1 | // =============================================================== // |
---|
2 | // // |
---|
3 | // File : ps_arb2asciipaths.cxx // |
---|
4 | // Purpose : // |
---|
5 | // // |
---|
6 | // Coded by Wolfram Foerster in October 2002 // |
---|
7 | // Institute of Microbiology (Technical University Munich) // |
---|
8 | // http://www.arb-home.de/ // |
---|
9 | // // |
---|
10 | // =============================================================== // |
---|
11 | |
---|
12 | #include "ps_filebuffer.hxx" |
---|
13 | #include "ps_pg_tree_functions.hxx" |
---|
14 | |
---|
15 | static IDVector *__PATH = new IDVector; |
---|
16 | |
---|
17 | static void PS_print_paths(GBDATA *_pb_node) { |
---|
18 | // recursively print the paths to the leafs |
---|
19 | |
---|
20 | // number and species name |
---|
21 | GBDATA *data = GB_entry(_pb_node, "num"); |
---|
22 | const char *buffer = GB_read_char_pntr(data); |
---|
23 | SpeciesID id = atoi(buffer); |
---|
24 | |
---|
25 | // probe(s) |
---|
26 | GBDATA *pb_group = GB_entry(_pb_node, "group"); |
---|
27 | if (!pb_group) { |
---|
28 | id = -id; |
---|
29 | } |
---|
30 | |
---|
31 | // path |
---|
32 | __PATH->push_back(id); |
---|
33 | |
---|
34 | // child(ren) |
---|
35 | GBDATA *pb_child = PS_get_first_node(_pb_node); |
---|
36 | if (pb_child) { |
---|
37 | while (pb_child) { |
---|
38 | PS_print_paths(pb_child); |
---|
39 | pb_child = PS_get_next_node(pb_child); |
---|
40 | } |
---|
41 | } |
---|
42 | else { |
---|
43 | // print path in leaf nodes |
---|
44 | printf("[%6zu] ", __PATH->size()); |
---|
45 | for (IDVectorCIter i=__PATH->begin(); i != __PATH->end(); ++i) { |
---|
46 | printf("%6i ", *i); |
---|
47 | } |
---|
48 | printf("\n"); |
---|
49 | } |
---|
50 | |
---|
51 | // path |
---|
52 | __PATH->pop_back(); |
---|
53 | } |
---|
54 | |
---|
55 | |
---|
56 | int main(int argc, char *argv[]) { |
---|
57 | GB_ERROR error = NULp; |
---|
58 | if (argc < 2) { |
---|
59 | error = GBS_global_string("Missing arguments\n Usage %s <input database name>", argv[0]); |
---|
60 | } |
---|
61 | else { |
---|
62 | const char *input_DB_name = argv[1]; |
---|
63 | printf("Loading probe-group-database '%s'..\n", input_DB_name); |
---|
64 | |
---|
65 | GBDATA *pb_main = GB_open(input_DB_name, "rwcN"); // open probe-group-database |
---|
66 | if (!pb_main) error = GB_await_error(); |
---|
67 | else { |
---|
68 | GB_transaction ta(pb_main); |
---|
69 | GBDATA *group_tree = GB_entry(pb_main, "group_tree"); |
---|
70 | if (!group_tree) error = "no 'group_tree' in database"; |
---|
71 | else { |
---|
72 | GBDATA *first_level_node = PS_get_first_node(group_tree); |
---|
73 | if (!first_level_node) error = "no 'node' found in group_tree"; |
---|
74 | else { |
---|
75 | printf("dumping probes... (starting with first toplevel nodes)\n"); |
---|
76 | // print 1st level nodes (and its subtrees) |
---|
77 | do { |
---|
78 | PS_print_paths(first_level_node); |
---|
79 | first_level_node = PS_get_next_node(first_level_node); |
---|
80 | } |
---|
81 | while (first_level_node); |
---|
82 | } |
---|
83 | } |
---|
84 | } |
---|
85 | } |
---|
86 | |
---|
87 | if (error) { |
---|
88 | fprintf(stderr, "Error in %s: %s\n", argv[0], error); |
---|
89 | return EXIT_FAILURE; |
---|
90 | } |
---|
91 | return EXIT_SUCCESS; |
---|
92 | } |
---|
93 | |
---|
94 | |
---|