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