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; }
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); }