1 | // ============================================================= // |
---|
2 | // // |
---|
3 | // File : arb_sub2ascii.cxx // |
---|
4 | // Purpose : unittest support tool // |
---|
5 | // // |
---|
6 | // Coded by Ralf Westram (coder@reallysoft.de) in April 2018 // |
---|
7 | // http://www.arb-home.de/ // |
---|
8 | // // |
---|
9 | // ============================================================= // |
---|
10 | |
---|
11 | #include <arbdbt.h> |
---|
12 | |
---|
13 | static int fail_if_error(const char *error) { |
---|
14 | if (error) { |
---|
15 | fprintf(stderr, "arb_sub2ascii: Error: %s\n", error); |
---|
16 | return EXIT_FAILURE; |
---|
17 | } |
---|
18 | return EXIT_SUCCESS; |
---|
19 | } |
---|
20 | |
---|
21 | static int show_usage(const char *error) { |
---|
22 | fputs("arb_sub2ascii - extract part of database into ascii database\n" |
---|
23 | "(intended to support fine-grained results in unit-tests)\n" |
---|
24 | "Syntax: arb_sub2ascii 'srcDB' 'path/to/container' 'dstDB'\n" |
---|
25 | "Opens arb-database 'srcDB', searches a container using the specified\n" |
---|
26 | "search path and dumps its contents in arb ascii format to 'dstDB'\n", |
---|
27 | stderr); |
---|
28 | |
---|
29 | return fail_if_error(error); |
---|
30 | } |
---|
31 | |
---|
32 | int ARB_main(int argc, char *argv[]) { |
---|
33 | GB_ERROR error = NULp; |
---|
34 | |
---|
35 | bool not_enough_args = argc<4; |
---|
36 | bool help_requested = argc>1 && strcmp(argv[1], "--help") == 0; |
---|
37 | |
---|
38 | if (not_enough_args || help_requested) { |
---|
39 | return show_usage(help_requested ? NULp : "not enough arguments"); |
---|
40 | } |
---|
41 | |
---|
42 | const char *srcname = argv[1]; |
---|
43 | const char *path = argv[2]; |
---|
44 | const char *dstname = argv[3]; |
---|
45 | |
---|
46 | { |
---|
47 | GB_shell shell; |
---|
48 | |
---|
49 | GBDATA *gb_src = GB_open(srcname, "r"); |
---|
50 | GBDATA *gb_dst = NULp; |
---|
51 | |
---|
52 | if (!gb_src) error = GB_await_error(); |
---|
53 | else { |
---|
54 | gb_dst = GB_open(dstname, "cw"); |
---|
55 | if (!gb_dst) error = GB_await_error(); |
---|
56 | } |
---|
57 | |
---|
58 | if (!error) { |
---|
59 | GB_transaction ts(gb_src); |
---|
60 | GB_transaction td(gb_dst); |
---|
61 | |
---|
62 | GBDATA *gb_sub = GB_search(gb_src, path, GB_FIND); |
---|
63 | if (!gb_sub) { |
---|
64 | error = GBS_global_string("could not find a container at '%s' in database '%s'", path, srcname); |
---|
65 | } |
---|
66 | else { |
---|
67 | error = GB_copy_dropMarksAndTempstate(gb_dst, gb_sub); |
---|
68 | } |
---|
69 | } |
---|
70 | |
---|
71 | if (!error) error = GB_save_as(gb_dst, dstname, "a"); |
---|
72 | |
---|
73 | if (gb_dst) GB_close(gb_dst); |
---|
74 | if (gb_src) GB_close(gb_src); |
---|
75 | } |
---|
76 | |
---|
77 | return fail_if_error(error); |
---|
78 | } |
---|
79 | |
---|