static void* save_state_cmd (int argc, char **argv, void *data) { Node *pos = (Node *) data; Node *i; Node *j; if (savedtree != NULL) { tree_free (savedtree); } savedtree = node_new (); i = node_root (pos); j = savedtree; do { j = savedtree = tree_duplicate (i, j); i = node_down (i); j = node_insert_down (j); } while (i != NULL); j = node_remove (j); { int no; no = node_no (pos); savedtree = node_root (savedtree); while (--no) savedtree = node_recurse (savedtree); } return pos; }
static Node *node_forced_down ( Node *node) { if (node_getflag(node,F_expanded)) { return node_recurse (node); } else { if (node_down (node)) { return (node_down (node)); } else { while (node != 0) { node = node_left (node); if (node_down (node)) return (node_down (node)); } } } return NULL; }
static void* stats_cmd (int argc, char **argv, void *data) { int words = 0, leaves = 0, nodes = 0; Node *pos = (Node *) data; Node *node = node_root (pos); while (node) { nodes++; words += count_words ((unsigned char *)fixnullstring (node_get (node, TEXT))); if (!node_right (node)) leaves++; node = node_recurse (node); } cli_outfunf ("nodes:%i, leaves:%i words:%i", nodes, leaves, words); return pos; }
static int ls (int argc, char **argv, void *data) { Node *pos = (Node *) data; Node *tnode; int recurse = 0; int indicate_sub = 1; int startlevel; tnode = node_top (pos); startlevel = nodes_left (tnode); while (tnode) { if (recurse) { int j; for (j = nodes_left (tnode); j > startlevel; j--) { printf ("\t"); } } cli_outfunf( "%s %s %s",fixnullstring(node_get (tnode, TEXT)), indicate_sub? node_right(tnode)?"(..)":"" :"", tnode==pos?"<":"" ); if (recurse) { tnode = node_recurse (tnode); if (nodes_left (tnode) < startlevel) tnode = 0; } else { tnode = node_down (tnode); } } return (int) pos; }
int export_dot (char *params, void *data) { Node *node = (Node *) data; char *filename = params; Node *tnode; int startlevel; FILE *file; file_error[0] = 0; if (!strcmp (filename, "-")) file = stdout; else file = fopen (filename, "w"); if (!file) { sprintf (file_error, "dot export, unable to open \"%s\"", filename); return (int) node; } startlevel = nodes_left (node); tnode = node; fprintf (file, "digraph hnb{\nrankdir=LR;\n"); while ((tnode != 0) & (nodes_left (tnode) >= startlevel)) { dot_export_node (file, tnode); tnode = node_recurse (tnode); } fprintf (file, "}\n"); if (file != stdout) fclose (file); return (int) node; }