# include "r.h" char *keyword [] = { "do", "if", "else", "for", "repeat", "until", "while", "break", "next", "define", "include", "return", "switch", "case", "default", 0}; int keytran[] = { DO, IF, ELSE, FOR, REPEAT, UNTIL, WHILE, BREAK, NEXT, DEFINE, INCLUDE, RETURN, SWITCH, CASE, DEFAULT, 0}; char *fcnloc; /* spot for "function" */ int svargc; char **svargv; char *curfile[10] = { "" }; int infptr = 0; FILE *outfil = { stdout }; FILE *infile[10] = { stdin }; int linect[10]; int contfld = CONTFLD; /* place to put continuation char */ int printcom = 0; /* print comments if on */ int hollerith = 0; /* convert "..." to 27H... if on */ #ifdef gcos char *ratfor "tssrat"; int bcdrat[2]; char *bwkmeter ". bwkmeter "; int bcdbwk[5]; #endif main(argc,argv) int argc; char **argv; { int i; while(argc>1 && argv[1][0]=='-') { if(argv[1][1]=='6') { contfld=6; if (argv[1][2]!='\0') contchar = argv[1][2]; } else if (argv[1][1] == 'C') printcom++; else if (argv[1][1] == 'h') hollerith++; argc--; argv++; } #ifdef gcos if (!intss()) { _fixup(); ratfor = "batrat"; } ascbcd(ratfor,bcdrat,6); ascbcd(bwkmeter,bcdbwk,24); acdata(bcdrat[0],1); acupdt(bcdbwk[0]); if (!intss()) { if ((infile[infptr]=fopen("s*", "r")) == NULL) cant("s*"); if ((outfil=fopen("*s", "w")) == NULL) cant("*s"); } #endif svargc = argc; svargv = argv; if (svargc > 1) putbak('\0'); for (i=0; keyword[i]; i++) install(keyword[i], "", keytran[i]); fcnloc = install("function", "", 0); yyparse(); #ifdef gcos if (!intss()) bexit(errorflag); #endif exit(errorflag); } #ifdef gcos bexit(status) { /* this is the batch version of exit for gcos tss */ FILE *inf, *outf; char c; fclose(stderr); /* make sure diagnostics get flushed */ if (status) /* abort */ _nogud(); /* good: copy output back to s*, call forty */ fclose(outfil,"r"); fclose(infile[0],"r"); inf = fopen("*s", "r"); outf = fopen("s*", "w"); while ((c=getc(inf)) != EOF) putc(c, outf); fclose(inf,"r"); fclose(outf,"r"); __imok(); } #endif cant(s) char *s; { linect[infptr] = 0; curfile[infptr] = s; error("can't open"); exit(1); } inclstat() { int c; char *ps; char fname[100]; while ((c = getchr()) == ' ' || c == '\t'); if (c == '(') { for (ps=fname; (*ps=getchr()) != ')'; ps++); *ps = '\0'; } else if (c == '"' || c == '\'') { for (ps=fname; (*ps=getchr()) != c; ps++); *ps = '\0'; } else { putbak(c); for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++); *ps = '\0'; } if ((infile[++infptr] = fopen(fname,"r")) == NULL) { cant(fname); exit(1); } linect[infptr] = 0; curfile[infptr] = fname; } char str[500]; int nstr; yylex() { int c, t; for (;;) { while ((c=gtok(str))==' ' || c=='\n' || c=='\t') ; yylval = c; if (c==';' || c=='{' || c=='}') return(c); if (c==EOF) return(0); yylval = (int) str; if (c == DIG) return(DIGITS); t = lookup(str)->ydef; if (t==DEFINE) defstat(); else if (t==INCLUDE) inclstat(); else if (t > 0) return(t); else return(GOK); } } int dbg = 0; yyerror(p) char *p; {;} defstat() { int c,i,val,t,nlp; extern int nstr; extern char str[]; while ((c=getchr())==' ' || c=='\t'); if (c == '(') { t = '('; while ((c=getchr())==' ' || c=='\t'); putbak(c); } else { t = ' '; putbak(c); } for (nstr=0; c=getchr(); nstr++) { if (type[c] != LET && type[c] != DIG) break; str[nstr] = c; } putbak(c); str[nstr] = '\0'; if (c != ' ' && c != '\t' && c != '\n' && c != ',') { error("illegal define statement"); return; } val = nstr+1; if (t == ' ') { while ((c=getchr())==' ' || c=='\t'); putbak(c); for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++) str[i] = c; putbak(c); } else { while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n'); putbak(c); nlp = 0; for (i=val; nlp>=0 && (c=str[i]=getchr()); i++) if (c == '(') nlp++; else if (c == ')') nlp--; i--; } for ( ; i>0; i--) if (str[i-1] != ' ' && str[i-1] != '\t') break; str[i] = '\0'; install(str, &str[val], 0); }