From b3fb8b4ed0a0fe84a1ea7f27e095377af653bcb8 Mon Sep 17 00:00:00 2001 From: miker Date: Mon, 7 Jan 2008 01:46:42 +0000 Subject: [PATCH 1/1] Patch from Scott McKellar: 1. Move several internal details from the header to the implementation file: The macros OSRF_HASH_LIST_SIZE and OSRF_HASH_NODE_FREE The declaration of the osrfHashNode struct The declarations of the osrfNewHashNode and osrfHashNodeFree functions (which are now static) 2. Remove a leading underscore from each of the struct tags __osrfHashStruct and __osrfHashIteratorStruct; 3. Explicitly initialize all struct members. git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1204 9efc2488-bf62-4759-914b-345cdb29e865 --- include/opensrf/osrf_hash.h | 31 ++++--------------------------- src/libopensrf/osrf_hash.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/include/opensrf/osrf_hash.h b/include/opensrf/osrf_hash.h index 132e43e..cb447dd 100644 --- a/include/opensrf/osrf_hash.h +++ b/include/opensrf/osrf_hash.h @@ -5,44 +5,21 @@ #include #include -/* 0x100 is a good size for small hashes */ -//#define OSRF_HASH_LIST_SIZE 0x100 /* size of the main hash list */ -#define OSRF_HASH_LIST_SIZE 0x10 /* size of the main hash list */ - - -/* used internally */ -#define OSRF_HASH_NODE_FREE(h, n) \ - if(h && n) { \ - if(h->freeItem) h->freeItem(n->key, n->item);\ - free(n->key); free(n); \ - } - - -struct __osrfHashStruct { +struct _osrfHashStruct { osrfList* hash; /* this hash */ void (*freeItem) (char* key, void* item); /* callback for freeing stored items */ unsigned int size; osrfStringArray* keys; }; -typedef struct __osrfHashStruct osrfHash; +typedef struct _osrfHashStruct osrfHash; -struct _osrfHashNodeStruct { - char* key; - void* item; -}; -typedef struct _osrfHashNodeStruct osrfHashNode; - - -struct __osrfHashIteratorStruct { +struct _osrfHashIteratorStruct { char* current; int currentIdx; osrfHash* hash; osrfStringArray* keys; }; -typedef struct __osrfHashIteratorStruct osrfHashIterator; - -osrfHashNode* osrfNewHashNode(char* key, void* item); -void* osrfHashNodeFree(osrfHash*, osrfHashNode*); +typedef struct _osrfHashIteratorStruct osrfHashIterator; /** Allocates a new hash object diff --git a/src/libopensrf/osrf_hash.c b/src/libopensrf/osrf_hash.c index 5447466..163d2ef 100644 --- a/src/libopensrf/osrf_hash.c +++ b/src/libopensrf/osrf_hash.c @@ -1,15 +1,36 @@ #include +struct _osrfHashNodeStruct { + char* key; + void* item; +}; +typedef struct _osrfHashNodeStruct osrfHashNode; + +/* 0x100 is a good size for small hashes */ +//#define OSRF_HASH_LIST_SIZE 0x100 /* size of the main hash list */ +#define OSRF_HASH_LIST_SIZE 0x10 /* size of the main hash list */ + +/* used internally */ +#define OSRF_HASH_NODE_FREE(h, n) \ + if(h && n) { \ + if(h->freeItem) h->freeItem(n->key, n->item);\ + free(n->key); free(n); \ +} + +static osrfHashNode* osrfNewHashNode(char* key, void* item); +static void* osrfHashNodeFree(osrfHash*, osrfHashNode*); + osrfHash* osrfNewHash() { osrfHash* hash; OSRF_MALLOC(hash, sizeof(osrfHash)); hash->hash = osrfNewList(); + hash->freeItem = NULL; + hash->size = 0; hash->keys = osrfNewStringArray(64); return hash; } - -/* algorithm proposed by Donald E. Knuth +/* algorithm proposed by Donald E. Knuth * in The Art Of Computer Programming Volume 3 (more or less..)*/ /* static unsigned int osrfHashMakeKey(char* str) { @@ -67,7 +88,7 @@ static unsigned int osrfHashFindItem( osrfHash* hash, char* key, osrfList** l, o return k; } -osrfHashNode* osrfNewHashNode(char* key, void* item) { +static osrfHashNode* osrfNewHashNode(char* key, void* item) { if(!(key && item)) return NULL; osrfHashNode* n; OSRF_MALLOC(n, sizeof(osrfHashNode)); @@ -76,7 +97,7 @@ osrfHashNode* osrfNewHashNode(char* key, void* item) { return n; } -void* osrfHashNodeFree(osrfHash* hash, osrfHashNode* node) { +static void* osrfHashNodeFree(osrfHash* hash, osrfHashNode* node) { if(!(node && hash)) return NULL; void* item = NULL; if( hash->freeItem ) @@ -204,6 +225,7 @@ osrfHashIterator* osrfNewHashIterator( osrfHash* hash ) { osrfHashIterator* itr; OSRF_MALLOC(itr, sizeof(osrfHashIterator)); itr->hash = hash; + itr->currentIdx = 0; itr->current = NULL; itr->keys = osrfHashKeysInc(hash); return itr; -- 2.43.2