1 #include "token.h"
2 
3 nm_entry* nm_entry::nm_table[nm_entry::h_t_size];
4 
5 //----------------------------------------------------------------//
6 
hash(const char * name)7 inline unsigned nm_entry::hash(const char* name)
8 {
9     unsigned h = 0;
10     unsigned c;
11 
12     while ((c = (unsigned)*name++) != 0) {
13         h = (h<<1) + c;
14     }
15 
16     return h % nm_entry::h_t_size;
17 }
18 
find(const char * name)19 nm_entry* nm_entry::find(const char* name)
20 {
21     unsigned h;
22     nm_entry* ne;
23 
24     h = hash(name);
25     for (ne = nm_table[h]; ne != NULL; ne = ne->next)
26     {
27         if (strcmp(name, ne->text) == 0)
28 	    break;
29     }
30 
31     return ne;
32 }
33 
add(const char * name,int v_tag)34 nm_entry* nm_entry::add(const char* name, int v_tag)
35 {
36     unsigned  h;
37     nm_entry* ne;
38 
39     ne = find(name);
40     if (ne != NULL)
41         return ne;
42 
43     h = hash(name);
44     ne = new (strlen(name)) nm_entry;
45     ne->next = nm_table[h];
46     nm_table[h] = ne;
47     ne->tag = v_tag;
48     ne->flags = 0;
49     strcpy(ne->text, name);
50     return ne;
51 }
52