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