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