148064Sbostic /*-
248064Sbostic * %sccs.include.proprietary.c%
348064Sbostic */
448064Sbostic
514502Ssam #ifndef lint
6*62208Sbostic static char sccsid[] = "@(#)r1.c 8.1 (Berkeley) 06/06/93";
748064Sbostic #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
repcode()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
untils(p1,un)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
ifcode()559726Sclemc ifcode() {
569726Sclemc transfer = 0;
579726Sclemc outtab();
589726Sclemc outcode("if(.not.");
599726Sclemc balpar();
609726Sclemc outcode(")");
619726Sclemc outgoto(yyval=genlab(2));
629726Sclemc indent++;
639726Sclemc }
649726Sclemc
elsecode(p1)659726Sclemc elsecode(p1) {
669726Sclemc outgoto(p1+1);
679726Sclemc indent--;
689726Sclemc putcom("else");
699726Sclemc indent++;
709726Sclemc outcont(p1);
719726Sclemc }
729726Sclemc
whilecode()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
whilestat(p1)899726Sclemc whilestat(p1) int p1; {
909726Sclemc outgoto(p1);
919726Sclemc indent--;
929726Sclemc putcom("endwhile");
939726Sclemc outcont(p1+1);
949726Sclemc brkptr--;
959726Sclemc }
969726Sclemc
balpar()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
genlab(n)1339726Sclemc genlab(n){
1349726Sclemc labval += n;
1359726Sclemc return(labval-n);
1369726Sclemc }
1379726Sclemc
gokcode(p1)1389726Sclemc gokcode(p1) {
1399726Sclemc transfer = 0;
1409726Sclemc outtab();
1419726Sclemc outcode(p1);
1429726Sclemc eatup();
1439726Sclemc outdon();
1449726Sclemc }
1459726Sclemc
eatup()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
forcode()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
forstat(p1)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
retcode()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
docode()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
dostat(p1)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
breakcode()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
nextcode()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
nonblank(s)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
error(s1)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
errcode()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