コード例 #1
0
ファイル: avl.c プロジェクト: Emeraude/AVL
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);
}
コード例 #2
0
ファイル: avl.c プロジェクト: Emeraude/AVL
/* 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);
}
コード例 #3
0
ファイル: btree_search.c プロジェクト: okayman/ebgn
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;
}
コード例 #4
0
ファイル: btree_search.c プロジェクト: okayman/ebgn
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;
}