1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37: #include <sys/cdefs.h>
38: #ifndef lint
39: #if 0
40: static char sccsid[] = "@(#)vocab.c 8.1 (Berkeley) 5/31/93";
41: #else
42: __RCSID("$NetBSD: vocab.c,v 1.11 2003/08/07 09:36:51 agc Exp $");
43: #endif
44: #endif
45:
46:
47:
48: #include <err.h>
49: #include <stdio.h>
50: #include <stdlib.h>
51: #include "hdr.h"
52: #include "extern.h"
53:
54: void
55: dstroy(object)
56: int object;
57: {
58: move(object, 0);
59: }
60:
61: void
62: juggle(object)
63: int object;
64: {
65: int i, j;
66:
67: i = place[object];
68: j = fixed[object];
69: move(object, i);
70: move(object + 100, j);
71: }
72:
73:
74: void
75: move(object, where)
76: int object, where;
77: {
78: int from;
79:
80: if (object <= 100)
81: from = place[object];
82: else
83: from = fixed[object - 100];
84: if (from > 0 && from <= 300)
85: carry(object, from);
86: drop(object, where);
87: }
88:
89: int
90: put(object, where, pval)
91: int object, where, pval;
92: {
93: move(object, where);
94: return (-1 - pval);
95: }
96:
97: void
98: carry(object, where)
99: int object, where;
100: {
101: int temp;
102:
103: if (object <= 100) {
104: if (place[object] == -1)
105: return;
106: place[object] = -1;
107: holdng++;
108: }
109: if (atloc[where] == object) {
110: atloc[where] = links[object];
111: return;
112: }
113: for (temp = atloc[where]; links[temp] != object; temp = links[temp]);
114: links[temp] = links[object];
115: }
116:
117:
118: void
119: drop(object, where)
120: int object, where;
121: {
122: if (object > 100)
123: fixed[object - 100] = where;
124: else {
125: if (place[object] == -1)
126: holdng--;
127: place[object] = where;
128: }
129: if (where <= 0)
130: return;
131: links[object] = atloc[where];
132: atloc[where] = object;
133: }
134:
135: int
136: vocab(word, type, value)
137: const char *word;
138: int type;
139:
140: int value;
141: {
142: int adr;
143: const char *s;
144: char *t;
145: int hash, i;
146: struct hashtab *h;
147:
148: for (hash = 0, s = word, i = 0; i < 5 && *s; i++)
149: hash += *s++;
150: hash = (hash * 3719) & 077777;
151: hash %= HTSIZE;
152:
153: for (adr = hash;; adr++) {
154: if (adr == HTSIZE)
155: adr = 0;
156: h = &voc[adr];
157: switch (type) {
158: case -2:
159: if (h->val)
160: goto exitloop2;
161: h->val = value;
162: h->atab = malloc(length(word));
163: if (h->atab == NULL)
164: err(1, NULL);
165: for (s = word, t = h->atab; *s;)
166: *t++ = *s++ ^ '=';
167: *t = 0 ^ '=';
168:
169:
170:
171: return (0);
172: case -1:
173: if (h->val == 0)
174: return (-1);
175: for (s = word, t = h->atab; *t ^ '=';)
176: if ((*s++ ^ '=') != *t++)
177: goto exitloop2;
178: if ((*s ^ '=') != *t && s - word < 5)
179: goto exitloop2;
180:
181: return (h->val);
182: default:
183: if (h->val == 0)
184: errx(1,"Unable to find %s in vocab", word);
185: for (s = word, t = h->atab; *t ^ '=';)
186: if ((*s++ ^ '=') != *t++)
187: goto exitloop2;
188:
189: if (h->val / 1000 != type)
190: continue;
191: return (h->val % 1000);
192: }
193:
194: exitloop2:
195: if (adr + 1 == hash || (adr == HTSIZE && hash == 0))
196: errx(1,"Hash table overflow");
197: }
198: }
199:
200: void
201: prht()
202: {
203: int i, j, l;
204: char *c;
205: struct hashtab *h;
206: for (i = 0; i < HTSIZE / 10 + 1; i++) {
207: printf("%4d", i * 10);
208: for (j = 0; j < 10; j++) {
209: if (i * 10 + j >= HTSIZE)
210: break;
211: h = &voc[i * 10 + j];
212: putchar(' ');
213: if (h->val == 0) {
214: printf("-----");
215: continue;
216: }
217: for (l = 0, c = h->atab; l < 5; l++)
218: if ((*c ^ '='))
219: putchar(*c++ ^ '=');
220: else
221: putchar(' ');
222: }
223: putchar('\n');
224: }
225: }