From e877d69a2ddf34b3157076a008576f70ea4f4a89 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Thu, 5 Feb 2009 21:03:58 +0100 Subject: [PATCH] Add compare func to hash table, fix remove in hashlist table. --- src/util-hash.c | 90 +++++++++++++++++++++++++++++++++------------ src/util-hash.h | 4 +- src/util-hashlist.c | 9 +---- src/vips.c | 4 +- 4 files changed, 73 insertions(+), 34 deletions(-) diff --git a/src/util-hash.c b/src/util-hash.c index 7b2a1b78d9..4ed780ac32 100644 --- a/src/util-hash.c +++ b/src/util-hash.c @@ -14,7 +14,7 @@ #include "util-unittest.h" -HashTable* HashTableInit(u_int32_t size, u_int32_t (*Hash)(struct _HashTable *, void *, u_int16_t), void (*Free)(void *)) { +HashTable* HashTableInit(u_int32_t size, u_int32_t (*Hash)(struct _HashTable *, void *, u_int16_t), char (*Compare)(void *, u_int16_t, void *, u_int16_t), void (*Free)(void *)) { HashTable *ht = NULL; @@ -36,6 +36,11 @@ HashTable* HashTableInit(u_int32_t size, u_int32_t (*Hash)(struct _HashTable *, ht->Hash = Hash; ht->Free = Free; + if (Compare != NULL) + ht->Compare = Compare; + else + ht->Compare = HashTableDefaultCompare; + /* setup the bitarray */ ht->array = malloc(ht->array_size * sizeof(HashTableBucket *)); if (ht->array == NULL) @@ -87,7 +92,7 @@ void HashTablePrint(HashTable *ht) { } int HashTableAdd(HashTable *ht, void *data, u_int16_t datalen) { - if (ht == NULL || data == NULL || datalen == 0) + if (ht == NULL || data == NULL) return -1; u_int32_t hash = ht->Hash(ht, data, datalen); @@ -131,13 +136,7 @@ int HashTableRemove(HashTable *ht, void *data, u_int16_t datalen) { HashTableBucket *hashbucket = ht->array[hash], *prev_hashbucket = NULL; do { - if (hashbucket->size != datalen) { - prev_hashbucket = hashbucket; - hashbucket = hashbucket->next; - continue; - } - - if (memcmp(hashbucket->data,data,datalen) == 0) { + if (ht->Compare(hashbucket->data,hashbucket->size,data,datalen) == 1) { if (prev_hashbucket == NULL) { /* root bucket */ ht->array[hash] = hashbucket->next; @@ -168,12 +167,7 @@ void *HashTableLookup(HashTable *ht, void *data, u_int16_t datalen) { HashTableBucket *hashbucket = ht->array[hash]; do { - if (hashbucket->size != datalen) { - hashbucket = hashbucket->next; - continue; - } - - if (memcmp(hashbucket->data,data,datalen) == 0) + if (ht->Compare(hashbucket->data,hashbucket->size,data,datalen) == 1) return hashbucket->data; hashbucket = hashbucket->next; @@ -198,12 +192,22 @@ u_int32_t HashTableGenericHash(HashTable *ht, void *data, u_int16_t datalen) { return hash; } +char HashTableDefaultCompare(void *data1, u_int16_t len1, void *data2, u_int16_t len2) { + if (len1 != len2) + return 0; + + if (memcmp(data1,data2,len1) != 0) + return 0; + + return 1; +} + /* * ONLY TESTS BELOW THIS COMMENT */ static int HashTableTestInit01 (void) { - HashTable *ht = HashTableInit(1024, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(1024, HashTableGenericHash, NULL, NULL); if (ht == NULL) return 0; @@ -213,7 +217,7 @@ static int HashTableTestInit01 (void) { /* no hash function, so it should fail */ static int HashTableTestInit02 (void) { - HashTable *ht = HashTableInit(1024, NULL, NULL); + HashTable *ht = HashTableInit(1024, NULL, NULL, NULL); if (ht == NULL) return 1; @@ -223,7 +227,7 @@ static int HashTableTestInit02 (void) { static int HashTableTestInit03 (void) { int result = 0; - HashTable *ht = HashTableInit(1024, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(1024, HashTableGenericHash, NULL, NULL); if (ht == NULL) return 0; @@ -235,7 +239,7 @@ static int HashTableTestInit03 (void) { } static int HashTableTestInit04 (void) { - HashTable *ht = HashTableInit(0, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(0, HashTableGenericHash, NULL, NULL); if (ht == NULL) return 1; @@ -243,14 +247,50 @@ static int HashTableTestInit04 (void) { return 0; } +static int HashTableTestInit05 (void) { + int result = 0; + HashTable *ht = HashTableInit(1024, HashTableGenericHash, NULL, NULL); + if (ht == NULL) + return 0; + + if (ht->Compare == HashTableDefaultCompare) + result = 1; + + HashTableFree(ht); + return result; +} + +static char HashTableDefaultCompareTest(void *data1, u_int16_t len1, void *data2, u_int16_t len2) { + if (len1 != len2) + return 0; + + if (memcmp(data1,data2,len1) != 0) + return 0; + + return 1; +} + +static int HashTableTestInit06 (void) { + int result = 0; + HashTable *ht = HashTableInit(1024, HashTableGenericHash, HashTableDefaultCompareTest, NULL); + if (ht == NULL) + return 0; + + if (ht->Compare == HashTableDefaultCompareTest) + result = 1; + + HashTableFree(ht); + return result; +} + static int HashTableTestAdd01 (void) { int result = 0; - HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL, NULL); if (ht == NULL) goto end; int r = HashTableAdd(ht, "test", 0); - if (r == 0) + if (r != 0) goto end; /* all is good! */ @@ -262,7 +302,7 @@ end: static int HashTableTestAdd02 (void) { int result = 0; - HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL, NULL); if (ht == NULL) goto end; @@ -279,7 +319,7 @@ end: static int HashTableTestFull01 (void) { int result = 0; - HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL, NULL); if (ht == NULL) goto end; @@ -304,7 +344,7 @@ end: static int HashTableTestFull02 (void) { int result = 0; - HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL); + HashTable *ht = HashTableInit(32, HashTableGenericHash, NULL, NULL); if (ht == NULL) goto end; @@ -332,6 +372,8 @@ void HashTableRegisterTests(void) { UtRegisterTest("HashTableTestInit02", HashTableTestInit02, 1); UtRegisterTest("HashTableTestInit03", HashTableTestInit03, 1); UtRegisterTest("HashTableTestInit04", HashTableTestInit04, 1); + UtRegisterTest("HashTableTestInit05", HashTableTestInit05, 1); + UtRegisterTest("HashTableTestInit06", HashTableTestInit06, 1); UtRegisterTest("HashTableTestAdd01", HashTableTestAdd01, 1); UtRegisterTest("HashTableTestAdd02", HashTableTestAdd02, 1); diff --git a/src/util-hash.h b/src/util-hash.h index 28d160eb5f..93006cab25 100644 --- a/src/util-hash.h +++ b/src/util-hash.h @@ -15,17 +15,19 @@ typedef struct _HashTable { HashTableBucket **array; u_int32_t array_size; u_int32_t (*Hash)(struct _HashTable *, void *, u_int16_t); + char (*Compare)(void *, u_int16_t, void *, u_int16_t); void (*Free)(void *); } HashTable; /* prototypes */ -HashTable* HashTableInit(u_int32_t, u_int32_t (*Hash)(struct _HashTable *, void *, u_int16_t), void (*Free)(void *)); +HashTable* HashTableInit(u_int32_t, u_int32_t (*Hash)(struct _HashTable *, void *, u_int16_t), char (*Compare)(void *, u_int16_t, void *, u_int16_t), void (*Free)(void *)); void HashTableFree(HashTable *); void HashTablePrint(HashTable *); int HashTableAdd(HashTable *, void *, u_int16_t); int HashTableRemove(HashTable *, void *, u_int16_t); void *HashTableLookup(HashTable *, void *, u_int16_t); u_int32_t HashTableGenericHash(HashTable *, void *, u_int16_t); +char HashTableDefaultCompare(void *, u_int16_t, void *, u_int16_t); void HashTableRegisterTests(void); diff --git a/src/util-hashlist.c b/src/util-hashlist.c index 726292d6fe..7d32f57ff9 100644 --- a/src/util-hashlist.c +++ b/src/util-hashlist.c @@ -149,13 +149,8 @@ int HashListTableRemove(HashListTable *ht, void *data, u_int16_t datalen) { HashListTableBucket *hashbucket = ht->array[hash], *prev_hashbucket = NULL; do { - if (hashbucket->size != datalen) { - prev_hashbucket = hashbucket; - hashbucket = hashbucket->bucknext; - continue; - } + if (ht->Compare(hashbucket->data,hashbucket->size,data,datalen) == 1) { - if (memcmp(hashbucket->data,data,datalen) == 0) { /* remove from the list */ if (hashbucket->listprev == NULL) { ht->listhead = hashbucket->listnext; @@ -290,7 +285,7 @@ static int HashListTableTestAdd01 (void) { goto end; int r = HashListTableAdd(ht, "test", 0); - if (r == 0) + if (r != 0) goto end; /* all is good! */ diff --git a/src/vips.c b/src/vips.c index eb5b7df800..3458b4af47 100644 --- a/src/vips.c +++ b/src/vips.c @@ -216,9 +216,9 @@ int main(int argc, char **argv) BloomFilterCountingRegisterTests(); MpmRegisterTests(); SigRegisterTests(); - //UtRunTests(); + UtRunTests(); UtCleanup(); - //exit(1); + exit(1); //LoadConfig(); //exit(1);