Example #1
0
/*
  newick tree destructor
 */
void killnewicktree(NEWICKTREE *tree)
{
  if(tree)
  {
    killnoder(tree->root);
    free(tree);
  }
}
Example #2
0
/*
  newick tree destructor
 */
void TreeOPE::killnewicktree(NEWICKTREE *tree)
{

//    rewind(stdin);
   // setbuf(stdout, NULL);
  if(tree)
  {
    killnoder(tree->root);
    free(tree);
  }
}
Example #3
0
/*
  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);
}
Example #4
0
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);
}
Example #5
0
/*
  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;
}
Example #6
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;
}