#include #include #include #include "uthash.h" struct item { unsigned char *sort_field; size_t sort_field_len; /** Sort field length, in bytes */ int some_user_data; UT_hash_handle hh; }; int sort_func(const struct item *a, const struct item *b) { int va = *(int*)(void*)a->sort_field; int vb = *(int*)(void*)b->sort_field; return (va < vb) ? -1 : (va > vb); } int main() { size_t i; struct item *p, *tmp; int total = 0; /** The sorted list */ struct item *list = NULL; int counter = 0; /* fill in the sorted list */ for(i=0; i<100; i++) { p = (struct item *)malloc(sizeof *p); p->sort_field_len = sizeof(int); p->sort_field = (unsigned char *)malloc(p->sort_field_len); *(int*)(void*)p->sort_field = counter++; HASH_ADD_KEYPTR_INORDER(hh, list, p->sort_field, p->sort_field_len, p, sort_func); } printf("filling in is ok\n"); HASH_ITER(hh, list, p, tmp) { total += *(int*)(void*)p->sort_field; HASH_DEL(list, p); free(p->sort_field); free(p); } assert(total == 4950); // sum of 0 through 99 printf("cleanup is ok\n"); return 0; }