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