Add propper debugging for lflathashs, crash if debug and invalid combination of ...
[citadel.git] / libcitadel / lib / hash.c
index 38d780ed4f4695ace5a61a24dda0f9b02ca85a28..ab7eec1896206b12797b442b4952114414c64285 100644 (file)
@@ -230,7 +230,12 @@ int dbg_PrintHash(HashList *Hash, PrintHashContent First, PrintHashContent Secon
 
                }
 #ifdef DEBUG
-               printf (" ---- Hashkey[%ld][%ld]: '%s' Value: '%s' ; %s\n", i, key, foo, bar, bla);
+               if ((Hash->Algorithm == lFlathash) || (Hash->Algorithm == Flathash)) {
+                       printf (" ---- Hashkey[%ld][%ld]: %ld '%s' Value: '%s' ; %s\n", i, key, *(long*) foo, foo, bar, bla);
+               }
+               else {
+                       printf (" ---- Hashkey[%ld][%ld]: '%s' Value: '%s' ; %s\n", i, key, foo, bar, bla);
+               }
 #endif
        }
 #ifdef DEBUG
@@ -618,7 +623,13 @@ static long FindInHash(HashList *Hash, long HashBinKey)
 long Flathash(const char *str, long len)
 {
        if (len != sizeof (int))
+       {
+#ifdef DEBUG
+               int *crash = NULL;
+               *crash = 1;
+#endif
                return 0;
+       }
        else return *(int*)str;
 }
 
@@ -632,7 +643,13 @@ long Flathash(const char *str, long len)
 long lFlathash(const char *str, long len)
 {
        if (len != sizeof (long))
+       {
+#ifdef DEBUG
+               int *crash = NULL;
+               *crash = 1;
+#endif
                return 0;
+       }
        else return *(long*)str;
 }
 
@@ -809,6 +826,30 @@ HashPos *GetNewHashPos(const HashList *Hash, int StepWidth)
        return Ret;
 }
 
+/**
+ * @ingroup HashListAccess
+ * @brief resets a hash-linear iterator object
+ * @param Hash the list we reference
+ * @param StepWidth in which step width should we iterate?
+ * @param it the iterator object to manipulate
+ *  If negative, the last position matching the 
+ *  step-raster is provided.
+ * @return the hash iterator
+ */
+void RewindHashPos(const HashList *Hash, HashPos *it, int StepWidth)
+{
+       if (StepWidth != 0)
+               it->StepWidth = StepWidth;
+       else
+               it->StepWidth = 1;
+       if (it->StepWidth <  0) {
+               it->Position = Hash->nLookupTableItems - 1;
+       }
+       else {
+               it->Position = 0;
+       }
+}
+
 /**
  * @ingroup HashListAccess
  * @brief Set iterator object to point to key. If not found, don't change iterator