static void insert_symbol_hashed (struct dictionary *dict, struct symbol *sym) { unsigned int hash_index; struct symbol **buckets = DICT_HASHED_BUCKETS (dict); hash_index = (msymbol_hash_iw (SYMBOL_NATURAL_NAME (sym)) % DICT_HASHED_NBUCKETS (dict)); sym->hash_next = buckets[hash_index]; buckets[hash_index] = sym; }
static void add_symbol_hashed_expandable (struct dictionary *dict, struct symbol *sym) { int nsyms = ++DICT_HASHED_EXPANDABLE_NSYMS (dict); if (DICT_HASHTABLE_SIZE (nsyms) > DICT_HASHED_NBUCKETS (dict)) expand_hashtable (dict); insert_symbol_hashed (dict, sym); DICT_HASHED_EXPANDABLE_NSYMS (dict) = nsyms; }
extern struct dictionary * dict_create_hashed_expandable (void) { struct dictionary *retval; retval = xmalloc (sizeof (struct dictionary)); DICT_VECTOR (retval) = &dict_hashed_expandable_vector; DICT_HASHED_NBUCKETS (retval) = DICT_EXPANDABLE_INITIAL_CAPACITY; DICT_HASHED_BUCKETS (retval) = xcalloc (DICT_EXPANDABLE_INITIAL_CAPACITY, sizeof (struct symbol *)); DICT_HASHED_EXPANDABLE_NSYMS (retval) = 0; return retval; }
static struct symbol * iterator_hashed_advance (struct dict_iterator *iterator) { const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); int nbuckets = DICT_HASHED_NBUCKETS (dict); int i; for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nbuckets; ++i) { struct symbol *sym = DICT_HASHED_BUCKET (dict, i); if (sym != NULL) { DICT_ITERATOR_INDEX (iterator) = i; DICT_ITERATOR_CURRENT (iterator) = sym; return sym; } } return NULL; }
struct dictionary * dict_create_hashed (struct obstack *obstack, const struct pending *symbol_list) { struct dictionary *retval; int nsyms = 0, nbuckets, i; struct symbol **buckets; const struct pending *list_counter; retval = obstack_alloc (obstack, sizeof (struct dictionary)); DICT_VECTOR (retval) = &dict_hashed_vector; /* Calculate the number of symbols, and allocate space for them. */ for (list_counter = symbol_list; list_counter != NULL; list_counter = list_counter->next) { nsyms += list_counter->nsyms; } nbuckets = DICT_HASHTABLE_SIZE (nsyms); DICT_HASHED_NBUCKETS (retval) = nbuckets; buckets = obstack_alloc (obstack, nbuckets * sizeof (struct symbol *)); memset (buckets, 0, nbuckets * sizeof (struct symbol *)); DICT_HASHED_BUCKETS (retval) = buckets; /* Now fill the buckets. */ for (list_counter = symbol_list; list_counter != NULL; list_counter = list_counter->next) { for (i = list_counter->nsyms - 1; i >= 0; --i) { insert_symbol_hashed (retval, list_counter->symbol[i]); } } return retval; }
static int size_hashed (const struct dictionary *dict) { return DICT_HASHED_NBUCKETS (dict); }