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