#define _GNU_SOURCE #include "strpool.h" #include #include #undef uthash_nonfatal_oom #define uthash_nonfatal_oom(elt) ut_oom_recover(elt) static bool oom = false; static void ut_oom_recover(strpool *elem) { oom = true; } // for zero terminated strings bool StrPoolAddStr(strpool **pp, const char *s) { strpool *elem; if (!(elem = (strpool*)malloc(sizeof(strpool)))) return false; if (!(elem->str = strdup(s))) { free(elem); return false; } oom = false; HASH_ADD_KEYPTR(hh, *pp, elem->str, strlen(elem->str), elem); if (oom) { free(elem->str); free(elem); return false; } return true; } // for not zero terminated strings bool StrPoolAddStrLen(strpool **pp, const char *s, size_t slen) { strpool *elem; if (!(elem = (strpool*)malloc(sizeof(strpool)))) return false; if (!(elem->str = malloc(slen + 1))) { free(elem); return false; } memcpy(elem->str, s, slen); elem->str[slen] = 0; oom = false; HASH_ADD_KEYPTR(hh, *pp, elem->str, strlen(elem->str), elem); if (oom) { free(elem->str); free(elem); return false; } return true; } bool StrPoolCheckStr(strpool *p, const char *s) { strpool *elem; HASH_FIND_STR(p, s, elem); return elem != NULL; } void StrPoolDestroy(strpool **p) { strpool *elem, *tmp; HASH_ITER(hh, *p, elem, tmp) { free(elem->str); HASH_DEL(*p, elem); free(elem); } *p = NULL; }