|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)1.fort.c 4.1 (Berkeley) 2/11/83"; ! 3: #endif not lint ! 4: ! 5: #include <stdio.h> ! 6: #include "1.incl.h" ! 7: #include "1.defs.h" ! 8: #include "def.h" ! 9: ! 10: ! 11: act(k,c,bufptr) ! 12: int k,bufptr; ! 13: char c; ! 14: { ! 15: long ftemp; ! 16: struct lablist *makelab(); ! 17: switch(k) ! 18: /*handle labels */ ! 19: {case 1: ! 20: if (c != ' ') ! 21: { ! 22: ftemp = c - '0'; ! 23: newlab->labelt = 10L * newlab->labelt + ftemp; ! 24: ! 25: if (newlab->labelt > 99999L) ! 26: { ! 27: error("in syntax:\n","",""); ! 28: fprintf(stderr,"line %d: label beginning %D too long\n%s\n", ! 29: begline,newlab->labelt,buffer); ! 30: fprintf(stderr,"treating line as straight line code\n"); ! 31: return(ABORT); ! 32: } ! 33: } ! 34: break; ! 35: ! 36: case 3: nlabs++; ! 37: newlab = newlab->nxtlab = makelab(0L); ! 38: break; ! 39: ! 40: /* handle labsw- switches and labels */ ! 41: /* handle if statements */ ! 42: case 30: counter++; break; ! 43: ! 44: case 31: ! 45: counter--; ! 46: if (counter) return(_if1); ! 47: else ! 48: { ! 49: pred = remtilda(stralloc(&buffer[p1],bufptr - p1)); ! 50: p3 = bufptr + 1; /* p3 pts. to 1st symbol after ) */ ! 51: flag = 1; ! 52: return(_if2); } ! 53: ! 54: case 45: /* set p1 to pt.to 1st symbol of pred */ ! 55: p1 = bufptr + 1; ! 56: act(30,c,bufptr); break; ! 57: ! 58: /* handle do loops */ ! 59: case 61: p1 = bufptr; break; /* p1 pts. to 1st symbol of increment string */ ! 60: ! 61: case 62: counter ++; break; ! 62: ! 63: case 63: counter --; break; ! 64: ! 65: case 64: ! 66: if (counter != 0) break; ! 67: act(162,c,bufptr); ! 68: return(ABORT); ! 69: ! 70: case 70: if (counter) return(_rwp); ! 71: r1 = bufptr; ! 72: return(_rwlab); ! 73: ! 74: case 72: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); break; ! 75: ! 76: case 73: endlab = newlab; ! 77: break; ! 78: ! 79: case 74: errlab = newlab; ! 80: break; ! 81: ! 82: case 75: reflab = newlab; ! 83: act(3,c,bufptr); ! 84: break; ! 85: ! 86: case 76: r1 = bufptr; break; ! 87: ! 88: case 77: ! 89: if (!counter) ! 90: { ! 91: act(111,c,bufptr); ! 92: return(ABORT); ! 93: } ! 94: counter--; ! 95: break; ! 96: /* generate nodes of all types */ ! 97: case 111: /* st. line code */ ! 98: stcode = remtilda(stralloc(&buffer[p3],endbuf - p3)); ! 99: recognize(STLNVX,flag); ! 100: return(ABORT); ! 101: ! 102: case 122: /* uncond. goto */ ! 103: recognize(ungo,flag); ! 104: break; ! 105: ! 106: case 123: /* assigned goto */ ! 107: act(72,c,bufptr); ! 108: faterr("in parsing:\n","assigned goto must have list of labels",""); ! 109: ! 110: case 124: /* ass. goto, labels */ ! 111: recognize(ASGOVX, flag); ! 112: break; ! 113: ! 114: case 125: /* computed goto*/ ! 115: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); ! 116: recognize(COMPVX, flag); ! 117: return(ABORT); ! 118: ! 119: case 133: /* if() = is a simple statement, so reset flag to 0 */ ! 120: flag = 0; ! 121: act(111,c,bufptr); ! 122: return(ABORT); ! 123: ! 124: case 141: /* arith. if */ ! 125: recognize(arithif, 0); ! 126: break; ! 127: ! 128: case 150: /* label assignment */ ! 129: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); ! 130: recognize(ASVX, flag); ! 131: break; ! 132: ! 133: case 162: /* do node */ ! 134: inc = remtilda(stralloc(&buffer[p1],endbuf - p1)); ! 135: recognize(DOVX, 0); ! 136: break; ! 137: ! 138: case 180: /* continue statement */ ! 139: recognize(contst, 0); ! 140: break; ! 141: ! 142: case 200: /* function or subroutine statement */ ! 143: progtype = sub; ! 144: nameline = begline; ! 145: recognize(STLNVX,0); ! 146: break; ! 147: ! 148: ! 149: case 210: /* block data statement */ ! 150: progtype = blockdata; ! 151: act(111,c,bufptr); ! 152: return(ABORT); ! 153: ! 154: case 300: /* return statement */ ! 155: recognize(RETVX,flag); ! 156: break; ! 157: ! 158: ! 159: case 350: /* stop statement */ ! 160: recognize(STOPVX, flag); ! 161: break; ! 162: ! 163: ! 164: case 400: /* end statement */ ! 165: if (progtype == sub) ! 166: act(300, c, bufptr); ! 167: else ! 168: act(350, c, bufptr); ! 169: return(endrt); ! 170: ! 171: case 500: ! 172: prerw = remtilda(stralloc(&buffer[p3],r1 - p3 + 1)); ! 173: postrw = remtilda(stralloc(&buffer[r2],endbuf - r2)); ! 174: if (reflab || endlab || errlab) recognize(IOVX,flag); ! 175: else recognize(STLNVX,flag); ! 176: return(ABORT); ! 177: ! 178: case 510: r2 = bufptr; ! 179: act(3,c,bufptr); ! 180: act(500,c,bufptr); ! 181: return(ABORT); ! 182: ! 183: case 520: r2 = bufptr; ! 184: reflab = newlab; ! 185: act(3,c,bufptr); ! 186: act(500,c,bufptr); ! 187: return(ABORT); ! 188: ! 189: ! 190: case 600: ! 191: recognize(FMTVX,0); return(ABORT); ! 192: ! 193: case 700: ! 194: stcode = remtilda(stralloc(&buffer[p3],endbuf - p3)); ! 195: recognize(entry,0); return(ABORT); ! 196: /* error */ ! 197: case 999: ! 198: printf("error: symbol '%c' should not occur as %d'th symbol of: \n%s\n", ! 199: c,bufptr, buffer); ! 200: return(ABORT); ! 201: } ! 202: return(nulls); ! 203: } ! 204: ! 205: ! 206: ! 207: struct lablist *makelab(x) ! 208: long x; ! 209: { ! 210: struct lablist *p; ! 211: p = challoc (sizeof(*p)); ! 212: p->labelt = x; ! 213: p->nxtlab = 0; ! 214: return(p); ! 215: } ! 216: ! 217: ! 218: long label(i) ! 219: int i; ! 220: { ! 221: struct lablist *j; ! 222: for (j = linelabs; i > 0; i--) ! 223: { ! 224: if (j == 0) return(0L); ! 225: j = j->nxtlab; ! 226: } ! 227: if (j) ! 228: return(j->labelt); ! 229: else ! 230: return(0L); ! 231: } ! 232: ! 233: ! 234: freelabs() ! 235: { ! 236: struct lablist *j,*k; ! 237: j = linelabs; ! 238: while(j != 0) ! 239: { ! 240: k = j->nxtlab; ! 241: chfree(j,sizeof(*j)); ! 242: j = k; ! 243: } ! 244: } ! 245: ! 246: ! 247: stralloc(ad,n) /* allocate space, copy n chars from address ad, add '0' */ ! 248: int n; char *ad; ! 249: { ! 250: char *cp; ! 251: cp = galloc(n+1); ! 252: copycs(ad,cp,n); ! 253: return(cp); ! 254: } ! 255: ! 256: ! 257: remtilda(s) /* change ~ to blank */ ! 258: char *s; ! 259: { ! 260: int i; ! 261: for (i = 0; s[i] != '\0'; i++) ! 262: if (s[i] == '~') s[i] = ' '; ! 263: return(s); ! 264: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.