xref: /csrg-svn/games/battlestar/parse.c (revision 69066)
118724Sedward /*
260750Sbostic  * Copyright (c) 1983, 1993
360750Sbostic  *	The Regents of the University of California.  All rights reserved.
434234Sbostic  *
542571Sbostic  * %sccs.include.redist.c%
618724Sedward  */
718724Sedward 
817388Sedward #ifndef lint
9*69066Sbostic static char sccsid[] = "@(#)parse.c	8.2 (Berkeley) 04/28/95";
1034234Sbostic #endif /* not lint */
1117388Sedward 
12*69066Sbostic #include "extern.h"
1317388Sedward 
wordinit()1417388Sedward wordinit()
1517388Sedward {
1617388Sedward 	register struct wlist *w;
1717388Sedward 
1817388Sedward 	for (w = wlist; w->string; w++)
1917388Sedward 		install(w);
2017388Sedward }
2117388Sedward 
hash(s)2217388Sedward hash(s)
2317388Sedward 	register char *s;
2417388Sedward {
2517388Sedward 	register hashval = 0;
2617388Sedward 
2717388Sedward 	while (*s) {
2817388Sedward 		hashval += *s++;
2917388Sedward 		hashval *= HASHMUL;
3017388Sedward 		hashval &= HASHMASK;
3117388Sedward 	}
3217388Sedward 	return hashval;
3317388Sedward }
3417388Sedward 
3517388Sedward struct wlist *
lookup(s)3617388Sedward lookup(s)
3717388Sedward 	char *s;
3817388Sedward {
3917388Sedward 	register struct wlist *wp;
4017388Sedward 
4117388Sedward 	for (wp = hashtab[hash(s)]; wp != NULL; wp = wp->next)
4217388Sedward 		if (*s == *wp->string && strcmp(s, wp->string) == 0)
4317388Sedward 			return wp;
4417388Sedward 	return NULL;
4517388Sedward }
4617388Sedward 
install(wp)4717388Sedward install(wp)
4817388Sedward 	register struct wlist *wp;
4917388Sedward {
5017388Sedward 	int hashval;
5117388Sedward 
5217388Sedward 	if (lookup(wp->string) == NULL) {
5317388Sedward 		hashval = hash(wp->string);
5417388Sedward 		wp->next = hashtab[hashval];
5517388Sedward 		hashtab[hashval] = wp;
5617388Sedward 	} else
5717388Sedward 		printf("Multiply defined %s.\n", wp->string);
5817388Sedward }
5917388Sedward 
parse()6017388Sedward parse()
6117388Sedward {
6217388Sedward 	register struct wlist *wp;
6317388Sedward 	register n;
6417388Sedward 
6517388Sedward 	wordnumber = 0;           /* for cypher */
6617388Sedward 	for (n = 0; n <= wordcount; n++) {
6717388Sedward 		if ((wp = lookup(words[n])) == NULL) {
6817388Sedward 			wordvalue[n] = -1;
6917388Sedward 			wordtype[n] = -1;
7017388Sedward 		} else {
7117388Sedward 			wordvalue[n] = wp -> value;
7217388Sedward 			wordtype[n] = wp -> article;
7317388Sedward 		}
7417388Sedward 	}
7517388Sedward }
76