static void add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val) { if (table->real_entries < MAX_PACKED_HASH) { st_index_t i = table->real_entries++; PKEY_SET(table, i, key); PVAL_SET(table, i, value); PHASH_SET(table, i, hash_val); table->num_entries++; } else { unpack_entries(table); add_direct(table, key, value, hash_val, hash_pos(hash_val, table->num_bins)); } }
void st_add_direct(st_table *table, st_data_t key, st_data_t value) { unsigned int hash_val, bin_pos; if (table->entries_packed) { int i; if ((table->num_entries+1) * 2 <= table->num_bins && table->num_entries+1 <= MAX_PACKED_NUMHASH) { i = table->num_entries++; table->bins[i*2] = (struct st_table_entry*)key; table->bins[i*2+1] = (struct st_table_entry*)value; return; } else { unpack_entries(table); } } hash_val = do_hash(key, table); bin_pos = hash_val % table->num_bins; ADD_DIRECT(table, key, value, hash_val, bin_pos); }
int st_insert(register st_table *table, register st_data_t key, st_data_t value) { unsigned int hash_val, bin_pos; register st_table_entry *ptr; if (table->entries_packed) { int i; for (i = 0; i < table->num_entries; i++) { if ((st_data_t)table->bins[i*2] == key) { table->bins[i*2+1] = (struct st_table_entry*)value; return 1; } } if ((table->num_entries+1) * 2 <= table->num_bins && table->num_entries+1 <= MAX_PACKED_NUMHASH) { i = table->num_entries++; table->bins[i*2] = (struct st_table_entry*)key; table->bins[i*2+1] = (struct st_table_entry*)value; return 0; } else { unpack_entries(table); } } hash_val = do_hash(key, table); FIND_ENTRY(table, ptr, hash_val, bin_pos); if (ptr == 0) { ADD_DIRECT(table, key, value, hash_val, bin_pos); return 0; } else { ptr->record = value; return 1; } }