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