Exemple #1
0
/*
 * 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;
}
Exemple #2
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;
  }
}
Exemple #3
0
/*
 * 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;
  }
}