|
|
1.1 root 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: char *FCN1loc; /* spot for "FUNCTION"; kludge */
41:
42: int svargc;
43: char **svargv;
44: char *curfile[10] = { "" };
45: int infptr = 0;
46: FILE *outfil = { stdout };
47: FILE *infile[10] = { stdin };
48: int linect[10];
49:
50: int contfld = CONTFLD; /* place to put continuation char */
51: int printcom = 0; /* print comments if on */
52: int hollerith = 0; /* convert "..." to 27H... if on */
53: int uppercase = 0; /* produce output in upper case (except for "...") */
54:
55: #ifndef unix
56: #define OPTION(L) (tolower(i) == tolower(L))
57: #else
58: #define OPTION(L) (i == L)
59: #endif
60: #ifdef gcos
61: #define BIT(n) (1 << 36 - 1 - n)
62: #define FORTRAN BIT(1)
63: #define FDS BIT(4)
64: #define EXEC BIT(5)
65: #define FORM BIT(14)
66: #define LNO BIT(15)
67: #define BCD BIT(16)
68: #define OPTZ BIT(17)
69: int compile = FORTRAN | FDS;
70: #define GCOSOPT() if (OPTION('O')) compile |= OPTZ; \
71: else if (i == '6') compile |= FORM; \
72: else if (OPTION('R')) compile = 0
73: #else
74: #define GCOSOPT()
75: #define ffiler(S) "can't open"
76: #endif
77:
78: main(argc,argv) int argc; char **argv; {
79: int i;
80: while(argc>1 && argv[1][0]=='-' && (i = argv[1][1]) != '\0') {
81: if (isdigit(i)) {
82: contfld = i - '0';
83: if (argv[1][2]!='\0')
84: contchar = argv[1][2];
85: } else if (OPTION('C'))
86: printcom++;
87: else if (OPTION('h'))
88: hollerith++;
89: else if (OPTION('u') && (argv[1][2] == 'c' || argv[1][2] == 'C'))
90: uppercase++;
91: GCOSOPT();
92: argc--;
93: argv++;
94: }
95:
96: #ifdef gcos
97: if (!intss()) {
98: fputs("\t\t Version 2.1 : read INFO/RATFOR (07/13/79)\n", stderr);
99: if (compile) {
100: static char name[80] = "s*", opts[20] = "yw";
101: char *opt = (char *)inquire(stdout, _OPTIONS);
102: if (!strchr(opt, 't')) { /* if stdout is diverted */
103: sprintf(name, "%s\"s*\"", (char *)inquire(stdout, _FILENAME));
104: strcpy(&opts[1], opt);
105: }
106: if (freopen(name, opts, stdout) == NULL)
107: cant(name);
108: }
109: } else {
110: compile = 0;
111: if (argc < 2 && inquire(stdin, _TTY))
112: freopen("*src", "rt", stdin);
113: }
114: #endif
115:
116: svargc = argc;
117: svargv = argv;
118: if (svargc > 1)
119: putbak('\0');
120: for (i=0; keyword[i]; i++)
121: install(keyword[i], "", keytran[i]);
122: fcnloc = install("function", "", 0);
123: FCN1loc = install("FUNCTION", "", 0);
124: yyparse();
125: #ifdef gcos
126: if (compile) {
127: if (errorflag) { /* abort */
128: cretsw(EXEC);
129: } else { /* good: call forty */
130: FILE *dstar; /* to intercept "gosys" action */
131:
132: if ((dstar = fopen("d*", "wv")) == NULL)
133: cant("d*");
134: fputs("$\tforty\tascii", dstar);
135: if (fopen("*1", "o") == NULL)
136: cant("*1");
137: fclose(stdout, "rl");
138: cretsw(FORM | LNO | BCD);
139: csetsw(compile);
140: gosys("forty");
141: }
142: }
143: #endif
144: exit(errorflag);
145: }
146:
147: cant(s) char *s; {
148: linect[infptr] = 0;
149: curfile[infptr] = s;
150: error(ffiler(""));
151: exit(1);
152: }
153:
154: inclstat() {
155: int c;
156: char *ps;
157: char fname[100];
158: while ((c = getchr()) == ' ' || c == '\t');
159: if (c == '(') {
160: for (ps=fname; (*ps=getchr()) != ')'; ps++);
161: *ps = '\0';
162: } else if (c == '"' || c == '\'') {
163: for (ps=fname; (*ps=getchr()) != c; ps++);
164: *ps = '\0';
165: } else {
166: putbak(c);
167: for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++);
168: *ps = '\0';
169: }
170: if ((infile[++infptr] = fopen(fname,"r")) == NULL) {
171: cant(fname);
172: exit(1);
173: }
174: linect[infptr] = 0;
175: curfile[infptr] = fname;
176: }
177:
178: char str[500];
179: int nstr;
180:
181: yylex() {
182: int c, t;
183: for (;;) {
184: while ((c=gtok(str))==' ' || c=='\n' || c=='\t')
185: ;
186: yylval = c;
187: if (c==';' || c=='{' || c=='}')
188: return(c);
189: if (c==EOF)
190: return(0);
191: yylval = (int) str;
192: if (c == DIG)
193: return(DIGITS);
194: t = lookup(str)->ydef;
195: if (t==DEFINE)
196: defstat();
197: else if (t==INCLUDE)
198: inclstat();
199: else if (t > 0)
200: return(t);
201: else
202: return(GOK);
203: }
204: }
205:
206: int dbg = 0;
207:
208: yyerror(p) char *p; {;}
209:
210:
211: defstat() {
212: int c,i,val,t,nlp;
213: extern int nstr;
214: extern char str[];
215: while ((c=getchr())==' ' || c=='\t');
216: if (c == '(') {
217: t = '(';
218: while ((c=getchr())==' ' || c=='\t');
219: putbak(c);
220: }
221: else {
222: t = ' ';
223: putbak(c);
224: }
225: for (nstr=0; c=getchr(); nstr++) {
226: if (!isalpha(c) && !isdigit(c))
227: break;
228: str[nstr] = c;
229: }
230: putbak(c);
231: str[nstr] = '\0';
232: if (c != ' ' && c != '\t' && c != '\n' && c != ',') {
233: error("illegal define statement");
234: return;
235: }
236: val = nstr+1;
237: if (t == ' ') {
238: while ((c=getchr())==' ' || c=='\t');
239: putbak(c);
240: for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++)
241: str[i] = c;
242: putbak(c);
243: } else {
244: while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n');
245: putbak(c);
246: nlp = 0;
247: for (i=val; nlp>=0 && (c=str[i]=getchr()); i++)
248: if (c == '(')
249: nlp++;
250: else if (c == ')')
251: nlp--;
252: i--;
253: }
254: for ( ; i>0; i--)
255: if (str[i-1] != ' ' && str[i-1] != '\t')
256: break;
257: str[i] = '\0';
258: install(str, &str[val], 0);
259: }
260:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.