1*9726Sclemc /* @(#)r1.c 1.1 (Berkeley) 12/15/82 */ 2*9726Sclemc #include "r.h" 3*9726Sclemc 4*9726Sclemc #define wasbreak brkused[brkptr]==1 || brkused[brkptr]==3 5*9726Sclemc #define wasnext brkused[brkptr]==2 || brkused[brkptr]==3 6*9726Sclemc 7*9726Sclemc int transfer = 0; /* 1 if just finished retrun, break, next */ 8*9726Sclemc 9*9726Sclemc char fcname[10]; 10*9726Sclemc char scrat[500]; 11*9726Sclemc 12*9726Sclemc int brkptr = -1; 13*9726Sclemc int brkstk[10]; /* break label */ 14*9726Sclemc int typestk[10]; /* type of loop construct */ 15*9726Sclemc int brkused[10]; /* loop contains BREAK or NEXT */ 16*9726Sclemc 17*9726Sclemc int forptr = 0; 18*9726Sclemc char *forstk[10]; 19*9726Sclemc 20*9726Sclemc repcode() { 21*9726Sclemc transfer = 0; 22*9726Sclemc outcont(0); 23*9726Sclemc putcom("repeat"); 24*9726Sclemc yyval = genlab(3); 25*9726Sclemc indent++; 26*9726Sclemc outcont(yyval); 27*9726Sclemc brkstk[++brkptr] = yyval+1; 28*9726Sclemc typestk[brkptr] = REPEAT; 29*9726Sclemc brkused[brkptr] = 0; 30*9726Sclemc } 31*9726Sclemc 32*9726Sclemc untils(p1,un) int p1,un; { 33*9726Sclemc outnum(p1+1); 34*9726Sclemc outtab(); 35*9726Sclemc if (un > 0) { 36*9726Sclemc outcode("if(.not."); 37*9726Sclemc balpar(); 38*9726Sclemc outcode(")"); 39*9726Sclemc } 40*9726Sclemc transfer = 0; 41*9726Sclemc outgoto(p1); 42*9726Sclemc indent--; 43*9726Sclemc if (wasbreak) 44*9726Sclemc outcont(p1+2); 45*9726Sclemc brkptr--; 46*9726Sclemc } 47*9726Sclemc 48*9726Sclemc ifcode() { 49*9726Sclemc transfer = 0; 50*9726Sclemc outtab(); 51*9726Sclemc outcode("if(.not."); 52*9726Sclemc balpar(); 53*9726Sclemc outcode(")"); 54*9726Sclemc outgoto(yyval=genlab(2)); 55*9726Sclemc indent++; 56*9726Sclemc } 57*9726Sclemc 58*9726Sclemc elsecode(p1) { 59*9726Sclemc outgoto(p1+1); 60*9726Sclemc indent--; 61*9726Sclemc putcom("else"); 62*9726Sclemc indent++; 63*9726Sclemc outcont(p1); 64*9726Sclemc } 65*9726Sclemc 66*9726Sclemc whilecode() { 67*9726Sclemc transfer = 0; 68*9726Sclemc outcont(0); 69*9726Sclemc putcom("while"); 70*9726Sclemc brkstk[++brkptr] = yyval = genlab(2); 71*9726Sclemc typestk[brkptr] = WHILE; 72*9726Sclemc brkused[brkptr] = 0; 73*9726Sclemc outnum(yyval); 74*9726Sclemc outtab(); 75*9726Sclemc outcode("if(.not."); 76*9726Sclemc balpar(); 77*9726Sclemc outcode(")"); 78*9726Sclemc outgoto(yyval+1); 79*9726Sclemc indent++; 80*9726Sclemc } 81*9726Sclemc 82*9726Sclemc whilestat(p1) int p1; { 83*9726Sclemc outgoto(p1); 84*9726Sclemc indent--; 85*9726Sclemc putcom("endwhile"); 86*9726Sclemc outcont(p1+1); 87*9726Sclemc brkptr--; 88*9726Sclemc } 89*9726Sclemc 90*9726Sclemc balpar() { 91*9726Sclemc register c, lpar; 92*9726Sclemc while ((c=gtok(scrat)) == ' ' || c == '\t') 93*9726Sclemc ; 94*9726Sclemc if (c != '(') { 95*9726Sclemc error("missing left paren"); 96*9726Sclemc return; 97*9726Sclemc } 98*9726Sclemc outcode(scrat); 99*9726Sclemc lpar = 1; 100*9726Sclemc do { 101*9726Sclemc c = gtok(scrat); 102*9726Sclemc if (c==';' || c=='{' || c=='}' || c==EOF) { 103*9726Sclemc pbstr(scrat); 104*9726Sclemc break; 105*9726Sclemc } 106*9726Sclemc if (c=='(') 107*9726Sclemc lpar++; 108*9726Sclemc else if (c==')') 109*9726Sclemc lpar--; 110*9726Sclemc else if (c == '\n') { 111*9726Sclemc while ((c = gtok(scrat)) == ' ' || c=='\t' || c=='\n') 112*9726Sclemc ; 113*9726Sclemc pbstr(scrat); 114*9726Sclemc continue; 115*9726Sclemc } 116*9726Sclemc else if (c == '=' && scrat[1] == '\0') 117*9726Sclemc error("assigment inside conditional"); 118*9726Sclemc outcode(scrat); 119*9726Sclemc } while (lpar > 0); 120*9726Sclemc if (lpar != 0) 121*9726Sclemc error("missing parenthesis"); 122*9726Sclemc } 123*9726Sclemc 124*9726Sclemc int labval = 23000; 125*9726Sclemc 126*9726Sclemc genlab(n){ 127*9726Sclemc labval += n; 128*9726Sclemc return(labval-n); 129*9726Sclemc } 130*9726Sclemc 131*9726Sclemc gokcode(p1) { 132*9726Sclemc transfer = 0; 133*9726Sclemc outtab(); 134*9726Sclemc outcode(p1); 135*9726Sclemc eatup(); 136*9726Sclemc outdon(); 137*9726Sclemc } 138*9726Sclemc 139*9726Sclemc eatup() { 140*9726Sclemc int t, lpar; 141*9726Sclemc char temp[100]; 142*9726Sclemc lpar = 0; 143*9726Sclemc do { 144*9726Sclemc if ((t = gtok(scrat)) == ';' || t == '\n') 145*9726Sclemc break; 146*9726Sclemc if (t == '{' || t == '}' || t == EOF) { 147*9726Sclemc pbstr(scrat); 148*9726Sclemc break; 149*9726Sclemc } 150*9726Sclemc if (t == ',' || t == '+' || t == '-' || t == '*' || t == '(' 151*9726Sclemc || t == '&' || t == '|' || t == '=') { 152*9726Sclemc while (gtok(temp) == '\n') 153*9726Sclemc ; 154*9726Sclemc pbstr(temp); 155*9726Sclemc } 156*9726Sclemc if (t == '(') 157*9726Sclemc lpar++; 158*9726Sclemc else if (t==')') { 159*9726Sclemc lpar--; 160*9726Sclemc if (lpar < 0) { 161*9726Sclemc error("missing left paren"); 162*9726Sclemc return(1); 163*9726Sclemc } 164*9726Sclemc } 165*9726Sclemc outcode(scrat); 166*9726Sclemc } while (lpar >= 0); 167*9726Sclemc if (lpar > 0) { 168*9726Sclemc error("missing right paren"); 169*9726Sclemc return(1); 170*9726Sclemc } 171*9726Sclemc return(0); 172*9726Sclemc } 173*9726Sclemc 174*9726Sclemc forcode(){ 175*9726Sclemc int lpar, t; 176*9726Sclemc char *ps, *qs; 177*9726Sclemc 178*9726Sclemc transfer = 0; 179*9726Sclemc outcont(0); 180*9726Sclemc putcom("for"); 181*9726Sclemc yyval = genlab(3); 182*9726Sclemc brkstk[++brkptr] = yyval+1; 183*9726Sclemc typestk[brkptr] = FOR; 184*9726Sclemc brkused[brkptr] = 0; 185*9726Sclemc forstk[forptr++] = malloc(1); 186*9726Sclemc if ((t = gnbtok(scrat)) != '(') { 187*9726Sclemc error("missing left paren in FOR"); 188*9726Sclemc pbstr(scrat); 189*9726Sclemc return; 190*9726Sclemc } 191*9726Sclemc if (gnbtok(scrat) != ';') { /* real init clause */ 192*9726Sclemc pbstr(scrat); 193*9726Sclemc outtab(); 194*9726Sclemc if (eatup() > 0) { 195*9726Sclemc error("illegal FOR clause"); 196*9726Sclemc return; 197*9726Sclemc } 198*9726Sclemc outdon(); 199*9726Sclemc } 200*9726Sclemc if (gnbtok(scrat) == ';') /* empty condition */ 201*9726Sclemc outcont(yyval); 202*9726Sclemc else { /* non-empty condition */ 203*9726Sclemc pbstr(scrat); 204*9726Sclemc outnum(yyval); 205*9726Sclemc outtab(); 206*9726Sclemc outcode("if(.not.("); 207*9726Sclemc for (lpar=0; lpar >= 0;) { 208*9726Sclemc if ((t = gnbtok(scrat)) == ';') 209*9726Sclemc break; 210*9726Sclemc if (t == '(') 211*9726Sclemc lpar++; 212*9726Sclemc else if (t == ')') { 213*9726Sclemc lpar--; 214*9726Sclemc if (lpar < 0) { 215*9726Sclemc error("missing left paren in FOR clause"); 216*9726Sclemc return; 217*9726Sclemc } 218*9726Sclemc } 219*9726Sclemc if (t != '\n') 220*9726Sclemc outcode(scrat); 221*9726Sclemc } 222*9726Sclemc outcode("))"); 223*9726Sclemc outgoto(yyval+2); 224*9726Sclemc if (lpar < 0) 225*9726Sclemc error("invalid FOR clause"); 226*9726Sclemc } 227*9726Sclemc ps = scrat; 228*9726Sclemc for (lpar=0; lpar >= 0;) { 229*9726Sclemc if ((t = gtok(ps)) == '(') 230*9726Sclemc lpar++; 231*9726Sclemc else if (t == ')') 232*9726Sclemc lpar--; 233*9726Sclemc if (lpar >= 0 && t != '\n') 234*9726Sclemc while(*ps) 235*9726Sclemc ps++; 236*9726Sclemc } 237*9726Sclemc *ps = '\0'; 238*9726Sclemc qs = forstk[forptr-1] = malloc((unsigned)(ps-scrat+1)); 239*9726Sclemc ps = scrat; 240*9726Sclemc while (*qs++ = *ps++) 241*9726Sclemc ; 242*9726Sclemc indent++; 243*9726Sclemc } 244*9726Sclemc 245*9726Sclemc forstat(p1) int p1; { 246*9726Sclemc char *bp, *q; 247*9726Sclemc bp = forstk[--forptr]; 248*9726Sclemc if (wasnext) 249*9726Sclemc outnum(p1+1); 250*9726Sclemc if (nonblank(bp)){ 251*9726Sclemc outtab(); 252*9726Sclemc outcode(bp); 253*9726Sclemc outdon(); 254*9726Sclemc } 255*9726Sclemc outgoto(p1); 256*9726Sclemc indent--; 257*9726Sclemc putcom("endfor"); 258*9726Sclemc outcont(p1+2); 259*9726Sclemc for (q=bp; *q++;); 260*9726Sclemc free(bp); 261*9726Sclemc brkptr--; 262*9726Sclemc } 263*9726Sclemc 264*9726Sclemc retcode() { 265*9726Sclemc register c; 266*9726Sclemc if ((c = gnbtok(scrat)) != '\n' && c != ';' && c != '}') { 267*9726Sclemc pbstr(scrat); 268*9726Sclemc outtab(); 269*9726Sclemc outcode(fcname); 270*9726Sclemc outcode(" = "); 271*9726Sclemc eatup(); 272*9726Sclemc outdon(); 273*9726Sclemc } 274*9726Sclemc else if (c == '}') 275*9726Sclemc pbstr(scrat); 276*9726Sclemc outtab(); 277*9726Sclemc outcode("return"); 278*9726Sclemc outdon(); 279*9726Sclemc transfer = 1; 280*9726Sclemc } 281*9726Sclemc 282*9726Sclemc docode() { 283*9726Sclemc transfer = 0; 284*9726Sclemc outtab(); 285*9726Sclemc outcode("do "); 286*9726Sclemc yyval = genlab(2); 287*9726Sclemc brkstk[++brkptr] = yyval; 288*9726Sclemc typestk[brkptr] = DO; 289*9726Sclemc brkused[brkptr] = 0; 290*9726Sclemc outnum(yyval); 291*9726Sclemc eatup(); 292*9726Sclemc outdon(); 293*9726Sclemc indent++; 294*9726Sclemc } 295*9726Sclemc 296*9726Sclemc dostat(p1) int p1; { 297*9726Sclemc outcont(p1); 298*9726Sclemc indent--; 299*9726Sclemc if (wasbreak) 300*9726Sclemc outcont(p1+1); 301*9726Sclemc brkptr--; 302*9726Sclemc } 303*9726Sclemc 304*9726Sclemc #ifdef gcos 305*9726Sclemc #define atoi(s) (*s-'0') /* crude!!! */ 306*9726Sclemc #endif 307*9726Sclemc 308*9726Sclemc breakcode() { 309*9726Sclemc int level, t; 310*9726Sclemc 311*9726Sclemc level = 0; 312*9726Sclemc if ((t=gnbtok(scrat)) == DIG) 313*9726Sclemc level = atoi(scrat) - 1; 314*9726Sclemc else if (t != ';') 315*9726Sclemc pbstr(scrat); 316*9726Sclemc if (brkptr-level < 0) 317*9726Sclemc error("illegal BREAK"); 318*9726Sclemc else { 319*9726Sclemc outgoto(brkstk[brkptr-level]+1); 320*9726Sclemc brkused[brkptr-level] |= 1; 321*9726Sclemc } 322*9726Sclemc transfer = 1; 323*9726Sclemc } 324*9726Sclemc 325*9726Sclemc nextcode() { 326*9726Sclemc int level, t; 327*9726Sclemc 328*9726Sclemc level = 0; 329*9726Sclemc if ((t=gnbtok(scrat)) == DIG) 330*9726Sclemc level = atoi(scrat) - 1; 331*9726Sclemc else if (t != ';') 332*9726Sclemc pbstr(scrat); 333*9726Sclemc if (brkptr-level < 0) 334*9726Sclemc error("illegal NEXT"); 335*9726Sclemc else { 336*9726Sclemc outgoto(brkstk[brkptr-level]); 337*9726Sclemc brkused[brkptr-level] |= 2; 338*9726Sclemc } 339*9726Sclemc transfer = 1; 340*9726Sclemc } 341*9726Sclemc 342*9726Sclemc nonblank(s) char *s; { 343*9726Sclemc int c; 344*9726Sclemc while (c = *s++) 345*9726Sclemc if (c!=' ' && c!='\t' && c!='\n') 346*9726Sclemc return(1); 347*9726Sclemc return(0); 348*9726Sclemc } 349*9726Sclemc 350*9726Sclemc int errorflag = 0; 351*9726Sclemc 352*9726Sclemc error(s1) char *s1; { 353*9726Sclemc if (errorflag == 0) 354*9726Sclemc fprintf(stderr, "ratfor:"); 355*9726Sclemc fprintf(stderr, "error at line %d, file %s: ",linect[infptr],curfile[infptr]); 356*9726Sclemc fprintf(stderr, s1); 357*9726Sclemc fprintf(stderr, "\n"); 358*9726Sclemc errorflag = 1; 359*9726Sclemc } 360*9726Sclemc 361*9726Sclemc errcode() { 362*9726Sclemc int c; 363*9726Sclemc if (errorflag == 0) 364*9726Sclemc fprintf(stderr, "******\n"); 365*9726Sclemc fprintf(stderr, "*****F ratfor:"); 366*9726Sclemc fprintf(stderr, "syntax error, line %d, file %s\n", linect[infptr], curfile[infptr]); 367*9726Sclemc while ((c=getchr())!=';' && c!='}' && c!='\n' && c!=EOF && c!='\0') 368*9726Sclemc ; 369*9726Sclemc if (c == EOF || c == '\0') 370*9726Sclemc putbak(c); 371*9726Sclemc errorflag = 1; 372*9726Sclemc } 373