1*14503Ssam #ifndef lint 2*14503Ssam static char sccsid[] = "@(#)rlex.c 1.2 (Berkeley) 08/11/83"; 3*14503Ssam #endif 4*14503Ssam 59729Sclemc # include "r.h" 69729Sclemc 79729Sclemc char *keyword [] = { 89729Sclemc "do", 99729Sclemc "if", 109729Sclemc "else", 119729Sclemc "for", 129729Sclemc "repeat", 139729Sclemc "until", 149729Sclemc "while", 159729Sclemc "break", 169729Sclemc "next", 179729Sclemc "define", 189729Sclemc "include", 199729Sclemc "return", 209729Sclemc "switch", 219729Sclemc "case", 229729Sclemc "default", 239729Sclemc 0}; 249729Sclemc 259729Sclemc int keytran[] = { 269729Sclemc DO, 279729Sclemc IF, 289729Sclemc ELSE, 299729Sclemc FOR, 309729Sclemc REPEAT, 319729Sclemc UNTIL, 329729Sclemc WHILE, 339729Sclemc BREAK, 349729Sclemc NEXT, 359729Sclemc DEFINE, 369729Sclemc INCLUDE, 379729Sclemc RETURN, 389729Sclemc SWITCH, 399729Sclemc CASE, 409729Sclemc DEFAULT, 419729Sclemc 0}; 429729Sclemc 439729Sclemc char *fcnloc; /* spot for "function" */ 449729Sclemc 459729Sclemc int svargc; 469729Sclemc char **svargv; 479729Sclemc char *curfile[10] = { "" }; 489729Sclemc int infptr = 0; 499729Sclemc FILE *outfil = { stdout }; 509729Sclemc FILE *infile[10] = { stdin }; 519729Sclemc int linect[10]; 529729Sclemc 539729Sclemc int contfld = CONTFLD; /* place to put continuation char */ 549729Sclemc int printcom = 0; /* print comments if on */ 559729Sclemc int hollerith = 0; /* convert "..." to 27H... if on */ 569729Sclemc 579729Sclemc #ifdef gcos 589729Sclemc char *ratfor "tssrat"; 599729Sclemc int bcdrat[2]; 609729Sclemc char *bwkmeter ". bwkmeter "; 619729Sclemc int bcdbwk[5]; 629729Sclemc #endif 639729Sclemc 649729Sclemc main(argc,argv) int argc; char **argv; { 659729Sclemc int i; 669729Sclemc while(argc>1 && argv[1][0]=='-') { 679729Sclemc if(argv[1][1]=='6') { 689729Sclemc contfld=6; 699729Sclemc if (argv[1][2]!='\0') 709729Sclemc contchar = argv[1][2]; 719729Sclemc } else if (argv[1][1] == 'C') 729729Sclemc printcom++; 739729Sclemc else if (argv[1][1] == 'h') 749729Sclemc hollerith++; 759729Sclemc argc--; 769729Sclemc argv++; 779729Sclemc } 789729Sclemc 799729Sclemc #ifdef gcos 809729Sclemc if (!intss()) { 819729Sclemc _fixup(); 829729Sclemc ratfor = "batrat"; 839729Sclemc } 849729Sclemc ascbcd(ratfor,bcdrat,6); 859729Sclemc ascbcd(bwkmeter,bcdbwk,24); 869729Sclemc acdata(bcdrat[0],1); 879729Sclemc acupdt(bcdbwk[0]); 889729Sclemc if (!intss()) { 899729Sclemc if ((infile[infptr]=fopen("s*", "r")) == NULL) 909729Sclemc cant("s*"); 919729Sclemc if ((outfil=fopen("*s", "w")) == NULL) 929729Sclemc cant("*s"); 939729Sclemc } 949729Sclemc #endif 959729Sclemc 969729Sclemc svargc = argc; 979729Sclemc svargv = argv; 989729Sclemc if (svargc > 1) 999729Sclemc putbak('\0'); 1009729Sclemc for (i=0; keyword[i]; i++) 1019729Sclemc install(keyword[i], "", keytran[i]); 1029729Sclemc fcnloc = install("function", "", 0); 1039729Sclemc yyparse(); 1049729Sclemc #ifdef gcos 1059729Sclemc if (!intss()) 1069729Sclemc bexit(errorflag); 1079729Sclemc #endif 1089729Sclemc exit(errorflag); 1099729Sclemc } 1109729Sclemc 1119729Sclemc #ifdef gcos 1129729Sclemc bexit(status) { 1139729Sclemc /* this is the batch version of exit for gcos tss */ 1149729Sclemc FILE *inf, *outf; 1159729Sclemc char c; 1169729Sclemc 1179729Sclemc fclose(stderr); /* make sure diagnostics get flushed */ 1189729Sclemc if (status) /* abort */ 1199729Sclemc _nogud(); 1209729Sclemc 1219729Sclemc /* good: copy output back to s*, call forty */ 1229729Sclemc 1239729Sclemc fclose(outfil,"r"); 1249729Sclemc fclose(infile[0],"r"); 1259729Sclemc inf = fopen("*s", "r"); 1269729Sclemc outf = fopen("s*", "w"); 1279729Sclemc while ((c=getc(inf)) != EOF) 1289729Sclemc putc(c, outf); 1299729Sclemc fclose(inf,"r"); 1309729Sclemc fclose(outf,"r"); 1319729Sclemc __imok(); 1329729Sclemc } 1339729Sclemc #endif 1349729Sclemc 1359729Sclemc cant(s) char *s; { 1369729Sclemc linect[infptr] = 0; 1379729Sclemc curfile[infptr] = s; 1389729Sclemc error("can't open"); 1399729Sclemc exit(1); 1409729Sclemc } 1419729Sclemc 1429729Sclemc inclstat() { 1439729Sclemc int c; 1449729Sclemc char *ps; 1459729Sclemc char fname[100]; 1469729Sclemc while ((c = getchr()) == ' ' || c == '\t'); 1479729Sclemc if (c == '(') { 1489729Sclemc for (ps=fname; (*ps=getchr()) != ')'; ps++); 1499729Sclemc *ps = '\0'; 1509729Sclemc } else if (c == '"' || c == '\'') { 1519729Sclemc for (ps=fname; (*ps=getchr()) != c; ps++); 1529729Sclemc *ps = '\0'; 1539729Sclemc } else { 1549729Sclemc putbak(c); 1559729Sclemc for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++); 1569729Sclemc *ps = '\0'; 1579729Sclemc } 1589729Sclemc if ((infile[++infptr] = fopen(fname,"r")) == NULL) { 1599729Sclemc cant(fname); 1609729Sclemc exit(1); 1619729Sclemc } 1629729Sclemc linect[infptr] = 0; 1639729Sclemc curfile[infptr] = fname; 1649729Sclemc } 1659729Sclemc 1669729Sclemc char str[500]; 1679729Sclemc int nstr; 1689729Sclemc 1699729Sclemc yylex() { 1709729Sclemc int c, t; 1719729Sclemc for (;;) { 1729729Sclemc while ((c=gtok(str))==' ' || c=='\n' || c=='\t') 1739729Sclemc ; 1749729Sclemc yylval = c; 1759729Sclemc if (c==';' || c=='{' || c=='}') 1769729Sclemc return(c); 1779729Sclemc if (c==EOF) 1789729Sclemc return(0); 1799729Sclemc yylval = (int) str; 1809729Sclemc if (c == DIG) 1819729Sclemc return(DIGITS); 1829729Sclemc t = lookup(str)->ydef; 1839729Sclemc if (t==DEFINE) 1849729Sclemc defstat(); 1859729Sclemc else if (t==INCLUDE) 1869729Sclemc inclstat(); 1879729Sclemc else if (t > 0) 1889729Sclemc return(t); 1899729Sclemc else 1909729Sclemc return(GOK); 1919729Sclemc } 1929729Sclemc } 1939729Sclemc 1949729Sclemc int dbg = 0; 1959729Sclemc 1969729Sclemc yyerror(p) char *p; {;} 1979729Sclemc 1989729Sclemc 1999729Sclemc defstat() { 2009729Sclemc int c,i,val,t,nlp; 2019729Sclemc extern int nstr; 2029729Sclemc extern char str[]; 2039729Sclemc while ((c=getchr())==' ' || c=='\t'); 2049729Sclemc if (c == '(') { 2059729Sclemc t = '('; 2069729Sclemc while ((c=getchr())==' ' || c=='\t'); 2079729Sclemc putbak(c); 2089729Sclemc } 2099729Sclemc else { 2109729Sclemc t = ' '; 2119729Sclemc putbak(c); 2129729Sclemc } 2139729Sclemc for (nstr=0; c=getchr(); nstr++) { 2149729Sclemc if (type[c] != LET && type[c] != DIG) 2159729Sclemc break; 2169729Sclemc str[nstr] = c; 2179729Sclemc } 2189729Sclemc putbak(c); 2199729Sclemc str[nstr] = '\0'; 2209729Sclemc if (c != ' ' && c != '\t' && c != '\n' && c != ',') { 2219729Sclemc error("illegal define statement"); 2229729Sclemc return; 2239729Sclemc } 2249729Sclemc val = nstr+1; 2259729Sclemc if (t == ' ') { 2269729Sclemc while ((c=getchr())==' ' || c=='\t'); 2279729Sclemc putbak(c); 2289729Sclemc for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++) 2299729Sclemc str[i] = c; 2309729Sclemc putbak(c); 2319729Sclemc } else { 2329729Sclemc while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n'); 2339729Sclemc putbak(c); 2349729Sclemc nlp = 0; 2359729Sclemc for (i=val; nlp>=0 && (c=str[i]=getchr()); i++) 2369729Sclemc if (c == '(') 2379729Sclemc nlp++; 2389729Sclemc else if (c == ')') 2399729Sclemc nlp--; 2409729Sclemc i--; 2419729Sclemc } 2429729Sclemc for ( ; i>0; i--) 2439729Sclemc if (str[i-1] != ' ' && str[i-1] != '\t') 2449729Sclemc break; 2459729Sclemc str[i] = '\0'; 2469729Sclemc install(str, &str[val], 0); 2479729Sclemc } 2489729Sclemc 249