|
|
1.1 root 1: #include "r.h"
2:
3: #define wasbreak brkused[brkptr]==1 || brkused[brkptr]==3
4: #define wasnext brkused[brkptr]==2 || brkused[brkptr]==3
5:
6: int transfer = 0; /* 1 if just finished retrun, break, next */
7:
8: char fcname[200];
9: char scrat[500];
10:
11: int brkptr = -1;
12: int brkstk[50]; /* break label */
13: int typestk[50]; /* type of loop construct */
14: int brkused[50]; /* loop contains BREAK or NEXT */
15:
16: int forptr = 0;
17: char *forstk[50];
18:
19: repcode() {
20: transfer = 0;
21: outcont(0);
22: putcom("repeat");
23: yyval = genlab(3);
24: indent++;
25: outcont(yyval);
26: brkstk[++brkptr] = yyval+1;
27: typestk[brkptr] = REPEAT;
28: brkused[brkptr] = 0;
29: }
30:
31: untils(p1,un) int p1,un; {
32: outnum(p1+1);
33: outtab();
34: if (un > 0) {
35: outcode("if(.not.");
36: balpar();
37: outcode(")");
38: }
39: transfer = 0;
40: outgoto(p1);
41: indent--;
42: if (wasbreak)
43: outcont(p1+2);
44: brkptr--;
45: }
46:
47: ifcode() {
48: transfer = 0;
49: outtab();
50: if (f77) {
51: outtab();
52: outcode("if");
53: balpar();
54: outcode("then");
55: outdon();
56: } else {
57: outcode("if(.not.");
58: balpar();
59: outcode(")");
60: outgoto(yyval=genlab(2));
61: }
62: indent++;
63: }
64:
65: elsecode(p1) {
66: if (f77) {
67: outtab();
68: outcode("else");
69: outdon();
70: } else {
71: outgoto(p1+1);
72: indent--;
73: putcom("else");
74: indent++;
75: outcont(p1);
76: }
77: }
78:
79: endif(s) char *s; {
80: outtab();
81: outcode("endif");
82: outdon();
83: }
84:
85: whilecode() {
86: transfer = 0;
87: outcont(0);
88: putcom("while");
89: brkstk[++brkptr] = yyval = genlab(2);
90: typestk[brkptr] = WHILE;
91: brkused[brkptr] = 0;
92: outnum(yyval);
93: outtab();
94: outcode("if(.not.");
95: balpar();
96: outcode(")");
97: outgoto(yyval+1);
98: indent++;
99: }
100:
101: whilestat(p1) int p1; {
102: outgoto(p1);
103: indent--;
104: putcom("endwhile");
105: outcont(p1+1);
106: brkptr--;
107: }
108:
109: balpar() {
110: register c, lpar;
111: while ((c=gtok(scrat)) == ' ' || c == '\t')
112: ;
113: if (c != '(') {
114: error("missing left paren");
115: return;
116: }
117: outcode(scrat);
118: lpar = 1;
119: do {
120: c = gtok(scrat);
121: if (c==';' || c=='{' || c=='}' || c==EOF) {
122: pbstr(scrat);
123: break;
124: }
125: if (c=='(')
126: lpar++;
127: else if (c==')')
128: lpar--;
129: else if (c == '\n') {
130: while ((c = gtok(scrat)) == ' ' || c=='\t' || c=='\n')
131: ;
132: pbstr(scrat);
133: continue;
134: }
135: else if (c == '=' && scrat[1] == '\0')
136: error("assigment inside conditional");
137: outcode(scrat);
138: } while (lpar > 0);
139: if (lpar != 0)
140: error("missing parenthesis");
141: }
142:
143: int labval = 23000;
144:
145: genlab(n){
146: labval += n;
147: return(labval-n);
148: }
149:
150: gokcode(p1) {
151: transfer = 0;
152: outtab();
153: outcode(p1);
154: eatup();
155: outdon();
156: }
157:
158: eatup() {
159: int t, lpar;
160: char temp[100];
161: lpar = 0;
162: do {
163: if ((t = gtok(scrat)) == ';' || t == '\n')
164: break;
165: if (t == '{' || t == '}' || t == EOF) {
166: pbstr(scrat);
167: break;
168: }
169: if (t == ',' || t == '+' || t == '-' || t == '*' || t == '('
170: || t == '&' || t == '|' || t == '=') {
171: while (gtok(temp) == '\n')
172: ;
173: pbstr(temp);
174: }
175: if (t == '(')
176: lpar++;
177: else if (t==')') {
178: lpar--;
179: if (lpar < 0) {
180: error("missing left paren");
181: return(1);
182: }
183: }
184: outcode(scrat);
185: } while (lpar >= 0);
186: if (lpar > 0) {
187: error("missing right paren");
188: return(1);
189: }
190: return(0);
191: }
192:
193: forcode(){
194: int lpar, t;
195: char *ps, *qs;
196:
197: transfer = 0;
198: outcont(0);
199: putcom("for");
200: yyval = genlab(3);
201: brkstk[++brkptr] = yyval+1;
202: typestk[brkptr] = FOR;
203: brkused[brkptr] = 0;
204: forstk[forptr++] = malloc(1);
205: if ((t = gnbtok(scrat)) != '(') {
206: error("missing left paren in FOR");
207: pbstr(scrat);
208: return;
209: }
210: if (gnbtok(scrat) != ';') { /* real init clause */
211: pbstr(scrat);
212: outtab();
213: if (eatup() > 0) {
214: error("illegal FOR clause");
215: return;
216: }
217: outdon();
218: }
219: if (gnbtok(scrat) == ';') /* empty condition */
220: outcont(yyval);
221: else { /* non-empty condition */
222: pbstr(scrat);
223: outnum(yyval);
224: outtab();
225: outcode("if(.not.(");
226: for (lpar=0; lpar >= 0;) {
227: if ((t = gnbtok(scrat)) == ';')
228: break;
229: if (t == '(')
230: lpar++;
231: else if (t == ')') {
232: lpar--;
233: if (lpar < 0) {
234: error("missing left paren in FOR clause");
235: return;
236: }
237: }
238: if (t != '\n')
239: outcode(scrat);
240: }
241: outcode("))");
242: outgoto(yyval+2);
243: if (lpar < 0)
244: error("invalid FOR clause");
245: }
246: ps = scrat;
247: for (lpar=0; lpar >= 0;) {
248: if ((t = gtok(ps)) == '(')
249: lpar++;
250: else if (t == ')')
251: lpar--;
252: if (lpar >= 0 && t != '\n')
253: while(*ps)
254: ps++;
255: }
256: *ps = '\0';
257: qs = forstk[forptr-1] = malloc((unsigned)(ps-scrat+1));
258: ps = scrat;
259: while (*qs++ = *ps++)
260: ;
261: indent++;
262: }
263:
264: forstat(p1) int p1; {
265: char *bp, *q;
266: bp = forstk[--forptr];
267: if (wasnext)
268: outnum(p1+1);
269: if (nonblank(bp)){
270: outtab();
271: outcode(bp);
272: outdon();
273: }
274: transfer = 0;
275: outgoto(p1);
276: indent--;
277: putcom("endfor");
278: outcont(p1+2);
279: for (q=bp; *q++;);
280: free(bp);
281: brkptr--;
282: }
283:
284: retcode() {
285: register c;
286: if ((c = gnbtok(scrat)) != '\n' && c != ';' && c != '}') {
287: pbstr(scrat);
288: outtab();
289: outcode(fcname);
290: outcode(" = ");
291: eatup();
292: outdon();
293: }
294: else if (c == '}')
295: pbstr(scrat);
296: outtab();
297: outcode("return");
298: outdon();
299: transfer = 1;
300: }
301:
302: docode() {
303: transfer = 0;
304: outtab();
305: outcode("do ");
306: yyval = genlab(2);
307: brkstk[++brkptr] = yyval;
308: typestk[brkptr] = DO;
309: brkused[brkptr] = 0;
310: outnum(yyval);
311: eatup();
312: outdon();
313: indent++;
314: }
315:
316: dostat(p1) int p1; {
317: outcont(p1);
318: indent--;
319: if (wasbreak)
320: outcont(p1+1);
321: brkptr--;
322: }
323:
324: breakcode() {
325: int level, t;
326:
327: level = 0;
328: if ((t=gnbtok(scrat)) == DIG)
329: level = atoi(scrat) - 1;
330: else if (t != ';')
331: pbstr(scrat);
332: if (brkptr-level < 0)
333: error("illegal BREAK");
334: else {
335: outgoto(brkstk[brkptr-level]+1);
336: brkused[brkptr-level] |= 1;
337: }
338: transfer = 1;
339: }
340:
341: nextcode() {
342: int level, t;
343:
344: level = 0;
345: if ((t=gnbtok(scrat)) == DIG)
346: level = atoi(scrat) - 1;
347: else if (t != ';')
348: pbstr(scrat);
349: if (brkptr-level < 0)
350: error("illegal NEXT");
351: else {
352: outgoto(brkstk[brkptr-level]);
353: brkused[brkptr-level] |= 2;
354: }
355: transfer = 1;
356: }
357:
358: nonblank(s) char *s; {
359: int c;
360: while (c = *s++)
361: if (c!=' ' && c!='\t' && c!='\n')
362: return(1);
363: return(0);
364: }
365:
366: int errorflag = 0;
367:
368: error(s1) char *s1; {
369: if (errorflag == 0)
370: fprintf(stderr, "ratfor:");
371: fprintf(stderr, "error at line %d, file %s: ",linect[infptr],curfile[infptr]);
372: fprintf(stderr, s1);
373: fprintf(stderr, "\n");
374: errorflag = 1;
375: }
376:
377: errcode() {
378: int c;
379: if (errorflag == 0)
380: fprintf(stderr, "******\n");
381: fprintf(stderr, "*****F ratfor:");
382: fprintf(stderr, "syntax error, line %d, file %s\n", linect[infptr], curfile[infptr]);
383: while ((c=getchr())!=';' && c!='}' && c!='\n' && c!=EOF && c!='\0')
384: ;
385: if (c == EOF || c == '\0')
386: putbak(c);
387: errorflag = 1;
388: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.