X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/d7482997dd1ca71b70df43c15dd5956f435a1a7e..8f664e7e91c918cd13248f6b684580c4dd2cdb31:/tree234.c diff --git a/tree234.c b/tree234.c index bc88039..26d188e 100644 --- a/tree234.c +++ b/tree234.c @@ -34,7 +34,7 @@ #define smalloc malloc #define sfree free -#define mknew(typ) ( (typ *) smalloc (sizeof (typ)) ) +#define snew(typ) ( (typ *) smalloc (sizeof (typ)) ) #ifdef TEST #define LOG(x) (printf x) @@ -60,7 +60,7 @@ struct node234_Tag { * Create a 2-3-4 tree. */ tree234 *newtree234(cmpfn234 cmp) { - tree234 *ret = mknew(tree234); + tree234 *ret = snew(tree234); LOG(("created tree %p\n", ret)); ret->root = NULL; ret->cmp = cmp; @@ -187,7 +187,7 @@ static int add234_insert(node234 *left, void *e, node234 *right, LOG((" done\n")); break; } else { - node234 *m = mknew(node234); + node234 *m = snew(node234); m->parent = n->parent; LOG((" splitting a 4-node; created new node %p\n", m)); /* @@ -283,7 +283,7 @@ static int add234_insert(node234 *left, void *e, node234 *right, return 0; /* root unchanged */ } else { LOG((" root is overloaded, split into two\n")); - (*root) = mknew(node234); + (*root) = snew(node234); (*root)->kids[0] = left; (*root)->counts[0] = lcount; (*root)->elems[0] = e; (*root)->kids[1] = right; (*root)->counts[1] = rcount; @@ -314,7 +314,7 @@ static void *add234_internal(tree234 *t, void *e, int index) { LOG(("adding element \"%s\" to tree %p\n", e, t)); if (t->root == NULL) { - t->root = mknew(node234); + t->root = snew(node234); t->root->elems[1] = t->root->elems[2] = NULL; t->root->kids[0] = t->root->kids[1] = NULL; t->root->kids[2] = t->root->kids[3] = NULL; @@ -1040,7 +1040,7 @@ static node234 *join234_internal(node234 *left, void *sep, * nodes. */ node234 *newroot; - newroot = mknew(node234); + newroot = snew(node234); newroot->kids[0] = left; newroot->counts[0] = countnode234(left); newroot->elems[0] = sep; newroot->kids[1] = right; newroot->counts[1] = countnode234(right); @@ -1215,7 +1215,7 @@ static node234 *split234_internal(tree234 *t, int index) { * new node pointers in halves[0] and halves[1], and go up * a level. */ - sib = mknew(node234); + sib = snew(node234); for (i = 0; i < 3; i++) { if (i+ki < 3 && n->elems[i+ki]) { sib->elems[i] = n->elems[i+ki]; @@ -1415,7 +1415,7 @@ tree234 *split234(tree234 *t, void *e, cmpfn234 cmp, int rel) { static node234 *copynode234(node234 *n, copyfn234 copyfn, void *copyfnstate) { int i; - node234 *n2 = mknew(node234); + node234 *n2 = snew(node234); for (i = 0; i < 3; i++) { if (n->elems[i] && copyfn) @@ -1440,8 +1440,11 @@ tree234 *copytree234(tree234 *t, copyfn234 copyfn, void *copyfnstate) { tree234 *t2; t2 = newtree234(t->cmp); - t2->root = copynode234(t->root, copyfn, copyfnstate); - t2->root->parent = NULL; + if (t->root) { + t2->root = copynode234(t->root, copyfn, copyfnstate); + t2->root->parent = NULL; + } else + t2->root = NULL; return t2; } @@ -2122,11 +2125,12 @@ int main(void) { tree = newtree234(mycmp); cmp = mycmp; arraylen = 0; - for (i = 0; i < 16; i++) { - addtest(strings[i]); + for (i = 0; i < 17; i++) { tree2 = copytree234(tree, NULL, NULL); splittest(tree2, array, arraylen); freetree234(tree2); + if (i < 16) + addtest(strings[i]); } freetree234(tree);