xref: /original-bsd/games/adventure/vocab.c (revision 957a0273)
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 
186