/* * Empty the table */ void reset_stbl(stbl_t *sym_table) { uint32_t i, n; stbl_rec_t *r, *p; n = sym_table->size; for (i=0; i<n; i++) { r = sym_table->data[i]; while (r != NULL) { p = r->next; sym_table->finalize(r); stbl_free_record(sym_table, r); r = p; } sym_table->data[i] = NULL; } sym_table->ndeleted = 0; sym_table->nelems = 0; }
/* * Remove the first occurrence of (symbol, value). * No effect if it's not present. */ void stbl_delete_mapping(stbl_t *sym_table, const char *symbol, int32_t val) { uint32_t h, mask, i; stbl_rec_t *r, *p; mask = sym_table->size - 1; h = jenkins_hash_string(symbol); i = h & mask; p = NULL; for (r = sym_table->data[i]; r != NULL; r = r->next) { if (r->hash == h && r->value == val && strcmp(symbol, r->string) == 0) { if (p == NULL) { sym_table->data[i] = r->next; } else { p->next = r->next; } sym_table->finalize(r); stbl_free_record(sym_table, r); return; } p = r; } }
/* * Remove records using a filter * - calls f(aux, r) on every record r present in the table * - if f(aux, r) returns true, then the finalizer is called * then r is removed from the table. * - f must not have side effects */ void stbl_remove_records(stbl_t *sym_table, void *aux, stbl_filter_t f) { uint32_t i, n; stbl_rec_t *r, *p, **q; n = sym_table->size; for (i=0; i<n; i++) { q = sym_table->data + i; r = sym_table->data[i]; while (r != NULL) { p = r->next; if (f(aux, r)) { sym_table->finalize(r); stbl_free_record(sym_table, r); r = p; } else { // keep r *q = r; q = &r->next; } } *q = NULL; } }