static struct symbol * iter_name_next_linear (const char *name, struct dict_iterator *iterator) { const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); int i, nsyms = DICT_LINEAR_NSYMS (dict); struct symbol *sym, *retval = NULL; for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nsyms; ++i) { sym = DICT_LINEAR_SYM (dict, i); /* APPLE LOCAL begin psym equivalences */ if ((strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) || (psym_equivalences && psym_name_match (SYMBOL_SEARCH_NAME (sym), name))) /* APPLE LOCAL end psym equivalences */ { retval = sym; break; } } DICT_ITERATOR_INDEX (iterator) = i; return retval; }
static struct symbol * iterator_first_linear (const struct dictionary *dict, struct dict_iterator *iterator) { DICT_ITERATOR_DICT (iterator) = dict; DICT_ITERATOR_INDEX (iterator) = 0; return DICT_LINEAR_NSYMS (dict) ? DICT_LINEAR_SYM (dict, 0) : NULL; }
static struct symbol * iterator_next_linear (struct dict_iterator *iterator) { const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); if (++DICT_ITERATOR_INDEX (iterator) >= DICT_LINEAR_NSYMS (dict)) return NULL; else return DICT_LINEAR_SYM (dict, DICT_ITERATOR_INDEX (iterator)); }
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; }
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; }
static struct symbol * iter_name_next_linear (const char *name, struct dict_iterator *iterator) { const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); int i, nsyms = DICT_LINEAR_NSYMS (dict); struct symbol *sym, *retval = NULL; for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nsyms; ++i) { sym = DICT_LINEAR_SYM (dict, i); if (strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) { retval = sym; break; } } DICT_ITERATOR_INDEX (iterator) = i; 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 int size_linear (const struct dictionary *dict) { return DICT_LINEAR_NSYMS (dict); }