corrections
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Wed, 15 Jun 2022 00:06:26 +0000 (10:06 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Wed, 15 Jun 2022 00:06:26 +0000 (10:06 +1000)
htable/Makefile
htable/htable.c
htable/htable.h

index 236afb871e99c4ccaf190dddf00432f1240b4b9c..4d0ed950bd473f117753633c258192205a73978f 100644 (file)
@@ -1,7 +1,7 @@
 default: libhtable.a
 
 .INTERMEDIATE: htable.o
-htable.o: CFLAGS = -Wall
+htable.o: CFLAGS = -Wall -g
 htable.o: htable.c
 
 libhtable.a: htable.o
index c35355da8f1082a9967adec6bec719bcb2d4f602..ce8c8384c35f9e14c479fa92a5fba2259f308300 100644 (file)
@@ -2,8 +2,6 @@
 #include <string.h>
 #include "htable.h"
 
-#define HOLE ((unsigned char *)1)
-
 //// Generic hash table implementation
 
 // Determine the index for a key. On match, it returns the index into
@@ -14,21 +12,23 @@ static int htindex(htable *table,unsigned char *key) {
        table->data = calloc( 256, sizeof( unsigned char* ) );
        table->size = 256;
     }
-    unsigned int hash = (*table->hashcode)( table, key ) % table->size;
+    unsigned int hash =
+       ( (unsigned int) (*table->hashcode)( table, key ) ) % table->size;
     unsigned int i = hash;
     int hole = -1;
     for ( ;; ) {
-       unsigned char *x = table->data[ i++ ];
+       unsigned char *x = table->data[ i ];
        if ( x == 0 ) {
-           return ( hole >= 0 )? -hole : - (int) i;
+           return ( hole >= 0 )? (- hole - 1 ): ( - (int) i - 1 );
        }
-       if ( x == HOLE ) {
+       if ( x == HTHOLE ) {
            if ( hole < 0 ) {
                hole = i;
            }
        } else if ( memcmp( x + table->offset, key, table->esize ) == 0 ) {
-           return i-1;
+           return i;
        }
+       i++;
        if ( i >= table->size ) {
            i = 0;
        }
@@ -36,7 +36,7 @@ static int htindex(htable *table,unsigned char *key) {
            break;
        }
     }
-    return -1;
+    return - hole - 1;
 }
 
 // Find the keyed element, and assign the x pointer, or assign 0.
@@ -89,7 +89,7 @@ static unsigned char *htnext(htable *table,int *i) {
     unsigned char **e = table->data + table->size;
     for ( ; p < e; p++ ) {
        (*i) += 1;
-       if ( *p != 0 && *p != HOLE ) {
+       if ( *p != 0 && *p != HTHOLE ) {
            return *p;
        }
     }
@@ -127,7 +127,7 @@ void htdelete(htable *table,unsigned char *p) {
     pthread_mutex_lock( &table->lock );
     int i = htindex( table, p + table->offset );
     if ( i >= 0 ) {
-       table->data[ i ] = HOLE;
+       table->data[ i ] = HTHOLE;
        table->holes += 1;
        if ( table->holes > table->fill / 2 ) {
            htrehash( table, table->size );
@@ -139,7 +139,7 @@ void htdelete(htable *table,unsigned char *p) {
 void htdump(htable *table,void (*dumpitem)(int i,unsigned char *p)) {
     int i;
     for ( i = 0 ; i < table->size; i++ ) {
-       if ( table->data[ i ] && table->data[ i ] != HOLE ) {
+       if ( table->data[ i ] && table->data[ i ] != HTHOLE ) {
            dumpitem( i, table->data[ i ] );
        }
     }
index e0233b269cdeb189e939b8b56062991d311fecc0..c002dc602ecf03448d1da07c56b91e75810ef91a 100644 (file)
@@ -71,4 +71,6 @@ void htdump(htable *table,void (*dumpitem)(int i,unsigned char *p));
            .esize = sizeof( ((type *)0)->member ), .hashcode = hashcodefn, \
            .lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP }
 
+#define HTHOLE ((unsigned char *)1)
+
 #endif // HTABLE_H