xref: /csrg-svn/old/ratfor/r1.c (revision 9732)
1*9732Sclemc /* @(#)r1.c	1.2 (Berkeley) 12/15/82 */
29726Sclemc #include "r.h"
39726Sclemc 
49726Sclemc #define	wasbreak	brkused[brkptr]==1 || brkused[brkptr]==3
59726Sclemc #define	wasnext	brkused[brkptr]==2 || brkused[brkptr]==3
69726Sclemc 
79726Sclemc int	transfer	= 0;	/* 1 if just finished retrun, break, next */
89726Sclemc 
99726Sclemc char	fcname[10];
109726Sclemc char	scrat[500];
119726Sclemc 
129726Sclemc int	brkptr	= -1;
139726Sclemc int	brkstk[10];	/* break label */
149726Sclemc int	typestk[10];	/* type of loop construct */
159726Sclemc int	brkused[10];	/* loop contains BREAK or NEXT */
169726Sclemc 
179726Sclemc int	forptr	= 0;
189726Sclemc char	*forstk[10];
199726Sclemc 
209726Sclemc repcode() {
219726Sclemc 	transfer = 0;
229726Sclemc 	outcont(0);
239726Sclemc 	putcom("repeat");
249726Sclemc 	yyval = genlab(3);
259726Sclemc 	indent++;
269726Sclemc 	outcont(yyval);
279726Sclemc 	brkstk[++brkptr] = yyval+1;
289726Sclemc 	typestk[brkptr] = REPEAT;
299726Sclemc 	brkused[brkptr] = 0;
309726Sclemc }
319726Sclemc 
329726Sclemc untils(p1,un) int p1,un; {
339726Sclemc 	outnum(p1+1);
349726Sclemc 	outtab();
359726Sclemc 	if (un > 0) {
369726Sclemc 		outcode("if(.not.");
379726Sclemc 		balpar();
389726Sclemc 		outcode(")");
399726Sclemc 	}
409726Sclemc 	transfer = 0;
419726Sclemc 	outgoto(p1);
429726Sclemc 	indent--;
439726Sclemc 	if (wasbreak)
449726Sclemc 		outcont(p1+2);
459726Sclemc 	brkptr--;
469726Sclemc }
479726Sclemc 
489726Sclemc ifcode() {
499726Sclemc 	transfer = 0;
509726Sclemc 	outtab();
519726Sclemc 	outcode("if(.not.");
529726Sclemc 	balpar();
539726Sclemc 	outcode(")");
549726Sclemc 	outgoto(yyval=genlab(2));
559726Sclemc 	indent++;
569726Sclemc }
579726Sclemc 
589726Sclemc elsecode(p1) {
599726Sclemc 	outgoto(p1+1);
609726Sclemc 	indent--;
619726Sclemc 	putcom("else");
629726Sclemc 	indent++;
639726Sclemc 	outcont(p1);
649726Sclemc }
659726Sclemc 
669726Sclemc whilecode() {
679726Sclemc 	transfer = 0;
689726Sclemc 	outcont(0);
699726Sclemc 	putcom("while");
709726Sclemc 	brkstk[++brkptr] = yyval = genlab(2);
719726Sclemc 	typestk[brkptr] = WHILE;
729726Sclemc 	brkused[brkptr] = 0;
739726Sclemc 	outnum(yyval);
749726Sclemc 	outtab();
759726Sclemc 	outcode("if(.not.");
769726Sclemc 	balpar();
779726Sclemc 	outcode(")");
789726Sclemc 	outgoto(yyval+1);
799726Sclemc 	indent++;
809726Sclemc }
819726Sclemc 
829726Sclemc whilestat(p1) int p1; {
839726Sclemc 	outgoto(p1);
849726Sclemc 	indent--;
859726Sclemc 	putcom("endwhile");
869726Sclemc 	outcont(p1+1);
879726Sclemc 	brkptr--;
889726Sclemc }
899726Sclemc 
909726Sclemc balpar() {
919726Sclemc 	register c, lpar;
929726Sclemc 	while ((c=gtok(scrat)) == ' ' || c == '\t')
939726Sclemc 		;
949726Sclemc 	if (c != '(') {
959726Sclemc 		error("missing left paren");
969726Sclemc 		return;
979726Sclemc 	}
989726Sclemc 	outcode(scrat);
999726Sclemc 	lpar = 1;
1009726Sclemc 	do {
1019726Sclemc 		c = gtok(scrat);
1029726Sclemc 		if (c==';' || c=='{' || c=='}' || c==EOF) {
1039726Sclemc 			pbstr(scrat);
1049726Sclemc 			break;
1059726Sclemc 		}
1069726Sclemc 		if (c=='(')
1079726Sclemc 			lpar++;
1089726Sclemc 		else if (c==')')
1099726Sclemc 			lpar--;
1109726Sclemc 		else if (c == '\n') {
1119726Sclemc 			while ((c = gtok(scrat)) == ' ' || c=='\t' || c=='\n')
1129726Sclemc 				;
1139726Sclemc 			pbstr(scrat);
1149726Sclemc 			continue;
1159726Sclemc 		}
1169726Sclemc 		else if (c == '=' && scrat[1] == '\0')
1179726Sclemc 			error("assigment inside conditional");
1189726Sclemc 		outcode(scrat);
1199726Sclemc 	} while (lpar > 0);
1209726Sclemc 	if (lpar != 0)
1219726Sclemc 		error("missing parenthesis");
1229726Sclemc }
1239726Sclemc 
1249726Sclemc int	labval	= 23000;
1259726Sclemc 
1269726Sclemc genlab(n){
1279726Sclemc 	labval += n;
1289726Sclemc 	return(labval-n);
1299726Sclemc }
1309726Sclemc 
1319726Sclemc gokcode(p1) {
1329726Sclemc 	transfer = 0;
1339726Sclemc 	outtab();
1349726Sclemc 	outcode(p1);
1359726Sclemc 	eatup();
1369726Sclemc 	outdon();
1379726Sclemc }
1389726Sclemc 
1399726Sclemc eatup() {
1409726Sclemc 	int t, lpar;
1419726Sclemc 	char temp[100];
1429726Sclemc 	lpar = 0;
1439726Sclemc 	do {
1449726Sclemc 		if ((t = gtok(scrat)) == ';' || t == '\n')
1459726Sclemc 			break;
1469726Sclemc 		if (t == '{' || t == '}' || t == EOF) {
1479726Sclemc 			pbstr(scrat);
1489726Sclemc 			break;
1499726Sclemc 		}
1509726Sclemc 		if (t == ',' || t == '+' || t == '-' || t == '*' || t == '('
1519726Sclemc 		  || t == '&' || t == '|' || t == '=') {
1529726Sclemc 			while (gtok(temp) == '\n')
1539726Sclemc 				;
1549726Sclemc 			pbstr(temp);
1559726Sclemc 		}
1569726Sclemc 		if (t == '(')
1579726Sclemc 			lpar++;
1589726Sclemc 		else if (t==')') {
1599726Sclemc 			lpar--;
1609726Sclemc 			if (lpar < 0) {
1619726Sclemc 				error("missing left paren");
1629726Sclemc 				return(1);
1639726Sclemc 			}
1649726Sclemc 		}
1659726Sclemc 		outcode(scrat);
1669726Sclemc 	} while (lpar >= 0);
1679726Sclemc 	if (lpar > 0) {
1689726Sclemc 		error("missing right paren");
1699726Sclemc 		return(1);
1709726Sclemc 	}
1719726Sclemc 	return(0);
1729726Sclemc }
1739726Sclemc 
1749726Sclemc forcode(){
1759726Sclemc 	int lpar, t;
1769726Sclemc 	char *ps, *qs;
1779726Sclemc 
1789726Sclemc 	transfer = 0;
1799726Sclemc 	outcont(0);
1809726Sclemc 	putcom("for");
1819726Sclemc 	yyval = genlab(3);
1829726Sclemc 	brkstk[++brkptr] = yyval+1;
1839726Sclemc 	typestk[brkptr] = FOR;
1849726Sclemc 	brkused[brkptr] = 0;
1859726Sclemc 	forstk[forptr++] = malloc(1);
1869726Sclemc 	if ((t = gnbtok(scrat)) != '(') {
1879726Sclemc 		error("missing left paren in FOR");
1889726Sclemc 		pbstr(scrat);
1899726Sclemc 		return;
1909726Sclemc 	}
1919726Sclemc 	if (gnbtok(scrat) != ';') {	/* real init clause */
1929726Sclemc 		pbstr(scrat);
1939726Sclemc 		outtab();
1949726Sclemc 		if (eatup() > 0) {
1959726Sclemc 			error("illegal FOR clause");
1969726Sclemc 			return;
1979726Sclemc 		}
1989726Sclemc 		outdon();
1999726Sclemc 	}
2009726Sclemc 	if (gnbtok(scrat) == ';')	/* empty condition */
2019726Sclemc 		outcont(yyval);
2029726Sclemc 	else {	/* non-empty condition */
2039726Sclemc 		pbstr(scrat);
2049726Sclemc 		outnum(yyval);
2059726Sclemc 		outtab();
2069726Sclemc 		outcode("if(.not.(");
2079726Sclemc 		for (lpar=0; lpar >= 0;) {
2089726Sclemc 			if ((t = gnbtok(scrat)) == ';')
2099726Sclemc 				break;
2109726Sclemc 			if (t == '(')
2119726Sclemc 				lpar++;
2129726Sclemc 			else if (t == ')') {
2139726Sclemc 				lpar--;
2149726Sclemc 				if (lpar < 0) {
2159726Sclemc 					error("missing left paren in FOR clause");
2169726Sclemc 					return;
2179726Sclemc 				}
2189726Sclemc 			}
2199726Sclemc 			if (t != '\n')
2209726Sclemc 				outcode(scrat);
2219726Sclemc 		}
2229726Sclemc 		outcode("))");
2239726Sclemc 		outgoto(yyval+2);
2249726Sclemc 		if (lpar < 0)
2259726Sclemc 			error("invalid FOR clause");
2269726Sclemc 	}
2279726Sclemc 	ps = scrat;
2289726Sclemc 	for (lpar=0; lpar >= 0;) {
2299726Sclemc 		if ((t = gtok(ps)) == '(')
2309726Sclemc 			lpar++;
2319726Sclemc 		else if (t == ')')
2329726Sclemc 			lpar--;
2339726Sclemc 		if (lpar >= 0 && t != '\n')
2349726Sclemc 			while(*ps)
2359726Sclemc 				ps++;
2369726Sclemc 	}
2379726Sclemc 	*ps = '\0';
2389726Sclemc 	qs = forstk[forptr-1] = malloc((unsigned)(ps-scrat+1));
2399726Sclemc 	ps = scrat;
2409726Sclemc 	while (*qs++ = *ps++)
2419726Sclemc 		;
2429726Sclemc 	indent++;
2439726Sclemc }
2449726Sclemc 
2459726Sclemc forstat(p1) int p1; {
2469726Sclemc 	char *bp, *q;
2479726Sclemc 	bp = forstk[--forptr];
248*9732Sclemc 	if (wasnext) {
2499726Sclemc 		outnum(p1+1);
250*9732Sclemc 		transfer = 0;
251*9732Sclemc 	}
2529726Sclemc 	if (nonblank(bp)){
2539726Sclemc 		outtab();
2549726Sclemc 		outcode(bp);
2559726Sclemc 		outdon();
2569726Sclemc 	}
2579726Sclemc 	outgoto(p1);
2589726Sclemc 	indent--;
2599726Sclemc 	putcom("endfor");
2609726Sclemc 	outcont(p1+2);
2619726Sclemc 	for (q=bp; *q++;);
2629726Sclemc 	free(bp);
2639726Sclemc 	brkptr--;
2649726Sclemc }
2659726Sclemc 
2669726Sclemc retcode() {
2679726Sclemc 	register c;
2689726Sclemc 	if ((c = gnbtok(scrat)) != '\n' && c != ';' && c != '}') {
2699726Sclemc 		pbstr(scrat);
2709726Sclemc 		outtab();
2719726Sclemc 		outcode(fcname);
2729726Sclemc 		outcode(" = ");
2739726Sclemc 		eatup();
2749726Sclemc 		outdon();
2759726Sclemc 	}
2769726Sclemc 	else if (c == '}')
2779726Sclemc 		pbstr(scrat);
2789726Sclemc 	outtab();
2799726Sclemc 	outcode("return");
2809726Sclemc 	outdon();
2819726Sclemc 	transfer = 1;
2829726Sclemc }
2839726Sclemc 
2849726Sclemc docode() {
2859726Sclemc 	transfer = 0;
2869726Sclemc 	outtab();
2879726Sclemc 	outcode("do ");
2889726Sclemc 	yyval = genlab(2);
2899726Sclemc 	brkstk[++brkptr] = yyval;
2909726Sclemc 	typestk[brkptr] = DO;
2919726Sclemc 	brkused[brkptr] = 0;
2929726Sclemc 	outnum(yyval);
2939726Sclemc 	eatup();
2949726Sclemc 	outdon();
2959726Sclemc 	indent++;
2969726Sclemc }
2979726Sclemc 
2989726Sclemc dostat(p1) int p1; {
2999726Sclemc 	outcont(p1);
3009726Sclemc 	indent--;
3019726Sclemc 	if (wasbreak)
3029726Sclemc 		outcont(p1+1);
3039726Sclemc 	brkptr--;
3049726Sclemc }
3059726Sclemc 
3069726Sclemc #ifdef	gcos
3079726Sclemc #define	atoi(s)	(*s-'0')	/* crude!!! */
3089726Sclemc #endif
3099726Sclemc 
3109726Sclemc breakcode() {
3119726Sclemc 	int level, t;
3129726Sclemc 
3139726Sclemc 	level = 0;
3149726Sclemc 	if ((t=gnbtok(scrat)) == DIG)
3159726Sclemc 		level = atoi(scrat) - 1;
3169726Sclemc 	else if (t != ';')
3179726Sclemc 		pbstr(scrat);
3189726Sclemc 	if (brkptr-level < 0)
3199726Sclemc 		error("illegal BREAK");
3209726Sclemc 	else {
3219726Sclemc 		outgoto(brkstk[brkptr-level]+1);
3229726Sclemc 		brkused[brkptr-level] |= 1;
3239726Sclemc 	}
3249726Sclemc 	transfer = 1;
3259726Sclemc }
3269726Sclemc 
3279726Sclemc nextcode() {
3289726Sclemc 	int level, t;
3299726Sclemc 
3309726Sclemc 	level = 0;
3319726Sclemc 	if ((t=gnbtok(scrat)) == DIG)
3329726Sclemc 		level = atoi(scrat) - 1;
3339726Sclemc 	else if (t != ';')
3349726Sclemc 		pbstr(scrat);
3359726Sclemc 	if (brkptr-level < 0)
3369726Sclemc 		error("illegal NEXT");
3379726Sclemc 	else {
3389726Sclemc 		outgoto(brkstk[brkptr-level]);
3399726Sclemc 		brkused[brkptr-level] |= 2;
3409726Sclemc 	}
3419726Sclemc 	transfer = 1;
3429726Sclemc }
3439726Sclemc 
3449726Sclemc nonblank(s) char *s; {
3459726Sclemc 	int c;
3469726Sclemc 	while (c = *s++)
3479726Sclemc 		if (c!=' ' && c!='\t' && c!='\n')
3489726Sclemc 			return(1);
3499726Sclemc 	return(0);
3509726Sclemc }
3519726Sclemc 
3529726Sclemc int	errorflag	= 0;
3539726Sclemc 
3549726Sclemc error(s1) char *s1; {
3559726Sclemc 	if (errorflag == 0)
3569726Sclemc 		fprintf(stderr, "ratfor:");
3579726Sclemc 	fprintf(stderr, "error at line %d, file %s: ",linect[infptr],curfile[infptr]);
3589726Sclemc 	fprintf(stderr, s1);
3599726Sclemc 	fprintf(stderr, "\n");
3609726Sclemc 	errorflag = 1;
3619726Sclemc }
3629726Sclemc 
3639726Sclemc errcode() {
3649726Sclemc 	int c;
3659726Sclemc 	if (errorflag == 0)
3669726Sclemc 		fprintf(stderr, "******\n");
3679726Sclemc 	fprintf(stderr, "*****F ratfor:");
3689726Sclemc 	fprintf(stderr, "syntax error, line %d, file %s\n", linect[infptr], curfile[infptr]);
3699726Sclemc 	while ((c=getchr())!=';' && c!='}' && c!='\n' && c!=EOF && c!='\0')
3709726Sclemc 		;
3719726Sclemc 	if (c == EOF || c == '\0')
3729726Sclemc 		putbak(c);
3739726Sclemc 	errorflag = 1;
3749726Sclemc }
375