add treebase_node_insertbefore
and fix bug in finalize.
@@ -1,7 +1,7 @@ | ||
1 | 1 | /* |
2 | 2 | * treebase.h |
3 | 3 | * |
4 | - * Copyright (c) 2013 project bchan | |
4 | + * Copyright (c) 2013-2014 project bchan | |
5 | 5 | * |
6 | 6 | * This software is provided 'as-is', without any express or implied |
7 | 7 | * warranty. In no event will the authors be held liable for any damages |
@@ -46,6 +46,7 @@ | ||
46 | 46 | IMPORT VOID treebase_node_initialize(treebase_node_t *node); |
47 | 47 | IMPORT VOID treebase_node_finalize(treebase_node_t *node); |
48 | 48 | IMPORT VOID treebase_node_appendchild(treebase_node_t *node, treebase_node_t *child); |
49 | +IMPORT W treebase_node_insertbefore(treebase_node_t *node, treebase_node_t *child, treebase_node_t *ref); | |
49 | 50 | IMPORT VOID treebase_node_remove(treebase_node_t *node); |
50 | 51 | IMPORT treebase_node_t* treebase_node_getparent(treebase_node_t *node); |
51 | 52 | IMPORT treebase_node_t* treebase_node_getnextsibling(treebase_node_t *node); |
@@ -1,7 +1,7 @@ | ||
1 | 1 | /* |
2 | 2 | * test_treebase.c |
3 | 3 | * |
4 | - * Copyright (c) 2013 project bchan | |
4 | + * Copyright (c) 2013-2014 project bchan | |
5 | 5 | * |
6 | 6 | * This software is provided 'as-is', without any express or implied |
7 | 7 | * warranty. In no event will the authors be held liable for any damages |
@@ -309,6 +309,75 @@ | ||
309 | 309 | return ret; |
310 | 310 | } |
311 | 311 | |
312 | +LOCAL UNITTEST_RESULT test_treebase_node_7() | |
313 | +{ | |
314 | + treebase_node_t node0, node1, node2, node3; | |
315 | + test_treebase_node_expected_t expected; | |
316 | + Bool ok; | |
317 | + UNITTEST_RESULT ret = UNITTEST_RESULT_PASS; | |
318 | + | |
319 | + treebase_node_initialize(&node0); | |
320 | + treebase_node_initialize(&node1); | |
321 | + treebase_node_initialize(&node2); | |
322 | + treebase_node_initialize(&node3); | |
323 | + | |
324 | + treebase_node_insertbefore(&node0, &node1, NULL); | |
325 | + treebase_node_insertbefore(&node0, &node2, NULL); | |
326 | + treebase_node_insertbefore(&node0, &node3, &node2); | |
327 | + | |
328 | + /**/ | |
329 | + expected.parent = NULL; | |
330 | + expected.next = NULL; | |
331 | + expected.prev = NULL; | |
332 | + expected.first = &node1; | |
333 | + expected.last = &node2; | |
334 | + expected.has_child = True; | |
335 | + ok = test_treebase_node_commoncheck(&node0, &expected, "node0"); | |
336 | + if (ok == False) { | |
337 | + ret = UNITTEST_RESULT_FAIL; | |
338 | + } | |
339 | + /**/ | |
340 | + expected.parent = &node0; | |
341 | + expected.next = &node3; | |
342 | + expected.prev = NULL; | |
343 | + expected.first = NULL; | |
344 | + expected.last = NULL; | |
345 | + expected.has_child = False; | |
346 | + ok = test_treebase_node_commoncheck(&node1, &expected, "node1"); | |
347 | + if (ok == False) { | |
348 | + ret = UNITTEST_RESULT_FAIL; | |
349 | + } | |
350 | + /**/ | |
351 | + expected.parent = &node0; | |
352 | + expected.next = NULL; | |
353 | + expected.prev = &node3; | |
354 | + expected.first = NULL; | |
355 | + expected.last = NULL; | |
356 | + expected.has_child = False; | |
357 | + ok = test_treebase_node_commoncheck(&node2, &expected, "node2"); | |
358 | + if (ok == False) { | |
359 | + ret = UNITTEST_RESULT_FAIL; | |
360 | + } | |
361 | + /**/ | |
362 | + expected.parent = &node0; | |
363 | + expected.next = &node2; | |
364 | + expected.prev = &node1; | |
365 | + expected.first = NULL; | |
366 | + expected.last = NULL; | |
367 | + expected.has_child = False; | |
368 | + ok = test_treebase_node_commoncheck(&node3, &expected, "node3"); | |
369 | + if (ok == False) { | |
370 | + ret = UNITTEST_RESULT_FAIL; | |
371 | + } | |
372 | + | |
373 | + treebase_node_finalize(&node3); | |
374 | + treebase_node_finalize(&node2); | |
375 | + treebase_node_finalize(&node1); | |
376 | + treebase_node_finalize(&node0); | |
377 | + | |
378 | + return ret; | |
379 | +} | |
380 | + | |
312 | 381 | /* treebase_preordertraversal_t */ |
313 | 382 | |
314 | 383 | typedef struct { |
@@ -408,5 +477,6 @@ | ||
408 | 477 | UNITTEST_DRIVER_REGIST(driver, test_treebase_node_4); |
409 | 478 | UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5); |
410 | 479 | UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6); |
480 | + UNITTEST_DRIVER_REGIST(driver, test_treebase_node_7); | |
411 | 481 | UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1); |
412 | 482 | } |
@@ -1,7 +1,7 @@ | ||
1 | 1 | /* |
2 | 2 | * treebase.c |
3 | 3 | * |
4 | - * Copyright (c) 2013 project bchan | |
4 | + * Copyright (c) 2013-2014 project bchan | |
5 | 5 | * |
6 | 6 | * This software is provided 'as-is', without any express or implied |
7 | 7 | * warranty. In no event will the authors be held liable for any damages |
@@ -43,6 +43,22 @@ | ||
43 | 43 | child->parent = node; |
44 | 44 | } |
45 | 45 | |
46 | +EXPORT W treebase_node_insertbefore(treebase_node_t *node, treebase_node_t *child, treebase_node_t *ref) | |
47 | +{ | |
48 | + if (ref == NULL) { | |
49 | + treebase_node_appendchild(node, child); | |
50 | + return 0; | |
51 | + } | |
52 | + if (ref->parent != node) { | |
53 | + return -1; /* TODO */ | |
54 | + } | |
55 | + | |
56 | + QueInsert(&child->sibling, &ref->sibling); | |
57 | + child->parent = node; | |
58 | + | |
59 | + return 0; | |
60 | +} | |
61 | + | |
46 | 62 | EXPORT VOID treebase_node_remove(treebase_node_t *node) |
47 | 63 | { |
48 | 64 | if (node->parent == NULL) { /* root node */ |
@@ -128,6 +144,7 @@ | ||
128 | 144 | |
129 | 145 | EXPORT VOID treebase_node_finalize(treebase_node_t *node) |
130 | 146 | { |
147 | + treebase_node_remove(node); | |
131 | 148 | } |
132 | 149 | |
133 | 150 |