1 #include "token.h" 2 3 nm_entry* nm_entry::nm_table[nm_entry::h_t_size]; 4 5 //----------------------------------------------------------------// 6 hash(const char * name)7inline 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)19nm_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)34nm_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