source: branches/tree/TOOLS/arb_sub2ascii.cxx

Last change on this file was 17836, checked in by westram, 6 years ago
  • Property svn:executable set to *
File size: 2.6 KB
Line 
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
13static 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
21static 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
32int 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
Note: See TracBrowser for help on using the repository browser.