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