FACT++  1.0
argv.cc
Go to the documentation of this file.
1 #include "Configuration.h"
2 
3 #include <iostream>
4 
5 using namespace std;
6 
7 // --------------------------------------------------------------------------
8 //
14 //
15 void SetupConfiguration(Configuration &conf, int &opt)
16 {
17  /*
18  // Default in case the option was not specified
19  typed_value* default_value(const T& v)
20  typed_value* default_value(const T& v, const std::string& textual)
21 
22  // Default value in case the option was given
23  // forces -o to become -o5
24  // forces --opt to become --opt=3
25  typed_value* implicit_value(const T &v)
26  typed_value* implicit_value(const T &v, const std::string& textual)
27 
28  // notifier function when the final value is determined
29  typed_value* notifier(function1<void, const T&> f)
30 
32  typed_value* composing()
33 
34  // Specifies that the value can span multiple tokens.
35  typed_value* multitoken()
36  typed_value* zero_tokens()
37 
38  // Specifies that the value must occur.
39  typed_value* required()
40  */
41 
42  // To merge the options from several parsers (e.g. comand_line and
43  // config file) use po_strings()->composing()
44  /*
45  po::options_description generic("Generic options");
46  generic.add_options()
47  ("help-config", "Print available configuration file options.")
48  ("help-env", "Print available environment variables.")
49  ("help", "Print available commandline options.")
50  ("print-unknown", "Print unrecognized options.")
51  ("config", po_string("config.txt"), "Set configuration file name.")
52  ;
53 
54 
55  // Declare the supported options.
56  po::options_description generic("Generaic options");
57  generic.add_options()
58 // ("testreq", po_int()->required(), "set compression level (madatory)")
59  ("default", po_string("my_default"), "set compression level")
60  ("unknown", po_int(1), "set compression level")
61  ("U", po_int(2)->implicit_value(1), "set compression level")
62  ;
63  */
64  // Declare a group of options that will be
65  // allowed both on command line and in
66  // config file
67  po::options_description config("Configuration");
68  config.add_options()
69  ("compression", var<int>(), "set compression level")
70  ("optimization", var<int>(10, &opt), "optimization level")
71  ("test-def", var<int>(42), "optimization level")
72  ("include-path,I", vars<string>()/*->composing()*/, "include path")
73  ("test,T", vars<string>()/*->composing()*/, "include path")
74  ("file1", vars<string>(), "include path")
75  ("int1", var<int>(), "include path")
76  ("Int2", var<int>(), "include path")
77  ("Int1", var<int>(), "include path")
78  ("test-db", var<string>("database"), "include path")
79  ("float1", var<double>(), "include path")
80 // (",A", po_float(), "include path")
81  ("radec", po::value<vector<double>>(), "include path")
82  ("switch", po_switch(), "include path")
83  ("bool", var<bool>()->implicit_value(true), "include path")
84  ;
85 
86  // !!! Option which are "shorted" must be placed last.
87  // Can this be switched off?
88 
89  po::options_description sections("Sections");
90  config.add_options()
91  ("unregistered", var<string>(), "include path")
92  ("Section1.unregistered", var<string>(), "include path")
93 // ("Section2*", po_string(), "include path")
94  // The latter accepts all options starting with Section2.
95  ;
96 
97  // Hidden options, will be allowed both on command line and
98  // in config file, but will not be shown to the user.
99  po::options_description hidden("Hidden options");
100  hidden.add_options()
101  ("input-file", vars<string>(), "input file")
102  ("output-file", vars<string>(), "output file")
103  ("test-file", vars<string>(), "test file")
104  ;
105 
106  po::options_description env("Environment options");
107  env.add_options()
108  ("linux", var<string>(), "LINUX env")
109  ("path", var<string>(), "PATH env")
110  ("dns", var<string>(), "DIM_DNS_SERVER env")
111  ;
112 
113  conf.AddEnv("linux", "LINUX");
114  conf.AddEnv("path", "PATH");
115  conf.AddEnv("dns", "DIM_DNS_SERVER");
116 
117  // define translation from position to name
118  po::positional_options_description p;
119  p.add("output-file", 2); // The first 2 positional options is output-file
120  p.add("test-file", 3); // The next three positional options is output-file
121  p.add("input-file", -1); // All others go to...
122 
123  conf.AddOptionsCommandline(config);
124  conf.AddOptionsCommandline(sections);
125  conf.AddOptionsCommandline(hidden, false);
126 
127  conf.AddOptionsConfigfile(config);
128  conf.AddOptionsConfigfile(sections);
129  conf.AddOptionsConfigfile(hidden, false);
130 
131  conf.AddOptionsEnvironment(env);
132 
133  conf.AddOptionsDatabase(config);
134 
135  conf.SetArgumentPositions(p);
136 }
137 
138 
139 int main(int argc, const char **argv)
140 {
141  int opt;
142 
143  Configuration conf(argv[0]);
144  SetupConfiguration(conf, opt);
145 
146  po::variables_map vm;
147  try
148  {
149  vm = conf.Parse(argc, argv);
150  }
151  catch (std::exception &e)
152  {
153 #if BOOST_VERSION > 104000
154  po::multiple_occurrences *MO = dynamic_cast<po::multiple_occurrences*>(&e);
155  if (MO)
156  cout << "Error: " << e.what() << " of '" << MO->get_option_name() << "' option." << endl;
157  else
158 #endif
159  cout << "Error: " << e.what() << endl;
160  cout << endl;
161 
162  return -1;
163  }
164 
165  if (conf.HasHelp() || conf.HasPrint())
166  return -1;
167 
168  cout << "------------------------------" << endl;
169 
170  cout << "Program " << argv[0] << " started successfully." << endl;
171 
172  cout << conf.Has("switch") << " " << conf.Get<bool>("switch") << endl;
173  cout << conf.Has("bool") << " " << conf.Get<bool>("bool") << endl;
174 
175  return 0;
176 /*
177  if (vm.count("compression"))
178  cout << "Compression level was set to " << vm["compression"].as<int>() << ".\n";
179  else
180  cout << "Compression level was not set.\n";
181 
182 
183  cout << "Test default is always: " << vm["test-def"].as<int>() << "\n";
184  cout << "Optimization level is " << vm["optimization"].as<int>() << "\n";
185  //cout << "Int2: " << vm["Int2"].as<int>() << "\n";
186 
187  cout << conf.GetString("unregistered") << endl;
188  cout << conf.GetString("Section1.unregistered") << endl;
189  cout << conf.Has("Section2.unregistered") << endl;
190  cout << conf.GetString("Section2.Section3.unregistered") << endl;
191  cout << "test-db: " << conf.GetString("test-db") << endl;
192 
193 
194  if (vm.count("include-path"))
195  {
196  vector<string> v = vm["include-path"].as< vector<string> >();
197  for (vector<string>::iterator s=v.begin(); s<v.end(); s++)
198  cout << "Incl P: " << *s << endl;
199  }
200 
201  if (vm.count("input-file"))
202  {
203  vector<string> v = vm["input-file"].as< vector<string> >();
204  for (vector<string>::iterator s=v.begin(); s<v.end(); s++)
205  cout << "Incl F: " << *s << endl;
206  }
207 
208  if (vm.count("output-file"))
209  {
210  vector<string> v = vm["output-file"].as< vector<string> >();
211  for (vector<string>::iterator s=v.begin(); s<v.end(); s++)
212  cout << "Out: " << *s << endl;
213  }
214 
215  if (vm.count("test-file"))
216  {
217  vector<string> v = vm["test-file"].as< vector<string> >();
218  for (vector<string>::iterator s=v.begin(); s<v.end(); s++)
219  cout << "Testf: " << *s << endl;
220  }
221 
222  cout << "Linux: " << conf.Get<string>("linux") << endl;
223 
224  if (vm.count("path"))
225  cout << "Path: " << vm["path"].as<string>() << endl;
226  if (vm.count("file1"))
227  cout << "File1: " << vm["file1"].as<string>() << endl;
228  if (vm.count("int1"))
229  cout << "Int1: " << vm["int1"].as<int>() << endl;
230  if (vm.count("float1"))
231  cout << "Float1: " << vm["float1"].as<float>() << endl;
232 
233  if (vm.count("test"))
234  {
235  vector<string> v = vm["test"].as< vector<string> >();
236  for (vector<string>::iterator s=v.begin(); s<v.end(); s++)
237  cout << "Test: " << *s << endl;
238  }*/
239 }
240 // ***************************************************************************
246 // ***************************************************************************
void AddOptionsEnvironment(const po::options_description &env, bool visible=true)
void AddOptionsConfigfile(const po::options_description &cf, bool visible=true)
T Get(const std::string &var)
po::typed_value< bool > * po_switch()
STL namespace.
void AddEnv(const std::string &conf, const std::string &env)
void SetArgumentPositions(const po::positional_options_description &desc)
void AddOptionsDatabase(const po::options_description &db, bool visible=true)
bool Has(const std::string &var)
void SetupConfiguration(Configuration &conf, int &opt)
Definition: argv.cc:15
void AddOptionsCommandline(const po::options_description &cl, bool visible=true)
Commandline parsing, resource file parsing and database access.
Definition: Configuration.h:9
const po::variables_map & Parse(int argc, const char **argv, const std::function< void()> &func=std::function< void()>())
int main(int argc, const char **argv)
Definition: argv.cc:139