From 06fb2a444e3783a9e15f96735030dca6ff399374 Mon Sep 17 00:00:00 2001 From: Thomas Junier Date: Tue, 17 Apr 2012 09:25:57 +0200 Subject: [PATCH] nw_prune no longer SEGVs, but result is wrong --- src/link.c | 6 ++++++ src/link.h | 4 ++-- src/prune.c | 3 +++ tests/HRV_FMDV.nw | 1 + tests/test_nw_prune_args | 1 + 5 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 tests/HRV_FMDV.nw diff --git a/src/link.c b/src/link.c index 78525c9f..e6c5e253 100644 --- a/src/link.c +++ b/src/link.c @@ -308,6 +308,12 @@ int swap_nodes(struct rnode *node) int unlink_rnode(struct rnode *node) { + if (is_root(node)) + return UNLINK_RNODE_ROOT; + + /* Don't unlink a node twice. This is both a waste of time and a risk + * of bugs, because the code assumes that a node to be unlinked is + * still linked. */ if (! node->linked) return UNLINK_RNODE_DONE; struct rnode *parent = node->parent; diff --git a/src/link.h b/src/link.h index 4f92ab76..f8e7f614 100644 --- a/src/link.h +++ b/src/link.h @@ -40,8 +40,8 @@ enum remove_child_status { RM_CHILD_HAS_NO_PARENT = -10, RM_CHILD_MEM_ERROR }; * nodes in the tree structure will still contain the spliced-out node (which * is good anyway since you need it to free the spliced-out node).*/ -enum unlink_rnode_status { UNLINK_RNODE_DONE, UNLINK_RNODE_ROOT_CHILD, - UNLINK_RNODE_ERROR }; +enum unlink_rnode_status { UNLINK_RNODE_DONE, UNLINK_RNODE_ROOT, + UNLINK_RNODE_ROOT_CHILD, UNLINK_RNODE_ERROR }; struct rnode; diff --git a/src/prune.c b/src/prune.c index a20301f9..24a25f20 100644 --- a/src/prune.c +++ b/src/prune.c @@ -198,6 +198,9 @@ void process_tree(struct rooted_tree *tree, set_t *cl_labels, bool reverse) case UNLINK_RNODE_ERROR: fprintf (stderr, "Memory error - exiting.\n"); exit(EXIT_FAILURE); + case UNLINK_RNODE_ROOT: + fprintf(stderr, "WARNING: root cannot be pruned.\n"); + break; default: assert(0); /* programmer error */ } diff --git a/tests/HRV_FMDV.nw b/tests/HRV_FMDV.nw new file mode 100644 index 00000000..ec789380 --- /dev/null +++ b/tests/HRV_FMDV.nw @@ -0,0 +1 @@ +(FMDV-C,((((((((HRV16,HRV1B)52,(HRV24,HRV85)70)22,(HRV11,(HRV9,(HRV64,HRV94)32)54)1)17,(HRV39,HRV2)92)97,HRV89)62,(HRV78,HRV12)52)100,((((HRV37,HRV3)65,HRV14)89,(HRV52,HRV17)100)75,(HRV93,HRV27)99)83)48,((((POLIO3,((POLIO2,(POLIO1A,COXA18)22)38,COXA17)72)97,COXA1)76,(((ECHO1,COXB2)83,ECHO6)99,(HEV70,HEV68)99)70)64,(COXA14,(COXA6,COXA2))59)100)68); diff --git a/tests/test_nw_prune_args b/tests/test_nw_prune_args index 8d546193..5f962915 100644 --- a/tests/test_nw_prune_args +++ b/tests/test_nw_prune_args @@ -4,3 +4,4 @@ def3: catarrhini.nw Macaca Simias multi: catarrhini_mult.nw Homo Pan rev: -v fagales.nw Fagaceae Myricaceae Juglandaceae Betulaceae bug1: -v prune_segv.nw COXA18 +bug2: -v HRV_FMDV.nw HRV37 HRV3 HRV14 HRV52 HRV17 HRV93 HRV27 POLIO3 POLIO2 POLIO1A COXA18 COXA17 COXA1