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