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