|
|
1.1 ! root 1: # ! 2: /* Re-coding of advent in C: data structure routines */ ! 3: ! 4: static char sccsid[] = " vocab.c 4.1 82/05/11 "; ! 5: ! 6: # include "hdr.h" ! 7: ! 8: dstroy(object) ! 9: int object; ! 10: { move(object,0); ! 11: } ! 12: ! 13: juggle(object) ! 14: int object; ! 15: { register int i,j; ! 16: i=place[object]; ! 17: j=fixed[object]; ! 18: move(object,i); ! 19: move(object+100,j); ! 20: } ! 21: ! 22: ! 23: move(object,where) ! 24: int object,where; ! 25: { register int from; ! 26: if (object<=100) ! 27: from=place[object]; ! 28: else ! 29: from=fixed[object-100]; ! 30: if (from>0 && from<=300) carry(object,from); ! 31: drop(object,where); ! 32: } ! 33: ! 34: ! 35: put(object,where,pval) ! 36: int object,where,pval; ! 37: { move(object,where); ! 38: return(-1-pval); ! 39: } ! 40: ! 41: ! 42: ! 43: carry(object,where) ! 44: int object,where; ! 45: { register int temp; ! 46: if (object<=100) ! 47: { if (place[object]== -1) return; ! 48: place[object] = -1; ! 49: holdng++; ! 50: } ! 51: if (atloc[where]==object) ! 52: { atloc[where]=link[object]; ! 53: return; ! 54: } ! 55: for (temp=atloc[where]; link[temp]!=object; temp=link[temp]); ! 56: link[temp]=link[object]; ! 57: } ! 58: ! 59: ! 60: ! 61: ! 62: drop(object,where) ! 63: int object,where; ! 64: { if (object>100) fixed[object-100]=where; ! 65: else ! 66: { if (place[object]== -1) holdng--; ! 67: place[object]=where; ! 68: } ! 69: if (where<=0) return; ! 70: link[object]=atloc[where]; ! 71: atloc[where]=object; ! 72: } ! 73: ! 74: ! 75: vocab(word,type,value) /* look up or store a word */ ! 76: char *word; ! 77: int type; /* -2 for store, -1 for user word, >=0 for canned lookup*/ ! 78: int value; /* used for storing only */ ! 79: { register int adr; ! 80: register char *s,*t; ! 81: int hash, i; ! 82: struct hashtab *h; ! 83: for (hash=0,s=word,i=0; i<5 &&*s; i++) /* some kind of hash */ ! 84: hash += *s++; /* add all chars in the word */ ! 85: hash = (hash*3719)&077777; /* pulled that one out of a hat */ ! 86: hash %= HTSIZE; /* put it into range of table */ ! 87: ! 88: for(adr=hash;; adr++) /* look for entry in table */ ! 89: { if (adr==HTSIZE) adr=0; /* wrap around */ ! 90: h = &voc[adr]; /* point at the entry */ ! 91: switch(type) ! 92: { case -2: /* fill in entry */ ! 93: if (h->val) /* already got an entry? */ ! 94: goto exitloop2; ! 95: h->val=value; ! 96: h->atab=malloc(length(word)); ! 97: for (s=word,t=h->atab; *s;) ! 98: *t++ = *s++ ^ '='; ! 99: *t=0^'='; ! 100: /* encrypt slightly to thwart core reader */ ! 101: /* printf("Stored \"%s\" (%d ch) as entry %d\n", */ ! 102: /* word, length(word), adr); */ ! 103: return(0); /* entry unused */ ! 104: case -1: /* looking up user word */ ! 105: if (h->val==0) return(-1); /* not found */ ! 106: for (s=word, t=h->atab;*t ^ '=';) ! 107: if ((*s++ ^ '=') != *t++) ! 108: goto exitloop2; ! 109: if ((*s ^ '=') != *t && s-word<5) goto exitloop2; ! 110: /* the word matched o.k. */ ! 111: return(h->val); ! 112: default: /* looking up known word */ ! 113: if (h->val==0) ! 114: { printf("Unable to find %s in vocab\n",word); ! 115: exit(0); ! 116: } ! 117: for (s=word, t=h->atab;*t ^ '=';) ! 118: if ((*s++ ^ '=') != *t++) goto exitloop2; ! 119: /* the word matched o.k. */ ! 120: if (h->val/1000 != type) continue; ! 121: return(h->val%1000); ! 122: } ! 123: ! 124: exitloop2: /* hashed entry does not match */ ! 125: if (adr+1==hash || (adr==HTSIZE && hash==0)) ! 126: { printf("Hash table overflow\n"); ! 127: exit(0); ! 128: } ! 129: } ! 130: } ! 131: ! 132: ! 133: copystr(w1,w2) /* copy one string to another */ ! 134: char *w1,*w2; ! 135: { register char *s,*t; ! 136: for (s=w1,t=w2; *s;) ! 137: *t++ = *s++; ! 138: *t=0; ! 139: } ! 140: ! 141: weq(w1,w2) /* compare words */ ! 142: char *w1,*w2; /* w1 is user, w2 is system */ ! 143: { register char *s,*t; ! 144: register int i; ! 145: s=w1; ! 146: t=w2; ! 147: for (i=0; i<5; i++) /* compare at most 5 chars */ ! 148: { if (*t==0 && *s==0) ! 149: return(TRUE); ! 150: if (*s++ != *t++) return(FALSE); ! 151: } ! 152: return(TRUE); ! 153: } ! 154: ! 155: ! 156: length(str) /* includes 0 at end */ ! 157: char *str; ! 158: { register char *s; ! 159: register int n; ! 160: for (n=0,s=str; *s++;) n++; ! 161: return(n+1); ! 162: } ! 163: ! 164: prht() /* print hash table */ ! 165: { register int i,j,l; ! 166: char *c; ! 167: struct hashtab *h; ! 168: for (i=0; i<HTSIZE/10+1; i++) ! 169: { printf("%4d",i*10); ! 170: for (j=0; j<10; j++) ! 171: { if (i*10+j>=HTSIZE) break; ! 172: h= &voc[i*10+j]; ! 173: putchar(' '); ! 174: if (h->val==0) ! 175: { printf("-----"); ! 176: continue; ! 177: } ! 178: for (l=0, c=h->atab; l<5; l++) ! 179: if ((*c ^ '=')) putchar(*c++ ^ '='); ! 180: else putchar(' '); ! 181: } ! 182: putchar('\n'); ! 183: } ! 184: } ! 185:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.