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