1 /* $Id: symtab.c,v 1.9 2010/11/24 15:12:29 tom Exp $ */
5 /* TABLE_SIZE is the number of entries in the symbol table. */
6 /* TABLE_SIZE must be a power of two. */
8 #define TABLE_SIZE 1024
10 static bucket
**symbol_table
= 0;
15 hash(const char *name
)
20 assert(name
&& *name
);
23 while ((c
= *++s
) != 0)
24 k
= (31 * k
+ c
) & (TABLE_SIZE
- 1);
30 make_bucket(const char *name
)
36 bp
= (bucket
*)MALLOC(sizeof(bucket
));
42 bp
->name
= MALLOC(strlen(name
) + 1);
46 bp
->value
= UNDEFINED
;
51 strcpy(bp
->name
, name
);
57 lookup(const char *name
)
61 bpp
= symbol_table
+ hash(name
);
66 if (strcmp(name
, bp
->name
) == 0)
72 *bpp
= bp
= make_bucket(name
);
73 last_symbol
->next
= bp
;
80 create_symbol_table(void)
85 symbol_table
= (bucket
**)MALLOC(TABLE_SIZE
* sizeof(bucket
*));
86 NO_SPACE(symbol_table
);
88 for (i
= 0; i
< TABLE_SIZE
; i
++)
91 bp
= make_bucket("error");
97 symbol_table
[hash("error")] = bp
;
101 free_symbol_table(void)
112 for (p
= first_symbol
; p
; p
= q
)