Lump_s prefix(Lump_s a, Lump_s b) { Lump_s p; int size; int i; #if 0 int cmp; cmp = cmplump(a, b); if (cmp > 0) { Lump_s t = a; a = b; b = t; } else if (cmp == 0) { return a; } #endif if (a.size > b.size) { size = b.size; } else { size = a.size; } for (i = 0; i < size; i++) { if (((u8 *)a.d)[i] != ((u8 *)b.d)[i]) { ++i; break; } } p.size = i; p.d = b.d; return p; }
int bi_insert (BiTree_s *tree, Rec_s r) { BiNode_s **np = &tree->root; for (;;) { BiNode_s *node = *np; if (!node) break; if (cmplump(r.key, node->rec.key) < 0) { np = &node->left; } else { np = &node->right; } } *np = bi_new(r); return 0; }
void find_find (Lump_s key, Lump_s val, void *user) { BiTree_s *tree = user; Lump_s fval; int rc; rc = bi_find(tree, key, &fval); if (rc) { fatal("Didn't find %s : rc=%d", key.d, rc); } else if (cmplump(val, fval) != 0) { fatal("Val not the same %s!=%s", val.d, fval.d); } else { printf("%s:%s\n", key.d, fval.d); } freelump(fval); }
int bi_delete (BiTree_s *tree, Lump_s key) { BiNode_s **np = &tree->root; for (;;) { BiNode_s *node = *np; if (!node) fatal("Key not found"); int r = cmplump(key, node->rec.key); if (r == 0) break; if (r < 0) { np = &node->left; } else { np = &node->right; } } delete_node(np); return 0; }
int bi_find (BiTree_s *tree, Lump_s key, Lump_s *val) { BiNode_s *node = tree->root; while (node) { int r = cmplump(key, node->rec.key); if (r == 0) { *val = node->rec.val; return 0; } if (r < 0) { node = node->left; } else { node = node->right; } } return -1; }
void bi_pr_path (BiTree_s *tree, Lump_s key) { BiNode_s *node = tree->root; while (node) { pr_lump(node->rec.key); int r = cmplump(key, node->rec.key); if (r == 0) { printf("\n"); return; } printf(" "); if (r < 0) { node = node->left; } else { node = node->right; } } }