-/*#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include "graph.h"
-#include "newick.h"
-#include "main.h"
-*/
+/* newick.c 2008-01-14 */
+
+/* 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;
centerNode = decodeNewickSubtree (str, T, &uCount);
snprintf (centerNode->label, MAX_LABEL_LENGTH, rootLabel);
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);
-