diff --git a/include/tvm/tvm_tree.h b/include/tvm/tvm_tree.h index f24c94a..f8ecf5a 100644 --- a/include/tvm/tvm_tree.h +++ b/include/tvm/tvm_tree.h @@ -3,14 +3,15 @@ typedef struct tvm_tree_t { - char *str; + char *keystr; + char *val; struct tvm_tree_t *left; struct tvm_tree_t *right; } tvm_tree_t; -tvm_tree_t *tvm_tree_create(tvm_tree_t *node, const char *str); -int tvm_tree_add(tvm_tree_t *node, const char *str); -int tvm_tree_find(tvm_tree_t *node, const char *str); +tvm_tree_t *tvm_tree_create(tvm_tree_t *node, const char *str, const void *val, int len); +int tvm_tree_add(tvm_tree_t *node, const char *str, const void *val, int len); +void *tvm_tree_find(tvm_tree_t *node, const char *str); int tvm_tree_destroy(tvm_tree_t *node); #endif \ No newline at end of file diff --git a/libtvm/tvm_tree.c b/libtvm/tvm_tree.c index e0d6ee4..70ba744 100644 --- a/libtvm/tvm_tree.c +++ b/libtvm/tvm_tree.c @@ -3,17 +3,24 @@ #include -tvm_tree_t *tvm_tree_create(tvm_tree_t *node, const char *str) +tvm_tree_t *tvm_tree_create(tvm_tree_t *node, const char *str, const void *val, int len) { - int len = strlen(str); - node = calloc(1, sizeof(tvm_tree_t) + len + 1); - node->str = (char *)node + sizeof(tvm_tree_t); - memcpy(node->str, str, len); + int keylen = strlen(str); + node = calloc(1, sizeof(tvm_tree_t) + len + keylen + 1); + + if(val && len) + { + node->val = (char *)node + sizeof(tvm_tree_t); + memcpy(node->val, val, len); + } + + node->keystr = (char *)node + sizeof(tvm_tree_t) + len; + memcpy(node->keystr, str, keylen); return node; } -int tvm_tree_add(tvm_tree_t *node, const char *str) +int tvm_tree_add(tvm_tree_t *node, const char *str, const void *val, int len) { if (!str || !node) return 1; @@ -22,7 +29,7 @@ int tvm_tree_add(tvm_tree_t *node, const char *str) tvm_tree_t *current = node; while(!done) { - diff = strcmp(current->str, str); + diff = strcmp(current->keystr, str); if(!diff) done = 1; else if(diff < 0) @@ -33,7 +40,7 @@ int tvm_tree_add(tvm_tree_t *node, const char *str) } else { - current->left = tvm_tree_create(NULL, str); + current->left = tvm_tree_create(NULL, str, val, len); done = 1; } } @@ -45,7 +52,7 @@ int tvm_tree_add(tvm_tree_t *node, const char *str) } else { - current->right = tvm_tree_create(NULL, str); + current->right = tvm_tree_create(NULL, str, val, len); done = 1; } } @@ -58,25 +65,26 @@ int tvm_tree_add(tvm_tree_t *node, const char *str) return 0; } -int tvm_tree_find(tvm_tree_t *node, const char *str) +void *tvm_tree_find(tvm_tree_t *node, const char *str) { if(!node || !str) return 0; - int diff, found = 0; + int diff; + void *value = NULL; tvm_tree_t *current = node; - while(current && !found) + while(current && !value) { - diff = strcmp(current->str, str); + diff = strcmp(current->keystr, str); if(!diff) - found = 1; + value = current->val; else if(diff < 0) current = current->left; else if(diff > 0) current = current->right; } - return found; + return value; } void tvm_destroy(tvm_tree_t *node)