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