|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "1.incl.h" ! 3: #include "1.defs.h" ! 4: #include"def.h" ! 5: ! 6: extern int match[], symclass[], action[], newstate[]; ! 7: extern char symbol[]; ! 8: long *hashtab; ! 9: int *value, *chain; ! 10: ! 11: extern FILE *infd; ! 12: ! 13: ! 14: parse() ! 15: {int i,j,found,current, someread; ! 16: char c; ! 17: ! 18: hash_init(); ! 19: routinit(); ! 20: line_init(); ! 21: ! 22: someread = 0; /* indicates haven't read part of a routine */ ! 23: ! 24: empseek(0); ! 25: endbuf = getline(&endline, &endchar, &endcom, & comchar); ! 26: if (progress && endbuf != -1) fprintf(stderr,"parsing\n"); ! 27: while(endbuf != -1) /* getline returns -1 when no more input */ ! 28: { ! 29: someread = 1; ! 30: if (progress > 0) ! 31: { ! 32: for (i = begline; i <= endline; i++) ! 33: if (!(i % progress)) fprintf(stderr,"parsing line %d\n",i); ! 34: } ! 35: current = 0; ! 36: for (i = 0; i < endbuf; i++) ! 37: { ! 38: ! 39: c = buffer[i]; ! 40: if(c != '~') ! 41: { ! 42: found = 0; ! 43: if ( (current < 0 || current >= snum) && current != ABORT) ! 44: { ! 45: strerr("in parsing:","",""); ! 46: fprintf(stderr,"line %d of file, parser in invalid state", begline,current); ! 47: fprintf(stderr,"treating it as straight line code\n"); ! 48: current = ABORT; ! 49: } ! 50: else ! 51: for (j = match[current]; j < match[current + 1]; j++) ! 52: { ! 53: if ((symclass[j] == 0 && c == symbol[j]) || ! 54: (symclass[j] != 0 && classmatch(c,symclass[j]) )) ! 55: {found = 1; break; ! 56: } ! 57: } ! 58: if (!found) ! 59: { ! 60: error("in syntax:","",""); ! 61: fprintf(stderr,"between lines %d and %d of file\n",begline, endline); ! 62: if (debug) ! 63: fprintf(stderr,"symbol '%c' does not match entries for state %d\n",c,current); ! 64: fprintf(stderr,"treating it as straight line code\n"); ! 65: current = ABORT; ! 66: } ! 67: else if (!action[j]) ! 68: current = newstate[j]; ! 69: else ! 70: { ! 71: current = act(action[j],c,i); ! 72: if (current == nulls) current = newstate[j]; ! 73: } ! 74: if (current == ABORT) break; ! 75: if (current == endrt) ! 76: { ! 77: return(1); ! 78: } ! 79: } ! 80: } ! 81: line_init(); ! 82: endbuf = getline(&endline, &endchar, &endcom,&comchar); ! 83: } ! 84: if (someread) return(1); ! 85: else return(0); ! 86: } ! 87: ! 88: ! 89: hash_init() ! 90: { ! 91: int i; ! 92: hashtab = challoc(sizeof(*hashtab) * maxhash); ! 93: chain = challoc(sizeof(*chain) * maxhash); ! 94: value = challoc(sizeof(*value) * maxhash); ! 95: for (i = 0; i < maxhash; i++) ! 96: { ! 97: hashtab[i] = -1L; ! 98: value[i] = -2; ! 99: chain[i] = 0; ! 100: } ! 101: } ! 102: ! 103: ! 104: hash_check() ! 105: { ! 106: int i; ! 107: for (i = 0; i < maxhash; ++i) ! 108: if (value[i] == -2 && hashtab[i] != -1L) ! 109: { ! 110: error("in syntax; label used but does not appear as statement label:","",""); ! 111: fprintf(stderr,"%D\n",hashtab[i]); ! 112: routerr = 1; ! 113: } ! 114: } ! 115: ! 116: hash_free() ! 117: { ! 118: chfree(hashtab,sizeof(*hashtab) * maxhash); ! 119: hashtab = 0; ! 120: chfree(chain,sizeof(*chain) * maxhash); ! 121: chain = 0; ! 122: chfree(value,sizeof(*value) * maxhash); ! 123: value = 0; ! 124: } ! 125: hash(x) ! 126: long x; ! 127: { ! 128: int quo, rem, hcount, temp; ! 129: ! 130: ASSERT(x >= 0L, hash); ! 131: quo = x/maxhash; ! 132: rem = x - (quo * maxhash); ! 133: if (quo == 0) quo = 1; ! 134: ! 135: temp = rem; ! 136: for (hcount=0; (hashtab[temp] != -1L) && (hashtab[temp] != x) && (hcount<maxhash); hcount++) ! 137: temp = (temp + quo)%maxhash; ! 138: if(hcount>=maxhash) faterr("hash table overflow - too many labels","",""); ! 139: hashtab[temp] = x; ! 140: return(temp); ! 141: } ! 142: ! 143: addref(x,ptr) /* put ptr in chain for x or assign value of x to *ptr */ ! 144: long x; ! 145: int *ptr; ! 146: { ! 147: int index; ! 148: index = hash(x); ! 149: ! 150: if (value[index] == -1) ! 151: { /* x already assigned value */ ! 152: *ptr = chain[index]; ! 153: return; ! 154: } ! 155: ! 156: /* add ptr to chain */ ! 157: ! 158: if (chain[index] == 0) ! 159: *ptr = 0; ! 160: else ! 161: *ptr = chain[index]; ! 162: chain[index] = ptr; ! 163: } ! 164: ! 165: fixvalue (x,ptr) ! 166: long x; ! 167: int ptr; ! 168: { ! 169: int *temp1, *temp2, index, temp0; ! 170: index = hash(x); ! 171: ! 172: while (index != -2) ! 173: { /* trace chain of linked labels */ ! 174: ! 175: if (value[index] == -1) ! 176: { ! 177: error("in syntax: ","",""); ! 178: fprintf(stderr,"attempt to redefine value of label %D between lines %d and %d\n", ! 179: x,begline,endline); ! 180: routerr = 1; ! 181: return; ! 182: } ! 183: ! 184: temp1 = &chain[index]; /* trace chain for each label */ ! 185: while (temp1 != 0) ! 186: { ! 187: temp2 = *temp1; ! 188: *temp1 = ptr; ! 189: temp1 = temp2; ! 190: } ! 191: temp0 = index; ! 192: index = value[index]; ! 193: value[temp0] = -1; ! 194: } ! 195: } ! 196: ! 197: connect(x,y) ! 198: long x,y; ! 199: { ! 200: int *temp, index, temp2; ! 201: index = hash(x); ! 202: ! 203: if (value[index] == -1) ! 204: fixvalue(y, chain[index]); ! 205: else ! 206: { ! 207: if (y == implicit) ! 208: { /* attach implicit chain to x chain */ ! 209: temp = &chain[index]; ! 210: ! 211: while (*temp != 0) ! 212: temp = *temp; ! 213: ! 214: *temp = chain[hash(y)]; ! 215: } ! 216: temp2 = index; /* attach y linked labels to x linked labels */ ! 217: while (value[temp2] >= 0) ! 218: temp2 = value[temp2]; ! 219: if (y == implicit) ! 220: value[temp2] = value[hash(y)]; ! 221: else ! 222: value[temp2] = hash(y); ! 223: } ! 224: if (y == implicit) clear(y); ! 225: } ! 226: ! 227: ! 228: clear(x) ! 229: long x; ! 230: { ! 231: int index; ! 232: index = hash(x); ! 233: value[index] = -2; ! 234: chain[index] = 0; ! 235: hashtab[index] = -1L; ! 236: } ! 237: ! 238:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.