1: # include "r.h" 2: 3: char *keyword [] = { 4: "do", 5: "if", 6: "else", 7: "for", 8: "repeat", 9: "until", 10: "while", 11: "break", 12: "next", 13: "define", 14: "include", 15: "return", 16: "switch", 17: "case", 18: "default", 19: 0}; 20: 21: int keytran[] = { 22: DO, 23: IF, 24: ELSE, 25: FOR, 26: REPEAT, 27: UNTIL, 28: WHILE, 29: BREAK, 30: NEXT, 31: DEFINE, 32: INCLUDE, 33: RETURN, 34: SWITCH, 35: CASE, 36: DEFAULT, 37: 0}; 38: 39: char *fcnloc; /* spot for "function" */ 40: 41: int svargc; 42: char **svargv; 43: char *curfile[10] = { "" }; 44: int infptr = 0; 45: FILE *outfil = { stdout }; 46: FILE *infile[10] = { stdin }; 47: int linect[10]; 48: 49: int contfld = CONTFLD; /* place to put continuation char */ 50: int printcom = 0; /* print comments if on */ 51: int hollerith = 0; /* convert "..." to 27H... if on */ 52: 53: #ifdef gcos 54: char *ratfor "tssrat"; 55: int bcdrat[2]; 56: char *bwkmeter ". bwkmeter "; 57: int bcdbwk[5]; 58: #endif 59: 60: main(argc,argv) int argc; char **argv; { 61: int i; 62: while(argc>1 && argv[1][0]=='-') { 63: if(argv[1][1]=='6') { 64: contfld=6; 65: if (argv[1][2]!='\0') 66: contchar = argv[1][2]; 67: } else if (argv[1][1] == 'C') 68: printcom++; 69: else if (argv[1][1] == 'h') 70: hollerith++; 71: argc--; 72: argv++; 73: } 74: 75: #ifdef gcos 76: if (!intss()) { 77: _fixup(); 78: ratfor = "batrat"; 79: } 80: ascbcd(ratfor,bcdrat,6); 81: ascbcd(bwkmeter,bcdbwk,24); 82: acdata(bcdrat[0],1); 83: acupdt(bcdbwk[0]); 84: if (!intss()) { 85: if ((infile[infptr]=fopen("s*", "r")) == NULL) 86: cant("s*"); 87: if ((outfil=fopen("*s", "w")) == NULL) 88: cant("*s"); 89: } 90: #endif 91: 92: svargc = argc; 93: svargv = argv; 94: if (svargc > 1) 95: putbak('\0'); 96: for (i=0; keyword[i]; i++) 97: install(keyword[i], "", keytran[i]); 98: fcnloc = install("function", "", 0); 99: yyparse(); 100: #ifdef gcos 101: if (!intss()) 102: bexit(errorflag); 103: #endif 104: exit(errorflag); 105: } 106: 107: #ifdef gcos 108: bexit(status) { 109: /* this is the batch version of exit for gcos tss */ 110: FILE *inf, *outf; 111: char c; 112: 113: fclose(stderr); /* make sure diagnostics get flushed */ 114: if (status) /* abort */ 115: _nogud(); 116: 117: /* good: copy output back to s*, call forty */ 118: 119: fclose(outfil,"r"); 120: fclose(infile[0],"r"); 121: inf = fopen("*s", "r"); 122: outf = fopen("s*", "w"); 123: while ((c=getc(inf)) != EOF) 124: putc(c, outf); 125: fclose(inf,"r"); 126: fclose(outf,"r"); 127: __imok(); 128: } 129: #endif 130: 131: cant(s) char *s; { 132: linect[infptr] = 0; 133: curfile[infptr] = s; 134: error("can't open"); 135: exit(1); 136: } 137: 138: inclstat() { 139: int c; 140: char *ps; 141: char fname[100]; 142: while ((c = getchr()) == ' ' || c == '\t'); 143: if (c == '(') { 144: for (ps=fname; (*ps=getchr()) != ')'; ps++); 145: *ps = '\0'; 146: } else if (c == '"' || c == '\'') { 147: for (ps=fname; (*ps=getchr()) != c; ps++); 148: *ps = '\0'; 149: } else { 150: putbak(c); 151: for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++); 152: *ps = '\0'; 153: } 154: if ((infile[++infptr] = fopen(fname,"r")) == NULL) { 155: cant(fname); 156: exit(1); 157: } 158: linect[infptr] = 0; 159: curfile[infptr] = fname; 160: } 161: 162: char str[500]; 163: int nstr; 164: 165: yylex() { 166: int c, t; 167: for (;;) { 168: while ((c=gtok(str))==' ' || c=='\n' || c=='\t') 169: ; 170: yylval = c; 171: if (c==';' || c=='{' || c=='}') 172: return(c); 173: if (c==EOF) 174: return(0); 175: yylval = (int) str; 176: if (c == DIG) 177: return(DIGITS); 178: t = lookup(str)->ydef; 179: if (t==DEFINE) 180: defstat(); 181: else if (t==INCLUDE) 182: inclstat(); 183: else if (t > 0) 184: return(t); 185: else 186: return(GOK); 187: } 188: } 189: 190: int dbg = 0; 191: 192: yyerror(p) char *p; {;} 193: 194: 195: defstat() { 196: int c,i,val,t,nlp; 197: extern int nstr; 198: extern char str[]; 199: while ((c=getchr())==' ' || c=='\t'); 200: if (c == '(') { 201: t = '('; 202: while ((c=getchr())==' ' || c=='\t'); 203: putbak(c); 204: } 205: else { 206: t = ' '; 207: putbak(c); 208: } 209: for (nstr=0; c=getchr(); nstr++) { 210: if (type[c] != LET && type[c] != DIG) 211: break; 212: str[nstr] = c; 213: } 214: putbak(c); 215: str[nstr] = '\0'; 216: if (c != ' ' && c != '\t' && c != '\n' && c != ',') { 217: error("illegal define statement"); 218: return; 219: } 220: val = nstr+1; 221: if (t == ' ') { 222: while ((c=getchr())==' ' || c=='\t'); 223: putbak(c); 224: for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++) 225: str[i] = c; 226: putbak(c); 227: } else { 228: while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n'); 229: putbak(c); 230: nlp = 0; 231: for (i=val; nlp>=0 && (c=str[i]=getchr()); i++) 232: if (c == '(') 233: nlp++; 234: else if (c == ')') 235: nlp--; 236: i--; 237: } 238: for ( ; i>0; i--) 239: if (str[i-1] != ' ' && str[i-1] != '\t') 240: break; 241: str[i] = '\0'; 242: install(str, &str[val], 0); 243: }