void *avl_search(t_avl *const avl, void *val) { if (!avl->hook_cmp) { fprintf(stderr, "%s: Warning: no cmp hook defined. Using default comparators.\n", __FUNCTION__); avl->hook_cmp = __default_hook_cmp; } return __search(avl, (t_node *)avl->root, val); }
/* searching */ static void *__search(t_avl *const avl, t_node *const root, void *val) { if (root == nil) return NULL; else if (!avl->hook_cmp(root->val, val)) return root->val; else return __search(avl, root->node[avl->hook_cmp(root->val, val) > 0], val); }
static uint8_t __search(BTree *tree, offset_t rootOffset, const uint8_t *key, int (*keyCompare)(const uint8_t *, const uint8_t *), offset_t *filePos) { uint8_t i; BTreeNode *rootNode; uint8_t result; rootNode = btreeReadNode(tree, rootOffset); if(NULL == rootNode) { sys_log(LOGSTDOUT, "error:__search: read node failed at offset %d\n", rootOffset); return 0; } for (i = 0; i < rootNode->keyCount && keyCompare(rootNode->keys[i], key) < 0; i++) ; if (BTREE_IS_LEAF(rootNode)) { if (i < rootNode->keyCount && keyCompare(rootNode->keys[i], key) == 0) { *filePos = rootNode->children[i]; btreeDestroyNode(rootNode); return 1; } sys_log(LOGSTDOUT, "error:__search: on leaf i = %d, keyCount %d\n", i, rootNode->keyCount); btreeDestroyNode(rootNode); return 0; } result = __search(tree, rootNode->children[i], key, keyCompare, filePos); btreeDestroyNode(rootNode); return result; }
offset_t btreeSearch(BTree *tree, const uint8_t *key, int (*keyCompare)(const uint8_t *, const uint8_t *)) { offset_t filePos; uint8_t found; if (tree == NULL) { sys_log(LOGSTDOUT, "error:btreeSearch: tree is null\n"); return 0; } if (key == NULL) { sys_log(LOGSTDOUT, "error:btreeSearch: key is null\n"); return 0; } filePos = 0; found = 0; #if 0 /* Read in the tree data. */ tree->root = btreeGetRootNode(tree); tree->leftLeaf = btreeGetLeftLeaf(tree); #endif sys_log(LOGSTDNULL, "[DEBUG] btreeSearch: tree %lx, root offset %d, left leaf offset %d\n", tree, tree->root, tree->leftLeaf); if (btreeIsEmpty(tree) == 1) { sys_log(LOGSTDOUT, "error:btreeSearch: btree is empty\n"); return 0; } found = __search(tree, tree->root, key, keyCompare, &filePos); if (found != 0) { return filePos; } sys_log(LOGSTDOUT, "error:btreeSearch: searched nothing\n"); return 0; }