HASHDATA * hash_find( struct hash * hp, OBJECT * key ) { ITEM * i; unsigned int keyval = hash_keyval( key ); #ifdef HASH_DEBUG_PROFILE profile_frame prof[ 1 ]; if ( DEBUG_PROFILE ) profile_enter( 0, prof ); #endif if ( !hp->items.nel ) { #ifdef HASH_DEBUG_PROFILE if ( DEBUG_PROFILE ) profile_exit( prof ); #endif return 0; } i = hash_search( hp, keyval, key, 0 ); #ifdef HASH_DEBUG_PROFILE if ( DEBUG_PROFILE ) profile_exit( prof ); #endif return i ? hash_item_data( i ) : 0; }
HASHDATA * hash_insert( struct hash * hp, OBJECT * key, int * found ) { ITEM * i; unsigned int keyval = hash_keyval( key ); #ifdef HASH_DEBUG_PROFILE profile_frame prof[1]; if ( DEBUG_PROFILE ) profile_enter( 0, prof ); #endif if ( !hp->items.more ) hashrehash( hp ); i = hash_search( hp, keyval, key, 0 ); if ( i ) { *found = 1; } else { ITEM * * base = hash_bucket( hp, keyval ); /* try to grab one from the free list */ if ( hp->items.free ) { i = hp->items.free; hp->items.free = i->hdr.next; assert( hash_item_key( i ) == 0 ); } else { i = (ITEM *)hp->items.next; hp->items.next += hp->items.size; } hp->items.more--; i->hdr.next = *base; *base = i; *found = 0; } #ifdef HASH_DEBUG_PROFILE if ( DEBUG_PROFILE ) profile_exit( prof ); #endif return hash_item_data( i ); }
void hashenumerate( struct hash * hp, void (* f)( void *, void * ), void * data ) { int i; for ( i = 0; i <= hp->items.list; ++i ) { char * next = hp->items.lists[i].base; int nel = hp->items.lists[i].nel; if ( i == hp->items.list ) nel -= hp->items.more; for ( ; nel--; next += hp->items.size ) { ITEM * i = (ITEM *)next; if ( hash_item_key( i ) != 0 ) /* DO not enumerate freed items. */ f( hash_item_data( i ), data ); } } }