#include "hash.h" #include "arena.h" #include "string.h" #include "stddef.h" #include "io.h" void inthash_init( intHashTable *ht, int size ) { ht->table = (intHashEntry **)allocate( size * sizeof( intHashEntry ) ); memset( ht->table, 0, size * sizeof( intHashEntry ) ); ht->capacity = size; ht->size = 0; } void inthash_done( intHashTable *ht ) { deallocate( (void **)&ht->table ); } static int hash_string( char *s ) { int h = 0; int c; while( ( c = *s++ ) ) { h += c; } return h; } void inthash_set( intHashTable *ht, char *key, int value ) { int h; intHashEntry *entry; intHashEntry *new; h = hash_string( key ) % ht->capacity; entry = ht->table[h]; while( entry != NULL && strcmp( key, entry->key ) != 0 ) { entry = entry->next; } if( entry != NULL && strcmp( key, entry->key ) == 0 ) { entry->value = value; } else { new = (intHashEntry *)allocate( sizeof( intHashEntry ) ); new->key = key; new->value = value; new->next = ht->table[h]; ht->table[h] = new; } ht->size++; } int inthash_get( intHashTable *ht, char *key) { int h; intHashEntry *entry; h = hash_string( key ) % ht->capacity; entry = ht->table[h]; while( entry != NULL && strcmp( key, entry->key ) != 0 ) { entry = entry->next; } if( entry != NULL && strcmp( key, entry->key ) == 0 ) { return entry->value; } return -1; } intHashEntry *inthash_getfirst( intHashTable *ht, intHashIterator *it ) { it->pos = 0; it->entry = ht->table[0]; it->ht = ht; while( it->entry == NULL ) { it->pos++; if( it->pos > ht->capacity ) { return NULL; } it->entry = ht->table[it->pos]; } return it->entry; } intHashEntry *inthash_getnext( intHashIterator *it ) { if( it->entry != NULL ) { it->entry = it->entry->next; if( it->entry != NULL ) { return it->entry; } } do { it->pos++; if( it->pos > it->ht->capacity ) { return NULL; } it->entry = it->ht->table[it->pos]; } while( it->entry == NULL ); return it->entry; }