aboutsummaryrefslogtreecommitdiff
path: root/tests/test60.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test60.c')
-rw-r--r--tests/test60.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/tests/test60.c b/tests/test60.c
new file mode 100644
index 000000000..138c0da86
--- /dev/null
+++ b/tests/test60.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "uthash.h"
+
+/* hash of hashes */
+typedef struct item {
+ char name[10];
+ struct item *sub;
+ int val;
+ UT_hash_handle hh;
+} item_t;
+
+int main()
+{
+ item_t *item1, *item2, *tmp1, *tmp2;
+ item_t *items=NULL;
+
+ /* make initial element */
+ item_t *i = (item_t *)malloc(sizeof(*i));
+ if (i == NULL) {
+ exit(-1);
+ }
+ strcpy(i->name, "bob");
+ i->sub = NULL;
+ i->val = 0;
+ HASH_ADD_STR(items, name, i);
+
+ /* add a sub hash table off this element */
+ item_t *s = (item_t *)malloc(sizeof(*s));
+ if (s == NULL) {
+ exit(-1);
+ }
+ strcpy(s->name, "age");
+ s->sub = NULL;
+ s->val = 37;
+ HASH_ADD_STR(i->sub, name, s);
+
+ /* iterate over hash elements, printing and freeing them */
+ HASH_ITER(hh, items, item1, tmp1) {
+ HASH_ITER(hh, item1->sub, item2, tmp2) {
+ printf("$items{%s}{%s} = %d\n", item1->name, item2->name, item2->val);
+ HASH_DEL(item1->sub, item2);
+ free(item2);
+ }
+ HASH_DEL(items, item1);
+ free(item1);
+ }
+
+ return 0;
+}