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