diff --git a/lang/basic/src.old/.distr b/lang/basic/src.old/.distr deleted file mode 100644 index 1e5230095..000000000 --- a/lang/basic/src.old/.distr +++ /dev/null @@ -1,20 +0,0 @@ -Makefile -basic.yacc -bem.c -bem.h -compile.c -eval.c -func.c -gencode.c -graph.c -graph.h -initialize.c -basic.lex -parsepar.c -split.c -symbols.c -symbols.h -util.c -y.tab.c -y.tab.h -yywrap.c diff --git a/lang/basic/src.old/Makefile b/lang/basic/src.old/Makefile deleted file mode 100644 index 35643055d..000000000 --- a/lang/basic/src.old/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# $Header$ - -d=../../.. -h=$d/h -l=$d/lib -INSTALL=$l/em_bem - -CFLAGS = -I$h -O - -FILES= bem.o y.tab.o symbols.o initialize.o compile.o \ - parsepar.o yywrap.o gencode.o util.o graph.o \ - eval.o func.o split.o - -CFILES= bem.c y.tab.c symbols.c initialize.c compile.c \ - parsepar.c yywrap.c gencode.c util.c graph.c \ - eval.c func.c split.c - -SRC= bem.h symbols.h graph.h y.tab.h \ - bem.c basic.yacc symbols.c initialize.c compile.c \ - parsepar.c yywrap.c gencode.c util.c graph.c \ - eval.c func.c split.c - -first : bem - -cmp : bem - cmp bem $(INSTALL) - -install: bem - cp bem $(INSTALL) - -clean: - rm -f *.[osmk] *.old bem - -opr: - make pr ^ opr -pr: - @pr $(SRC) - -distr: y.tab.c y.tab.h - -bem: $(FILES) - $(CC) -o bem $(FILES) - -y.tab.o : y.tab.c basic.lex - $(CC) $(CFLAGS) -c y.tab.c - -y.tab.h y.tab.c : basic.yacc - yacc -d basic.yacc - -$(FILES) : bem.h symbols.h graph.h y.tab.h - -lint: $(CFILES) - lint -phac -I$h $(CFILES) diff --git a/lang/basic/src.old/basic.lex b/lang/basic/src.old/basic.lex deleted file mode 100644 index bb72e467a..000000000 --- a/lang/basic/src.old/basic.lex +++ /dev/null @@ -1,484 +0,0 @@ -#ifndef NORSCID -static char rcs_lex[] = "$Header$" ; -#endif - -/* This file contains the new lexical analizer */ -typedef struct { - char *name; - int token, classvalue,length; -} Key; - -Key keywords [] ={ -"abs", FUNCTION, ABSSYM, 0, -"and", BOOLOP, ANDSYM, 0, -"asc", FUNCTION, ASCSYM, 0, -"as", ASSYM, 0, 0, -"atn", FUNCTION, ATNSYM, 0, -"auto", ILLEGAL, 0, 0, -"base", BASESYM, 0, 0, -"call", CALLSYM, 0, 0, -"cdbl", FUNCTION, CDBLSYM, 0, -"chain", ILLEGAL, 0, 0, -"chr", FUNCTION, CHRSYM, 0, -"cint", FUNCTION, CINTSYM, 0, -"clear", CLEARSYM, 0, 0, -"cload", ILLEGAL, 0, 0, -"close", ILLEGAL, 0, 0, -"common", ILLEGAL, 0, 0, -"cont", ILLEGAL, 0, 0, -"cos", FUNCTION, COSSYM, 0, -"csng", FUNCTION, CSNGSYM, 0, -"csave", ILLEGAL, 0, 0, -"cvi", FUNCTION, CVISYM, 0, -"cvs", FUNCTION, CVSSYM, 0, -"cvd", FUNCTION, CVDSYM, 0, -"data", DATASYM, 0, 0, -"defint", DEFINTSYM, 0, 0, -"defsng", DEFSNGSYM, 0, 0, -"defdbl", DEFDBLSYM, 0, 0, -"defstr", DEFSTRSYM, 0, 0, -"def", DEFSYM, 0, 0, -"delete", ILLEGAL, 0, 0, -"dim", DIMSYM, 0, 0, -"edit", ILLEGAL, 0, 0, -"else", ELSESYM, 0, 0, -"end", ENDSYM, 0, 0, -"eof", FUNCTION, EOFSYM, 0, -"eqv", BOOLOP, EQVSYM, 0, -"erase", ILLEGAL, 0, 0, -"error", ERRORSYM, 0, 0, -"err", ERRSYM, 0, 0, -"erl", ERLSYM, 0, 0, -"exp", FUNCTION, EXPSYM, 0, -"field", FIELDSYM, 0, 0, -"fix", FUNCTION, FIXSYM, 0, -"for", FORSYM, 0, 0, -"fre", FUNCTION, FRESYM, 0, -"get", GETSYM, 0, 0, -"gosub", GOSUBSYM, 0, 0, -"goto", GOTOSYM, 0, 0, -"hex", FUNCTION, HEXSYM, 0, -"if", IFSYM, 0, 0, -"imp", BOOLOP, IMPSYM, 0, -"inkey", INKEYSYM, 0, 0, -"input", INPUTSYM, 0, 0, -"inp", FUNCTION, INPSYM, 0, -"instr", FUNCTION, INSTRSYM, 0, -"int", FUNCTION, INTSYM, 0, -"kill", ILLEGAL, 0, 0, -"left", FUNCTION, LEFTSYM, 0, -"len", FUNCTION, LENSYM, 0, -"let", LETSYM, 0, 0, -"line", LINESYM, 0, 0, -"list", LISTSYM, 0, 0, -"llist", ILLEGAL, 0, 0, -"load", LOADSYM, 0, 0, -"loc", FUNCTION, LOCSYM, 0, -"log", FUNCTION, LOGSYM, 0, -"lpos", FUNCTION, LPOSSYM, 0, -"lprint", ILLEGAL, 0, 0, -"lset", LSETSYM, 0, 0, -"merge", MERGESYM, 0, 0, -"mid", MIDSYM, 0, 0, -"mki", FUNCTION, MKISYM, 0, -"mks", FUNCTION, MKSSYM, 0, -"mkd", FUNCTION, MKDSYM, 0, -"mod", MODSYM, 0, 0, -"name", ILLEGAL, 0, 0, -"new", ILLEGAL, 0, 0, -"next", NEXTSYM, 0, 0, -"not", NOTSYM, 0, 0, -"null", ILLEGAL, 0, 0, -"on", ONSYM, 0, 0, -"oct", FUNCTION, OCTSYM, 0, -"open", OPENSYM, 0, 0, -"option", OPTIONSYM, 0, 0, -"or", BOOLOP, ORSYM, 0, -"out", FUNCTION, OUTSYM, 0, -"peek", PEEKSYM, 0, 0, -"poke", POKESYM, 0, 0, -"print", PRINTSYM, 0, 0, -"pos", FUNCTION, POSSYM, 0, -"put", PUTSYM, 0, 0, -"randomi", RANDOMIZESYM, 0, 0, -"read", READSYM, 0, 0, -"rem", REMSYM, 0, 0, -"renum", ILLEGAL, 0, 0, -"ren", ILLEGAL, 0, 0, -"restore", RESTORESYM, 0, 0, -"resume", ILLEGAL, 0, 0, -"return", RETURNSYM, 0, 0, -"right", FUNCTION, RIGHTSYM, 0, -"rnd", FUNCTION, RNDSYM, 0, -"run", ILLEGAL, 0, 0, -"save", ILLEGAL, 0, 0, -"step", STEPSYM, 0, 0, -"sgn", FUNCTION, SGNSYM, 0, -"sin", FUNCTION, SINSYM, 0, -"space", FUNCTION, SPACESYM, 0, -"spc", FUNCTION, SPCSYM, 0, -"sqr", FUNCTION, SQRSYM, 0, -"stop", STOPSYM, 0, 0, -"string", FUNCTION, STRINGSYM, 0, -"str", FUNCTION, STRSYM, 0, -"swap", SWAPSYM, 0, 0, -"tab", FUNCTION, TABSYM, 0, -"tan", FUNCTION, TANSYM, 0, -"then", THENSYM, 0, 0, -"to", TOSYM, 0, 0, -"tron", TRONOFFSYM, TRONSYM, 0, -"troff", TRONOFFSYM, TROFFSYM, 0, -"using", USINGSYM, 0, 0, -"usr", FUNCTION, USRSYM, 0, -"val", FUNCTION, VALSYM, 0, -"varptr", FUNCTION, VARPTRSYM, 0, -"wait", ILLEGAL, 0, 0, -"while", WHILESYM, 0, 0, -"wend", WENDSYM, 0, 0, -"width", ILLEGAL, 0, 0, -"write", WRITESYM, 0, 0, -"xor", BOOLOP, XORSYM, 0, -0, 0, 0, 0 -}; - -char *index(); - -/* Keyword index table */ - -int kex[27]; - -/* Initialize the keyword table */ -fillkex() -{ - Key *k; - int i; - for(k=keywords;k->name;k++) - k->length= strlen(k->name); - k=keywords; - for(i=0;k->name && i<='z'-'a';i++) - { - for(;k->name && *k->namename!=i+'a') continue; - kex[*k->name-'a']=k-keywords; - for(;k->name && *k->name==i+'a';k++); - kex[*(k-1)->name-'a'+1]=k-keywords; - } - if(debug) - { - for(i=0;i<27;i++) - printf("%c:%d\n",'a'+i,kex[i]); - } -} - -#include - -/* Get each line separately into the buffer */ -/* Lines too long are terminated and flagged illegal */ - -#define MAXLINELENGTH 1024 - -char inputline[MAXLINELENGTH]; /* current source line */ -char *cptr; /* next character to decode */ -int yylineno=0; /* source line counter */ - -getline() -{ - /* get next input line */ - - if( fgets(inputline,MAXLINELENGTH,yyin) == NULL) - return(FALSE); - yylineno ++; - if( index(inputline,'\n') == 0) - error("source line too long"); - inputline[MAXLINELENGTH-1]=0; - if( listing) - fputs(inputline,stdout); - cptr= inputline; - return(TRUE); -} -yyerror(str) -char *str; -{ - error("Syntax error"); -} - -typechar() -{ - switch(*cptr) - { - case '$': - cptr++; return( STRINGTYPE); - case '%': - cptr++; return( INTTYPE); - case '!': - cptr++; return( FLOATTYPE); - case '#': - cptr++; return( DOUBLETYPE); - } - return(0); -} - -/* symbols in Microsoft are significant for the first 40 characters */ -#define SIGNIFICANT 40 -char name[SIGNIFICANT+1]; - -lookup() -{ - Key *k; - Symbol *Sym; - char *c; - int i, typech; - - sval= name; - for(c=cptr; *c && isalnum(*c);c++) - if( isupper(*c) ) - *c= tolower((*c)); - for(k= keywords+kex[*cptr-'a']; k->name != 0 && *(k->name)== *cptr;k++) - if( strncmp(cptr,k->name,k->length)==0) - { - /* check functions first*/ - if( isalnum( *(cptr+k->length) ) && - k->token==FUNCTION) continue; - cptr += k->length; - yylval.integer= k->classvalue; - if(debug) printf("lookup:%d %d\n", - k->classvalue,k->token); - if( k->token == FUNCTION) - { - /* stripp type character */ - typech=typechar(); - } - /* illegals + rem */ - if( k->token == REMSYM || k->token==ILLEGAL) - while( *cptr && *cptr!=':' && *cptr!='\n') - cptr++; - return( k->token); - } - /* Is it a function name ? */ - c=cptr; - /* Identifier found, update the symbol table */ - i=0; - while( isalnum(*c) || *c == '.') - if( isymtype!=DEFAULTTYPE) - { - if(typech && typech!=Sym->symtype && wflag) - warning("type re-declared,ignored"); - } - if( typech) - Sym->symtype=typech; - if(debug) printf("lookup:%d Identifier\n",Sym); - if( (name[0]=='f' || name[0]=='F') && - (name[1]=='n' || name[1]=='N') ) - return(FUNCTID); - return(IDENTIFIER); -} - -/* Parsing unsigned numbers */ -readconstant() -{ - /* read HEX and OCTAL numbers */ - char *c; - cptr++; - if( *cptr == 'H' || *cptr=='h') - { - /* HEX */ - cptr++; - c=cptr; - while( isdigit(*cptr) || - (*cptr>='a' && *cptr<='f' ) || - (*cptr>='A' && *cptr<='F' ) )cptr++; - sscanf(c,"%x",&ival); - } else - if( *cptr == 'O' || *cptr == 'o') - { - /* OCTAL */ - cptr++; - c=cptr; - while( isdigit(*cptr) ) cptr++; - sscanf(c,"%o",&ival); - } else - error("H or O expected"); - return(INTVALUE); -} - -number() -{ - long i1; - double atof(); - register char *c; - int overflow = 0; - char cx; - - i1=0; - c=cptr; - while(isdigit(*c)){ - i1= i1*10 + *c-'0'; - if (i1 < 0) overflow = 1; - c++; - } - if( *c != '.'){ - if( i1> MAXINT || i1': - if( *(c+1)=='='){ - c++;c++;cptr=c; yylval.integer= GESYM;return(RELOP); - } - yylval.integer= '>'; - cptr++; - return(RELOP); - case '<': - if( *(c+1)=='='){ - c++; c++; cptr=c; yylval.integer=LESYM; return(RELOP); - } else - if( *(c+1)=='>'){ - c++; c++; cptr=c; yylval.integer=NESYM; return(RELOP); - } - yylval.integer= '<'; - cptr++; - return(RELOP); - } - return(*cptr++); -} - -char * -index(s, c) - register char *s, c; -{ - while (*s) - if (*s++ == c) - return --s; - return (char *)0; -} diff --git a/lang/basic/src.old/basic.yacc b/lang/basic/src.old/basic.yacc deleted file mode 100644 index 10c1d20c4..000000000 --- a/lang/basic/src.old/basic.yacc +++ /dev/null @@ -1,483 +0,0 @@ -%token ILLEGAL -%token ASSYM -%token BASESYM -%token CALLSYM -%token CLEARSYM -%token CLOSESYM -%token DATASYM -%token DEFINTSYM -%token DEFSNGSYM -%token DEFDBLSYM -%token DEFSTRSYM -%token DEFSYM -%token DIMSYM -%token ELSESYM -%token ERRSYM -%token ERLSYM -%token ERRORSYM -%token FIELDSYM -%token FORSYM -%token FUNCTION -%token FUNCTID -%token INKEYSYM -%token GETSYM -%token GOSUBSYM -%token GOTOSYM -%token IFSYM -%token INPUTSYM -%token LETSYM -%token LINESYM -%token LSETSYM -%token MIDSYM -%token NEXTSYM -%token ONSYM -%token OPENSYM -%token OPTIONSYM -%token PRINTSYM -%token POKESYM -%token PUTSYM -%token RANDOMIZESYM -%token READSYM -%token REMSYM -%token RESTORESYM -%token RETURNSYM -%token ENDSYM -%token STOPSYM -%token STEPSYM -%token SWAPSYM -%token THENSYM -%token TOSYM -%token TRONOFFSYM -%token USINGSYM -%token USRSYM -%token WHILESYM -%token WENDSYM -%token WRITESYM -/* special tokens */ -%token EOLN -%token INTVALUE -%token FLTVALUE -%token DBLVALUE -%token STRVALUE -%token UNARYSYM -%token IDENTIFIER -%token ANDSYM -%token ORSYM -%token VARPTR - -%type arraydcl identifier indexed -%type getput -%type exprlist expression negation compare sum term factor -%type parmlist variable printlist inputtail funcname funccall - -%left BOOLOP -%left NOTSYM -%left '=' '<' '>' LESYM GESYM NESYM -%left RELOP -%left '+' '-' -%left '*' '/' '\\' MODSYM -%left '^' -%left UNARYMINUS - -%{ -#define YYDEBUG -#include "bem.h" - -typedef union { - int integer ; - Symbol *Sptr ; - char *cptr ; -} YYSTYPE ; - -int ival; -double dval; -char *sval; -int e1,e2; - -char *formatstring; /* formatstring used for printing */ -Symbol *s; /* Symbol dummy */ -%} -%% -programline : INTVALUE {newblock(ival); newemblock(ival);} stmts EOLN - | '#' INTVALUE STRVALUE EOLN - | EOLN - ; - - -stmts : singlestmt - | stmts ':' singlestmt - ; - -singlestmt : callstmt - | clearstmt - | closestmt - | datastmt - | deffnstmt - | defvarstmt - | defusrstmt - | dimstmt - | ERRORSYM expression {errorstmt($2);} - | fieldstmt - | forstmt - | getstmt - | gosubstmt - | ongotostmt - | ifstmt - | illegalstmt - | inputstmt - | letstmt - | lineinputstmt - | lsetstmt - | midstmt - | exceptionstmt - | nextstmt - | GOTOSYM INTVALUE {gotostmt(ival);} - | openstmt - | optionstmt - | pokestmt - | printstmt - | randomizestmt - | readstmt - | REMSYM - | restorestmt - | returnstmt - | ENDSYM { emcode("loc","0"); - emcode("cal","$_hlt"); - emcode("asp",EMINTSIZE);} - | STOPSYM { emcode("cal","$_stop");} - | swapstmt - | TRONOFFSYM { tronoff=$1;} - | whilestmt - | wendstmt - | writestmt - | /* EMPTY STATEMENT */ - ; - -illegalstmt: ILLEGAL {illegalcmd();} - -callstmt: CALLSYM IDENTIFIER parmlist ')' - { - emcode("cal",proclabel($2->symname)); - while($3 -- >0) emcode("asp",EMPTRSIZE); - } - | CALLSYM IDENTIFIER - { emcode("cal",proclabel($2->symname));} - -parmlist: '(' variable { $$=1;} - | parmlist ',' variable { $$= $1+1;} - -clearstmt: CLEARSYM {warning("statement ignored");} - | CLEARSYM ',' expression {warning("statement ignored");} - | CLEARSYM ',' expression ',' expression {warning("statement ignored");} -closestmt: CLOSESYM filelist - | CLOSESYM {emcode("cal","$_close");} - -filelist: cross intvalue { emcode("loc",itoa(ival)); - emcode("cal","$_clochn"); - emcode("asp",EMINTSIZE);} - | filelist ',' cross intvalue { emcode("loc",itoa(ival)); - emcode("cal","$_clochn"); - emcode("asp",EMINTSIZE);} - -datastmt: DATASYM {datastmt();} datalist {fprintf(datfile,"\n");} - -dataelm : INTVALUE {fprintf(datfile,"%d",ival);} - | '-' INTVALUE {fprintf(datfile,"%d",-ival);} - | FLTVALUE {fprintf(datfile,"%f",dval);} - | '-' FLTVALUE {fprintf(datfile,"%f",-dval);} - | STRVALUE {fprintf(datfile,"\"%s\"",sval);} - | IDENTIFIER {fprintf(datfile,"\"%s\"",sval);} - ; - -datalist: dataelm - | datalist ',' {fputc(',',datfile);} dataelm - ; - -deffnstmt: DEFSYM heading '=' expression {endscope($4);} - -heading : FUNCTID { newscope($1); heading();} - | FUNCTID {newscope($1);} '(' idlist ')' { heading();} - -idlist : IDENTIFIER { dclparm($1);} - | idlist ',' IDENTIFIER { dclparm($3);} - ; - -defvarstmt: DEFINTSYM { setdefaulttype( INTTYPE);} - | DEFSNGSYM { setdefaulttype( FLOATTYPE);} - | DEFDBLSYM { setdefaulttype( DOUBLETYPE);} - | DEFSTRSYM { setdefaulttype( STRINGTYPE);} - -defusrstmt: DEFSYM USRSYM error ':' {illegalcmd();} - -dimstmt: DIMSYM arraydcl ')' {dclarray($2);} - | dimstmt ',' arraydcl ')' {dclarray($3);} - ; - -arraydcl : IDENTIFIER '(' INTVALUE {$$=$1; s= $1; - s->dimlimit[s->dimensions]=ival; - s->dimensions++; - } - | arraydcl ',' INTVALUE {$$=$1; s= $1; - if(s->dimensionsdimlimit[s->dimensions]=ival; - s->dimensions++; - } else - error("too many dimensions"); - } - - - -fieldstmt: FIELDSYM cross intvalue {setchannel(ival);} ',' fieldlist {notyetimpl();} - -fieldlist: intvalue ASSYM variable - | fieldlist ',' intvalue ASSYM variable - ; - -forstmt: FORSYM IDENTIFIER {forinit($2);} '=' expression {forexpr($5);} - TOSYM expression {forlimit($8);} step - ; - -step : STEPSYM expression {forstep($2);} - | /*EMPTY*/ {emcode("loc","1"); forstep(INTTYPE);} - ; - -nextstmt: NEXTSYM IDENTIFIER {nextstmt($2);} - | NEXTSYM { nextstmt((Symbol *)0);} - | nextstmt ',' IDENTIFIER { nextstmt($3);} - -getstmt: getput {emcode("loc",itoa(0)); - emcode("cal",$1); - emcode("asp",EMINTSIZE);} - | getput ',' intvalue - { /* position seek pointer first*/ - emcode("loc",itoa(ival)); - emcode("cal",$1); - emcode("asp",EMINTSIZE); - } -getput: GETSYM cross intvalue { setchannel(ival); $$= "$_getrec";} - | PUTSYM cross intvalue { setchannel(ival); $$= "$_putsym";} - -gosubstmt: GOSUBSYM INTVALUE {gosubstmt(ival);} - -returnstmt: RETURNSYM {returnstmt();} - -ifstmt: IFSYM expression {$1=ifstmt($2);} thenpart - {$1=thenpart($1);} elsepart {elsepart($1);} - ; - -thenpart: THENSYM INTVALUE {gotostmt(ival);} - | THENSYM stmts - | GOTOSYM INTVALUE {gotostmt(ival);} - ; -elsepart: ELSESYM INTVALUE {gotostmt(ival);} - | ELSESYM stmts - | /* empty */ - ; - -inputstmt: INPUTSYM semiprompt readlist - | INPUTSYM '#' intvalue {setchannel(ival);}',' readlist - ; - -semiprompt : semi STRVALUE ';' { loadstr($2); prompt(1);} - | semi STRVALUE ',' { loadstr($2); prompt(0);} - | /*EMPTY*/ { setchannel(-1); - emcode("cal","$_qstmark");} - -semi : ';' | /* empty */ ; - -letstmt: LETSYM {e1=where();} variable {e2=where();} - '=' expression {assign($3,$6);} - | {e1=where();} variable {e2=where();} - '=' expression {assign($2,$5);} - -lineinputstmt: LINESYM INPUTSYM semiprompt {setchannel(-1);} variable {linestmt($5);} - | LINESYM '#' intvalue {setchannel(ival);} ',' variable {linestmt($6);} - ; - -readlist: readelm - | readlist ',' readelm - ; -readelm: variable {readelm($1);} - -lsetstmt: LSETSYM variable '=' expression {notyetimpl();} - -midstmt: MIDSYM '$' midparms '=' expression - { emcode("cal","$_midstmt"); - emcode("asp",EMINTSIZE); - emcode("asp",EMINTSIZE); - emcode("asp",EMPTRSIZE); - emcode("asp",EMPTRSIZE);} - -midparms: '(' midfirst midsec midthird ')' - -midfirst: expression { conversion($1,STRINGTYPE); } -midsec: ',' expression { conversion($2,INTTYPE); } -midthird: ',' expression { conversion($2,INTTYPE); } - | /* empty */ { emcode("loc","-1");} - -exceptionstmt: ONSYM ERRORSYM GOTOSYM INTVALUE {exceptstmt(ival);} - -ongotostmt: ONSYM expression - GOSUBSYM constantlist {ongosubstmt($2);} - | ONSYM expression - GOTOSYM constantlist {ongotostmt($2);} - -constantlist: INTVALUE {jumpelm(ival);} - | constantlist ',' INTVALUE { jumpelm(ival);} - -openstmt: OPENSYM mode openchannel expression - { conversion($4,STRINGTYPE); openstmt(0);} - | OPENSYM mode openchannel - expression {conversion($4,STRINGTYPE);} - INTVALUE { openstmt(ival);} - -openchannel: cross INTVALUE ',' { setchannel(ival);} - -mode : expression ',' {conversion($1,STRINGTYPE);} - | ',' { emcode("lae","_iomode");} - ; - -optionstmt: OPTIONSYM BASESYM intvalue { optionbase(ival);} - -printstmt: PRINTSYM {setchannel(-1);emcode("cal","$_nl");} - | PRINTSYM file format printlist - { if( $4) emcode("cal","$_nl");} -file : '#' intvalue ',' {setchannel(ival);} - | /* empty */ {setchannel(-1);} - ; -format : USINGSYM STRVALUE ';' { loadstr($2);} - | USINGSYM variable ';' { - if($2!=STRINGTYPE) error("string variable expected");} - | /* empty */ {formatstring=0;} - -printlist: expression { printstmt($1); $$=1;} - | ',' { zone(1); $$=0;} - | ';' { zone(0); $$=0;} - | printlist expression { printstmt($2); $$=1;} - | printlist ',' { zone(1);$$=0;} - | printlist ';' { zone(0);$$=0;} - ; -pokestmt: POKESYM expression ',' expression {pokestmt($2,$4);} - ; -randomizestmt: RANDOMIZESYM - { emcode("cal","$_randomi");} - | RANDOMIZESYM expression - { conversion($2,INTTYPE); - emcode("cal","$_setrand"); - emcode("asp",EMINTSIZE);} - -readstmt: READSYM {setchannel(0);} variable { readelm($3);} - | readstmt ',' variable { readelm($3);} - -restorestmt: RESTORESYM INTVALUE { restore(ival);} - | RESTORESYM { restore(0);} - -swapstmt: SWAPSYM variable ',' variable { swapstmt($2,$4);} - -whilestmt: WHILESYM {whilestart();} expression {whiletst($3);} - ; - -wendstmt : WENDSYM {wend();} - -writestmt: WRITESYM {setchannel(-1);emcode("cal","$_wrnl");} - | WRITESYM file writelist {emcode("cal","$_wrnl");} - ; - -writelist: expression {writestmt($1,0);} - | writelist ',' expression {writestmt($3,1);} - ; - -cross: '#' | /* empty */ - -intvalue: INTVALUE - ; - -variable: identifier { $$=loadaddr($1);} - | indexed ')' {$$=endarrayload();} - | ERRSYM {emcode("lae","_errsym"); $$= INTTYPE;} - | ERLSYM {emcode("lae","_erlsym"); $$= INTTYPE;} - ; -indexed : identifier '(' {newarrayload($1);} - expression {loadarray($4); $$=$1;} - | indexed ',' expression {loadarray($3); $$=$1;} - ; - - -expression: - negation - | expression BOOLOP expression {$$=boolop($1,$3,$2);} - ; - -negation: NOTSYM compare {$$=boolop($2,0,NOTSYM);} - | compare - ; - -compare : sum - | sum RELOP sum {$$=relop($1,$3,$2);} - | sum '=' sum {$$=relop($1,$3,'=');} - ; - -sum : term - | sum '-' sum {$$=plusmin($1,$3,'-');} - | sum '+' sum {$$=plusmin($1,$3,'+');} - ; -term : factor - | factor '^' factor {$$=power($1,$3);} - | term '*' term {$$=muldiv($1,$3,'*');} - | term '\\' term {$$=muldiv($1,$3,'\\');} - | term '/' term {$$=muldiv($1,$3,'/');} - | term MODSYM term {$$=muldiv($1,$3,MODSYM);} - ; -factor : INTVALUE {$$=loadint(ival);} - | '(' expression ')' {$$=$2;} - | '-' factor { $$=negate($2);} - | FLTVALUE {$$=loaddbl(dval);} - | STRVALUE {$$= STRINGTYPE; loadstr($1);} - | variable {$$=$1; loadvar($1);} - | INKEYSYM '$' { emcode("cal","$_inkey"); - emcode("lfr",EMPTRSIZE); - $$= STRINGTYPE; - } - | VARPTR '(' '#' intvalue ')' { warning("Not supported"); $$=INTTYPE;} - | FUNCTION {$$= callfcn($1,0);} - | FUNCTION '(' cross exprlist')' {$$=callfcn($1,$4);} - | funcname { $$=fcnend(0);} - | funcname funccall ')' { $$=fcnend($2);} - | MIDSYM '$' midparms - { - emcode("cal","$_mid"); - emcode("asp",EMINTSIZE); - emcode("asp",EMINTSIZE); - emcode("asp",EMPTRSIZE); - /* emcode("asp",itoa($3)); */ - emcode("lfr",EMPTRSIZE); - $$= STRINGTYPE; - } - | INPUTSYM '$' '(' expression inputtail - { - emcode("cal","$_inpfcn"); - emcode("asp",EMINTSIZE); - emcode("asp",EMINTSIZE); - emcode("asp",EMPTRSIZE); - $$= STRINGTYPE; - } -inputtail: ',' expression ')' { conversion($2,INTTYPE); $$= INTTYPE;} - | ',' '#' expression ')' { conversion($3,INTTYPE); $$= INTTYPE;} - | ')' { emcode("loc","-1"); $$= INTTYPE;} - -funcname: FUNCTID {$$=fcncall($1);} - -funccall: '(' expression { callparm(0,$2); $$=1;} - | funccall ',' expression { callparm($1,$3); $$=$1+1;} - -identifier: IDENTIFIER { dcltype($1); $$=$1;} - -exprlist: expression { typetable[0]= $1; $$=1;} - | exprlist ',' expression { typetable[$1]=$3;$$=$1+1;} - -%% -#ifndef NORCSID -static char rcs_id[] = "$Header$" ; -#endif -#include "basic.lex" diff --git a/lang/basic/src.old/bem.c b/lang/basic/src.old/bem.c deleted file mode 100644 index e266de2d8..000000000 --- a/lang/basic/src.old/bem.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -static char rcs_bem[] = RCS_BEM ; -static char rcs_symb[] = RCS_SYMB ; -static char rcs_graph[] = RCS_GRAPH ; -#endif - -/* Author: M.L. Kersten -** -** This is the main routine for the BASIC-EM frontend. -** Program parameters are decoded, the BASIC program is parsed -** and compiled to an executable program -** -** Bem expects at least three parameters. One ending with '.i' is considered -** the input to the compiler, '.e' denotes the file to be generated, -** and the last name denotes the name of the user supplied file name. -** The latter is used to store the data entries. -** Additional flags may be supplied, see parseparms. -*/ - -char *program; - -char datfname[MAXFILENAME] ; -char tmpfname[MAXFILENAME] ; - -char *inpfile, *outfile; -main(argc,argv) -int argc; -char **argv; -{ - extern int errorcnt; - - /* parseparams */ - parseparams(argc,argv); - /* initialize the system */ - initialize(); - /* compile source programs */ - compileprogram(program); - linewarnings(); - if( errorcnt) { - unlink(tmpfname); - exit(-1); - } - /* process em object files */ - simpleprogram(); - exit(0); -} diff --git a/lang/basic/src.old/bem.h b/lang/basic/src.old/bem.h deleted file mode 100644 index d664038b0..000000000 --- a/lang/basic/src.old/bem.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include -#include -#include - -/* Author: M.L. Kersten -** Here all the global objects are defined. -*/ -#include "symbols.h" -#include "graph.h" -#include "y.tab.h" - -#ifndef NORCSID -# define RCS_BEM "$Header$" -#endif - -#define MAXINT 32768 -#define MININT -32767 -#define EMINTSIZE "EM_WSIZE" -#define EMPTRSIZE "EM_PSIZE" -#define EMFLTSIZE "EM_DSIZE" - -#define MAXPIECES 100 -#define MAXFILENAME 200 - -#define CHANNEL 0 -#define THRESHOLD 40 /* for splitting blocks */ - -#define void int /* Some C compilers don't know void */ - -extern char *program; /* name of source program */ -extern char *inpfile; /* input tko compiler */ -extern char *outfile; /* output from compiler */ - -extern char datfname[MAXFILENAME]; /* data statements file */ -extern char tmpfname[MAXFILENAME]; /* temporary statements file */ - -extern FILE *emfile; /* EM output file */ -extern FILE *datfile; /* data file */ -extern FILE *Tmpfile; /* compiler temporary */ -extern FILE *yyin; /* Compiler input */ - -extern int endofinput; -extern int wflag; -extern int hflag; -extern int traceflag; -extern int yydebug; -extern int yylineno; -extern int listing; -extern int nolins; -extern int threshold; -extern int debug; -extern int tronoff; - -extern int emlinecount; /* counts lines on Tmpfile */ -extern int dataused; -extern int typetable[10]; /* parameters to standard functions */ - -extern Linerecord *currline; - - -extern char *itoa(); -extern char *datalabel(); -extern char *instrlabel(); -extern char *proclabel(); -extern char *typesize(); -extern char *typestring(); -extern char *salloc(); - -extern char *sprintf(); -extern char *strcpy(); -extern char *strcat(); -extern char *malloc(); diff --git a/lang/basic/src.old/compile.c b/lang/basic/src.old/compile.c deleted file mode 100644 index 664940492..000000000 --- a/lang/basic/src.old/compile.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - - -/* compile the next program in the list */ -/* Here we should open the input file. (for the future) */ - -FILE *yyin; - -compileprogram(dummyprog) -char *dummyprog; -{ - - while( getline()) - (void) yyparse(); - (void) fclose(yyin); -} diff --git a/lang/basic/src.old/eval.c b/lang/basic/src.old/eval.c deleted file mode 100644 index afbd88b36..000000000 --- a/lang/basic/src.old/eval.c +++ /dev/null @@ -1,444 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - - -/* Here you find all routines to evaluate expressions and - generate code for assignment statements -*/ - -exprtype(ltype,rtype) -int ltype,rtype; -{ - /* determine the result type of an expression */ - if( ltype== STRINGTYPE || rtype==STRINGTYPE) - { - if( ltype!=rtype) - error("type conflict, string expected"); - return( STRINGTYPE); - } - /* take maximum */ - if( ltype': genbool("zgt"); break; - case '=': genbool("zeq"); break; - case NESYM: genbool("zne"); break; - case LESYM: genbool("zle"); break; - case GESYM: genbool("zge"); break; - default: error("relop:unexpected operator"); - } - return(INTTYPE); -} -plusmin(ltype,rtype,operator) -int ltype,rtype,operator; -{ - int result; - result= exprtype(ltype,rtype); - - if( result== STRINGTYPE) - { - if( operator== '+') - { - emcode("cal","$_concat"); - emcode("asp",EMPTRSIZE); - emcode("asp",EMPTRSIZE); - emcode("lfr",EMPTRSIZE); - } else error("illegal operator"); - } else { - extraconvert(ltype,result,rtype); - conversion(rtype,result); - if( result== INTTYPE) - { - if( operator=='+') - emcode("adi",EMINTSIZE); - else emcode("sbi",EMINTSIZE); - } else{ - if( operator=='+') - emcode("adf",EMFLTSIZE); - else emcode("sbf",EMFLTSIZE); - } - } - return(result); -} -muldiv(ltype,rtype,operator) -int ltype,rtype,operator; -{ - int result; - - result= exprtype(ltype,rtype); - if(operator==MODSYM || operator== '\\') result=INTTYPE; - extraconvert(ltype,result,rtype); - conversion(rtype,result); - if( result== INTTYPE) - { - if( operator=='/') - { - result= DOUBLETYPE; - extraconvert(ltype,result,rtype); - conversion(rtype,result); - emcode("dvf",EMFLTSIZE); - } else - if( operator=='\\') - emcode("dvi",EMINTSIZE); - else - if( operator=='*') - emcode("mli",EMINTSIZE); - else - if( operator==MODSYM) - emcode("rmi",EMINTSIZE); - else error("illegal operator"); - } else{ - if( operator=='/') - emcode("dvf",EMFLTSIZE); - else - if( operator=='*') - emcode("mlf",EMFLTSIZE); - else error("illegal operator"); - } - return(result); -} -negate(type) -int type; -{ - switch(type) - { - case INTTYPE: - emcode("ngi",EMINTSIZE); break; - case DOUBLETYPE: - case FLOATTYPE: - emcode("ngf",EMFLTSIZE); break; - default: - error("Illegal operator"); - } - return(type); -} -power(ltype,rtype) -int ltype,rtype; -{ - extraconvert(ltype,DOUBLETYPE,rtype); - conversion(rtype,DOUBLETYPE); - emcode("cal","$_power"); - emcode("asp",EMFLTSIZE); - emcode("asp",EMFLTSIZE); - emcode("lfr",EMFLTSIZE); - return(DOUBLETYPE); -} -char *typesize(ltype) -int ltype; -{ - switch( ltype) - { - case INTTYPE: - return(EMINTSIZE); - case FLOATTYPE: - case DOUBLETYPE: - return(EMFLTSIZE); - case STRINGTYPE: - return(EMPTRSIZE); - default: - error("typesize:unexpected"); - if(debug) printf("type received %d\n",ltype); - } - return(EMINTSIZE); -} -/* -loadptr(s) -Symbol *s; -{ - if( POINTERSIZE==WORDSIZE) - fprintf(Tmpfile," loe l%d\n",s->symalias); - else - if( POINTERSIZE== 2*WORDSIZE) - fprintf(Tmpfile," lde l%d\n",s->symalias); - else error("loadptr:unexpected pointersize"); -} -*/ -char *typestring(type) -int type; -{ - switch(type) - { - case INTTYPE: - return(EMINTSIZE); - case FLOATTYPE: - case DOUBLETYPE: - return(EMFLTSIZE); - case STRINGTYPE: - return(EMPTRSIZE); - default: - error("typestring: unexpected type"); - } - return("0"); -} -loadvar(type) -int type; -{ - /* load a simple variable its address is on the stack*/ - emcode("loi",typestring(type)); -} -loadint(value) -int value; -{ - emcode("loc",itoa(value)); - return(INTTYPE); -} -loaddbl(value) -double value; -{ - int index; - index= genlabel(); - fprintf(emfile,"l%d\n bss 8,%fF8,1\n",index,value); - emcode("lae",datalabel(index)); - emcode("loi",EMFLTSIZE); - return(DOUBLETYPE); -} -loadstr(value) -int value; -{ - emcode("lae",datalabel(value)); -} -loadaddr(s) -Symbol *s; -{ - extern Symbol *fcn; - int i,j; - - if(debug) printf("load %s %d\n",s->symname,s->symtype); - if( s->symalias>0) - emcode("lae",datalabel(s->symalias)); - else{ - j= -s->symalias; - if(debug) printf("load parm %d\n",j); - fprintf(Tmpfile," lal "); - for(i=fcn->dimensions;i>j;i--) - fprintf(Tmpfile,"%s+",typesize(fcn->dimlimit[i-1])); - fprintf(Tmpfile,"0\n"); - emlinecount++; - /* - emcode("lal",datalabel(fcn->dimalias[-s->symalias])); - */ - } - return(s->symtype); -} -assign(type,lt) -int type,lt; -{ - extern int e1,e2; - conversion(lt,type); - exchange(e1,e2); - /* address is on stack already */ - emcode("sti",typestring(type) ); -} -storevar(lab,type) -int lab,type; -{ - /*store value back */ - emcode("lae",datalabel(lab)); - emcode("sti",typestring(type)); -} - -/* maintain a stack of array references */ -int dimstk[MAXDIMENSIONS], dimtop= -1; -Symbol *arraystk[MAXDIMENSIONS]; - -newarrayload(s) -Symbol *s; -{ - if( dimtopdimensions==0) - { - s->dimensions=1; - defarray(s); - } - dimstk[dimtop]= s->dimensions; - arraystk[dimtop]= s; - emcode("lae",datalabel(s->symalias)); -} -endarrayload() -{ - return(arraystk[dimtop--]->symtype); -} -loadarray(type) -int type; -{ - int dim; - Symbol *s; - - if( dimtop<0 || dimtop>=MAXDIMENSIONS) - fatal("too many nested array references"); - /* index expression is on top of stack */ - s=arraystk[dimtop]; - dim= dimstk[dimtop]; - if( dim==0) - { - error("too many indices"); - dimstk[dim--]=0; - return; - } - conversion(type,INTTYPE); - dim--; - /* first check index range */ - fprintf(Tmpfile," lae r%d\n",s->dimalias[dim]); - emlinecount++; - emcode("rck",EMINTSIZE); - emcode("lae",datalabel(s->dimalias[dim])); - emcode("aar",EMINTSIZE); - dimstk[dimtop]--; -} -storearray(type) -{ - /* used only in let statement */ - extern int e1,e2; - exchange(e1,e2); - emcode("sti",typestring(type)); -} diff --git a/lang/basic/src.old/func.c b/lang/basic/src.old/func.c deleted file mode 100644 index 00e916028..000000000 --- a/lang/basic/src.old/func.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - - -/* expression types for predefined functions are assembled */ -int typetable[10]; -int exprlimit; - -/* handle all predefined functions */ -#define cv(X) conversion(type,X); pop=X -#define cl(X) emcode("cal",X); - -parm(cnt) -int cnt; -{ - if( cnt> exprlimit) - error("Not enough arguments"); - if( cnt < exprlimit) - error("Too many arguments"); -} - -callfcn(fcnnr,cnt) -int fcnnr,cnt; -{ - int pop=DOUBLETYPE; - int res=DOUBLETYPE; - int type; - - - type= typetable[0]; - exprlimit=cnt; - if(debug) printf("fcn=%d\n",fcnnr); - switch(fcnnr) - { - case ABSSYM: cv(DOUBLETYPE); - cl("$_abr"); - parm(1); - break; - case ASCSYM: cv(STRINGTYPE); - cl("$_asc"); res=INTTYPE; - parm(1); - break; - case ATNSYM: cv(DOUBLETYPE); - cl("$_atn"); - parm(1); - break; - case CDBLSYM: cv(DOUBLETYPE); return(DOUBLETYPE);; - case CHRSYM: cv(INTTYPE); - cl("$_chr"); res=STRINGTYPE; - parm(1); - break; - case CSNGSYM: - cv(DOUBLETYPE); return(DOUBLETYPE); - case CINTSYM: cv(INTTYPE); return(INTTYPE); - case COSSYM: cv(DOUBLETYPE); - cl("$_cos"); - parm(1); - break; - case CVISYM: cv(STRINGTYPE); - cl("$_cvi"); res=INTTYPE; - parm(1); - break; - case CVSSYM: cv(STRINGTYPE); - cl("$_cvd"); res=DOUBLETYPE; - parm(1); - break; - case CVDSYM: cv(STRINGTYPE); - cl("$_cvd"); res=DOUBLETYPE; - parm(1); - break; - case EOFSYM: - if( cnt==0) - { - res= INTTYPE; - pop= INTTYPE; - emcode("loc","-1"); - } else cv(INTTYPE); - cl("$_ioeof"); res=INTTYPE; - break; - case EXPSYM: cv(DOUBLETYPE); - cl("$_exp"); - parm(1); - break; - case FIXSYM: cv(DOUBLETYPE); - cl("$_fix"); res=INTTYPE; - parm(1); - break; - case INPSYM: - case LPOSSYM: - case FRESYM: pop=0; - warning("function not supported"); - parm(1); - break; - case HEXSYM: cv(INTTYPE); - cl("$_hex"); res=STRINGTYPE; - parm(1); - break; - case OUTSYM: - case INSTRSYM: cv(DOUBLETYPE); - cl("$_instr"); res=STRINGTYPE; - parm(1); - break; - case INTSYM: cv(DOUBLETYPE); - cl("$_fcint"); - parm(1); - break; - case LEFTSYM: parm(2); - extraconvert(type, STRINGTYPE,typetable[1]); - type= typetable[1]; - cv(INTTYPE); - cl("$_left"); res=STRINGTYPE; - emcode("asp",EMPTRSIZE); - emcode("asp",EMINTSIZE); - emcode("lfr",EMPTRSIZE); - return(STRINGTYPE); - case LENSYM: cv(STRINGTYPE); - cl("$_len"); res=INTTYPE; - parm(1); - break; - case LOCSYM: cv(INTTYPE); - cl("$_loc"); res=INTTYPE; - parm(1); - break; - case LOGSYM: cv(DOUBLETYPE); - cl("$_log"); - parm(1); - break; - case MKISYM: cv(INTTYPE); - cl("$_mki"); res=STRINGTYPE; - parm(1); - break; - case MKSSYM: cv(DOUBLETYPE); - cl("$_mkd"); res=STRINGTYPE; - parm(1); - break; - case MKDSYM: cv(DOUBLETYPE); - cl("$_mkd"); res=STRINGTYPE; - parm(1); - break; - case OCTSYM: cv(INTTYPE); - cl("$_oct"); res=STRINGTYPE; - parm(1); - break; - case PEEKSYM: cv(INTTYPE); - cl("$_peek"); res=INTTYPE; - parm(1); - break; - case POSSYM: emcode("asp",typestring(type)); - emcode("exa","_pos"); - emcode("loe","_pos"); - return(INTTYPE); - case RIGHTSYM: parm(2); - extraconvert(type, STRINGTYPE,typetable[1]); - type= typetable[1]; - cv(INTTYPE); - cl("$_right"); res=STRINGTYPE; - emcode("asp",EMINTSIZE); - emcode("asp",EMPTRSIZE); - emcode("lfr",EMPTRSIZE); - return(STRINGTYPE); - case RNDSYM: if( cnt==1) pop=type; else pop=0; - cl("$_rnd"); res= DOUBLETYPE; - break; - case SGNSYM: cv(DOUBLETYPE); - cl("$_sgn"); res=INTTYPE; - parm(1); - break; - case SINSYM: cv(DOUBLETYPE); - cl("$_sin"); - parm(1); - break; - case SPACESYM: cv(INTTYPE); - cl("$_space"); res=STRINGTYPE; - parm(1); - break; - case SPCSYM: cv(INTTYPE); - cl("$_spc"); res=0; - parm(1); - break; - case SQRSYM: cv(DOUBLETYPE); - cl("$_sqt"); - parm(1); - break; - case STRSYM: cv(DOUBLETYPE); - cl("$_str"); - parm(1); - break; - case STRINGSYM: cv(STRINGTYPE); - cl("$_string"); res=STRINGTYPE; - parm(1); - break; - case TABSYM: cv(INTTYPE); - cl("$_tab"); res=0; - parm(1); - break; - case TANSYM: cv(DOUBLETYPE); - cl("$_tan"); - parm(1); - break; - case VALSYM: cv(STRINGTYPE); - cl("$atol"); res=INTTYPE; - parm(1); - break; - case VARPTRSYM: cv(DOUBLETYPE); - cl("$_valptr"); - parm(1); - break; - default: error("unknown function"); - } - if(pop) - emcode("asp",typestring(pop)); - if(res) - emcode("lfr",typestring(res)); - return(res); -} - diff --git a/lang/basic/src.old/gencode.c b/lang/basic/src.old/gencode.c deleted file mode 100644 index e76324e6a..000000000 --- a/lang/basic/src.old/gencode.c +++ /dev/null @@ -1,585 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - - -/* Here we find all routines dealing with pure EM code generation */ - -static int emlabel=1; -genlabel() { return(emlabel++);} - - -genemlabel() -{ - int l; - - l=genlabel(); - fprintf( emfile,"l%d\n",l); - return(l); -} -genrom() -{ - int l; - l= genemlabel(); - fprintf(emfile," rom "); - return(l); -} - -where() -{ - return(emlinecount); -} -exchange(blk1,blk2) -int blk1,blk2; -{ - /* exchange assembler blocks */ - if(debug) printf("exchange %d %d %d\n",blk1,blk2,emlinecount); - fprintf(Tmpfile," exc %d,%d\n",blk2-blk1,emlinecount-blk2); - emlinecount++; -} - -/* routines to manipulate the Tmpfile */ -int emlinecount; /* count number of lines generated */ - /* this value can be used to generate EXC */ -int tronoff=0; -newemblock(nr) -int nr; -{ - /* save location on Tmpfile */ - currline->offset= ftell(Tmpfile); - fprintf(Tmpfile,"%d\n",currline->emlabel); - emlinecount++; - if (! nolins) { - fprintf(Tmpfile," lin %d\n",nr); - emlinecount++; - } - if( tronoff || traceflag) { - emcode("loc",itoa(nr)); - emcode("cal","$_trace"); - emcode("asp","EM_WSIZE"); - } -} - -emcode(operation,params) -char *operation,*params; -{ - fprintf(Tmpfile," %s %s\n",operation,params); - emlinecount++; -} -/* Handle data statements */ -int dataused=0; -List *datalist=0; -datastmt() -{ - List *l,*l1; - /*NOSTRICT*/ l= (List *) salloc(sizeof(List)); - l->linenr= currline->linenr; - /*NOSTRICT?*/ l->emlabel= (long) ftell(datfile); - if( datalist==0) - { - datalist=l; - datfile= fopen(datfname,"w"); - if( datfile==NULL) fatal("improper file creation permission"); - }else{ - l1= datalist; - while(l1->nextlist) l1= l1->nextlist; - l1->nextlist=l; - } - - dataused=1; -} -datatable() -{ - List *l; - int line=0; - - /* called at end to generate the data seek table */ - fprintf(emfile," exa _seektab\n"); - fprintf(emfile,"_seektab\n"); - l= datalist; - while(l) - { - fprintf(emfile," rom %d,%d\n", l->linenr,line++); - l= l->nextlist; - } - fprintf(emfile," rom 0,0\n"); -} - -/* ERROR and exception handling */ -exceptstmt(lab) -int lab; -{ - /* exceptions to subroutines are supported only */ - extern int gosubcnt; - List *l; - - emcode("loc",itoa(gosubcnt)); - l= (List *) gosublabel(); - l->emlabel= gotolabel(lab); - emcode("cal","$_trpset"); - emcode("asp",EMINTSIZE); -} - -errorstmt(exprtype) -int exprtype; -{ - /* convert expression to a valid error number */ - /* obtain the message and print it */ - emcode("cal","$error"); - emcode("asp",typesize(exprtype)); -} - -/* BASIC IO */ -openstmt(recsize) -int recsize; -{ - emcode("loc",itoa(recsize)); - emcode("cal","$_opnchn"); - emcode("asp",EMPTRSIZE); - emcode("asp",EMPTRSIZE); - emcode("asp",EMINTSIZE); -} - - -printstmt(exprtype) -int exprtype; -{ - switch(exprtype) - { - case INTTYPE: - emcode("cal","$_prinum"); - emcode("asp",typestring(INTTYPE)); - break; - case FLOATTYPE: - case DOUBLETYPE: - emcode("cal","$_prfnum"); - emcode("asp",typestring(DOUBLETYPE)); - break; - case STRINGTYPE: - emcode("cal","$_prstr"); - emcode("asp",EMPTRSIZE); - break; - case 0: /* result of tab function etc */ - break; - default: - error("printstmt:unexpected"); - } -} -zone(i) -int i; -{ - if( i)emcode("cal","$_zone"); -} -writestmt(exprtype,comma) -int exprtype,comma; -{ - if( comma) emcode("cal","$_wrcomma"); - switch(exprtype) - { - case INTTYPE: - emcode("cal","$_wrint"); - break; - case FLOATTYPE: - case DOUBLETYPE: - emcode("cal","$_wrint"); - break; - case STRINGTYPE: - emcode("cal","$_wrstr"); - break; - default: - error("printstmt:unexpected"); - } - emcode("asp",EMPTRSIZE); -} -restore(lab) -int lab; -{ - /* save this information too */ - - emcode("loc",itoa(0)); - emcode("cal","$_setchan"); - emcode("asp",EMINTSIZE); - emcode("loc",itoa(lab)); - emcode("cal","$_restore"); - emcode("asp",EMINTSIZE); -} -prompt(qst) -int qst; -{ - setchannel(-1); - emcode("cal","$_prstr"); - emcode("asp",EMPTRSIZE); - if(qst) emcode("cal","$_qstmark"); -} -linestmt(type) -int type; -{ - if( type!= STRINGTYPE) - error("String variable expected"); - emcode("cal","$_rdline"); - emcode("asp",EMPTRSIZE); -} -readelm(type) -int type; -{ - switch(type) - { - case INTTYPE: - emcode("cal","$_readint"); - break; - case FLOATTYPE: - case DOUBLETYPE: - emcode("cal","$_readflt"); - break; - case STRINGTYPE: - emcode("cal","$_readstr"); - break; - default: - error("readelm:unexpected type"); - } - emcode("asp",EMPTRSIZE); -} - -/* Swap exchanges the variable values */ -swapstmt(ltype,rtype) -int ltype, rtype; -{ - if( ltype!= rtype) - error("Type mismatch"); - else - switch(ltype) - { - case INTTYPE: - emcode("cal","$_intswap"); - break; - case FLOATTYPE: - case DOUBLETYPE: - emcode("cal","$_fltswap"); - break; - case STRINGTYPE: - emcode("cal","$_strswap"); - break; - default: - error("swap:unexpected"); - } - emcode("asp",EMPTRSIZE); - emcode("asp",EMPTRSIZE); -} - -/* input/output handling */ -setchannel(val) -int val; -{ /* obtain file descroption */ - emcode("loc",itoa(val)); - emcode("cal","$_setchan"); - emcode("asp",EMINTSIZE); -} -/* The if-then-else statements */ -ifstmt(type) -int type; -{ - /* This BASIC follows the True= -1 rule */ - int nr; - - nr= genlabel(); - if( type == INTTYPE) - emcode("zeq",instrlabel(nr)); - else - if( type == FLOATTYPE) - { - emcode("lae","fltnull"); - emcode("loi",EMFLTSIZE); - emcode("cmf",EMFLTSIZE); - emcode("zeq",instrlabel(nr)); - } - else error("Integer or Float expected"); - return(nr); -} -thenpart( elselab) -int elselab; -{ - int nr; - - nr=genlabel(); - emcode("bra",instrlabel(nr)); - fprintf(Tmpfile,"%d\n",elselab); - emlinecount++; - return(nr); -} -elsepart(lab)int lab; -{ - fprintf(Tmpfile,"%d\n",lab); emlinecount++; -} -/* generate code for the for-statement */ -#define MAXFORDEPTH 20 -struct FORSTRUCT{ - Symbol *loopvar; /* loop variable */ - int initaddress; - int limitaddress; - int stepaddress; - int fortst; /* variable limit test */ - int forinc; /* variable increment code */ - int forout; /* end of loop */ -} fortable[MAXFORDEPTH]; -int forcnt= -1; - -forinit(s) -Symbol *s; -{ - int type; - struct FORSTRUCT *f; - - dcltype(s); - type= s->symtype; - forcnt++; - if( (type!=INTTYPE && type!=FLOATTYPE && type!=DOUBLETYPE) || - s->dimensions) - error("Illegal loop variable"); - if( forcnt >=MAXFORDEPTH) - error("too many for statements"); - else{ - f=fortable+forcnt; - f->loopvar=s; - f->fortst=genlabel(); - f->forinc=genlabel(); - f->forout=genlabel(); - /* generate space for temporary objects */ - f->initaddress= dclspace(type); - f->limitaddress= dclspace(type); - f->stepaddress= dclspace(type); - } -} -forexpr(type) -int type; -{ - /* save start value of loop variable in a save place*/ - /* to avoid clashing with final value and step expression */ - int result; - result= fortable[forcnt].loopvar->symtype; - conversion(type,result); - storevar(fortable[forcnt].initaddress, result); -} -forlimit(type) -int type; -{ - /* save the limit value too*/ - int result; - result= fortable[forcnt].loopvar->symtype; - conversion(type,result); - storevar(fortable[forcnt].limitaddress, result); -} -forskipped(f) -struct FORSTRUCT *f; -{ - int type; - type= f->loopvar->symtype; - /* evaluate lower bound times sign of step */ - emcode("lae",datalabel(f->initaddress)); - loadvar(type); - conversion(type,DOUBLETYPE); - emcode("lae",datalabel(f->stepaddress)); - loadvar(type); - conversion(type,DOUBLETYPE); - emcode("cal","$_sgn"); - emcode("asp",EMFLTSIZE); - emcode("lfr",EMINTSIZE); - conversion(INTTYPE,DOUBLETYPE); - emcode("mlf",EMFLTSIZE); - /* evaluate higher bound times sign of step */ - emcode("lae",datalabel(f->limitaddress)); - loadvar(type); - conversion(type,DOUBLETYPE); - emcode("lae",datalabel(f->stepaddress)); - loadvar(type); - conversion(type,DOUBLETYPE); - emcode("cal","$_sgn"); - emcode("asp",EMFLTSIZE); - emcode("lfr",EMINTSIZE); - conversion(INTTYPE,DOUBLETYPE); - emcode("mlf",EMFLTSIZE); - /* skip condition */ - emcode("cmf",EMFLTSIZE); - emcode("zgt",instrlabel(f->forout)); -} -forstep(type) -int type; -{ - int result; - int varaddress; - struct FORSTRUCT *f; - - f= fortable+forcnt; - result= f->loopvar->symtype; - varaddress= f->loopvar->symalias; - conversion(type,result); - storevar(f->stepaddress, result); - /* all information available, generate for-loop head */ - /* test for ingoring loop */ - forskipped(f); - /* set initial value */ - emcode("lae",datalabel(f->initaddress)); - loadvar(result); - emcode("lae",datalabel(varaddress)); - emcode("sti",typestring(result)); - emcode("bra",instrlabel(f->fortst)); - /* increment loop variable */ - fprintf(Tmpfile,"%d\n",f->forinc); - emlinecount++; - emcode("lae",datalabel(varaddress)); - loadvar(result); - emcode("lae",datalabel(f->stepaddress)); - loadvar(result); - if(result == INTTYPE) - emcode("adi",EMINTSIZE); - else emcode("adf",EMFLTSIZE); - emcode("lae",datalabel(varaddress)); - emcode("sti",typestring(result)); - /* test boundary */ - fprintf(Tmpfile,"%d\n",f->fortst); - emlinecount++; - emcode("lae",datalabel(varaddress)); - loadvar(result); - emcode("lae",datalabel(f->limitaddress)); - loadvar(result); - if(result == INTTYPE) - emcode("cmi",EMINTSIZE); - else emcode("cmf",EMFLTSIZE); - emcode("zgt",instrlabel(f->forout)); -} -nextstmt(s) -Symbol *s; -{ - if(forcnt>MAXFORDEPTH || forcnt<0 || - ( s && s!= fortable[forcnt].loopvar)) - error("NEXT without FOR"); - else{ - /* address of variable is on top of stack ! */ - emcode("bra",instrlabel(fortable[forcnt].forinc)); - fprintf(Tmpfile,"%d\n",fortable[forcnt].forout); - forcnt--; - } -} - -pokestmt(type1,type2) -int type1,type2; -{ - conversion(type1,INTTYPE); - conversion(type2,INTTYPE); - emcode("cal","$_poke"); - emcode("asp",EMINTSIZE); - emcode("asp",EMINTSIZE); -} - -/* generate code for the while statement */ -#define MAXDEPTH 20 - -int whilecnt, whilelabels[MAXDEPTH][2]; /*0=head,1=out */ - -whilestart() -{ - whilecnt++; - if( whilecnt==MAXDEPTH) - fatal("too many nestings"); - /* gendummy label in graph */ - newblock(-1); - whilelabels[whilecnt][0]= currline->emlabel; - whilelabels[whilecnt][1]= genlabel(); - fprintf(Tmpfile,"%d\n", whilelabels[whilecnt][0]); - emlinecount++; -} -whiletst(exprtype) -int exprtype; -{ - /* test expression type */ - conversion(exprtype,INTTYPE); - fprintf(Tmpfile," zeq *%d\n",whilelabels[whilecnt][1]); - emlinecount++; -} -wend() -{ - if( whilecnt<1) - error("not part of while statement"); - else{ - fprintf(Tmpfile," bra *%d\n",whilelabels[whilecnt][0]); - fprintf(Tmpfile,"%d\n",whilelabels[whilecnt][1]); - emlinecount++; - emlinecount++; - whilecnt--; - } -} - -/* generate code for the final version */ -prologcode() -{ - /* generate the EM prolog code */ - fprintf(emfile,"fltnull\n con 0,0,0,0\n"); - fprintf(emfile,"dummy2\n con 0,0,0,0\n"); - fprintf(emfile,"tronoff\n con 0\n"); - fprintf(emfile,"dummy1\n con 0,0,0,0\n"); - fprintf(emfile," exa _iomode\n_iomode\n rom \"O\"\n"); - fprintf(emfile," exa _errsym\n"); - fprintf(emfile,"_errsym\n bss EM_WSIZE,0,1\n"); - fprintf(emfile," exa _erlsym\n"); - fprintf(emfile,"_erlsym\n bss EM_WSIZE,0,1\n"); -} - -prolog2() -{ - fprintf(emfile," exp $main\n"); - fprintf(emfile," pro $main,0\n"); - fprintf(emfile," mes 3\n"); - fprintf(emfile," mes 9,0\n"); - /* Trap handling */ - fprintf(emfile," cal $_ini_trp\n"); - fprintf(emfile," exa trpbuf\n"); - fprintf(emfile," lae trpbuf\n"); - fprintf(emfile," cal $setjmp\n"); - fprintf(emfile," asp 4\n"); - fprintf(emfile," lfr %s\n",EMINTSIZE); - fprintf(emfile," dup %s\n",EMINTSIZE); - fprintf(emfile," zeq *0\n"); - fprintf(emfile," lae returns\n"); - fprintf(emfile," csa %s\n",EMINTSIZE); - fprintf(emfile,"0\n"); - fprintf(emfile," asp EM_WSIZE\n"); - /* when data lists are used open its file */ - if( dataused) - { - fprintf(emfile," loc 0\n"); - fprintf(emfile," cal $_setchan\n"); - fprintf(emfile," asp EM_WSIZE\n"); - fprintf(emfile,"datfname\n rom \"%s\\0\"\n", datfname); - fprintf(emfile,"dattyp\n rom \"i\\0\"\n"); - fprintf(emfile,"datfdes\n rom datfname,1,%d\n", - strlen(datfname)); - fprintf(emfile,"dattdes\n rom dattyp,1,1\n"); - fprintf(emfile," lae dattdes\n"); - fprintf(emfile," lae datfdes\n"); - fprintf(emfile," loc 0\n"); - fprintf(emfile," cal $_opnchn\n"); - fprintf(emfile," asp EM_PSIZE\n"); - fprintf(emfile," asp EM_PSIZE\n"); - fprintf(emfile," asp EM_WSIZE\n"); - } - datatable(); -} - -epilogcode() -{ - /* finalization code */ - int nr; - nr= genlabel(); - fprintf(emfile," bra *%d\n",nr); - genreturns(); - fprintf(emfile,"%d\n",nr); - fprintf(emfile," loc 0\n"); - fprintf(emfile," cal $_hlt\n"); - fprintf(emfile," end 0\n"); - fprintf(emfile," mes 4,4\n"); -} diff --git a/lang/basic/src.old/graph.c b/lang/basic/src.old/graph.c deleted file mode 100644 index 0dd22171d..000000000 --- a/lang/basic/src.old/graph.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - - -List *forwardlabel=0; - -Linerecord *firstline, - *currline, - *lastline; - -List *newlist() -{ - List *l; - /*NOSTRICT*/ l= (List *) salloc(sizeof(List)); - return(l); -} - -/* Line management is handled here */ - -Linerecord *srchline(nr) -int nr; -{ - Linerecord *l; - for(l=firstline;l && l->linenr<=nr;l= l->nextline) - if( l->linenr== nr) return(l); - return(0); -} -List *srchforward(nr) -int nr; -{ - List *l; - for(l=forwardlabel;l ;l=l->nextlist) - if( l->linenr== nr) return(l); - return(0); -} -linewarnings() -{ - List *l; - extern int errorcnt; - l= forwardlabel; - while(l) - { - if( !srchline(l->linenr)) - { - fprintf(stderr,"ERROR: line %d not defined\n",l->linenr); - errorcnt++; - } - l=l->nextlist; - } -} - -newblock(nr) -int nr; -{ - Linerecord *l; - List *frwrd; - - if( debug) printf("newblock at %d\n",nr); - if( nr>0 && currline && currline->linenr>= nr) - { - if( debug) printf("old line:%d\n",currline->linenr); - error("Lines out of sequence"); - } - - frwrd=srchforward(nr); - if( frwrd && debug) printf("forward found %d\n",frwrd->emlabel); - l= srchline(nr); - if( l) - { - error("Line redefined"); - nr= -genlabel(); - } - - /* make new EM block structure */ - /*NOSTRICT*/ l= (Linerecord *) salloc(sizeof(*l)); - l->emlabel= frwrd? frwrd->emlabel: genlabel(); - l->linenr= nr; - /* save offset into Tmpfile too */ - l->offset = (long) ftell(Tmpfile); - l->codelines= emlinecount; - - /* insert this record */ - if( firstline) - { - currline->nextline=l; - l->prevline= currline; - lastline= currline=l; - } else - firstline = lastline =currline=l; -} - -gotolabel(nr) -int nr; -{ - /* simulate a goto statement in the line record table */ - Linerecord *l1; - List *ll; - - if(debug) printf("goto label %d\n",nr); - /* update currline */ - ll= newlist(); - ll-> linenr=nr; - ll-> nextlist= currline->gotos; - currline->gotos= ll; - - /* try to generate code */ - l1= srchline(nr); - if( (ll=srchforward(nr))!=0) - nr= ll->emlabel; - else - if( l1==0) - { - /* declare forward label */ - if(debug) printf("declare forward %d\n",nr); - ll= newlist(); - ll->emlabel= genlabel(); - ll-> linenr=nr; - ll->nextlist= forwardlabel; - forwardlabel= ll; - nr= ll->emlabel; - } else - nr= l1->emlabel; - return(nr); -} -gotostmt(nr) -int nr; -{ - emcode("bra",instrlabel(gotolabel(nr))); -} -/* GOSUB-return, assume that proper entries are made to subroutines - only. The return statement is triggered by a fake constant label */ - -List *gosubhead, *gotail; -int gosubcnt=1; - -List *gosublabel() -{ - List *l; - - l= newlist(); - l->nextlist=0; - l->emlabel=genlabel(); - if( gotail){ - gotail->nextlist=l; - gotail=l; - } else gotail= gosubhead=l; - gosubcnt++; - return(l); -} -gosubstmt(lab) -int lab; -{ - List *l; - int nr,n; - - n=gosubcnt; - l= gosublabel(); - nr=gotolabel(lab); - emcode("loc",itoa(n)); /*return index */ - emcode("cal","$_gosub"); /* administer legal return */ - emcode("asp",EMINTSIZE); - emcode("bra",instrlabel(nr)); - fprintf(Tmpfile,"%d\n",l->emlabel); - emlinecount++; -} -genreturns() -{ - int nr; - nr= genlabel(); - fprintf(emfile,"returns\n"); - fprintf(emfile," rom *%d,1,%d\n",nr,gosubcnt-1); - while( gosubhead) - { - fprintf(emfile," rom *%d\n",gosubhead->emlabel); - gosubhead= gosubhead->nextlist; - } - fprintf(emfile,"%d\n",nr); - fprintf(emfile," loc 1\n"); - fprintf(emfile," cal $error\n"); -} -returnstmt() -{ - emcode("cal","$_retstmt"); /* ensure legal return*/ - emcode("lfr",EMINTSIZE); - fprintf(Tmpfile," lae returns\n"); - emlinecount++; - emcode("csa",EMINTSIZE); -} -/* compound goto-gosub statements */ -List *jumphead,*jumptail; -int jumpcnt; - -jumpelm(nr) -int nr; -{ - List *l; - - l= newlist(); - l->emlabel= gotolabel(nr); - l->nextlist=0; - if( jumphead==0) jumphead= jumptail= l; - else { - jumptail->nextlist=l; - jumptail=l; - } - jumpcnt++; -} -ongotostmt(type) -int type; -{ - /* generate the code itself, index in on top of the stack */ - /* blurh, store the number of entries in the descriptor */ - int firstlabel; - int descr; - List *l; - /* create descriptor first */ - descr= genlabel(); - firstlabel=genlabel(); - fprintf(Tmpfile,"l%d\n",descr); emlinecount++; - fprintf(Tmpfile," rom *%d,1,%d\n",firstlabel,jumpcnt-1); emlinecount++; - l= jumphead; - while( l) - { - fprintf(Tmpfile," rom *%d\n",l->emlabel); emlinecount++; - l= l->nextlist; - } - jumphead= jumptail=0; jumpcnt=0; - if(debug) printf("ongotst:%d labels\n", jumpcnt); - conversion(type,INTTYPE); - emcode("lae",datalabel(descr)); - emcode("csa",EMINTSIZE); - fprintf(Tmpfile,"%d\n",firstlabel); emlinecount++; -} -ongosubstmt(type) -int type; -{ - List *l; - int firstlabel; - int descr; - /* create descriptor first */ - descr= genlabel(); - firstlabel=genlabel(); - fprintf(Tmpfile,"l%d\n",descr); emlinecount++; - fprintf(Tmpfile," rom *%d,1,%d\n",firstlabel,jumpcnt-1); emlinecount++; - l= jumphead; - while( l) - { - fprintf(Tmpfile," rom *%d\n",l->emlabel); emlinecount++; - l= l->nextlist; - } - jumphead= jumptail=0; jumpcnt=0; - - l= newlist(); - l->nextlist=0; - l->emlabel=firstlabel; - if( gotail){ - gotail->nextlist=l; - gotail=l; - } else gotail= gosubhead=l; - /* save the return point of the gosub */ - emcode("loc",itoa(gosubcnt)); - emcode("cal","$_gosub"); - emcode("asp",EMINTSIZE); - gosubcnt++; - /* generate gosub */ - conversion(type,INTTYPE); - emcode("lae",datalabel(descr)); - emcode("csa",EMINTSIZE); - fprintf(Tmpfile,"%d\n",firstlabel); - emlinecount++; -} - -/* REGION ANALYSIS and FINAL VERSION GENERATION */ - -simpleprogram() -{ - char buf[512]; - int length; - - /* a small EM programs has been found */ - prologcode(); - prolog2(); - (void) fclose(Tmpfile); - Tmpfile= fopen(tmpfname,"r"); - if( Tmpfile==NULL) - fatal("tmp file disappeared"); - while( (length=fread(buf,1,512,Tmpfile)) != 0) - (void) fwrite(buf,1,length,emfile); - epilogcode(); - (void) unlink(tmpfname); -} diff --git a/lang/basic/src.old/graph.h b/lang/basic/src.old/graph.h deleted file mode 100644 index 82046d514..000000000 --- a/lang/basic/src.old/graph.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -# - -#ifndef NORCSID -# define RCS_GRAPH "$Header$" -#endif - -/* -** The control graph is represented by a multi-list structure. -** The em code is stored on the em intermediate file already -** The offset and length is saved only. -** Although this makes code generation mode involved, it allows -** rather large BASIC programs to be processed. -*/ -typedef struct LIST { - int emlabel; /* em label used with forwards */ - int linenr; /* BASIC line number */ - struct LIST *nextlist; -} List; - -typedef struct LINERECORD{ - int emlabel; /* target label */ - int linenr; /* BASIC line number */ - long offset; /* file offset in em file */ - long codelines; /* number of em code lines */ - List *callers; /* used from where ? */ - List *gotos; /* fanout labels */ - struct LINERECORD *nextline, *prevline; - int fixed; /* fixation of block */ -} Linerecord; - -extern Linerecord *firstline, - *currline, - *lastline; -extern List *forwardlabel; - -extern List *gosublabel(); diff --git a/lang/basic/src.old/initialize.c b/lang/basic/src.old/initialize.c deleted file mode 100644 index 7b71ed6cb..000000000 --- a/lang/basic/src.old/initialize.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" -#include - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - -/* generate temporary files etc */ - -FILE *emfile; -FILE *Tmpfile; -FILE *datfile; - -initialize() -{ - register char *cindex, *cptr ; - - sprintf(tmpfname,"%s/abc%d",TMP_DIR,getpid()); - /* Find the basename */ - /* Strip leading directories */ - cindex= (char *)0 ; - for ( cptr=program ; *cptr ; cptr++ ) if ( *cptr=='/' ) cindex=cptr ; - if ( !cindex ) cindex= program ; - else { - cindex++ ; - if ( !*cindex ) { - warning("Null program name, assuming \"basic\"") ; - cindex= "basic" ; - } - } - cptr=datfname ; - while ( *cptr++ = *cindex++ ) ; - /* Strip trailing suffix */ - if ( cptr>datfname+3 && cptr[-3]=='.' ) cptr[-3]=0 ; - strcat(datfname,".d"); - yyin= fopen(inpfile,"r"); - emfile= fopen(outfile,"w"); - Tmpfile= fopen(tmpfname,"w"); - if( yyin==NULL || emfile== NULL || Tmpfile== NULL ) - fatal("Improper file permissions"); - fillkex(); /* initialize symbol table */ - fprintf(emfile,"#\n"); - fprintf(emfile," mes 2,EM_WSIZE,EM_PSIZE\n"); - initdeftype(); /* set default symbol declarers */ -} diff --git a/lang/basic/src.old/parsepar.c b/lang/basic/src.old/parsepar.c deleted file mode 100644 index c2bd77cac..000000000 --- a/lang/basic/src.old/parsepar.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - -int listing; /* -E listing required */ -int debug; /* -d compiler debugging */ -int wflag=0; /* -w no warnings */ -int hflag=0; /* -h to split EM program */ -int traceflag=0; /* generate line tracing code */ -int nolins=0; /* -l: generate no LIN statements */ - -parseparams(argc,argv) -int argc; -char **argv; -{ - int files=0 ; - int i; - char *ext; - - if(argc< 4) - { - fprintf(stderr,"usage %s \n", argv[0]); - exit(-1); - } - for(i=1;inextline) - if( lr->linenr == lnr) - lr->fixed=1; -} - -fixblock(l) -List *l; -{ - while(l) - { - fix(l->linenr); - l=l->nextlist; - } -} -phase1() -{ - /* copy all offloaded blocks */ - Linerecord *lr, *lf; - long blksize; - - lf= lr= firstline; - blksize= lr->codelines; - while( lr) - { - if( lr->fixed){ - if( !lf->fixed && blksize>threshold) - { - /*move block */ - if(debug) printf("%d %d->%d moved\n", - blksize,lf->linenr, lr->linenr); - } - lf= lr; - blksize= lr->codelines; - } - lr= lr->nextline; - } -} -phase2() -{ - /* copy main procedure */ - prolog2(); - epilogcode(); -} -split() -{ - /* selectively copy the intermediate code to procedures */ - Linerecord *lr; - - if( debug) printf("split EM code using %d\n",threshold); - - /* First consolidate the goto's and caller's */ - lr= firstline; - while(lr) - { - fixblock(lr->callers); - fixblock(lr->gotos); - lr= lr->nextline; - } - - /* Copy the temporary file piecewise */ - prologcode(); - phase1(); - phase2(); -} diff --git a/lang/basic/src.old/symbols.c b/lang/basic/src.old/symbols.c deleted file mode 100644 index a067399b1..000000000 --- a/lang/basic/src.old/symbols.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - -/* Symboltable management module */ - -int deftype[128]; /* default type declarer */ - /* which may be set by OPTION BASE */ - -initdeftype() -{ - int i; - for(i='a';i<='z';i++) deftype[i]= DOUBLETYPE; - for(i='A';i<='Z';i++) deftype[i]= DOUBLETYPE; -} - -int indexbase=0; /* start of array subscripting */ - -Symbol *firstsym = NIL; -Symbol *alternate = NIL; - -Symbol *srchsymbol(str) -char *str; -{ - Symbol *s; - /* search symbol table entry or create it */ - if(debug) printf("srchsymbol %s\n",str); - s=firstsym; - while(s) - { - if( strcmp(s->symname,str)==0) return(s); - s= s->nextsym; - } - /* search alternate list */ - s=alternate; - while(s) - { - if( strcmp(s->symname,str)==0) return(s); - s= s->nextsym; - } - /* not found, create an emty slot */ - /*NOSTRICT*/ s= (Symbol *) salloc(sizeof(Symbol)); - s->symtype= DEFAULTTYPE; - s->nextsym= firstsym; - s->symname= (char *) salloc((unsigned)(strlen(str)+1)); - strcpy(s->symname,str); - firstsym= s; - if(debug) printf("%s allocated\n",str); - return(s); -} - -dcltype(s) -Symbol *s; -{ - /* type declarer */ - int type; - if( s->isparam) return; - type=s->symtype; - if(type==DEFAULTTYPE) - /* use the default rule */ - type= deftype[*s->symname]; - /* generate the emlabel too */ - if( s->symalias==0) - s->symalias= dclspace(type); - s->symtype= type; - if(debug) printf("symbol set to %d\n",type); -} -dclarray(s) -Symbol *s; -{ - int i; int size; - - if( s->symtype==DEFAULTTYPE) s->symtype= DOUBLETYPE; - if(debug) printf("generate space and descriptors for %d\n",s->symtype); - if(debug) printf("dim %d\n",s->dimensions); - s->symalias= genlabel(); - /* generate descriptors */ - size=1; - for(i=0;idimensions;i++) - s->dimalias[i]= genlabel(); - for(i=s->dimensions-1;i>=0;i--) - { - fprintf(emfile,"l%d\n rom %d,%d,%d*%s\n", - s->dimalias[i], - indexbase, - s->dimlimit[i]-indexbase, - size, typesize(s->symtype)); - size = size* (s->dimlimit[i]+1-indexbase); - } - if(debug) printf("size=%d\n",size); - /* size of stuff */ - fprintf(emfile,"l%d\n bss %d*%s,0,1\n", - s->symalias,size,typesize(s->symtype)); - /* Generate the range check descriptors */ - for( i= 0; idimensions;i++) - fprintf(emfile,"r%d\n rom %d,%d\n", - s->dimalias[i], - indexbase, - s->dimlimit[i]); - -} -defarray(s) -Symbol *s; -{ - /* array is used without dim statement, set default limits */ - int i; - for(i=0;idimensions;i++) s->dimlimit[i]=10; - dclarray(s); -} -dclspace(type) -{ - int nr; - nr= genemlabel(); - switch( type) - { - case STRINGTYPE: - fprintf(emfile," bss %s,0,1\n",EMPTRSIZE); - break; - case INTTYPE: - fprintf(emfile," bss %s,0,1\n",EMINTSIZE); - break; - case FLOATTYPE: - case DOUBLETYPE: - fprintf(emfile," bss 8,0.0F %s,1\n",EMFLTSIZE); - break; - } - return(nr); -} - -/* SOME COMPILE TIME OPTIONS */ -optionbase(ival) -int ival; -{ - if( ival<0 || ival>1) - error("illegal option base value"); - else indexbase=ival; -} - -setdefaulttype(type) -int type; -{ - extern char *cptr; - char first,last,i; - - /* handcrafted parser for letter ranges */ - if(debug) printf("deftype:%s\n",cptr); - while( isspace(*cptr)) cptr++; - if( !isalpha(*cptr)) - error("letter expected"); - first= *cptr++; - if(*cptr=='-') - { - /* letter range */ - cptr++; - last= *cptr; - if( !isalpha(last)) - error("letter expected"); - else for(i=first;i<=last;i++) deftype[i]= type; - cptr++; - } else deftype[first]=type; - if( *cptr== ',') - { - cptr++; - setdefaulttype(type); /* try again */ - } -} - -Symbol *fcn; - -newscope(s) -Symbol *s; -{ - if(debug) printf("new scope for %s\n",s->symname); - alternate= firstsym; - firstsym = NIL; - fcn=s; - s->isfunction=1; - if( fcn->dimensions) - error("Array redeclared"); - if( fcn->symtype== DEFAULTTYPE) - fcn->symtype=DOUBLETYPE; -} -/* User defined functions */ -heading( ) -{ - char procname[50]; - sprintf(procname,"$_%s",fcn->symname); - emcode("pro",procname); - if( fcn->symtype== DEFAULTTYPE) - fcn->symtype= DOUBLETYPE; -} -fcnsize() -{ - /* generate portable function size */ - int i; - for(i=0;idimensions;i++) - fprintf(Tmpfile,"%s+",typesize(fcn->dimlimit[i])); - fprintf(Tmpfile,"0\n"); emlinecount++; -} -endscope(type) -int type; -{ - Symbol *s; - - if( debug) printf("endscope"); - conversion(type,fcn->symtype); - emcode("ret", typestring(fcn->symtype)); - /* generate portable EM code */ - fprintf(Tmpfile," end "); - fcnsize(); - s= firstsym; - while(s) - { - firstsym = s->nextsym; - /*NOSTRICT*/ free((char *)s); - s= firstsym; - } - firstsym= alternate; - alternate = NIL; - fcn=NIL; -} - -dclparm(s) -Symbol *s; -{ - int size=0; - if( s->symtype== DEFAULTTYPE) - s->symtype= DOUBLETYPE; - s->isparam=1; - fcn->dimlimit[fcn->dimensions]= s->symtype; - fcn->dimensions++; - /* - OLD STUFF - for(i=fcn->dimensions;i>0;i--) - fcn->dimalias[i]= fcn->dimalias[i-1]; - */ - /*fcn->parmsize += typesize(s->symtype);*/ - /* fcn->dimalias[0]= -typesize(s->symtype)-fcn->dimalias[1];*/ - s->symalias= -fcn->dimensions; - if( debug) printf("parameter %d offset %d\n",fcn->dimensions-1,-size); -} -/* unfortunately function calls have to be stacked as well */ -#define MAXNESTING 50 -Symbol *fcntable[MAXNESTING]; -int fcnindex= -1; - -fcncall(s) -Symbol *s; -{ - if( !s->isfunction) - error("Function not declared"); - else{ - fcn= s; - fcnindex++; - fcntable[fcnindex]=s; - } - return(s->symtype); -} -fcnend(parmcount) -int parmcount; -{ - int type; - /* check number of arguments */ - if( parmcount dimensions) - error("not enough parameters"); - if( parmcount >fcn->dimensions) - error("too many parameters"); - fprintf(Tmpfile," cal $_%s\n",fcn->symname); - emlinecount++; - fprintf(Tmpfile," asp "); - fcnsize(); - emcode("lfr",typestring(fcn->symtype)); - type= fcn->symtype; - fcnindex--; - if( fcnindex>=0) - fcn= fcntable[fcnindex]; - return(type); -} -callparm(ind,type) -int ind,type; -{ - if( fcnindex<0) error("unexpected parameter"); - - if( ind >= fcn->dimensions) - error("too many parameters"); - else - conversion(type,fcn->dimlimit[ind]); -} diff --git a/lang/basic/src.old/symbols.h b/lang/basic/src.old/symbols.h deleted file mode 100644 index 4b4f2ea8d..000000000 --- a/lang/basic/src.old/symbols.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#ifndef NORCSID -# define RCS_SYMB "$Header$" -#endif - -#define NIL 0 -#define TRUE 1 -#define FALSE 0 - -#define DEFAULTTYPE 500 -#define INTTYPE 501 -#define FLOATTYPE 502 -#define DOUBLETYPE 503 -#define STRINGTYPE 504 - -#define ABSSYM 520 -#define ASCSYM 521 -#define ATNSYM 522 -#define CDBLSYM 524 -#define CHRSYM 525 -#define CINTSYM 526 -#define COSSYM 527 -#define CSNGSYM 528 -#define CVISYM 529 -#define CVSSYM 530 -#define CVDSYM 531 -#define EOFSYM 532 -#define EXPSYM 533 -#define FIXSYM 534 -#define FRESYM 535 -#define HEXSYM 536 -#define INPSYM 538 -#define INSTRSYM 539 -#define LEFTSYM 540 -#define LENSYM 541 -#define LOCSYM 542 -#define LOGSYM 543 -#define LPOSSYM 544 -#define MKISYM 546 -#define MKSSYM 547 -#define MKDSYM 548 -#define OCTSYM 549 -#define PEEKSYM 550 -#define POSSYM 551 -#define RIGHTSYM 552 -#define RNDSYM 553 -#define SGNSYM 554 -#define SINSYM 555 -#define SPACESYM 556 -#define SPCSYM 557 -#define SQRSYM 558 -#define STRSYM 559 -#define STRINGSYM 560 -#define TABSYM 561 -#define TANSYM 562 -#define VALSYM 564 -#define VARPTRSYM 565 -/* some stuff forgotten */ -#define INTSYM 567 -#define AUTOSYM 568 -#define LISTSYM 569 -#define LOADSYM 570 -#define MERGESYM 571 -#define TRONSYM 572 -#define TROFFSYM 573 -#define XORSYM 574 -#define EQVSYM 575 -#define IMPSYM 576 -#define OUTSYM 577 - -#define MAXDIMENSIONS 10 - -typedef struct SYMBOL{ - char *symname; - int symalias; - int symtype; - int dimensions; /* dimension array/function */ - int dimlimit[MAXDIMENSIONS]; /* type of parameter */ - int dimalias[MAXDIMENSIONS]; - struct SYMBOL *nextsym; - int isfunction; - int parmsize; - int isparam; -} Symbol; - -extern Symbol *srchsymbol(); diff --git a/lang/basic/src.old/util.c b/lang/basic/src.old/util.c deleted file mode 100644 index 3fc7c71d2..000000000 --- a/lang/basic/src.old/util.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - -#define abs(X) (X>=0?X:-X) -/* Miscelaneous routines can be found here */ - -int errorcnt; - -warning(str) -char *str; -{ - if (! wflag) Xerror("WARNING",str); -} -error(str) -char *str; -{ - Xerror("ERROR",str); - errorcnt++; -} -Xerror(type,str) -char *str; -char *type; -{ - extern int listing,yylineno; - if( !listing) fprintf(stderr,"LINE %d:",yylineno); - fprintf(stderr,"%s:%s\n",type,str); -} -fatal(str) -char *str; -{ - Xerror("FATAL",str); - unlink(tmpfname); - exit(-1); -} -notyetimpl() -{ - warning("not yet implemented"); -} -illegalcmd() -{ - warning("illegal command"); -} -char *itoa(i) -int i; -{ - static char buf[30]; - sprintf(buf,"%d",i); - return(buf); -} -char *instrlabel(i) -int i; -{ - static char buf[30]; - sprintf(buf,"*%d",i); - return(buf); -} -char *datalabel(i) -int i; -{ - static char buf[30]; - if( i>0) - sprintf(buf,"l%d",i); - else sprintf(buf,"%d",-i); - return(buf); -} - -char *salloc(length) -unsigned length; -{ - char *s,*c; - extern char *malloc() ; - s=c= malloc(length); - if ( !s ) fatal("Out of memory") ; - while(length--)*c++ =0; - return(s); -} - -char * proclabel(str) -char *str; -{ - static char buf[50]; - sprintf(buf,"$%s",str); - return(buf); -} diff --git a/lang/basic/src.old/yywrap.c b/lang/basic/src.old/yywrap.c deleted file mode 100644 index 12b6938d5..000000000 --- a/lang/basic/src.old/yywrap.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "bem.h" - -#ifndef NORSCID -static char rcs_id[] = "$Header$" ; -#endif - -/* Author: M.L. Kersten -** yywrap is called upon encountering endoffile on yyin. -** when more input files are present, it moves to the next -** otherwise -1 is returned and simultaneous endofinput is set -*/ -int endofinput =0; - - -yywrap() -{ - if( fclose(yyin) == EOF) - fatal("fclose problems "); - /* check for next input file */ - return(-1); -} diff --git a/lang/cem/cemcom/Makefile.erik b/lang/cem/cemcom/Makefile.erik deleted file mode 100644 index 54035a20e..000000000 --- a/lang/cem/cemcom/Makefile.erik +++ /dev/null @@ -1,718 +0,0 @@ -# $Id$ -# M A K E F I L E F O R A C K C - C O M P I L E R - -# Machine and environ dependent definitions -EMHOME = /usr/em# # ACK tree on this machine -DESTINATION = /user1/$$USER/bin# # where to put the stuff -MKDEP = $(EMHOME)/bin/mkdep# # dependency generator -MAP = -#MAP = -DInsertFile=ins_file -DInsertText=ins_text# bug in m68k2 back end -SIM = /user1/dick/bin/sim# # Dicks sim program -LINT = /usr/new/lint - -# Libraries and EM interface definitions -SYSLIB = $(EMHOME)/modules/lib/libsystem.a -EMKLIB = $(EMHOME)/modules/lib/libemk.a -EMELIB = $(EMHOME)/modules/lib/libeme.a $(EMHOME)/lib/em_data.a -STRLIB = $(EMHOME)/modules/lib/libstring.a -PRTLIB = $(EMHOME)/modules/lib/libprint.a -EMMESLIB = $(EMHOME)/modules/lib/libem_mes.a -INPLIB = $(EMHOME)/modules/lib/libinput.a -ALLOCLIB = $(EMHOME)/modules/lib/liballoc.a -MALLOC = $(EMHOME)/modules/lib/malloc.o -#CH3LIB = $(EMHOME)/modules/lib/libch3.a -CH3LIB = -LIBS = $(INPLIB) $(CH3LIB) $(EMMESLIB) $(EMKLIB) \ - $(PRTLIB) $(STRLIB) $(ALLOCLIB) $(MALLOC) $(SYSLIB) -ELIBS = $(INPLIB) $(CH3LIB) $(EMMESLIB) $(EMELIB) \ - $(PRTLIB) $(STRLIB) $(ALLOCLIB) $(MALLOC) $(SYSLIB) -LIB_INCLUDES = -I$(EMHOME)/modules/h -I$(EMHOME)/modules/pkg -EM_INCLUDES = -I$(EMHOME)/h -SYSLLIB = $(EMHOME)/modules/lib/llib-lsys.ln -EMKLLIB = $(EMHOME)/modules/lib/llib-lemk.ln -EMELLIB = $(EMHOME)/modules/lib/llib-leme.ln -STRLLIB = $(EMHOME)/modules/lib/llib-lstr.ln -PRTLLIB = $(EMHOME)/modules/lib/llib-lprint.ln -EMMESLLIB = $(EMHOME)/modules/lib/llib-lmes.ln -INPLLIB = $(EMHOME)/modules/lib/llib-linput.ln -CH3LLIB = $(EMHOME)/modules/lib/llib-lch3.ln -ALLOCLLIB = $(EMHOME)/modules/lib/llib-alloc.ln -LINTLIBS = -#LINTLIBS = $(CH3LLIB) $(INPLLIB) $(EMMESLLIB) $(EMKLLIB) \ -# $(PRTLLIB) $(STRLLIB) $(SYSLLIB) $(ALLOCLLIB) - -# Where to install the compiler and its driver -CEMCOM = $(DESTINATION)/cemcom -DRIVER = $(DESTINATION)/cem - -# What C compiler to use and how -# CC = $(ACK) -.c -# CC = CC -# CC = /bin/cc -COPTIONS = - -# What parser generator to use and how -GEN = $(EMHOME)/bin/LLgen -GENOPTIONS = -vv - -# Special #defines during compilation -CDEFS = $(MAP) $(EM_INCLUDES) $(LIB_INCLUDES) -CFLAGS = $(CDEFS) $(COPTIONS) -O# we cannot pass the COPTIONS to lint! - -# Grammar files and their objects -LSRC = tokenfile.g declar.g statement.g expression.g program.g ival.g -GLCSRC = tokenfile.c declar.c statement.c expression.c program.c Lpars.c ival.c -LOBJ = tokenfile.o declar.o statement.o expression.o program.o Lpars.o ival.o - -CSRC = main.c idf.c declarator.c decspecs.c struct.c \ - expr.c ch7.c ch7bin.c cstoper.c arith.c \ - asm.c code.c dumpidf.c error.c field.c\ - tokenname.c LLlex.c LLmessage.c \ - input.c domacro.c replace.c init.c options.c \ - scan.c skip.c stack.c type.c ch7mon.c label.c eval.c \ - switch.c conversion.c util.c \ - blocks.c dataflow.c Version.c -# Objects of hand-written C files -COBJ = main.o idf.o declarator.o decspecs.o struct.o \ - expr.o ch7.o ch7bin.o cstoper.o arith.o \ - asm.o code.o dumpidf.o error.o field.o\ - tokenname.o LLlex.o LLmessage.o \ - input.o domacro.o replace.o init.o options.o \ - scan.o skip.o stack.o type.o ch7mon.o label.o eval.o \ - switch.o conversion.o util.o \ - blocks.o dataflow.o Version.o - -# Objects of other generated C files -GCSRC = char.c symbol2str.c next.c -GOBJ = char.o symbol2str.o next.o - -# generated source files -GSRC = char.c symbol2str.c next.c \ - code.h declar.h decspecs.h def.h expr.h field.h estack.h \ - idf.h macro.h stack.h stmt.h struct.h switch.h type.h util.h - -# .h files generated by `make hfiles'; PLEASE KEEP THIS UP-TO-DATE! -GHSRC = botch_free.h dataflow.h debug.h density.h errout.h \ - idfsize.h ifdepth.h inputtype.h inumlength.h lapbuf.h \ - nobitfield.h nofloat.h nopp.h noRoption.h nocross.h \ - nparams.h numsize.h parbufsize.h pathlength.h \ - strsize.h target_sizes.h textsize.h use_tmp.h spec_arith.h static.h \ - reg_count.h - -# Other generated files, for 'make clean' only -GENERATED = tokenfile.g Lpars.h LLfiles LL.output lint.out \ - print Xref lxref hfiles cfiles $(GLCSRC) - -# include files containing ALLOCDEF specifications -NEXTFILES = code.str declar.str decspecs.str def.str expr.str field.str \ - estack.str util.str \ - idf.str macro.str stack.str stmt.str struct.str switch.str type.str - -.SUFFIXES: .str .h -.str.h: - ./make.allocd <$*.str >$*.h - -all: cc - -cc: - make "EMHOME="$(EMHOME) "CC=$(CC)" hfiles - make "EMHOME="$(EMHOME) "CC=$(CC)" LLfiles - make "EMHOME="$(EMHOME) "CC=$(CC)" main - -cem: cem.c - $(CC) -O cem.c $(SYSLIB) -o cem - -lint.cem: cem.c - $(LINT) -bx cem.c - -hfiles: ./make.hfiles Parameters - ./make.hfiles Parameters - @touch hfiles - -LLfiles: $(LSRC) - $(GEN) $(GENOPTIONS) $(LSRC) - @touch LLfiles - -tokenfile.g: tokenname.c make.tokfile - tokenfile.g - -symbol2str.c: tokenname.c make.tokcase - symbol2str.c - -char.c: char.tab - $(EMHOME)/bin/tabgen -fchar.tab >char.c - -next.c: make.next $(NEXTFILES) - ./make.next $(NEXTFILES) >next.c - -code.h: make.allocd -declar.h: make.allocd -decspecs.h: make.allocd -def.h: make.allocd -estack.h: make.allocd -expr.h: make.allocd -field.h: make.allocd -idf.h: make.allocd -macro.h: make.allocd -stack.h: make.allocd -stmt.h: make.allocd -struct.h: make.allocd -switch.h: make.allocd -type.h: make.allocd -util.h: make.allocd - -# Objects needed for 'main' -OBJ = $(COBJ) $(LOBJ) $(GOBJ) -SRC = $(CSRC) $(LCSRC) $(GCSRC) - -main: $(OBJ) Makefile.erik - $(CC) $(COPTIONS) $(LFLAGS) $(OBJ) $(LIBS) -o main - size main - -emain: $(OBJ) Makefile.erik - $(CC) $(COPTIONS) $(LFLAGS) $(OBJ) $(ELIBS) -o emain - size emain - -cfiles: hfiles LLfiles $(GSRC) - @touch cfiles - -install: main cem - cp main $(CEMCOM) - cp cem $(DRIVER) - -print: files - pr `cat files` > print - -tags: cfiles - ctags $(SRC) - -shar: files - shar `cat files` - -listcfiles: - @echo $(SRC) - -listobjects: - @echo $(OBJ) - -depend: cfiles - sed '/^#AUTOAUTO/,$$d' Makefile.erik >Makefile.erik.new - echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >>Makefile.erik.new - $(MKDEP) $(SRC) | sed 's/\.c:/.o:/' >>Makefile.erik.new - mv Makefile.erik Makefile.erik.old - mv Makefile.erik.new Makefile.erik - -xref: - ctags -x `grep "\.[ch]" files`|sed "s/).*/)/">Xref - -lxref: - lxref $(OBJ) -lc >lxref - -lint: lint.main lint.cem - -lint.main: cfiles - $(LINT) -bx $(CDEFS) $(SRC) $(LINTLIBS) >lint.out - -cchk: - cchk $(SRC) - -clean: - rm -f $(LCSRC) $(OBJ) $(GENERATED) $(GSRC) $(GHSRC) - -sim: cfiles - $(SIM) $(SIMFLAGS) $(CSRC) $(GSRC) $(LSRC) - -#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO -main.o: LLlex.h -main.o: Lpars.h -main.o: align.h -main.o: arith.h -main.o: debug.h -main.o: declar.h -main.o: file_info.h -main.o: idf.h -main.o: input.h -main.o: inputtype.h -main.o: level.h -main.o: noRoption.h -main.o: nobitfield.h -main.o: nocross.h -main.o: nofloat.h -main.o: nopp.h -main.o: sizes.h -main.o: spec_arith.h -main.o: specials.h -main.o: target_sizes.h -main.o: tokenname.h -main.o: type.h -main.o: use_tmp.h -idf.o: LLlex.h -idf.o: Lpars.h -idf.o: align.h -idf.o: arith.h -idf.o: assert.h -idf.o: botch_free.h -idf.o: debug.h -idf.o: declar.h -idf.o: decspecs.h -idf.o: def.h -idf.o: file_info.h -idf.o: idf.h -idf.o: idfsize.h -idf.o: label.h -idf.o: level.h -idf.o: noRoption.h -idf.o: nobitfield.h -idf.o: nocross.h -idf.o: nofloat.h -idf.o: nopp.h -idf.o: sizes.h -idf.o: spec_arith.h -idf.o: specials.h -idf.o: stack.h -idf.o: struct.h -idf.o: target_sizes.h -idf.o: type.h -declarator.o: Lpars.h -declarator.o: arith.h -declarator.o: botch_free.h -declarator.o: declar.h -declarator.o: expr.h -declarator.o: idf.h -declarator.o: label.h -declarator.o: nobitfield.h -declarator.o: nocross.h -declarator.o: nofloat.h -declarator.o: nopp.h -declarator.o: sizes.h -declarator.o: spec_arith.h -declarator.o: target_sizes.h -declarator.o: type.h -decspecs.o: Lpars.h -decspecs.o: arith.h -decspecs.o: decspecs.h -decspecs.o: def.h -decspecs.o: level.h -decspecs.o: noRoption.h -decspecs.o: nobitfield.h -decspecs.o: nofloat.h -decspecs.o: spec_arith.h -decspecs.o: type.h -struct.o: LLlex.h -struct.o: Lpars.h -struct.o: align.h -struct.o: arith.h -struct.o: assert.h -struct.o: botch_free.h -struct.o: debug.h -struct.o: def.h -struct.o: field.h -struct.o: file_info.h -struct.o: idf.h -struct.o: level.h -struct.o: noRoption.h -struct.o: nobitfield.h -struct.o: nocross.h -struct.o: nofloat.h -struct.o: nopp.h -struct.o: sizes.h -struct.o: spec_arith.h -struct.o: stack.h -struct.o: struct.h -struct.o: target_sizes.h -struct.o: type.h -expr.o: LLlex.h -expr.o: Lpars.h -expr.o: arith.h -expr.o: botch_free.h -expr.o: declar.h -expr.o: decspecs.h -expr.o: def.h -expr.o: expr.h -expr.o: file_info.h -expr.o: idf.h -expr.o: label.h -expr.o: level.h -expr.o: noRoption.h -expr.o: nobitfield.h -expr.o: nocross.h -expr.o: nofloat.h -expr.o: nopp.h -expr.o: sizes.h -expr.o: spec_arith.h -expr.o: target_sizes.h -expr.o: type.h -ch7.o: Lpars.h -ch7.o: arith.h -ch7.o: assert.h -ch7.o: debug.h -ch7.o: def.h -ch7.o: expr.h -ch7.o: idf.h -ch7.o: label.h -ch7.o: nobitfield.h -ch7.o: nofloat.h -ch7.o: nopp.h -ch7.o: spec_arith.h -ch7.o: struct.h -ch7.o: type.h -ch7bin.o: Lpars.h -ch7bin.o: arith.h -ch7bin.o: botch_free.h -ch7bin.o: expr.h -ch7bin.o: idf.h -ch7bin.o: label.h -ch7bin.o: noRoption.h -ch7bin.o: nobitfield.h -ch7bin.o: nofloat.h -ch7bin.o: nopp.h -ch7bin.o: spec_arith.h -ch7bin.o: struct.h -ch7bin.o: type.h -cstoper.o: Lpars.h -cstoper.o: arith.h -cstoper.o: assert.h -cstoper.o: debug.h -cstoper.o: expr.h -cstoper.o: idf.h -cstoper.o: label.h -cstoper.o: nobitfield.h -cstoper.o: nocross.h -cstoper.o: nofloat.h -cstoper.o: nopp.h -cstoper.o: sizes.h -cstoper.o: spec_arith.h -cstoper.o: target_sizes.h -cstoper.o: type.h -arith.o: Lpars.h -arith.o: arith.h -arith.o: botch_free.h -arith.o: expr.h -arith.o: field.h -arith.o: idf.h -arith.o: label.h -arith.o: mes.h -arith.o: noRoption.h -arith.o: nobitfield.h -arith.o: nofloat.h -arith.o: nopp.h -arith.o: spec_arith.h -arith.o: type.h -code.o: Lpars.h -code.o: arith.h -code.o: assert.h -code.o: atw.h -code.o: botch_free.h -code.o: code.h -code.o: dataflow.h -code.o: debug.h -code.o: declar.h -code.o: decspecs.h -code.o: def.h -code.o: expr.h -code.o: file_info.h -code.o: idf.h -code.o: label.h -code.o: level.h -code.o: noRoption.h -code.o: nobitfield.h -code.o: nocross.h -code.o: nofloat.h -code.o: nopp.h -code.o: sizes.h -code.o: spec_arith.h -code.o: specials.h -code.o: stack.h -code.o: stmt.h -code.o: target_sizes.h -code.o: type.h -code.o: use_tmp.h -dumpidf.o: Lpars.h -dumpidf.o: arith.h -dumpidf.o: debug.h -dumpidf.o: def.h -dumpidf.o: expr.h -dumpidf.o: field.h -dumpidf.o: idf.h -dumpidf.o: label.h -dumpidf.o: nobitfield.h -dumpidf.o: nofloat.h -dumpidf.o: nopp.h -dumpidf.o: spec_arith.h -dumpidf.o: stack.h -dumpidf.o: static.h -dumpidf.o: struct.h -dumpidf.o: type.h -error.o: LLlex.h -error.o: arith.h -error.o: debug.h -error.o: errout.h -error.o: expr.h -error.o: file_info.h -error.o: label.h -error.o: nofloat.h -error.o: nopp.h -error.o: spec_arith.h -error.o: tokenname.h -field.o: Lpars.h -field.o: align.h -field.o: arith.h -field.o: assert.h -field.o: code.h -field.o: debug.h -field.o: expr.h -field.o: field.h -field.o: idf.h -field.o: label.h -field.o: nobitfield.h -field.o: nocross.h -field.o: nofloat.h -field.o: nopp.h -field.o: sizes.h -field.o: spec_arith.h -field.o: target_sizes.h -field.o: type.h -tokenname.o: LLlex.h -tokenname.o: Lpars.h -tokenname.o: arith.h -tokenname.o: file_info.h -tokenname.o: idf.h -tokenname.o: nofloat.h -tokenname.o: nopp.h -tokenname.o: spec_arith.h -tokenname.o: tokenname.h -LLlex.o: LLlex.h -LLlex.o: Lpars.h -LLlex.o: arith.h -LLlex.o: assert.h -LLlex.o: class.h -LLlex.o: debug.h -LLlex.o: def.h -LLlex.o: file_info.h -LLlex.o: idf.h -LLlex.o: idfsize.h -LLlex.o: input.h -LLlex.o: nocross.h -LLlex.o: nofloat.h -LLlex.o: nopp.h -LLlex.o: numsize.h -LLlex.o: sizes.h -LLlex.o: spec_arith.h -LLlex.o: strsize.h -LLlex.o: target_sizes.h -LLmessage.o: LLlex.h -LLmessage.o: Lpars.h -LLmessage.o: arith.h -LLmessage.o: file_info.h -LLmessage.o: idf.h -LLmessage.o: nofloat.h -LLmessage.o: nopp.h -LLmessage.o: spec_arith.h -input.o: file_info.h -input.o: input.h -input.o: inputtype.h -input.o: nopp.h -domacro.o: LLlex.h -domacro.o: Lpars.h -domacro.o: arith.h -domacro.o: assert.h -domacro.o: botch_free.h -domacro.o: class.h -domacro.o: debug.h -domacro.o: file_info.h -domacro.o: idf.h -domacro.o: idfsize.h -domacro.o: ifdepth.h -domacro.o: input.h -domacro.o: interface.h -domacro.o: macro.h -domacro.o: nofloat.h -domacro.o: nopp.h -domacro.o: nparams.h -domacro.o: parbufsize.h -domacro.o: spec_arith.h -domacro.o: textsize.h -replace.o: LLlex.h -replace.o: arith.h -replace.o: assert.h -replace.o: class.h -replace.o: debug.h -replace.o: file_info.h -replace.o: idf.h -replace.o: input.h -replace.o: interface.h -replace.o: macro.h -replace.o: nofloat.h -replace.o: nopp.h -replace.o: pathlength.h -replace.o: spec_arith.h -replace.o: static.h -replace.o: strsize.h -init.o: class.h -init.o: idf.h -init.o: interface.h -init.o: macro.h -init.o: nopp.h -options.o: align.h -options.o: arith.h -options.o: botch_free.h -options.o: class.h -options.o: dataflow.h -options.o: idf.h -options.o: idfsize.h -options.o: macro.h -options.o: noRoption.h -options.o: nobitfield.h -options.o: nocross.h -options.o: nofloat.h -options.o: nopp.h -options.o: sizes.h -options.o: spec_arith.h -options.o: target_sizes.h -options.o: use_tmp.h -scan.o: class.h -scan.o: idf.h -scan.o: input.h -scan.o: interface.h -scan.o: lapbuf.h -scan.o: macro.h -scan.o: nopp.h -scan.o: nparams.h -skip.o: LLlex.h -skip.o: arith.h -skip.o: class.h -skip.o: file_info.h -skip.o: input.h -skip.o: interface.h -skip.o: nofloat.h -skip.o: nopp.h -skip.o: spec_arith.h -stack.o: Lpars.h -stack.o: arith.h -stack.o: botch_free.h -stack.o: debug.h -stack.o: def.h -stack.o: idf.h -stack.o: level.h -stack.o: mes.h -stack.o: noRoption.h -stack.o: nobitfield.h -stack.o: nofloat.h -stack.o: nopp.h -stack.o: spec_arith.h -stack.o: stack.h -stack.o: struct.h -stack.o: type.h -type.o: Lpars.h -type.o: align.h -type.o: arith.h -type.o: botch_free.h -type.o: def.h -type.o: idf.h -type.o: nobitfield.h -type.o: nocross.h -type.o: nofloat.h -type.o: nopp.h -type.o: sizes.h -type.o: spec_arith.h -type.o: target_sizes.h -type.o: type.h -ch7mon.o: Lpars.h -ch7mon.o: arith.h -ch7mon.o: botch_free.h -ch7mon.o: def.h -ch7mon.o: expr.h -ch7mon.o: idf.h -ch7mon.o: label.h -ch7mon.o: nobitfield.h -ch7mon.o: nofloat.h -ch7mon.o: nopp.h -ch7mon.o: spec_arith.h -ch7mon.o: type.h -label.o: Lpars.h -label.o: arith.h -label.o: def.h -label.o: idf.h -label.o: label.h -label.o: level.h -label.o: noRoption.h -label.o: nobitfield.h -label.o: nofloat.h -label.o: nopp.h -label.o: spec_arith.h -label.o: type.h -eval.o: Lpars.h -eval.o: align.h -eval.o: arith.h -eval.o: assert.h -eval.o: atw.h -eval.o: code.h -eval.o: dataflow.h -eval.o: debug.h -eval.o: def.h -eval.o: expr.h -eval.o: idf.h -eval.o: label.h -eval.o: level.h -eval.o: mes.h -eval.o: nobitfield.h -eval.o: nocross.h -eval.o: nofloat.h -eval.o: nopp.h -eval.o: sizes.h -eval.o: spec_arith.h -eval.o: specials.h -eval.o: stack.h -eval.o: target_sizes.h -eval.o: type.h -switch.o: Lpars.h -switch.o: arith.h -switch.o: assert.h -switch.o: botch_free.h -switch.o: code.h -switch.o: debug.h -switch.o: density.h -switch.o: expr.h -switch.o: idf.h -switch.o: label.h -switch.o: noRoption.h -switch.o: nobitfield.h -switch.o: nofloat.h -switch.o: nopp.h -switch.o: spec_arith.h -switch.o: switch.h -switch.o: type.h -conversion.o: Lpars.h -conversion.o: arith.h -conversion.o: nobitfield.h -conversion.o: nocross.h -conversion.o: nofloat.h -conversion.o: sizes.h -conversion.o: spec_arith.h -conversion.o: target_sizes.h -conversion.o: type.h -util.o: Lpars.h -util.o: align.h -util.o: def.h -util.o: nocross.h -util.o: nofloat.h -util.o: regcount.h -util.o: sizes.h -util.o: stack.h -util.o: target_sizes.h -util.o: use_tmp.h -util.o: util.h -blocks.o: Lpars.h -blocks.o: align.h -blocks.o: arith.h -blocks.o: atw.h -blocks.o: label.h -blocks.o: nocross.h -blocks.o: nofloat.h -blocks.o: sizes.h -blocks.o: spec_arith.h -blocks.o: stack.h -blocks.o: target_sizes.h -dataflow.o: dataflow.h -char.o: class.h -symbol2str.o: Lpars.h diff --git a/lang/cem/cemcom/cem.1 b/lang/cem/cemcom/cem.1 deleted file mode 100644 index ea79f3aa6..000000000 --- a/lang/cem/cemcom/cem.1 +++ /dev/null @@ -1,230 +0,0 @@ -.TH CEM 1L 86/11/12 -.SH NAME -cem \- ACK C compiler -.SH SYNOPSIS -.B cem -[ option ] ... file ... -.SH DESCRIPTION -.I Cem -is a -.I cc (1)-like -C compiler that uses the C front-end compiler -.I cemcom (1) -of the Amsterdam Compiler Kit. -.I Cem -interprets its arguments not starting with a '\-' as -source files, to be compiled by the various parts of the compilation process, -which are listed below. -File arguments whose names end with \fB.\fP\fIcharacter\fP are interpreted as -follows: -.IP .[ao] -object file. -.IP .[ci] -C source code -.IP .e -EM assembler source file. -.IP .k -compact EM file, not yet optimized by the EM peephole optimizer. -.IP .m -compact EM file, already optimized by the peephole optimizer. -.IP .s -assembler file. -.LP -The actions to be taken by -.I cem -are directed by the type of file argument and the various options that are -presented to it. -.PP -The following set of options, which is a mixture of options interpreted by -.I cc (1) -and -.I ack (?) -are interpreted by -.I cem . -(The options not specified here are passed to the loader.) -.IP \fB\-B\fP\fIname\fP -Use -.I name -as front-end compiler instead of the default -.I cemcom (1). -.br -Same as "\fB\-Rcem=\fP\fIname\fP". -.IP \fB\-C\fP -Run C preprocessor -.I /lib/cpp -only and prevent it from eliding comments. -.IP \fB\-D\fP\fIname\fP\fB=\fP\fIdef\fP -Define the -.I name -to the preprocessor, as if by "#define". -.IP \fB\-D\fP\fIname\fP -.br -Same as "\fB\-D\fP\fIname\fP\fB=1\fP". -.IP \fB\-E\fP -Run only the macro preprocessor on the named files and send the -result to standard output. -.IP \fB\-I\fP\fIdir\fP -\&"#include" files whose names do not begin with '/' are always -sought first in the directory of the \fIfile\fP argument, then in directories -in \fB\-I\fP options, then in directories on a standard list (which in fact -consists of "/usr/include"). -.IP \fB\-L\fP\fIdir\fP -Use \fIdir\fP as library-containing directory instead of the default. -.IP \fB\-N\fP\fIc\fP -Only effective if ACK pipeline is used. -This option causes some default actions and options to be suppressed, according -to -.I c : -.RS -.IP \fBc\fP -do not convert from EM a.out to local a.out format (i.e., skip the -.B cv -pass.) -.IP \fBl\fP -do not pass the default loader flags to the -.B ld -pass. -.RE -.IP \fB\-P\fP -Same as \fB\-E\fP, but sending the result of input file \fIfile\fP\fB.[ceis]\fP -to \fIfile\fP\fB.i\fP. -.IP \fB\-R\fP -Passed to \fIcemcom\fP(1) in order to parse the named C programs according -to the C language as described in [K&R] (also called \fIRestricted\fP C). -.IP \fB\-R\fP\fIprog\fP\fB=\fP\fIname\fP -.br -Use \fIname\fP as program for phase \fIprog\fP of the compilation instead of -the default. -\&\fIProg\fP is one of the following names: -.RS -.IP \fBcpp\fP -macro preprocessor -.IP \fBcem\fP -front\-end compiler -.IP \fBopt\fP -EM peephole optimizer -.IP \fBdecode\fP -EM compact to EM assembler translator -.IP \fBencode\fP -EM assembler to EM compact translator -.IP \fBbe\fP -EM compact code to target\-machine assembly code compiler -.IP \fBcg\fP -same as \fBbe\fP -.IP \fBas\fP -assembler -.IP \fBld\fP -linker/loader -.IP \fBcv\fP -a.out format converting program (only if ACK pipeline is used) -.RE -.IP \fB\-R\fP\fIprog\fP\fB\-\fP\fIoption\fP -.br -Pass \fB\-\fP\fIoption\fP to the compilation phase indicated by \fIprog\fP. -.IP \fB\-S\fP -Same as \fB\-c.s\fP. -.IP \fB\-U\fP\fIname\fP -.br -Remove any initial definition of \fIname\fP. -.IP \fB\-V\fP\fIcm\fP.\fIn\fP,\ \fB\-V\fIcm\fP.\fIncm\fP.\fIn\fP\ ... -.br -Set the size and alignment requirements of the C constructs of the named -C input files. -The letter \fIc\fP indicates the simple type, which is one of -\fBs\fP(short), \fBi\fP(int), \fBl\fP(long), \fBf\fP(float), \fBd\fP(double) or -\fBp\fP(pointer). -The \fIm\fP parameter can be used to specify the length of the type (in bytes) -and the \fIn\fP parameter for the alignment of that type. -Absence of \fIm\fP or \fIn\fP causes the default value to be retained. -To specify that the bitfields should be right adjusted instead of the -default left adjustment, specify \fBr\fP as \fIc\fP parameter -without parameters. -.br -This option is passed directly to \fIcemcom\fP(1). -.IP \fB\-c\fP -Same as \fB\-c.o\fP. -.IP \fB\-c.e\fP -Produce human-readable EM assembly code on \fIfile\fP\fB.e\fP for the -named files \fIfile\fP\fB.[cikm]\fP -.IP \fB\-c.k\fP -Compile C source \fIfile\fP\fB.[ci]\fP or -encode human-readable EM assembly code from \fIfile\fP\fB.e\fP -into non-optimized compact EM code and write the result on \fIfile\fP\fB.k\fP -.IP \fB\-c.m\fP -Compile C source \fIfile\fP\fB.[ci]\fP, -translate non-optimized EM code from \fIfile\fP\fB.k\fP or -encode EM assembly code from \fIfile\fP\fB.e\fP -into optimized compact EM code and write the result on \fIfile\fP\fB.m\fP -.IP \fB\-c.o\fP -Suppress the loading phase of the compilation, and force an object file to -be produced even if only one program is compiled -.IP \fB\-c.s\fP -Compile the named \fIfile\fP\fB.[ceikm]\fP input files, and leave the -assembly language output on corresponding files suffixed ".s". -.IP \fB\-k\fP -Same as \fB\-c.k\fP. -.IP \fB\-l\fP\fIname\fP -.br -Append the library \fBlib\fP\fIname\fP\fB.a\fP to the list of files that -should be loaded and linked into the final output file. -The library is searched for in the library directory. -.IP \fB\-m\fP -Same as \fB\-c.m\fP. -.IP \fB\-o\fP\ \fIoutput\fP -.br -Name the final output file \fIoutput\fP. -If this option is used, the default "a.out" will be left undisturbed. -.IP \fB\-p\fP -Produce EM profiling code (\fBfil\fP and \fBlin\fP instructions to -enable an interpreter to keep track of the current location in the -source code) -.IP \fB\-t\fP -Keep the intermediate files, produced during the various phases of the -compilation. -The produced files are named \fIfile\fP\fB.\fP\fIcharacter\fP where -\&\fIcharacter\fP indicates the type of the file as listed before. -.IP \fB\-v\fP -Verbose. -Print the commands before they are executed. -.IP \fB\-vn\fP -Do not really execute (for debugging purposes only). -.IP \fB\-vd\fP -Print some additional information (for debugging purposes only). -.IP \fB\-\-\fP\fIanything\fP -.br -Equivalent to \fB\-Rcem\-\-\fP\fIanything\fP. -The options -.B \-\-C , -.B \-\-E -and -.B \-\-P -all have the same effect as respectively -.B \-C , -.B \-E -and -.B \-P -except for the fact that the macro preprocessor is taken to be the -built\-in preprocessor of the \fBcem\fP phase. -Most "\-\-" options are used by -.I cemcom (1) -to set some internal debug switches. -.LP -.SH SEE ALSO -cemcom(1), cc(1), ack(?), as(1), ld(1) -.br -.IP [K&R] -B.W. Kernighan and D.M. Ritchie, \fIThe C Programming Language\fP, -Prentice-Hall, 1978. -.SH DIAGNOSTICS -.I Cem -reports any failure of its components. -.SH BUGS -.IP \(bu -All intermediate files are placed in the current working directory which -causes files with the same name as the intermediate files to be overwritten. -.IP \(bu -.B Cem -only accepts a limited number of arguments to be passed to the components. -(e.g., 256). -.IP \(bu -Please report suggestions and other bugs to erikb@vu44.uucp diff --git a/lang/cem/cemcom/cem.c b/lang/cem/cemcom/cem.c deleted file mode 100644 index 0a0953b82..000000000 --- a/lang/cem/cemcom/cem.c +++ /dev/null @@ -1,764 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* - Driver for the CEMCOM compiler: works like /bin/cc and accepts - most of the options accepted by /bin/cc and /usr/em/bin/ack. - Date written: dec 4, 1985 - Adapted for 68000 (Aug 19, 1986) - Merged the vax and mantra versions (Nov 10, 1986) - Author: Erik Baalbergen -*/ - -#include -#include -#include -#include -#include - -#define MAXARGC 256 /* maximum number of arguments allowed in a list */ -#define USTR_SIZE 1024 /* maximum length of string variable */ - -struct arglist { - int al_argc; - char *al_argv[MAXARGC]; -}; - -/* some system-dependent variables */ -char *PP = "/lib/cpp"; -char *CEM = "/usr/em/lib/em_cemcom"; -char *ENCODE = "/usr/em/lib/em_encode"; -char *DECODE = "/usr/em/lib/em_decode"; -char *OPT = "/usr/em/lib/em_opt"; -char *SHELL = "/bin/sh"; - -#ifndef MANTRA -char *CG = "/usr/em/lib/vax4/cg"; -char *AS = "/bin/as"; -char *AS_FIX = "/user1/erikb/bin/mcomm"; -char *LD = "/bin/ld"; -char *LIBDIR = "/user1/cem/lib"; -char *V_FLAG = "-Vs2.2w4.4i4.4l4.4f4.4d8.4p4.4"; -#else MANTRA -char *CG = "/usr/em/lib/m68k2/cg"; -char *AS = "/usr/em/lib/m68k2/as"; -char *LD = "/usr/em/lib/em_led"; -char *CV = "/usr/em/lib/m68k2/cv"; -char *LIBDIR = "/usr/em/lib/m68k2"; -char *V_FLAG = "-Vs2.2w2.2i2.2l4.2f4.2d8.2p4.2"; -#endif MANTRA - -struct arglist LD_HEAD = { - 2, - { -#ifndef MANTRA - "/usr/em/lib/vax4/head_em", - "/usr/em/lib/vax4/head_cc" -#else MANTRA - "/usr/em/lib/m68k2/head_em", - "/usr/em/lib/m68k2/head_cc" -#endif MANTRA - } -}; - -struct arglist LD_TAIL = { -#ifndef MANTRA - 4, - { - "/user1/cem/lib/libc.a", - "/user1/cem/lib/stb.o", - "/usr/em/lib/vax4/tail_mon", - "/usr/em/lib/vax4/tail_em" - } -#else MANTRA - 7, - { - "/usr/em/lib/m68k2/tail_cc.1s", - "/usr/em/lib/m68k2/tail_cc.2g", - "/usr/em/lib/m68k2/tail_cem", - "/usr/em/lib/m68k2/tail_fp.a", - "/usr/em/lib/m68k2/tail_em.rt", - "/usr/em/lib/m68k2/tail_mon", - "/usr/em/lib/m68k2/end_em" - } -#endif MANTRA -}; - -char *o_FILE = "a.out"; -#ifdef MANTRA -char *cv_FILE = "cv.out"; -#endif MANTRA - -#define remove(str) (((FLAG(t) == 0) && unlink(str)), (str)[0] = '\0') -#define cleanup(str) (str && remove(str)) -#define mkname(dst, s1, s2) mkstr(dst, (s1), (s2), 0) -#define init(al) (al)->al_argc = 1 -#define library(nm) \ - mkstr(alloc((unsigned int)strlen(nm) + strlen(LIBDIR) + 7), \ - LIBDIR, "/lib", nm, ".a", 0) - -struct arglist SRCFILES, LDFILES, GEN_LDFILES, PP_FLAGS, CEM_FLAGS, - OPT_FLAGS, DECODE_FLAGS, ENCODE_FLAGS, CG_FLAGS, AS_FLAGS, - O_FLAGS, DEBUG_FLAGS, CALL_VEC; - -#ifndef MANTRA -struct arglist LD_FLAGS; -#else MANTRA -struct arglist LD_FLAGS = { - 5, - { - "-b0:0x80000", - "-a0:2", - "-a1:2", - "-a2:2", - "-a3:2" - } -}; -struct arglist CV_FLAGS; -int Nc_flag = 0; -#endif MANTRA - -/* option naming */ -#define NAME(chr) chr -#define FLAG(chr) NAME(chr)_flag -int E_flag, P_flag, S_flag, c_flag, e_flag, k_flag, - m_flag, o_flag, t_flag, v_flag; - -/* various passes */ -struct prog { - char *p_name; - char **p_task; - struct arglist *p_flags; -} ProgParts[] = { - { "cpp", &PP, &PP_FLAGS }, - { "cem", &CEM, &CEM_FLAGS }, - { "opt", &OPT, &OPT_FLAGS }, - { "decode", &DECODE, &DECODE_FLAGS }, - { "encode", &ENCODE, &ENCODE_FLAGS }, - { "be", &CG, &CG_FLAGS }, - { "cg", &CG, &CG_FLAGS }, - { "as", &AS, &AS_FLAGS }, - { "ld", &LD, &LD_FLAGS }, -#ifdef MANTRA - { "cv", &CV, &CV_FLAGS }, -#endif MANTRA - { 0, 0, 0 } -}; - -/* various forward declarations */ -int trap(); -char *mkstr(); -char *alloc(); -long sizeof_file(); - -/* various globals */ -char *ProgCall = 0; -int debug = 0; -int exec = 1; -int RET_CODE = 0; - -main(argc, argv) - char *argv[]; -{ - char *str, **argvec, *file, *ldfile = 0; - int count, ext; - char Nfile[USTR_SIZE], kfile[USTR_SIZE], sfile[USTR_SIZE], - mfile[USTR_SIZE], ofile[USTR_SIZE], BASE[USTR_SIZE]; - register struct arglist *call = &CALL_VEC; - - set_traps(trap); - ProgCall = *argv++; - append(&CEM_FLAGS, "-L"); - while (--argc > 0) { - if (*(str = *argv++) != '-') { - append(&SRCFILES, str); - continue; - } - switch (str[1]) { - case '-': - switch (str[2]) { - case 'C': - case 'E': - case 'P': - FLAG(E) = 1; - append(&PP_FLAGS, str); - PP = CEM; - FLAG(P) = (str[2] == 'P'); - break; - default: - append(&DEBUG_FLAGS, str); - break; - } - break; - case 'B': - PP = CEM = &str[2]; - break; - case 'C': - case 'E': - case 'P': - FLAG(E) = 1; - append(&PP_FLAGS, str); - FLAG(P) = (str[1] == 'P'); - break; - case 'c': - if (str[2] == '.') { - switch (str[3]) { - case 's': - FLAG(S) = 1; - break; - case 'k': - FLAG(k) = 1; - break; - case 'o': - FLAG(c) = 1; - break; - case 'm': - FLAG(m) = 1; - break; - case 'e': - FLAG(e) = 1; - break; - default: - bad_option(str); - } - } - else - if (str[2] == '\0') - FLAG(c) = 1; - else - bad_option(str); - break; - case 'D': - case 'I': - case 'U': - append(&PP_FLAGS, str); - break; - case 'k': - FLAG(k) = 1; - break; - case 'l': - if (str[2] == '\0') /* no standard libraries */ - LD_HEAD.al_argc = LD_TAIL.al_argc = 0; - else /* use library from library directory */ - append(&SRCFILES, library(&str[2])); - break; - case 'L': /* change default library directory */ - LIBDIR = &str[2]; - break; - case 'm': - FLAG(m) = 1; - break; -#ifdef MANTRA - case 'N': - switch (str[2]) { - case 'c': /* no a.out conversion */ - Nc_flag = 1; - break; - case 'l': /* no default options to led */ - LD_FLAGS.al_argc = 0; - break; - default: - bad_option(str); - } - break; -#endif MANTRA - case 'o': - FLAG(o) = 1; - if (argc-- < 0) - bad_option(str); - else - o_FILE = *argv++; - break; - case 'O': - append(&O_FLAGS, "-O"); - break; - case 'R': - if (str[2] == '\0') - append(&CEM_FLAGS, str); - else - Roption(str); - break; - case 'S': - FLAG(S) = 1; - break; - case 't': - FLAG(t) = 1; - break; - case 'v': /* set debug switches */ - FLAG(v) = 1; - switch (str[2]) { - case 'd': - debug = 1; - break; - case 'n': /* no execute */ - exec = 0; - break; - case '\0': - break; - default: - bad_option(str); - } - break; - case 'V': - V_FLAG = str; - break; - default: - append(&LD_FLAGS, str); - } - } - if (debug) report("Note: debug output"); - if (exec == 0) - report("Note: no execution"); - count = SRCFILES.al_argc; - argvec = &(SRCFILES.al_argv[0]); - Nfile[0] = '\0'; - while (count-- > 0) { - basename(file = *argvec++, BASE); - if (FLAG(E)) { - char ifile[USTR_SIZE]; - - init(call); - append(call, PP); - concat(call, &DEBUG_FLAGS); - concat(call, &PP_FLAGS); - append(call, file); - runvec(call, FLAG(P) ? mkname(ifile, BASE, ".i") : 0); - continue; - } - ext = extension(file); - /* .c to .k and .N */ - if (ext == 'c' || ext == 'i') { - init(call); - append(call, CEM); - concat(call, &DEBUG_FLAGS); - append(call, V_FLAG); - concat(call, &CEM_FLAGS); - concat(call, &PP_FLAGS); - append(call, file); - append(call, mkname(kfile, BASE, ".k")); - append(call, mkname(Nfile, BASE, ".N")); - if (runvec(call, (char *)0)) { - file = kfile; - ext = 'k'; - if (sizeof_file(Nfile) <= 0L) - remove(Nfile); - } - else { - remove(kfile); - remove(Nfile); - continue; - } - } - /* .e to .k */ - if (ext == 'e') { - init(call); - append(call, ENCODE); - concat(call, &ENCODE_FLAGS); - append(call, file); - append(call, mkname(kfile, BASE, ".k")); - if (runvec(call, (char *)0) == 0) - continue; - file = kfile; - ext = 'k'; - } - if (FLAG(k)) - continue; - /* decode .k or .m */ - if (FLAG(e) && (ext == 'k' || ext == 'm')) { - char efile[USTR_SIZE]; - init(call); - append(call, DECODE); - concat(call, &DECODE_FLAGS); - append(call, file); - append(call, mkname(efile, BASE, ".e")); - runvec(call, (char *)0); - cleanup(kfile); - continue; - } - /* .k to .m */ - if (ext == 'k') { - init(call); - append(call, OPT); - concat(call, &OPT_FLAGS); - append(call, file); - if (runvec(call, mkname(mfile, BASE, ".m")) == 0) - continue; - file = mfile; - ext = 'm'; - cleanup(kfile); - } - if (FLAG(m)) - continue; - /* .m to .s */ - if (ext == 'm') { - init(call); - append(call, CG); - concat(call, &CG_FLAGS); - append(call, file); - append(call, mkname(sfile, BASE, ".s")); - if (runvec(call, (char *)0) == 0) - continue; - if (Nfile[0] != '\0') { -#ifndef MANTRA - init(call); - append(call, AS_FIX); - append(call, Nfile); - append(call, sfile); - runvec(call, (char *)0); -#endif MANTRA - remove(Nfile); - } - cleanup(mfile); - file = sfile; - ext = 's'; - } - if (FLAG(S)) - continue; - /* .s to .o */ - if (ext == 's') { - ldfile = FLAG(c) ? - ofile : - alloc((unsigned)strlen(BASE) + 3); - init(call); - append(call, AS); - concat(call, &AS_FLAGS); -#ifdef MANTRA - append(call, "-"); -#endif MANTRA - append(call, "-o"); - append(call, mkname(ldfile, BASE, ".o")); - append(call, file); - if (runvec(call, (char *)0) == 0) - continue; - file = ldfile; - ext = 'o'; - cleanup(sfile); - } - if (FLAG(c)) - continue; - append(&LDFILES, file); - if (ldfile) { - append(&GEN_LDFILES, ldfile); - ldfile = 0; - } - } - /* *.o to a.out */ - if (RET_CODE == 0 && LDFILES.al_argc > 0) { - init(call); - append(call, LD); - concat(call, &LD_FLAGS); - append(call, "-o"); -#ifndef MANTRA - append(call, o_FILE); -#else MANTRA - append(call, Nc_flag ? o_FILE : cv_FILE); -#endif MANTRA - concat(call, &LD_HEAD); - concat(call, &LDFILES); - concat(call, &LD_TAIL); - if (runvec(call, (char *)0)) { - register i = GEN_LDFILES.al_argc; - - while (i-- > 0) - remove(GEN_LDFILES.al_argv[i]); -#ifdef MANTRA - /* convert to local a.out format */ - if (Nc_flag == 0) { - init(call); - append(call, CV); - concat(call, &CV_FLAGS); - append(call, cv_FILE); - append(call, o_FILE); - if (runvec(call, (char *)0)) - remove(cv_FILE); - } -#endif MANTRA - } - } - exit(RET_CODE); -} - -#define BUFSIZE (USTR_SIZE * MAXARGC) -char alloc_buf[BUFSIZE]; - -char * -alloc(u) - unsigned u; -{ - static char *bufptr = &alloc_buf[0]; - register char *p = bufptr; - - if ((bufptr += u) >= &alloc_buf[BUFSIZE]) - panic("no space"); - return p; -} - -append(al, arg) - register struct arglist *al; - char *arg; -{ - if (al->al_argc >= MAXARGC) - panic("argument list overflow"); - al->al_argv[(al->al_argc)++] = arg; -} - -concat(al1, al2) - struct arglist *al1, *al2; -{ - register int i = al2->al_argc; - register char **p = &(al1->al_argv[al1->al_argc]); - register char **q = &(al2->al_argv[0]); - - if ((al1->al_argc += i) >= MAXARGC) - panic("argument list overflow"); - while (i-- > 0) - *p++ = *q++; -} - -/* The next function is a dirty old one, taking a variable number of - arguments. - Take care that the last argument is a null-valued pointer! -*/ -/*VARARGS1*/ -char * -mkstr(dst, arg) - char *dst, *arg; -{ - char **vec = (char **) &arg; - register char *p; - register char *q = dst; - - while (p = *vec++) { - while (*q++ = *p++); - q--; - } - return dst; -} - -Roption(str) - char *str; /* of the form "prog=/-arg" */ -{ - char *eq; - char *prog, *arg; - char bc; - char *cindex(); - - prog = &str[2]; - if (eq = cindex(prog, '=')) - bc = '='; - else - if (eq = cindex(prog, '-')) - bc = '-'; - else { - bad_option(str); - return; - } - *eq++ = '\0'; - if (arg = eq) { - char *opt = 0; - struct prog *pp = &ProgParts[0]; - - if (bc == '-') - opt = mkstr(alloc((unsigned)strlen(arg) + 2), - "-", arg, 0); - while (pp->p_name) { - if (strcmp(prog, pp->p_name) == 0) { - if (opt) - append(pp->p_flags, opt); - else - *(pp->p_task) = arg; - return; - } - pp++; - } - } - bad_option(str); -} - -basename(str, dst) - char *str; - register char *dst; -{ - register char *p1 = str; - register char *p2 = p1; - - while (*p1) - if (*p1++ == '/') - p2 = p1; - p1--; - if (*--p1 == '.') { - *p1 = '\0'; - while (*dst++ = *p2++) {} - *p1 = '.'; - } - else - while (*dst++ = *p2++) {} -} - -int -extension(fn) - register char *fn; -{ - char c; - - while (*fn++) {} - fn--; - c = *--fn; - return (*--fn == '.') ? c : 0; -} - -long -sizeof_file(nm) - char *nm; -{ - struct stat stbuf; - - if (stat(nm, &stbuf) == 0) - return stbuf.st_size; - return -1; -} - -char * sysmsg[] = { - 0, - "Hangup", - "Interrupt", - "Quit", - "Illegal instruction", - "Trace/BPT trap", - "IOT trap", - "EMT trap", - "Floating exception", - "Killed", - "Bus error", - "Memory fault", - "Bad system call", - "Broken pipe", - "Alarm call", - "Terminated", - "Signal 16" -}; - -runvec(vec, outp) - struct arglist *vec; - char *outp; -{ - int status, fd; - char *task = vec->al_argv[1]; - - vec->al_argv[vec->al_argc] = 0; - if (FLAG(v)) - print_vec(vec); - if (exec == 0) - return 1; - if (fork() == 0) { /* start up the process */ - extern int errno; - if (outp) { /* redirect standard output */ - close(1); - if ((fd = creat(outp, 0666)) < 0) - panic("cannot create %s", outp); - if (fd != 1) - panic("illegal redirection"); - } - if (debug) report("exec %s", task); - execv(task, &(vec->al_argv[1])); - /* not an a.out file, let's try it with the SHELL */ - if (debug) report("try it with %s", SHELL); - if (errno == ENOEXEC) { - vec->al_argv[0] = SHELL; - execv(SHELL, &(vec->al_argv[0])); - } - /* failed, so ... */ - panic("cannot execute %s", task); - exit(1); - } - else { - int loworder, highorder, sig; - - wait(&status); - loworder = status & 0377; - highorder = (status >> 8) & 0377; - if (loworder == 0) { - if (highorder) - report("%s: exit status %d", task, highorder); - return highorder ? ((RET_CODE = 1), 0) : 1; - } - else { - sig = loworder & 0177; - if (sig == 0177) - report("%s: stopped by ptrace", task); - else - if (sysmsg[sig]) - report("%s: %s%s", task, sysmsg[sig], - (loworder & 0200) - ? " - core dumped" - : ""); - RET_CODE = 1; - return 0; - } - } - /*NOTREACHED*/ -} - -bad_option(str) - char *str; -{ - report("bad option %s", str); -} - -/*VARARGS1*/ -report(fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) - char *fmt; -{ - fprintf(stderr, "%s: ", ProgCall); - fprintf(stderr, fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - fprintf(stderr, "\n"); -} - -/*VARARGS1*/ -panic(fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) - char *fmt; -{ - fprintf(stderr, "%s: ", ProgCall); - fprintf(stderr, fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - fprintf(stderr, "\n"); - exit(1); -} - -set_traps(f) - int (*f)(); -{ - signal(SIGHUP, f); - signal(SIGINT, f); - signal(SIGQUIT, f); - signal(SIGALRM, f); - signal(SIGTERM, f); -} - -/*ARGSUSED*/ -trap(sig) -{ - set_traps(SIG_IGN); - panic("Trapped"); -} - -print_vec(vec) - struct arglist *vec; -{ - register i; - - for (i = 1; i < vec->al_argc; i++) - printf("%s ", vec->al_argv[i]); - printf("\n"); -} - -char * -cindex(s, c) - char *s, c; -{ - while (*s) - if (*s++ == c) - return s - 1; - return (char *) 0; -}