1 | // ==================================================================== // |
---|
2 | // // |
---|
3 | // File : GEN_tools.cxx // |
---|
4 | // Purpose : Some helper functions // |
---|
5 | // Time-stamp: <Thu Jul/01/2004 09:08 MET Coder@ReallySoft.de> // |
---|
6 | // // |
---|
7 | // // |
---|
8 | // Coded by Ralf Westram (coder@reallysoft.de) in July 2004 // |
---|
9 | // Copyright Department of Microbiology (Technical University Munich) // |
---|
10 | // // |
---|
11 | // Visit our web site at: http://www.arb-home.de/ // |
---|
12 | // // |
---|
13 | // ==================================================================== // |
---|
14 | |
---|
15 | #include <cstdio> |
---|
16 | #include <cstdlib> |
---|
17 | #include <cstring> |
---|
18 | #include <arbdb.h> |
---|
19 | |
---|
20 | #include "GEN_local.hxx" |
---|
21 | #include "GEN_tools.hxx" |
---|
22 | |
---|
23 | using namespace std; |
---|
24 | |
---|
25 | // provide fast access to strings like |
---|
26 | // "pos_begin", "pos_begin2", "pos_begin3", ... |
---|
27 | class NumberedEntries { |
---|
28 | int size; |
---|
29 | char **entries; |
---|
30 | |
---|
31 | void fill_entries(int from_idx, int to_idx) { |
---|
32 | while (from_idx <= to_idx) { |
---|
33 | entries[from_idx] = GBS_global_string_copy("%s%i", entries[0], from_idx+1); // entries[1] gets number '2' |
---|
34 | ++from_idx; |
---|
35 | } |
---|
36 | } |
---|
37 | |
---|
38 | void increase_size(int new_size) { |
---|
39 | char **new_entries = new char*[new_size]; |
---|
40 | |
---|
41 | for (int i = 0; i<size; ++i) new_entries[i] = entries[i]; |
---|
42 | |
---|
43 | delete [] entries; |
---|
44 | |
---|
45 | entries = new_entries; |
---|
46 | int old_size = size; |
---|
47 | size = new_size; |
---|
48 | |
---|
49 | fill_entries(old_size, new_size-1); |
---|
50 | } |
---|
51 | |
---|
52 | NumberedEntries(const NumberedEntries& other); // copying not allowed |
---|
53 | NumberedEntries& operator = (const NumberedEntries& other); // assignment not allowed |
---|
54 | public: |
---|
55 | NumberedEntries(const char *prefix) |
---|
56 | : size(5) |
---|
57 | , entries(new char*[size]) |
---|
58 | { |
---|
59 | entries[0] = strdup(prefix); |
---|
60 | fill_entries(1, size-1); |
---|
61 | } |
---|
62 | ~NumberedEntries() { |
---|
63 | for (int i = 0; i<size; ++i) free(entries[i]); |
---|
64 | delete [] entries; |
---|
65 | } |
---|
66 | |
---|
67 | const char *get_entry(int nr) { |
---|
68 | gen_assert(nr >= 1); |
---|
69 | if (nr > size) { |
---|
70 | int new_size = size+5; |
---|
71 | if (nr>new_size) new_size = nr+5; |
---|
72 | increase_size(new_size); |
---|
73 | } |
---|
74 | return entries[nr-1]; |
---|
75 | } |
---|
76 | }; |
---|
77 | |
---|
78 | |
---|
79 | const char *GEN_pos_begin_entry_name(int nr) { |
---|
80 | static NumberedEntries entries("pos_begin"); |
---|
81 | return entries.get_entry(nr); |
---|
82 | } |
---|
83 | const char *GEN_pos_end_entry_name(int nr) { |
---|
84 | static NumberedEntries entries("pos_end"); |
---|
85 | return entries.get_entry(nr); |
---|
86 | } |
---|
87 | |
---|
88 | |
---|
89 | |
---|
90 | |
---|
91 | |
---|