static void add_symbol_linear_expandable (struct dictionary *dict, struct symbol *sym) { int nsyms = ++DICT_LINEAR_NSYMS (dict); /* Do we have enough room? If not, grow it. */ if (nsyms > DICT_LINEAR_EXPANDABLE_CAPACITY (dict)) { DICT_LINEAR_EXPANDABLE_CAPACITY (dict) *= 2; DICT_LINEAR_SYMS (dict) = xrealloc (DICT_LINEAR_SYMS (dict), DICT_LINEAR_EXPANDABLE_CAPACITY (dict) * sizeof (struct symbol *)); } DICT_LINEAR_SYM (dict, nsyms - 1) = sym; }
struct dictionary * dict_create_linear_expandable (void) { struct dictionary *retval; retval = xmalloc (sizeof (struct dictionary)); DICT_VECTOR (retval) = &dict_linear_expandable_vector; DICT_LINEAR_NSYMS (retval) = 0; DICT_LINEAR_EXPANDABLE_CAPACITY (retval) = DICT_EXPANDABLE_INITIAL_CAPACITY; DICT_LINEAR_SYMS (retval) = xmalloc (DICT_LINEAR_EXPANDABLE_CAPACITY (retval) * sizeof (struct symbol *)); return retval; }
struct dictionary * dict_create_linear (struct obstack *obstack, const struct pending *symbol_list) { struct dictionary *retval; int nsyms = 0, i, j; struct symbol **syms; const struct pending *list_counter; retval = obstack_alloc (obstack, sizeof (struct dictionary)); DICT_VECTOR (retval) = &dict_linear_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; } DICT_LINEAR_NSYMS (retval) = nsyms; syms = obstack_alloc (obstack, nsyms * sizeof (struct symbol *)); DICT_LINEAR_SYMS (retval) = syms; /* Now fill in the symbols. Start filling in from the back, so as to preserve the original order of the symbols. */ for (list_counter = symbol_list, j = nsyms - 1; list_counter != NULL; list_counter = list_counter->next) { for (i = list_counter->nsyms - 1; i >= 0; --i, --j) { syms[j] = list_counter->symbol[i]; } } return retval; }
static void free_linear_expandable (struct dictionary *dict) { xfree (DICT_LINEAR_SYMS (dict)); xfree (dict); }