/* newick tree destructor */ void killnewicktree(NEWICKTREE *tree) { if(tree) { killnoder(tree->root); free(tree); } }
/* newick tree destructor */ void TreeOPE::killnewicktree(NEWICKTREE *tree) { // rewind(stdin); // setbuf(stdout, NULL); if(tree) { killnoder(tree->root); free(tree); } }
/* node destructor (recursive) */ static void killnoder(NEWICKNODE *node) { int i; if(!node) return; for(i=0;i<node->Nchildren;i++) { killnoder(node->child[i]); } free(node->label); free(node->child); free(node); }
void TreeOPE::killnoder(NEWICKNODE *node) { if(!node) return; for(int i = 0;i < node->Nchildren; i++) { killnoder(node->child[i]); } setbuf(stdout, NULL); free(node->label); if(node->bitstr != NULL) { delete node->bitstr; node->bitstr = NULL; } free(node->child); free(node); }
/* load a node from the file Params: fp - the input stream error - return for error Returns: node loaded. Notes: recursive. Expects the opening parenthesis to have been eaten */ static NEWICKNODE *loadnode(FILE *fp, int *error) { NEWICKNODE *answer; int err; NEWICKNODE *child = 0; int ch; answer = malloc(sizeof(NEWICKNODE)); if(!answer) { err = -1; goto error_exit; } answer->Nchildren = 0; answer->label = 0; answer->child = 0; answer->hv1 = 0; answer->hv2 = 0; skipspace(fp); do { ch = fgetc(fp); if(ch == '(') { child = loadnode(fp, &err); if(!child) goto error_exit; if( addchild(answer, child ) == -1) { err = -1; goto error_exit; } child = 0; } else { ungetc(ch, fp); child = loadleaf(fp, &err); if(!child) goto error_exit; if(addchild(answer, child) == -1) { err = -1; goto error_exit; } child = 0; } skipspace(fp); ch = fgetc(fp); } while(ch == ','); if(ch == ')') { answer->label = readlabelandweight(fp, &answer->weight, &err); if(err) goto error_exit; } else { err = -2; goto error_exit; } if(error) *error = 0; return answer; error_exit: if(child) killnoder(child); killnoder(answer); if(error) *error = err; return 0; }
NEWICKNODE *TreeOPE::parsenode(char **str, int *error) { NEWICKNODE *answer = NULL; int err; NEWICKNODE *child = NULL; answer = (NEWICKNODE *) malloc(sizeof(NEWICKNODE)); if (!answer) { err = -1; goto error_exit; } answer->Nchildren = 0; answer->label = NULL; answer->child = NULL; answer->hv1 = 0; answer->hv2 = 0; answer->bitstr = NULL; if (**str == '(') { (*str)++; child = parsenode(str, &err); if (!child) goto error_exit; if (addchild(answer, child) == -1) { err = -1; goto error_exit; } child = NULL; } else { child = parseleaf(str, &err); if (!child) goto error_exit; if (addchild(answer, child) == -1) { err = -1; goto error_exit; } child = NULL; } while(**str == ',') { (*str)++; if (**str == '(') { (*str)++; child = parsenode(str, &err); if (!child) goto error_exit; if (addchild(answer, child) == -1) { err = -1; goto error_exit; } child = NULL; } else { child = parseleaf(str, &err); if (!child) goto error_exit; if (addchild(answer, child) == -1) { err = -1; goto error_exit; } child = NULL; } } if (**str == ')') { (*str)++; answer->label = parselabelandweight(str, &answer->weight, &err); if(err) goto error_exit; } else { err = -2; goto error_exit; } if (error) *error = 0; return answer; error_exit: cout << "Wrong in parsenode()!\n\n";//---- if (child) killnoder(child); killnoder(answer); if (error) *error = err; return NULL; }