Ejemplo n.º 1
0
int main(int argc, char *argv[])
{
	char *s = "((a[abc],d1)x:0.5,((b[&&NHX:S=MOUSE],h2)[&&NHX:S=HUMAN:B=99][blabla][&&NHX:K=foo],c))";
	knhx1_t *node;
	int i, n, error;
	node = kn_parse(s, &n, &error);
	for (i = 0; i < n; ++i) {
		knhx1_t *p = node + i;
		printf("%s[%d]: %d,%d,%lg\n", p->name, i, p->parent, p->n, p->d);
	}
	return 0;
}
Ejemplo n.º 2
0
void Tree::parse (const string& nhx) {
  LogThisAt(8,"Parsing tree: " << nhx << endl);
  ktree_t *tree = kn_parse (nhx.c_str());
  LogThisAt(8,"Tree has " << plural(tree->n,"node") << endl);
  node = vguard<TreeNode> (tree->n);
  set<string> names;
  for (int n = 0; n < tree->n; ++n) {
    node[n].parent = tree->node[n].parent;
    node[n].child = vector<TreeNodeIndex> (tree->node[n].n);
    for (int c = 0; c < tree->node[n].n; ++c)
      node[n].child[c] = tree->node[n].child[c];
    node[n].name = tree->node[n].name;
    if (tree->node[n].d >= 0)
      node[n].d = max (tree->node[n].d, minBranchLength);
    else
      node[n].d = tree->node[n].d;
    if (node[n].name.size()) {
      Require (names.count (node[n].name) == 0, "Duplicate node name '%s' in tree: %s", node[n].name.c_str(), nhx.c_str());
      names.insert (node[n].name);
    }
  }
  kn_free (tree);
}