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