+# 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);
+}
+