-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgPMC_commandline.hxx
61 lines (60 loc) · 4.24 KB
/
gPMC_commandline.hxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "gPMC_ggo.h"
template < class TArgsInfo, class TCleanupFunction = void(*)(TArgsInfo*) >
class args_info_manager
{
public:
args_info_manager(TArgsInfo & args_info, TCleanupFunction cf)
{
this->args_info_pointer = &args_info;
this->cleanup_function = cf;
}
~args_info_manager()
{
this->cleanup_function(this->args_info_pointer);
}
private:
TArgsInfo * args_info_pointer;
TCleanupFunction cleanup_function;
};
//--------------------------------------------------------------------
/** \brief Process gengetopt with config file option (shamelessly stolen from RTK)
*
* \author Simon Rit
*
* \ingroup Macro
*/
#define GGO(ggo_filename, args_info) \
args_info_##ggo_filename args_info; \
cmdline_parser_##ggo_filename##_params args_params; \
cmdline_parser_##ggo_filename##_params_init(&args_params); \
args_params.print_errors = 1; \
args_params.check_required = 0; \
args_params.override = 1; \
args_params.initialize = 1; \
if (0 != cmdline_parser_##ggo_filename##_ext(argc, argv, &args_info, &args_params)) \
{ \
std::cerr << "Error in cmdline_parser_" #ggo_filename "_ext" << std::endl; \
exit(1); \
} \
std::string configFile; \
if (args_info.config_given) \
configFile = args_info.config_arg; \
cmdline_parser_##ggo_filename##_free(&args_info); \
if (configFile != "") \
{ \
if (0 != cmdline_parser_##ggo_filename##_config_file(configFile.c_str(), &args_info, &args_params)) \
{ \
std::cerr << "Error in cmdline_parser_" #ggo_filename "_config_file" << std::endl; \
exit(1); \
} \
args_params.initialize = 0; \
} \
args_params.check_required = 1; \
if (0 != cmdline_parser_##ggo_filename##_ext(argc, argv, &args_info, &args_params)) \
{ \
std::cerr << "Error in cmdline_parser_" #ggo_filename "_ext" << std::endl; \
exit(1); \
} \
args_info_manager< args_info_##ggo_filename > \
manager_object(args_info, cmdline_parser_##ggo_filename##_free);
//--------------------------------------------------------------------