47 #define AWAR_DBB_BASE "/dbbrowser"
48 #define AWAR_DBB_TMP_BASE "/tmp" AWAR_DBB_BASE
50 #define AWAR_DBB_DB AWAR_DBB_BASE "/db"
51 #define AWAR_DBB_ORDER AWAR_DBB_BASE "/order"
52 #define AWAR_DBB_PATH AWAR_DBB_BASE "/path"
53 #define AWAR_DBB_HISTORY AWAR_DBB_BASE "/history"
55 #define AWAR_DBB_BROWSE AWAR_DBB_TMP_BASE "/browse"
56 #define AWAR_DBB_INFO AWAR_DBB_TMP_BASE "/info"
58 #define AWAR_DBB_RECSIZE AWAR_DBB_BASE "/recsize"
60 #define AWAR_DUMP_HEX AWAR_DBB_BASE "/hex"
61 #define AWAR_DUMP_ASCII AWAR_DBB_BASE "/ascii"
62 #define AWAR_DUMP_SPACE AWAR_DBB_BASE "/space"
63 #define AWAR_DUMP_WIDTH AWAR_DBB_BASE "/width"
64 #define AWAR_DUMP_BLOCK AWAR_DBB_BASE "/block"
66 #define HISTORY_PSEUDO_PATH "*history*"
67 #define ENTRY_MAX_LENGTH 1000
68 #define HISTORY_MAX_LENGTH 20000
70 inline bool is_dbbrowser_pseudo_path(
const char *path) {
74 strcmp(path, HISTORY_PSEUDO_PATH) == 0;
88 static const char *sort_order_name[SORT_COUNT] = {
105 static SortOrder sort_order;
107 inline bool less_than_by_name(
const list_entry& other)
const {
109 if (cmp != 0)
return cmp<0;
110 return childCount<other.childCount;
113 inline int cmp_by_container(
const list_entry& other)
const {
return int(type !=
GB_DB) -
int(other.type !=
GB_DB); }
114 inline int cmp_by_childcount(
const list_entry& other)
const {
return childCount - other.childCount; }
116 inline bool less_than_by_container_name(
const list_entry& other)
const {
117 int cmp = cmp_by_container(other);
118 if (cmp == 0)
return less_than_by_name(other);
121 inline bool less_than_by_childcount_name(
const list_entry& other)
const {
122 int cmp = cmp_by_childcount(other);
123 if (cmp == 0)
return less_than_by_name(other);
127 bool operator<(
const list_entry& other)
const {
128 bool is_less =
false;
129 switch (sort_order) {
130 case SORT_COUNT:
break;
136 is_less = less_than_by_name(other);
140 is_less = less_than_by_container_name(other);
144 is_less = less_than_by_childcount_name(other);
148 int cmp =
ARB_stricmp(content.c_str(), other.content.c_str());
150 if (cmp != 0) is_less = cmp<0;
151 else is_less = less_than_by_container_name(other);
156 int cmp = type-other.type;
158 if (cmp == 0) is_less = less_than_by_name(other);
159 else is_less = cmp<0;
168 SortOrder list_entry::sort_order = SORT_NONE;
178 size_t separate = awr->
awar(AWAR_DUMP_BLOCK)->
read_int();
180 bool offset = (hex||ascii) && width;
182 return MemDump(offset, hex, ascii, width, separate, space);
185 static void nodedisplay_changed_cb(
AW_root *aw_root) {
190 aw_root->
awar_int (AWAR_DBB_DB, 0, aw_def);
191 aw_root->
awar_int (AWAR_DBB_ORDER, SORT_CONTAINER, aw_def);
194 aw_root->
awar_string(AWAR_DBB_INFO,
"<select an element>", aw_def);
195 aw_root->
awar_string(AWAR_DBB_HISTORY,
"", aw_def);
210 if (str[0] ==
'/' && str[1] == 0) {
214 const char *first_bracket = strchr(str,
'[');
216 const char *second_bracket = strchr(first_bracket+1,
']');
217 if (second_bracket && (second_bracket[1] == 0 || second_bracket[1] ==
'/')) {
218 int count = atoi(first_bracket+1);
219 if (count >= 0 && isdigit(first_bracket[1])) {
221 const char *previous_slash = first_bracket-1;
222 while (previous_slash >= str && previous_slash[0] !=
'/') previous_slash--;
223 if (previous_slash<str) previous_slash =
NULp;
227 if (previous_slash) {
231 if (parent_path[0] == 0) {
238 if (!gb_parent) fprintf(stderr,
"Warning: parent '%s' not found\n", parent_path);
249 const char *name_start = previous_slash ? previous_slash+1 :
str;
253 gb_son =
GB_entry(gb_parent, key_name);
254 while (c<count && gb_son) {
259 if (!gb_son) fprintf(stderr,
"Warning: did not find %i. son '%s'\n", count, key_name);
264 const char *rest =
NULp;
265 if (second_bracket[1] ==
'/') {
266 if (second_bracket[2]) {
267 rest = second_bracket+2;
272 ? GB_search_numbered(gb_son, rest, create)
277 fprintf(stderr,
"Warning: don't know where to start numbered search in '%s'\n", str);
283 fprintf(stderr,
"Warning: Illegal content in search path - expected digits at '%s'\n", first_bracket+1);
287 fprintf(stderr,
"Warning: Unbalanced or illegal [] in search path (%s)\n", str);
306 KnownDB(
GBDATA *gb_main_,
const char *description_) :
308 description(description_),
313 const string& get_description()
const {
return description; }
315 const string& get_path()
const {
return current_path; }
316 void set_path(
const string& path) { current_path = path; }
317 void set_path(
const char* path) { current_path = path; }
323 explicit hasDB(
GBDATA *gbm) : db(gbm) {}
324 bool operator()(
const KnownDB& kdb) {
return kdb.get_db() == db; }
331 static DB_browser *get_the_browser(
bool autocreate);
334 typedef vector<KnownDB>::iterator KnownDBiterator;
336 vector<KnownDB> known_databases;
344 friend DB_browser *get_the_browser(
bool autocreate);
346 void update_DB_selector();
349 DB_browser() : current_db(0), aww(
NULp), oms(
NULp) {}
352 known_databases.push_back(KnownDB(gb_main, description));
353 if (aww) update_DB_selector();
356 void del_db(
GBDATA *gb_main) {
357 KnownDBiterator known = find_if(known_databases.begin(), known_databases.end(), hasDB(gb_main));
358 if (known != known_databases.end()) known_databases.erase(known);
363 if (aww) update_DB_selector();
369 bool legal_selected_db()
const {
return current_db < known_databases.size(); }
371 size_t get_selected_db()
const {
arb_assert(legal_selected_db());
return current_db; }
372 void set_selected_db(
size_t idx) {
arb_assert(idx < known_databases.size()); current_db = idx; }
374 const char *get_path()
const {
return known_databases[get_selected_db()].get_path().c_str(); }
375 void set_path(
const char *new_path) { known_databases[get_selected_db()].set_path(new_path); }
378 return legal_selected_db() ?
const_cast<GBDATA*
>(known_databases[get_selected_db()].get_db()) :
NULp;
388 static DB_browser *get_the_browser(
bool autocreate =
true) {
389 if (DB_browser::the_browser.isNull() && autocreate) {
390 DB_browser::the_browser =
new DB_browser;
392 return &*DB_browser::the_browser;
398 static void browser_auto_forget_db(
AW_root*,
GBDATA *gb_main) {
399 DB_browser *browser = get_the_browser(
false);
402 if (browser) browser->del_db(gb_main);
405 void AWT_announce_db_to_browser(
GBDATA *gb_main,
const char *description) {
406 get_the_browser()->add_db(gb_main, description);
410 static void AWT_announce_properties_to_browser(
GBDATA *gb_defaults,
const char *defaults_name) {
411 AWT_announce_db_to_browser(gb_defaults,
GBS_global_string(
"Properties (%s)", defaults_name));
417 static void toggle_tmp_cb(
AW_window *aww) {
423 if (path[4] ==
'/') {
427 else if (path[4] == 0) {
433 if (!done && !is_dbbrowser_pseudo_path(path)) {
436 char *lslash = strrchr(path_in_tmp,
'/');
437 if (lslash && !lslash[1]) {
446 static void show_history_cb(
AW_window *aww) {
450 static void goto_root_cb(
AW_window *aww) {
457 char *lslash = strrchr(path,
'/');
461 if (!path[0]) strcpy(path,
"/");
469 #define BROWSE_CMD_PREFIX "browse_cmd___"
470 #define BROWSE_CMD_GOTO_VALID_NODE BROWSE_CMD_PREFIX "goto_valid_node"
471 #define BROWSE_CMD_GO_UP BROWSE_CMD_PREFIX "go_up"
473 struct BrowserCommand {
487 int len = strlen(path);
488 GBDATA *gb_main = get_the_browser()->get_db();
491 aw_message(
"previously selected database vanished => selected first database");
496 while (len>0 && !GB_search_numbered(gb_main, path,
GB_FIND)) {
507 static BrowserCommand browser_command_table[] = {
508 { BROWSE_CMD_GOTO_VALID_NODE, browse_cmd_goto_valid_node },
509 { BROWSE_CMD_GO_UP, browse_cmd_go_up },
513 static void execute_DB_browser_command(
AW_window *aww,
const char *
command) {
515 for (idx = 0; browser_command_table[idx].name; ++idx) {
516 if (strcmp(command, browser_command_table[idx].name) == 0) {
523 if (!browser_command_table[idx].name) {
532 return get_the_browser()->get_window(aw_root);
537 counterPair() : occur(0), count(0) {}
540 inline void insert_history_selection(
AW_selection_list *sel,
const char *entry,
int wanted_db) {
541 const char *colon = strchr(entry,
':');
542 if (colon && (atoi(entry) == wanted_db)) {
543 sel->
insert(colon+1, colon+1);
548 static char *get_container_description(
GBDATA *gbd) {
549 char *content =
NULp;
550 const char *known_children[] = {
"@name",
"name",
"key_name",
"alignment_name",
"group_name",
"key_text",
NULp };
551 for (
int i = 0; known_children[i]; ++i) {
564 static char *get_dbentry_content(
GBDATA *gbd,
GB_TYPES type,
bool shorten_repeats,
const MemDump& dump) {
567 char *content =
NULp;
575 case GB_INT: size =
sizeof(int32_t);
break;
576 case GB_FLOAT: size =
sizeof(float);
break;
594 content = buf.release();
595 shorten_repeats =
false;
600 if (!dump.
wrapped() && len>(ENTRY_MAX_LENGTH+15)) {
601 content[ENTRY_MAX_LENGTH] = 0;
609 DB_browser *browser = get_the_browser();
615 GBDATA *gb_main = browser->get_db();
618 is_root = (strcmp(path,
"/") == 0);
619 node = GB_search_numbered(gb_main, path,
GB_FIND);
626 if (strcmp(path, HISTORY_PSEUDO_PATH) == 0) {
629 id->insert(
"Previously visited nodes:",
"");
633 for (
char *lf = strchr(start,
'\n'); lf; start = lf+1, lf = strchr(start,
'\n')) {
635 insert_history_selection(
id, start, curr_db);
637 insert_history_selection(
id, start, curr_db);
642 id->insert(
"No such node!",
"");
643 id->insert(
"-> goto valid node", BROWSE_CMD_GOTO_VALID_NODE);
647 map<string, counterPair> child_count;
652 child_count[key_name].occur++;
657 for (map<string, counterPair>::iterator i = child_count.begin(); i != child_count.end(); ++i) {
659 int keylen = i->first.length();
660 int maxcount = i->second.occur;
664 while (maxcount) { maxcount /= 10; keylen++; }
667 if (keylen>maxkeylen) maxkeylen = keylen;
673 int typelen = strlen(type_name);
675 if (typelen>maxtypelen) maxtypelen = typelen;
680 id->insert(
GBS_global_string(
"%-*s parent container", maxkeylen,
".."), BROWSE_CMD_GO_UP);
689 vector<list_entry> sorted_children;
691 MemDump simpleDump(
false,
true,
false);
695 entry.childCount = -1;
699 int occurrences = child_count[entry.key_name].occur;
700 if (occurrences != 1) {
701 entry.childCount = child_count[entry.key_name].count;
702 child_count[entry.key_name].count++;
704 char *display =
NULp;
705 if (entry.type ==
GB_DB) {
706 display = get_container_description(entry.gbd);
709 display = get_dbentry_content(entry.gbd, entry.type,
true, simpleDump);
711 if (display) entry.content = display;
712 sorted_children.push_back(entry);
715 list_entry::sort_order = (SortOrder)aw_root->
awar(AWAR_DBB_ORDER)->
read_int();
716 if (list_entry::sort_order != SORT_NONE) {
717 sort(sorted_children.begin(), sorted_children.end());
720 for (vector<list_entry>::iterator ch = sorted_children.begin(); ch != sorted_children.end(); ++ch) {
721 const list_entry& entry = *ch;
722 const char *key_name = entry.key_name;
723 char *numbered_keyname =
NULp;
725 if (entry.childCount >= 0) {
729 key_name = numbered_keyname ? numbered_keyname : key_name;
731 id->insert(displayed, key_name);
733 free(numbered_keyname);
736 id->insert_default(
"",
"");
743 static void order_changed_cb(
AW_root *aw_root) {
744 DB_browser *browser = get_the_browser();
745 update_browser_selection_list(aw_root, browser->get_browser_list());
748 inline char *strmove(
char *dest,
char *source) {
749 return (
char*)memmove(dest, source, strlen(source)+1);
752 static void add_to_history(
AW_root *aw_root,
const char *path) {
755 if (strcmp(path, HISTORY_PSEUDO_PATH) != 0) {
757 AW_awar *awar_history = aw_root->
awar(AWAR_DBB_HISTORY);
760 int entry_len = strlen(entry);
762 char *found = strstr(old_history, entry);
764 if (found == old_history || found[-1] ==
'\n') {
765 if (found[entry_len] ==
'\n') {
766 strmove(found, found+entry_len+1);
767 found = strstr(old_history, entry);
769 else if (found[entry_len] == 0) {
770 if (found == old_history) {
774 strmove(found, found+entry_len+1);
776 found = strstr(old_history, entry);
779 found = strstr(found+1, entry);
783 found = strstr(found+1, entry);
787 if (old_history[0]) {
790 while (strlen(old_history)>HISTORY_MAX_LENGTH) {
791 char *llf = strrchr(old_history,
'\n');
808 static bool inside_path_change =
false;
811 static void selected_node_modified_cb(
GBDATA *gb_node,
GB_CB_TYPE cb_type) {
815 gb_tracked_node =
NULp;
818 if (!inside_path_change) {
819 static bool avoid_recursion =
false;
820 if (!avoid_recursion) {
827 AW_awar *awar_child = aw_root->
awar(AWAR_DBB_BROWSE);
832 const char *new_path;
834 if (!path[0] || !path[1]) {
853 static void untrack_node() {
854 if (gb_tracked_node) {
856 gb_tracked_node =
NULp;
859 static void track_node(
GBDATA *gb_node) {
866 gb_tracked_node = gb_node;
870 static string get_node_info_string(
AW_root *aw_root,
GBDATA *gb_selected_node,
const char *fullpath) {
874 if (!gb_selected_node) {
875 info +=
"Address | NULp\n";
879 add_to_history(aw_root, fullpath);
885 GB_SizeInfo sizeInfo;
886 bool collect_recursive = aw_root->
awar(AWAR_DBB_RECSIZE)->
read_int();
889 if (collect_recursive || type !=
GB_DB) {
890 sizeInfo.collect(gb_selected_node);
893 string structure_add;
898 if (collect_recursive) {
902 sizeInfo.structure = struct_size;
905 info +=
"Node type | container\n";
908 if (collect_recursive) {
909 childs = childs+
" (rec: " +
GBS_readable_size(sizeInfo.containers,
"containers");
911 childs = childs+
" = " +
GBS_readable_size(sizeInfo.terminals+sizeInfo.containers,
"nodes")+
')';
925 long overall = sizeInfo.mem+sizeInfo.structure;
929 info +=
GBS_global_string(
"Structure | %7s %5.2f%%",
GBS_readable_size(sizeInfo.structure,
"b"),
double(sizeInfo.structure)/overall*100+.0049) + structure_add +
'\n';
932 info +=
GBS_global_string(
"CompRatio | %5.2f%% (mem-only: %5.2f%%)\n",
double(overall)/sizeInfo.data*100+.0049,
double(sizeInfo.mem)/sizeInfo.data*100+.0049);
940 if (is_tmp || not_tmp_but_in_tmp) {
941 info +=
GBS_global_string(
"Temporary | yes%s\n", not_tmp_but_in_tmp ?
" (in temporary branch)" :
"");
946 char *recursed_path =
NULp;
951 info +=
"AWAR | yes\n";
953 gb_recurse_here = awar_this->
gb_var;
955 info = info +
" | mapped to '" + recursed_path +
"' (see below)\n";
970 for (
size_t i = 0; i<callbacks.
size(); ++i) {
971 const char *prefix = i ?
" " :
"Callbacks";
972 info = info + prefix +
" | " + callbacks[i] +
'\n';
975 if (gb_selected_node == gb_tracked_node) {
976 info +=
" | (Note: one callback was installed by this browser)\n";
981 MemDump dump = make_userdefined_MemDump(aw_root);
982 char *content = get_dbentry_content(gb_selected_node,
GB_read_type(gb_selected_node),
false, dump);
984 info = info+
"\nContent:\n"+content+
'\n';
987 info +=
"\nNo content.\n";
992 if (gb_recurse_here) {
995 const bool same_DB = gb_sel_main == gb_sub_main;
999 string subinfo = get_node_info_string(aw_root, gb_recurse_here, recursed_path);
1005 "===========================\n"
1006 "Recursive database element:\n"
1008 "===================================================\n"
1009 "Recursive database element (in different database):\n"
1014 freenull(recursed_path);
1020 static void child_changed_cb(
AW_root *aw_root) {
1022 if (strncmp(child, BROWSE_CMD_PREFIX,
sizeof(BROWSE_CMD_PREFIX)-1) == 0) {
1023 execute_DB_browser_command(get_the_browser()->get_window(aw_root), child);
1028 if (strcmp(path, HISTORY_PSEUDO_PATH) == 0) {
1035 static bool avoid_recursion =
false;
1036 if (!avoid_recursion) {
1040 if (strcmp(path,
"/") == 0) {
1043 else if (child[0] == 0) {
1050 DB_browser *browser = get_the_browser();
1051 GBDATA *gb_main = browser->get_db();
1055 GBDATA *gb_selected_node = GB_search_numbered(gb_main, fullpath,
GB_FIND);
1057 string info = get_node_info_string(aw_root, gb_selected_node, fullpath);
1071 static void path_changed_cb(
AW_root *aw_root) {
1072 static bool avoid_recursion =
false;
1073 if (!avoid_recursion) {
1077 DB_browser *browser = get_the_browser();
1078 char *goto_child =
NULp;
1080 GBDATA *gb_main = browser->get_db();
1083 AW_awar *awar_path = aw_root->
awar(AWAR_DBB_PATH);
1088 char *lslash = strrchr(path,
'/');
1091 lslash[lslash == path] = 0;
1098 add_to_history(aw_root, goto_child ?
GBS_global_string(
"%s/%s", path, goto_child) : path);
1100 track_node(father ? father : found);
1102 else if (is_dbbrowser_pseudo_path(path)) {
1108 browser->set_path(path);
1112 update_browser_selection_list(aw_root, browser->get_browser_list());
1119 static void db_changed_cb(
AW_root *aw_root) {
1121 DB_browser *browser = get_the_browser();
1124 browser->set_selected_db(selected);
1128 void DB_browser::update_DB_selector() {
1133 for (KnownDBiterator i = known_databases.begin(); i != known_databases.end(); ++i, ++idx) {
1134 const KnownDB& db = *i;
1146 int wanted_db = aw_root->
awar(AWAR_DBB_DB)->
read_int();
1147 int known = known_databases.size();
1148 if (wanted_db >= known) {
1153 set_selected_db(wanted_db);
1156 known_databases[wanted_db].set_path(wanted_path);
1160 AW_window_simple *aws =
new AW_window_simple;
1162 aws->init(aw_root,
"DB_BROWSER",
"ARB database browser");
1166 aws->create_button(
"CLOSE",
"CLOSE",
"C");
1169 update_DB_selector();
1172 aws->create_option_menu(AWAR_DBB_ORDER);
1173 for (
int idx = 0; idx<SORT_COUNT; ++idx) {
1174 aws->insert_option(sort_order_name[idx],
"", idx);
1176 aws->update_option_menu();
1179 aws->create_input_field(AWAR_DBB_PATH, 10);
1181 aws->auto_space(10, 10);
1182 aws->button_length(8);
1184 aws->at(
"navigation");
1185 aws->callback(go_up_cb); aws->create_button(
"go_up",
"Up");
1186 aws->callback(goto_root_cb); aws->create_button(
"goto_root",
"Top");
1187 aws->callback(show_history_cb); aws->create_button(
"history",
"History");
1188 aws->callback(toggle_tmp_cb); aws->create_button(
"toggle_tmp",
"/tmp");
1190 aws->label(
"Rec.size"); aws->create_toggle(AWAR_DBB_RECSIZE);
1193 browse_list = aws->create_selection_list(AWAR_DBB_BROWSE);
1194 update_browser_selection_list(aw_root, browse_list);
1197 aws->label(
"ASCII"); aws->create_toggle (AWAR_DUMP_ASCII);
1198 aws->label(
"Hex"); aws->create_toggle (AWAR_DUMP_HEX);
1199 aws->label(
"Sep?"); aws->create_toggle (AWAR_DUMP_SPACE);
1200 aws->label(
"Width"); aws->create_input_field(AWAR_DUMP_WIDTH, 3);
1201 aws->label(
"Block"); aws->create_input_field(AWAR_DUMP_BLOCK, 3);
1204 aws->create_text_field(AWAR_DBB_INFO, 40, 40);
1212 db_changed_cb(aw_root);
1217 static void callallcallbacks(
AW_window *aww,
int mode) {
1218 static bool running =
false;
1221 aww->
get_root()->callallcallbacks(mode);
1227 void AWT_create_debug_menu(
AW_window *awmm) {
1234 awmm->
insert_sub_menu(
"Callbacks (dangerous! use at your own risk)",
"C", AWM_ALL);
1235 awmm->
insert_menu_topic(
"!run_all_cbs_alph",
"Call all callbacks (alpha-order)",
"a",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 0));
1236 awmm->
insert_menu_topic(
"!run_all_cbs_nalph",
"Call all callbacks (alpha-reverse)",
"l",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 1));
1237 awmm->
insert_menu_topic(
"!run_all_cbs_loc",
"Call all callbacks (code-order)",
"c",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 2));
1238 awmm->
insert_menu_topic(
"!run_all_cbs_nloc",
"Call all callbacks (code-reverse)",
"o",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 3));
1239 awmm->
insert_menu_topic(
"!run_all_cbs_rnd",
"Call all callbacks (random)",
"r",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 4));
1241 awmm->
insert_menu_topic(
"!forget_called_cbs",
"Forget called",
"F",
"", AWM_ALL, makeWindowCallback(callallcallbacks, -1));
1242 awmm->
insert_menu_topic(
"!mark_all_called",
"Mark all called",
"M",
"", AWM_ALL, makeWindowCallback(callallcallbacks, -2));
1246 awmm->
insert_menu_topic(
"!run_all_cbs_alph_inf",
"Call all callbacks (alpha-order repeated)",
"a",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 8|0));
1247 awmm->
insert_menu_topic(
"!run_all_cbs_nalph_inf",
"Call all callbacks (alpha-reverse repeated)",
"l",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 8|1));
1248 awmm->
insert_menu_topic(
"!run_all_cbs_loc_inf",
"Call all callbacks (code-order repeated)",
"c",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 8|2));
1249 awmm->
insert_menu_topic(
"!run_all_cbs_nloc_inf",
"Call all callbacks (code-reverse repeated)",
"o",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 8|3));
1250 awmm->
insert_menu_topic(
"!run_all_cbs_rnd_inf",
"Call all callbacks (random repeated)",
"r",
"", AWM_ALL, makeWindowCallback(callallcallbacks, 8|4));
1261 void AWT_check_action_ids(
AW_root *,
const char *) {
1264 void AWT_check_action_ids(
AW_root *aw_root,
const char *suffix) {
1274 FILE *out = fopen(save,
"wt");
1277 for (
size_t i = 0; i<action_ids->
size(); ++i) {
1278 fprintf(out,
"%s\n", (*action_ids)[i]);
1286 if (IDs_have_changed) error =
GBS_global_string(
"action ids differ from expected (see console)");
1293 if (error) fprintf(stderr,
"AWT_check_action_ids: Error: %s\n", error);
1305 AW_root *aw_root =
new AW_root(properties, program,
false, user_tracker);
1324 if (appAction.
empty()) {
1325 error =
"No action found";
1328 for (
unsigned a = 0; a<appAction.
size() && !
error; ++a) {
1332 if (cmd.
size() != 2) {
1336 const char *app = cmd[0];
1337 const char *action = cmd[1];
1355 "Unhandled error was:\n"
1357 #if defined(DEVEL_RALF)
1359 #endif // DEVEL_RALF
1366 "Unhandled error was:\n"
1368 #if defined(DEVEL_RALF)
1370 #endif // DEVEL_RALF
void insert_option(AW_label choice_label, const char *mnemonic, const char *var_value, const char *name_of_color=NULp)
static void after_callback_guard()
void GBS_restore_global_buffers(GlobalStringBuffers *saved)
NOT4PERL long GB_calc_structure_size(GBDATA *gbd)
void init_Advisor(AW_root *awr)
has to be called one time (before calling AW_advice)
GBDATA * GB_child(GBDATA *father)
return string(buffer, length)
bool GB_is_temporary(GBDATA *gbd)
void insert_menu_topic(const char *id, const char *name, const char *mnemonic, const char *help_text_, AW_active mask, const WindowCallback &wcb)
void load_xfig(const char *file, bool resize=true)
GB_ERROR GB_add_callback(GBDATA *gbd, GB_CB_TYPE type, const DatabaseCallback &dbcb)
GBDATA * GB_nextEntry(GBDATA *entry)
int ARB_stricmp(const char *s1, const char *s2)
static list< ArbDisconnectCallback > callbacks
const char * GB_get_type_name(GBDATA *gbd)
GB_ERROR GB_IO_error(const char *action, const char *filename)
char * ARB_strdup(const char *str)
char * GB_read_as_string(GBDATA *gbd)
static void set_AW_cb_guards(AW_cb_struct_guard before, AW_cb_struct_guard after)
size_t GBS_shorten_repeated_data(char *data)
const char * GBS_global_string(const char *templat,...)
NOT4PERL GB_ERROR GBT_remote_action_with_timeout(GBDATA *gb_main, const char *application, const char *action_name, const class ARB_timeout *timeout, bool verbose)
char * GBS_string_eval(const char *insource, const char *icommand)
void AW_POPDOWN(AW_window *window)
char * ARB_strpartdup(const char *start, const char *end)
int GB_unlink(const char *path)
GBDATA * GB_get_father(GBDATA *gbd)
void update_option_menu()
AW_awar * add_callback(const RootCallback &cb)
struct Unfixed_cb_parameter * UNFIXED
void insert(const char *displayed, const AW_scalar &value)
static HelixNrInfo * start
const char * read_char_pntr() const
GB_ERROR GB_await_error()
static AW_root * SINGLETON
AliDataPtr after(AliDataPtr data, size_t pos)
long GB_read_count(GBDATA *gbd)
GB_TYPES GB_read_type(GBDATA *gbd)
GB_ERROR rewrite_int(long aw_int)
GB_CSTR GB_read_key_pntr(GBDATA *gbd)
char * GB_get_callback_info(GBDATA *gbd)
GB_CSTR GB_read_pntr(GBDATA *gbd)
long GB_number_of_subentries(GBDATA *gbd)
int GB_read_security_write(GBDATA *gbd)
static void set_AW_postcb_cb(AW_postcb_cb postcb_cb)
size_t mem_needed_for_dump(size_t bytes) const
void create_menu(const char *name, const char *mnemonic, AW_active mask=AWM_ALL)
const char * GBS_readable_size(unsigned long long size, const char *unit_suffix)
static void error(const char *msg)
GBDATA * GB_get_root(GBDATA *gbd)
void dump_to(GBS_strstruct &buf, const char *mem, size_t size) const
void AWT_trigger_remote_action(UNFIXED, GBDATA *gb_main, const char *remote_action_spec)
GBQUARK GB_get_quark(GBDATA *gbd)
char * read_string() const
GB_CSTR GB_path_in_ARBLIB(const char *relative_path)
AW_awar * awar_no_error(const char *awar)
end timer stuff
AW_awar * awar(const char *awar)
void insert_sub_menu(const char *name, const char *mnemonic, AW_active mask=AWM_ALL)
void AWT_install_cb_guards()
bool ARB_textfiles_have_difflines(const char *file1, const char *file2, int expected_difflines, TextDiffMode tdmode)
static void before_callback_guard()
void clear_option_menu(AW_option_menu_struct *oms)
int GB_read_security_read(GBDATA *gbd)
int GB_read_security_delete(GBDATA *gbd)
AW_awar * awar_int(const char *var_name, long default_value=0, AW_default default_file=AW_ROOT_DEFAULT)
void nprintf(size_t maxlen, const char *templat,...) __ATTR__FORMAT_MEMBER(2)
void GB_remove_callback(GBDATA *gbd, GB_CB_TYPE type, const DatabaseCallback &dbcb)
const char * GB_get_db_path(GBDATA *gbd)
void aw_message(const char *msg)
AW_option_menu_struct * create_option_menu(const char *awar_name)
GlobalStringBuffers * GBS_store_global_buffers()
GB_ERROR write_string(const char *aw_string)
void GBT_split_string(ConstStrArray &dest, const char *namelist, const char *separator, SplitMode mode)
void AWT_install_postcb_cb(AW_postcb_cb postcb_cb)
bool ARB_strBeginsWith(const char *str, const char *with)
const char * local_id(const char *id) const
void ARB_atdisconnect_callback(const ArbDisconnectCallback &cb)
GBDATA * GB_nextChild(GBDATA *child)
GB_transaction ta(gb_var)
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
GBDATA * GB_search(GBDATA *gbd, const char *fieldpath, GB_TYPES create)
void(* AW_postcb_cb)(AW_window *)
static int info[maxsites+1]
AW_root * AWT_create_root(const char *properties, const char *program, UserActionTracker *user_tracker)
void GBT_splitNdestroy_string(ConstStrArray &names, char *&namelist, const char *separator, SplitMode mode)
GB_ERROR write_int(long aw_int)
GBDATA * GB_entry(GBDATA *father, const char *key)
void AW_system_async_cb(AW_window *, const char *command)
void aw_message_if(GB_ERROR error)
char * GBS_global_string_copy(const char *templat,...)
GB_ERROR rewrite_string(const char *aw_string)
bool operator<(const GEN_positionPtr &A, const GEN_positionPtr &B)
bool GB_in_temporary_branch(GBDATA *gbd)