/* $Id: pairs.c,v 1.3 2006/09/17 08:19:15 maxim Exp $ * */ #include #include "configure.h" #include "settings.h" #include "misc.h" #include "pairs.h" #include "str.h" Pairs* newPairs(int size, void* (*freeFunction)(void*)) { Pairs* pairs; // if (!(pairs = CALLOC(sizeof(Pairs) + size * sizeof(Pair*)))) return NULL; // pairs->pairs = (Pair**)(pairs + 1); size = biRound(size, 16); if (!(pairs = CALLOC(sizeof(Pairs)))) return NULL; pairs->pairs = CALLOC(size * sizeof(Pair*)); pairs->size = size - 1; pairs->freeFunction = freeFunction; return pairs; } Pairs* freePairs(Pairs* pairs) { int h; if (!pairs) return NULL; for (h = 0; h <= pairs->size; h++) { Pair* p = pairs->pairs[h]; while (p) { Pair* next = p->next; if (pairs->freeFunction) pairs->freeFunction(p->value); FREE(p->name); FREE(p); p = next; } } FREE(pairs); return NULL; } void setPair(Pairs* pairs, char* name, void* value) { unsigned hc; Pair* p; if (!(pairs && name && value)) return; hc = hash(name) & pairs->size; p = pairs->pairs[hc]; while(p) { if (!strcmp(p->name, name)) { if (pairs->freeFunction) pairs->freeFunction(p->value); p->value = value; return; } p = p->next; } p = CALLOC(sizeof(Pair)); p->name = STRDUP(name); p->value = value; p->next = pairs->pairs[hc]; pairs->pairs[hc] = p; pairs->count++; } void* getPair(Pairs* pairs, char* name) { Pair* p; if (!(pairs && name)) return NULL; p = pairs->pairs[hash(name) & pairs->size]; while(p) { if (!strcmp(p->name, name)) return p->value; p = p->next; } return NULL; } void startListPairs(Pairs* pairs) { if (!pairs) return; pairs->last = NULL; pairs->lastHash = 0; } Pair* nextPair(Pairs* pairs) { if (pairs->last) { if (pairs->last->next) return pairs->last = pairs->last->next; ++(pairs->lastHash); } for (; pairs->lastHash <= pairs->size; pairs->lastHash++) if (pairs->pairs[pairs->lastHash]) return pairs->last = pairs->pairs[pairs->lastHash]; pairs->lastHash = 0; pairs->last = NULL; return NULL; }