xref: /original-bsd/games/battlestar/parse.c (revision e3b6d66c)
1 #ifndef lint
2 static char sccsid[] = "@(#)parse.c	1.1 11/18/84";
3 #endif
4 
5 #include "externs.h"
6 
7 wordinit()
8 {
9 	register struct wlist *w;
10 
11 	for (w = wlist; w->string; w++)
12 		install(w);
13 }
14 
15 hash(s)
16 	register char *s;
17 {
18 	register hashval = 0;
19 
20 	while (*s) {
21 		hashval += *s++;
22 		hashval *= HASHMUL;
23 		hashval &= HASHMASK;
24 	}
25 	return hashval;
26 }
27 
28 struct wlist *
29 lookup(s)
30 	char *s;
31 {
32 	register struct wlist *wp;
33 
34 	for (wp = hashtab[hash(s)]; wp != NULL; wp = wp->next)
35 		if (*s == *wp->string && strcmp(s, wp->string) == 0)
36 			return wp;
37 	return NULL;
38 }
39 
40 install(wp)
41 	register struct wlist *wp;
42 {
43 	int hashval;
44 
45 	if (lookup(wp->string) == NULL) {
46 		hashval = hash(wp->string);
47 		wp->next = hashtab[hashval];
48 		hashtab[hashval] = wp;
49 	} else
50 		printf("Multiply defined %s.\n", wp->string);
51 }
52 
53 parse()
54 {
55 	register struct wlist *wp;
56 	register n;
57 
58 	wordnumber = 0;           /* for cypher */
59 	for (n = 0; n <= wordcount; n++) {
60 		if ((wp = lookup(words[n])) == NULL) {
61 			wordvalue[n] = -1;
62 			wordtype[n] = -1;
63 		} else {
64 			wordvalue[n] = wp -> value;
65 			wordtype[n] = wp -> article;
66 		}
67 	}
68 }
69