else
Ret->StepWidth = 1;
if (Ret->StepWidth < 0) {
- Ret->Position = (Hash->nMembersUsed % (-Ret->StepWidth))
- * (-Ret->StepWidth);
+ Ret->Position = Hash->nMembersUsed - 1;
}
else {
Ret->Position = 0;
* \param the Iterator to analyze
* \returns the n'th hashposition we point at
*/
-int GetHashPosCounter(HashPos *At)
+int GetHashPosCounter(HashList *Hash, HashPos *At)
{
+ if ((Hash == NULL) ||
+ (At->Position >= Hash->nMembersUsed) ||
+ (At->Position < 0) ||
+ (At->Position > Hash->nMembersUsed))
+ return 0;
return At->Position;
}
int GetNextHashPos(HashList *Hash, HashPos *At, long *HKLen, const char **HashKey, void **Data)
{
long PayloadPos;
+ long offset = 0;
- if ((Hash == NULL) || (At->Position >= Hash->nMembersUsed) || (At->Position < 0))
+ if ((Hash == NULL) ||
+ (At->Position >= Hash->nMembersUsed) ||
+ (At->Position < 0) ||
+ (At->Position > Hash->nMembersUsed))
return 0;
*HKLen = Hash->LookupTable[At->Position]->HKLen;
*HashKey = Hash->LookupTable[At->Position]->HashKey;
PayloadPos = Hash->LookupTable[At->Position]->Position;
*Data = Hash->Members[PayloadPos]->Data;
-
- At->Position += At->StepWidth;
- if (At->Position > Hash->nMembersUsed) {
- At->Position = Hash->nMembersUsed;
- return 0;
- }
+ /* Position is NULL-Based, while Stepwidth is not... */
+ if (At->StepWidth < 0)
+ offset = 1;
+ if ((At->Position % abs(At->StepWidth)) == 0)
+ At->Position += At->StepWidth;
+ else
+ At->Position += ((At->Position) % abs(At->StepWidth)) *
+ (At->StepWidth / abs(At->StepWidth));
return 1;
}
{
long PayloadPos;
- if ((Hash == NULL) || (At >= Hash->nMembersUsed))
+ if ((Hash == NULL) ||
+ (At < 0) ||
+ (At > Hash->nMembersUsed))
return 0;
*HKLen = Hash->LookupTable[At]->HKLen;
*HashKey = Hash->LookupTable[At]->HashKey;
}
+/*
+ * This exposes the hashlittle() function to consumers.
+ */
+int HashLittle(const void *key, size_t length) {
+ return (int)hashlittle(key, length, 1);
+}