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