Annotation of 43BSD/games/adventure/vocab.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.