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