]> git.donarmstrong.com Git - ape.git/blobdiff - src/newick.c
stabler and faster C code for ME and BIONJ
[ape.git] / src / newick.c
index 07cd96d85efcd57f3e1d7426b4caa2c140936d48..d0a4f15e88abc94d3d2787322661ce5a72537f0a 100644 (file)
@@ -1,11 +1,10 @@
-/*#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;
@@ -233,285 +232,5 @@ tree *readNewickString (char *str, int numLeaves)
   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);
-