X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fnewick.c;h=e94ded5e612ed08acf9d29d9ac9dada4c9537727;hb=a02ce8c6e9fd80d3d7a749cc24699366fb8e54b6;hp=07cd96d85efcd57f3e1d7426b4caa2c140936d48;hpb=c827059eeafc8cbe41c812b26979543ab287803e;p=ape.git diff --git a/src/newick.c b/src/newick.c index 07cd96d..e94ded5 100644 --- a/src/newick.c +++ b/src/newick.c @@ -1,11 +1,10 @@ -/*#include -#include -#include -#include -#include "graph.h" -#include "newick.h" -#include "main.h" -*/ +/* newick.c 2010-11-23 */ + +/* Copyright 2007-2008 Vincent Lefort */ + +/* This file is part of the R-package `ape'. */ +/* See the file ../COPYING for licensing issues. */ + #include "me.h" int nodeCount; @@ -231,287 +230,7 @@ tree *readNewickString (char *str, int numLeaves) } } centerNode = decodeNewickSubtree (str, T, &uCount); - snprintf (centerNode->label, MAX_LABEL_LENGTH, rootLabel); + snprintf (centerNode->label, MAX_LABEL_LENGTH, "%s", rootLabel); /* added "%s" following Jos Kafer's suggestion (2010-11-23) */ T->root = centerNode; - return (T); -} - -tree *loadNewickTree(FILE *ifile, int numLeaves) -{ -// char label[] = "EmptyEdge"; - tree *T; - node *centerNode; - int i = 0; - int j = 0; - int inputLength; - int uCount = 0; - int parCount = 0; - char c; - int Comment; - char *nextString; - char rootLabel[MAX_LABEL_LENGTH]; - nodeCount = edgeCount = 0; - T = newTree(); - nextString = (char *) malloc(numLeaves*INPUT_SIZE*sizeof(char)); - if (NULL == nextString) - nextString = (char *) malloc(MAX_INPUT_SIZE*sizeof(char)); - Comment = 0; - while(1 == fscanf(ifile,"%c",&c)) - { - if('[' == c) - Comment = 1; - else if (']' == c) - Comment = 0; - else if (!(Comment)) - { - if(whiteSpace(c)) - { - if (i > 0) - nextString[i++] = ' '; - } - else /*note that this else goes with if(whiteSpace(c))*/ - nextString[i++] = c; - if (';' == c) - break; - } - } - if ('(' != nextString[0]) - { - fprintf(stderr,"Error reading input file - does not start with '('.\n"); - exit(EXIT_FAILURE); - } - inputLength = i; - for(i = 0; i < inputLength;i++) - { - if ('(' == nextString[i]) - parCount++; - else if (')' == nextString[i]) - parCount--; - if (parCount > 0) - ; - else if (0 == parCount) - { - i++; -/* if(';' == nextString[i]) - sprintf(rootLabel,"URoot"); - else - {*/ - while(';' != nextString[i]) - if(!(whiteSpace(nextString[i++]))) - rootLabel[j++] = nextString[i-1]; /*be careful here */ - rootLabel[j] = '\0'; -// } - i = inputLength; - } - else if (parCount < 0) - { - fprintf(stderr,"Error reading tree input file. Too many right parentheses.\n"); - exit(EXIT_FAILURE); - } - } - centerNode = decodeNewickSubtree(nextString,T,&uCount); - snprintf(centerNode->label, MAX_LABEL_LENGTH, rootLabel); - T->root = centerNode; - free(nextString); return(T); } - -double GetSubTreeLength (tree *T, edge *e) -{ - double ret = 0; - - if ( (NULL != e) && (! leaf(e->head) )) { - ret += GetSubTreeLength (T, e->head->leftEdge); - ret += GetSubTreeLength (T, e->head->rightEdge); - } - ret += e->distance; - return ret; -} - -void NewickPrintSubtree(tree *T, edge *e, char *str) -{ - char *tmp; - if (NULL == e) - { - Rprintf("Error with Newick Printing routine.\n"); - exit(0); - } - if(!(leaf(e->head))) - { - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, "(", 1); - NewickPrintSubtree(T,e->head->leftEdge,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ",", 1); - NewickPrintSubtree(T,e->head->rightEdge,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ")", 1); - } - if (strlen (str) < MAX_INPUT_SIZE - strlen (e->head->label) -1) - strncat (str, e->head->label, strlen (e->head->label)); - - if (strlen (str) < MAX_INPUT_SIZE - 2) - strncat (str, ":", 1); - - tmp = (char *)R_alloc(INPUT_SIZE, sizeof(char)); - /* added by EP */ - if (strlen(tmp)) - strncpy(tmp, "", strlen(tmp)); - /* end */ - snprintf (tmp, INPUT_SIZE, "%lf", e->distance); - if (strlen (str) < MAX_INPUT_SIZE - strlen (tmp) -1) - strncat (str, tmp, strlen (tmp)); - - /* free (tmp); */ - return; -} - -double GetBinaryTreeLength (tree *T) -{ - double ret = 0; - edge *e, *f; - node *rootchild; - e = T->root->leftEdge; - rootchild = e->head; - - f = rootchild->leftEdge; - if (NULL != f) - ret += GetSubTreeLength (T, f); - f = rootchild->rightEdge; - if (NULL != f) - ret += GetSubTreeLength (T, f); - ret += e->distance; - return ret; -} - -void NewickPrintBinaryTree(tree *T, char *str) -{ - edge *e, *f; - node *rootchild; - char *tmp; - e = T->root->leftEdge; - rootchild = e->head; - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, "(", 1); - f = rootchild->leftEdge; - if (NULL != f) - { - NewickPrintSubtree(T,f,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ",", 1); - } - f = rootchild->rightEdge; - if (NULL != f) - { - NewickPrintSubtree(T,f,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ",", 1); - } - if (strlen (str) < MAX_INPUT_SIZE - strlen (T->root->label) -1) - strncat (str, T->root->label, strlen (T->root->label)); - - if (strlen (str) < MAX_INPUT_SIZE - 2) - strncat (str, ":", 1); - - tmp = (char *)R_alloc(INPUT_SIZE, sizeof(char)); - /* added by EP */ - if (strlen(tmp)) - strncpy(tmp, "", strlen(tmp)); - /* end */ - snprintf (tmp, INPUT_SIZE, "%lf", e->distance); - if (strlen (str) < MAX_INPUT_SIZE - strlen (tmp) -1) - strncat (str, tmp, strlen (tmp)); - - if (strlen (str) < MAX_INPUT_SIZE - 2) - strncat (str, ")", 1); - - if (NULL != rootchild->label) - if (strlen (str) < MAX_INPUT_SIZE - strlen (rootchild->label) -1) - strncat (str, T->root->label, strlen (rootchild->label)); - - if (strlen (str) < MAX_INPUT_SIZE - 3) - strncat (str, ";\n", 2); - - /* free (tmp); */ - return; -} - -double GetTrinaryTreeLength (tree *T) -{ - double ret = 0; - edge *f; - f = T->root->leftEdge; - if (NULL != f) - ret += GetSubTreeLength (T, f); - f = T->root->rightEdge; - if (NULL != f) - ret += GetSubTreeLength (T, f); - f = T->root->middleEdge; - if (NULL != f) - ret += GetSubTreeLength (T, f); - - return ret; -} - -void NewickPrintTrinaryTree(tree *T, char *str) -{ - edge *f; - f = T->root->leftEdge; - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, "(", 1); - if (NULL != f) - { - NewickPrintSubtree(T,f,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ",", 1); - } - f = T->root->rightEdge; - if (NULL != f) - { - NewickPrintSubtree(T,f,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ",", 1); - } - f = T->root->middleEdge; - if (NULL != f) - { - NewickPrintSubtree(T,f,str); - if (strlen (str) < MAX_INPUT_SIZE -2) - strncat (str, ")", 1); - } - if (NULL != T->root->label) - if (strlen (str) < MAX_INPUT_SIZE - strlen (T->root->label) -1) - strncat (str, T->root->label, strlen (T->root->label)); - if (strlen (str) < MAX_INPUT_SIZE - 3) - strncat (str, ";\n", 2); - return; -} - -void NewickPrintTreeStr(tree *T, char *str) -{ - if (leaf(T->root)) - NewickPrintBinaryTree(T,str); - else - NewickPrintTrinaryTree(T,str); -} - -double GetTreeLength (tree *T) -{ - double ret = 0; - if (leaf(T->root)) - ret = GetBinaryTreeLength (T); - else - ret = GetTrinaryTreeLength (T); - return ret; -} -/* -void NewickPrintTree(tree *T, FILE *ofile) -{ - if (leaf(T->root)) - NewickPrintBinaryTree(T,ofile); - else - NewickPrintTrinaryTree(T,ofile); -} -*/ -//edge *depthFirstTraverse(tree *T, edge *e); -