AJA NTV2 SDK  18.1.0.2439
NTV2 SDK 18.1.0.2439
commandline.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
10 #include <iomanip>
11 #include <iostream>
12 #include <sstream>
13 
14 static const char kAssignChar = '=';
15 static const char kSingleDash = '-';
16 static const char *kDoubleDash = "--";
17 
19 : _names(),
20  _desc(),
21  _descExtra(),
22  _values(),
23  _defaultValue(),
24  _isSet(false)
25 {}
26 
28  const std::string &desc,
29  const std::string &defaultValue)
30 : _names(),
31  _desc(desc),
32  _descExtra(),
33  _values(),
34  _defaultValue(defaultValue),
35  _isSet(false)
36 {
37  AddName(name);
38 }
39 
41  const std::string &desc,
42  const std::string &defaultValue)
43 : _names(),
44  _desc(desc),
45  _descExtra(),
46  _values(),
47  _defaultValue(defaultValue),
48  _isSet(false)
49 {
50  for (const auto &name : names) {
51  AddName(name);
52  }
53 }
54 
56 {
57 }
58 
59 bool AJACommandLineOption::AddName(const std::string &name)
60 {
61  bool haveName = false;
62  for (size_t i = 0; i < _names.size(); i++) {
63  if (_names.at(i) == name) {
64  haveName = true;
65  break;
66  }
67  }
68  if (!haveName) {
69  _names.push_back(name);
70  }
71 
72  return haveName;
73 }
74 
76 {
77  return _names;
78 }
79 
80 bool AJACommandLineOption::HaveName(const std::string &name) const
81 {
82  for (const auto &n : _names) {
83  if (n == name) {
84  return true;
85  }
86  }
87 
88  return false;
89 }
90 
91 std::string AJACommandLineOption::Desc() const
92 {
93  return _desc;
94 }
95 
96 void AJACommandLineOption::SetDesc(const std::string &desc)
97 {
98  _desc = desc;
99 }
100 
102 {
103  return _descExtra;
104 }
105 
106 void AJACommandLineOption::SetExtraDesc(const std::string &desc)
107 {
108  _descExtra = desc;
109 }
110 
111 
112 void AJACommandLineOption::SetDefaultValue(const std::string &value)
113 {
114  _defaultValue = value;
115 }
116 
118 {
119  return _defaultValue;
120 }
121 
122 void AJACommandLineOption::AddValue(const std::string &value)
123 {
124  _values.push_back(value);
125 }
126 
127 std::string AJACommandLineOption::Value(size_t index) const
128 {
129  if (index > _values.size() || _values.empty()) {
130  return "";
131  }
132  return _values.at(index);
133 }
134 
136 {
137  return _values;
138 }
139 
141 {
142  _values.clear();
143  _isSet = false;
144 }
145 
147 {
148  return _isSet;
149 }
151 {
152  _isSet = isSet;
153 }
154 
156 : _flags(flags), _name(), _commandName(), _desc(), _descExtra(), _usageText(), _helpText(),
157  _options(), _subParsers()
158 {
159  init();
160 }
161 
162 AJACommandLineParser::AJACommandLineParser(const std::string &name, int flags)
163 : _flags(flags), _name(name), _commandName(), _desc(), _descExtra(), _usageText(), _helpText(),
164  _options(), _subParsers()
165 {
166  init();
167 }
168 
170 {
171  operator=(other);
172 }
173 
175 {
176 }
177 
179 {
180  _flags = other._flags;
181  _name = other._name;
182  _commandName = other._commandName;
183  _desc = other._desc;
184  _descExtra = other._descExtra;
185  _usageText = other._usageText;
186  _helpText = other._helpText;
187  _options = other._options;
188  _subParsers.clear();
189  for (SubParserMapConstIter iter = other._subParsers.begin(); iter != other._subParsers.end(); ++iter) {
190  _subParsers.insert(AJASubParserPair(iter->first, iter->second));
191  }
192 }
193 
194 void AJACommandLineParser::init()
195 {
196  if ((_flags & kNoDefaultHelpOption) == 0) {
197  AddHelpOption();
198  }
199  if ((_flags & kNoDefaultUsageOption) == 0) {
200  AddUsageOption();
201  }
202 }
203 
205 {
206  _flags = flags;
207 }
208 
210 {
211  _subParsers.clear();
212  _options.clear();
213 }
214 
215 void AJACommandLineParser::Reset(bool clearAll)
216 {
217  if (clearAll) {
218  Clear();
219  } else {
220  for (auto &sp : _subParsers) {
221  if (sp.second) {
222  sp.second->Reset();
223  }
224  }
225  for (auto &opt : _options) {
226  opt.Reset();
227  }
228  }
229 }
230 
232 {
233  if (!_commandName.empty()) {
234  AJACommandLineParser *sp = _subParsers.at(_commandName);
235  if (sp != NULL) {
236  return sp->Dump();
237  }
238  } else {
239  for (AJACommandLineOptionListIter iter = _options.begin();
240  iter != _options.end(); ++iter) {
241  const AJACommandLineOption &o = *iter;
242  const AJAStringList & names = o.Names();
243  std::ostringstream oss;
244  oss << "[";
245  std::string name;
246  size_t count = 0;
247  for (AJAStringListConstIter sIter = names.begin(); sIter != names.end(); ++sIter) {
248  name = *sIter;
249  oss << name;
250  if (++count < names.size()) {
251  oss << ", ";
252  }
253  }
254  oss << "] " << "set? " << (IsSet(name) ? "true" : "false") << " value = " << o.Value();
255  std::cout << oss.str() << std::endl;
256  }
257  }
258 }
259 
260 bool AJACommandLineParser::HaveOption(const std::string &name) const
261 {
262  for (const auto &opt : _options) {
263  for (const auto &n : opt.Names()) {
264  if (n == name) {
265  return true;
266  }
267  }
268  }
269  return false;
270 }
271 
272 bool AJACommandLineParser::HavePositionalArg(const std::string &name) const
273 {
274  for (const auto &arg : _positionalArgs) {
275  if (arg == name) {
276  return true;
277  }
278  }
279  return false;
280 }
281 
283 {
284  return _positionalArgs;
285 }
286 
287 bool AJACommandLineParser::OptionByName(const std::string &name, AJACommandLineOption &opt) const
288 {
289  for (const auto &o : _options) {
290  for (const auto &n : o.Names()) {
291  if (n == name) {
292  opt = o;
293  return true;
294  }
295  }
296  }
297  return false;
298 }
299 
301 {
302  const std::string &name = p->Name();
303  if (_subParsers.find(name) == _subParsers.end()) {
304  _subParsers.insert(AJASubParserPair(name, p));
305  return true;
306  }
307 
308  return false;
309 }
310 
312 {
313  AJAStringList::const_iterator iter = args.begin();
314  ++iter; // Skip exe path
315 
316  for (SubParserMap::iterator spIter = _subParsers.begin(); spIter != _subParsers.end(); ++spIter) {
317  // Is second arg a command name which belongs to a sub-parser?
318  if (*iter == spIter->first) {
319  _commandName = *iter;
320  }
321  // Iterate all args with all sub-parsers...
322  if (spIter->second != NULL) {
323  if (!spIter->second->Parse(args)) {
324  std::cerr << "Error parsing args with sub-parser: " << spIter->second->Name() << std::endl;
325  return false;
326  }
327  }
328  }
329 
330  // If the the parser name is set, expect the second arg to match (i.e. we are in a sub-parser).
331  // For example, the following case "name" would be "theCommand".
332  // If the second arg doesn't match the name, the sub-parser name is simply not present in the
333  // list of args provided. This is not an error condition.
334  // > MyApp.exe theCommand -d1 -n3 --verbose
335  if (!_name.empty() && *iter != _name) {
336  return true;
337  }
338 
339  // ...otherwise just parse the args.
340  bool havePositionalArgs = false;
341  for (; iter != args.end(); iter++) {
342  const std::string &arg = *iter;
343  // Treat subsequent args as "positional"
344  if (!havePositionalArgs && arg == kDoubleDash) {
345  havePositionalArgs = true;
346  continue;
347  }
348 
349  if (havePositionalArgs) {
350  _positionalArgs.push_back(arg);
351  continue;
352  }
353 
354  if (hasOptionPrefix(arg)) {
356  std::string optName;
357  std::string optValue;
358  std::string argStr;
359  bool doubleDash = aja::starts_with(arg, kDoubleDash);
360  bool singleDash = aja::starts_with(arg, kSingleDash) && !doubleDash;
361  if (doubleDash) {
362  argStr = arg.substr(2, arg.length());
363  } else if (singleDash) {
364  argStr = arg.substr(1, arg.length());
365  }
366  if (hasAssignmentOperator(argStr)) {
367  size_t assignPos = argStr.find_first_of(kAssignChar);
368  optName = argStr.substr(0, assignPos);
369  optValue = argStr.substr(assignPos+1, argStr.length());
370  } else {
371  // Single-dash cases we need to handle:
372  // example args: {a, apple}, {b, ball}, {c, cat}, {r, car}
373  // -a=1
374  // -a1
375  // -a 1
376  // -abc // SPECIAL CASE: short opts as long opts
377  // Should we even allow setting a value for a single-dash arg if the arg name is longer than 1 character?
378  // i.e. should -devicekona5 be legal? seems weird to me...
379  if (singleDash) { /* -argname */
380  /* handle single-dash option */
381  std::string subStr;
382  if (_flags & kShortOptionsAsLong) {
383  for (size_t c = 1; c < arg.length(); c++) {
384  subStr = arg.substr(c, 1);
385  if (HaveOption(subStr))
386  setOption(subStr, true);
387  }
388  continue;
389  } else {
390  // Walk candidates longest-first to find the longest registered
391  // option name that prefixes this arg; whatever follows it is the
392  // value, so "-b1" yields name "b" and value "1".
393  //
394  // Do NOT report an unknown arg from inside this loop. The first
395  // and longest candidate is the whole token ("b1"), which is
396  // almost never a registered name, so doing so rejected every
397  // valid "-<opt><value>" arg whenever kErrorOnUnknownArgs was set.
398  // The HaveOption check after this block already reports genuine
399  // unknowns, for both single- and double-dash forms.
400  for (size_t c = arg.length(); c > 1; c--) {
401  subStr = arg.substr(1, c-1);
402  if (HaveOption(subStr)) {
403  optName = subStr;
404  size_t count = (arg.length()-1)-optName.length();
405  optValue = arg.substr(optName.length()+1, count);
406  break;
407  }
408  }
409  if (optName.empty()) {
410  // Nothing matched. Carry the whole token so the unknown-arg
411  // message below names what the user actually typed.
412  optName = argStr;
413  }
414  }
415  } else { /* --argname */
416  optName = argStr;
417  }
418 
419  // If we have no value, and the next arg is not another arg, use it as the value for the current arg.
420  if (optValue.empty()) {
421  auto nextIter = iter;
422  nextIter++;
423  if (nextIter != args.end()) {
424  std::string nextArg = *(nextIter++);
425  if (!hasOptionPrefix(nextArg)) {
426  optValue = nextArg;
427  }
428  }
429  }
430  } // else no assignment operator
431 
432  if (HaveOption(optName)) {
433  if (!optValue.empty()) {
434  setOptionValue(optName, optValue);
435  }
436  setOption(optName, true);
437  } else if (_flags & kErrorOnUnknownArgs) {
438  std::cerr << "Unknown arg: " << optName << std::endl;
439  return false;
440  }
441  } // if hasOptionPrefix
442  } // for each arg
443 
444  if (!(_flags & kNoDefaultHelpOption))
445  if (IsSet("help"))
446  {std::cout << HelpText(); return false;}
447 
448  if (!(_flags & kNoDefaultUsageOption))
449  if (IsSet("usage"))
450  {std::cout << UsageText(); return false;}
451 
452  return true;
453 } // Parse (AJAStringList)
454 
455 bool AJACommandLineParser::Parse(int argc, const char *argv[])
456 {
457  if (argc == 0 || argv == NULL) {
458  return false;
459  }
460  AJAStringList argList;
461  for (int i = 0; i < argc; i++) {
462  argList.push_back(std::string(argv[i]));
463  }
464  return Parse(argList);
465 }
466 
467 bool AJACommandLineParser::Parse(int argc, char *argv[])
468 {
469  if (argc == 0 || argv == NULL) {
470  return false;
471  }
472  AJAStringList argList;
473  for (int i = 0; i < argc; i++) {
474  argList.push_back(std::string(argv[i]));
475  }
476  return Parse(argList);
477 }
478 
479 bool AJACommandLineParser::IsSet(const std::string &name) const
480 {
481  if (!_commandName.empty()) {
482  AJACommandLineParser *sp = _subParsers.at(_commandName);
483  if (sp != NULL) {
484  return sp->IsSet(name);
485  }
486  } else {
488  if (OptionByName(name, opt)) {
489  return opt.IsSet();
490  }
491  }
492  return false;
493 }
494 
495 AJAVariant AJACommandLineParser::Value(const std::string &name, size_t index) const
496 {
497  return AJAVariant(ValueString(name, index));
498 }
499 
500 AJAVariantList AJACommandLineParser::Values(const std::string &name) const
501 {
502  AJAStringList values = ValueStrings(name);
503  if (!values.empty()) {
504  AJAVariantList variants;
505  for (AJAStringListConstIter it = values.begin(); it != values.end(); ++it) {
506  variants.push_back(AJAVariant(*it));
507  }
508  return variants;
509  }
510  return AJAVariantList();
511 }
512 
513 std::string AJACommandLineParser::ValueString(const std::string &name, size_t index) const
514 {
515  std::string val;
516  if (!_commandName.empty()) {
517  AJACommandLineParser *sp = _subParsers.at(_commandName);
518  if (sp != NULL) {
519  return sp->ValueString(name, index);
520  }
521  } else {
523  if (OptionByName(name, opt)) {
524  val = opt.Value(index);
525  if (val.empty()) {
526  val = opt.DefaultValue();
527  }
528  }
529  }
530 
531  return val;
532 }
533 
534 AJAStringList AJACommandLineParser::ValueStrings(const std::string &name) const
535 {
536  if (!_commandName.empty()) {
537  AJACommandLineParser *sp = _subParsers.at(_commandName);
538  if (sp != NULL) {
539  return sp->ValueStrings(name);
540  }
541  } else {
543  if (OptionByName(name, opt)) {
544  return opt.Values();
545  }
546  }
547  return AJAStringList();
548 }
549 
551 {
552  bool exists = false;
553  const AJAStringList &wantNames = option.Names();
554  for (AJACommandLineOptionListIter optIter = _options.begin(); optIter != _options.end(); ++optIter) {
555  const AJAStringList &names = optIter->Names();
556  for (AJAStringListConstIter nameIter = names.begin(); nameIter != names.end(); ++nameIter) {
557  for (AJAStringListConstIter wantIter = wantNames.begin(); wantIter != wantNames.end(); ++wantIter) {
558  if (*wantIter == *nameIter) {
559  exists = true;
560  goto next;
561  }
562  }
563  }
564  }
565 
566 next:
567  if (exists) {
568  return false;
569  } else {
570  _options.push_back(option);
571  return true;
572  }
573 }
574 
576 {
577  size_t okCount = 0;
578  for (size_t i = 0; i < options.size(); i++) {
579  if (AddOption(options.at(i))) {
580  ++okCount;
581  }
582  }
583 // if (_Flags & kAutoProcessUsage)
584 // AddOption(AJACommandLineOption("usage", "Show command usage"));
585 // if (_Flags & (kAutoProcessHelp | kAutoProcessUsage))
586 // AddHelpOption();
587  return options.size() ? (okCount == options.size() ? true : false) : false;
588 }
589 
590 bool AJACommandLineParser::AddHelpOption(bool useShortName)
591 {
592  AJACommandLineOption helpOpt;
593  helpOpt.AddName("?");
594  if (useShortName) {
595  helpOpt.AddName("h");
596  }
597  helpOpt.AddName("help");
598  helpOpt.SetDesc("Print the help text");
599  return AddOption(helpOpt);
600 }
601 
603 {
604  AJACommandLineOption usageOpt;
605  usageOpt.AddName("usage");
606  if (useShortName) {
607  usageOpt.AddName("u");
608  }
609  usageOpt.SetDesc("Print the usage text");
610  return AddOption(usageOpt);
611 }
612 
613 std::string AJACommandLineParser::Name() const
614 {
615  if (!_commandName.empty()) {
616  AJACommandLineParser *sp = _subParsers.at(_commandName);
617  if (sp != NULL) {
618  return sp->Name();
619  }
620  }
621 
622  return _name;
623 }
624 
625 void AJACommandLineParser::SetUsageText(const std::string &usageText)
626 {
627  if (!_commandName.empty()) {
628  AJACommandLineParser *sp = _subParsers.at(_commandName);
629  if (sp != NULL) {
630  sp->SetUsageText(usageText);
631  }
632  } else {
633  _usageText = usageText;
634  }
635 }
636 
638 {
639  if (!_commandName.empty()) {
640  AJACommandLineParser *sp = _subParsers.at(_commandName);
641  if (sp != NULL) {
642  return sp->UsageText();
643  }
644  }
645 
646  std::string usageText;
647  if (!_usageText.empty()) {
648  usageText = _usageText;
649  } else {
650  usageText = generateUsageText();
651  }
652  return usageText;
653 }
654 
655 void AJACommandLineParser::SetHelpText(const std::string &helpText)
656 {
657  if (!_commandName.empty()) {
658  AJACommandLineParser *sp = _subParsers.at(_commandName);
659  if (sp != NULL) {
660  sp->SetHelpText(helpText);
661  }
662  } else {
663  _helpText = helpText;
664  }
665 }
666 
668 {
669  if (!_commandName.empty()) {
670  AJACommandLineParser *sp = _subParsers.at(_commandName);
671  if (sp != NULL) {
672  return sp->HelpText();
673  }
674  }
675 
676  std::string helpText;
677  if (_helpText.empty()) {
678  helpText = generateHelpText();
679  } else {
680  helpText = _helpText;
681  }
682  return helpText;
683 }
684 
685 std::string AJACommandLineParser::generateHelpText() const
686 {
687  std::ostringstream oss;
688  std::string exePath;
690  oss << "Usage: " << exePath;
691  if (!_name.empty()) {
692  oss << " " << _name;
693  }
694  oss << " [OPTION...]" << std::endl;
695 
696  // Get the longest line size first...
697  size_t longestSize = 0;
698  for (AJACommandLineOptionListIter it = _options.begin();
699  it != _options.end(); ++it) {
700  const AJAStringList &names = it->Names();
701  size_t namesLength = 0;
702  for (AJAStringListConstIter sIter = names.begin(); sIter != names.end(); ++sIter) {
703  const std::string &name = *sIter;
704  namesLength += name.length();
705  // add size of dashes
706  if (name.length() == 1) {
707  namesLength++;
708  } else {
709  namesLength += 2;
710  }
711  }
712  // add size of commas/spaces (i.e. ", ")
713  namesLength += ((names.size()*2)-2);
714  if (namesLength > longestSize) {
715  longestSize = namesLength;
716  }
717  }
718 
719  // ...now calculate all of the line padding.
720  for (AJACommandLineOptionListIter it = _options.begin();
721  it != _options.end(); ++it) {
722  oss << std::setw(2) << std::right;
723  const AJAStringList &names = it->Names();
724  size_t nameCount = 0;
725  size_t namesLength = 0;
726  for (AJAStringListConstIter sIter = names.begin(); sIter != names.end(); ++sIter) {
727  const std::string &name = *sIter;
728  namesLength += name.length();
729  if (name.length() == 1) {
730  oss << "-" << name;
731  namesLength++;
732  } else {
733  oss << "--" << name;
734  namesLength += 2;
735  }
736  if (++nameCount < names.size()) {
737  oss << ", ";
738  }
739  }
740  namesLength += ((names.size()*2)-2);
741  oss << std::setw((longestSize-namesLength) + it->Desc().length() + 8);
742  oss << it->Desc() << std::endl;
743  }
744 
745  return oss.str();
746 }
747 
748 std::string AJACommandLineParser::generateUsageText() const
749 {
750  std::ostringstream oss;
751  std::string exePath;
753  oss << "Usage: " << exePath;
754  if (!_name.empty()) {
755  oss << " " << _name;
756  }
757 
758  std::string abbrev;
759  std::ostringstream usages;
760  bool haveHelp = false;
761  bool haveUsage = false;
762  for (const auto &opt : _options) {
763  if (opt.HaveName("?")) {
764  haveHelp = true;
765  } else if (opt.HaveName("usage")) {
766  haveUsage = true;
767  } else {
768  auto names = opt.Names();
769  usages << "\t[";
770  for (size_t ndx = 0; ndx < names.size(); ndx++) {
771  auto name = names.at(ndx);
772  bool isShortName = name.length() == 1;
773  if (isShortName) {
774  abbrev += name;
775  usages << '-' << name;
776  } else {
777  usages << "--" << name;
778  }
779  if (ndx < names.size()-1) {
780  usages << '|';
781  }
782  }
783  usages << ']' << std::endl;
784  }
785  }
786 
787  // Make sure help and usage options appear at the end
788  if (haveHelp) {
789  usages << "\t[" << "-?|--help]" << std::endl;
790  }
791  if (haveUsage) {
792  usages << "\t[" << "--usage]" << std::endl;
793  }
794 
795  if (!abbrev.empty()) {
796  if (haveHelp) {
797  abbrev += '?';
798  }
799  oss << " [-" << abbrev << "]" << std::endl;
800  }
801  oss << usages.str() << std::endl;
802 
803  if (!_subParsers.empty()) {
804  oss << '\n' << "commands: " << std::endl;
805  for (const auto &sp : _subParsers) {
806  if (sp.second) {
807  oss << "\t " << sp.second->Name() << std::endl;
808  }
809  }
810  }
811  return oss.str();
812 }
813 
815 {
816  return _commandName;
817 }
818 
819 bool AJACommandLineParser::hasOptionPrefix(const std::string &name)
820 {
821  return aja::starts_with(name, kSingleDash);
822 }
823 
824 bool AJACommandLineParser::hasAssignmentOperator(const std::string &arg)
825 {
826  size_t assignPos = arg.find_first_of(kAssignChar);
827  return assignPos != std::string::npos;
828 }
829 
830 bool AJACommandLineParser::setOptionValue(const std::string &name, const std::string &value)
831 {
832  if (!value.empty()) {
833  for (size_t i = 0; i < _options.size(); i++) {
834  AJACommandLineOption opt = _options.at(i);
835  const AJAStringList &names = opt.Names();
836  for (AJAStringListConstIter iter = names.begin(); iter != names.end(); ++iter) {
837  if (name == *iter) {
838  _options[i].AddValue(value);
839  return true;
840  }
841  }
842  }
843  }
844  return false;
845 }
846 
847 bool AJACommandLineParser::setOption(const std::string &name, bool isSet)
848 {
849  for (size_t i = 0; i < _options.size(); i++) {
850  AJACommandLineOption opt = _options.at(i);
851  const AJAStringList &names = opt.Names();
852  for (AJAStringListConstIter iter = names.begin(); iter != names.end(); ++iter) {
853  if (name == *iter) {
854  _options[i].MarkSet(isSet);
855  return true;
856  }
857  }
858  }
859  return false;
860 }
std::vector< AJACommandLineOption > AJACommandLineOptionList
Definition: commandline.h:161
void SetHelpText(const std::string &helpText)
void MarkSet(bool isSet=true)
bool HaveOption(const std::string &name) const
SubParserMap::const_iterator SubParserMapConstIter
Definition: commandline.h:166
AJAStringList PositionalArgs() const
bool starts_with(const std::string &str, const std::string &needle)
Definition: common.cpp:61
std::vector< AJAVariant > AJAVariantList
Definition: variant.h:330
AJACommandLineParser(int flags=0)
bool IsSet(const std::string &name) const
std::string UsageText()
std::vector< std::string > AJAStringList
Definition: commandline.h:18
void AddValue(const std::string &value)
#define false
void SetDesc(const std::string &desc)
Definition: commandline.cpp:96
bool AddSubParser(AJACommandLineParser *sp)
bool AddOption(const AJACommandLineOption &option)
std::string HelpText()
std::string Desc() const
Definition: commandline.cpp:91
unsigned int n
Definition: pstream.cpp:148
#define true
void Reset(bool clearAll=false)
bool HavePositionalArg(const std::string &name) const
Declares the AJAFileIO class.
bool Parse(const AJAStringList &args)
A simple Variant class.
Definition: variant.h:39
virtual ~AJACommandLineOption()
Definition: commandline.cpp:55
std::string DefaultValue() const
static const char * kDoubleDash
Definition: commandline.cpp:16
AJAVariantList Values(const std::string &name) const
the parser finished reading a JSON value
std::string CommandName()
AJAStringList Names() const
Definition: commandline.cpp:75
std::pair< std::string, AJACommandLineParser * > AJASubParserPair
Definition: commandline.h:167
Declaration of Command Line classes.
bool AddOptions(const std::vector< AJACommandLineOption > &options)
AJAVariant Value(const std::string &name, size_t index=0) const
bool HaveName(const std::string &name) const
Definition: commandline.cpp:80
AJAStringList::const_iterator AJAStringListConstIter
Definition: commandline.h:19
static const char kSingleDash
Definition: commandline.cpp:15
void SetDefaultValue(const std::string &value)
std::string Name() const
AJAStringList Values() const
bool AddUsageOption(bool useShortName=false)
std::string ValueString(const std::string &name, size_t index=0) const
AJACommandLineOptionList::const_iterator AJACommandLineOptionListIter
Definition: commandline.h:162
Private include file for all ajabase sources.
AJAStringList ValueStrings(const std::string &name) const
bool OptionByName(const std::string &name, AJACommandLineOption &opt) const
static const char kAssignChar
Definition: commandline.cpp:14
std::string ExtraDesc() const
void operator=(const AJACommandLineParser &other)
void SetExtraDesc(const std::string &desc)
static AJAStatus GetExecutablePath(std::string &path)
Definition: file_io.cpp:1361
void SetFlags(int flags)
bool AddHelpOption(bool useShortName=false)
#define NULL
Definition: ntv2vpid.cpp:18
void SetUsageText(const std::string &usageText)
bool AddName(const std::string &name)
Definition: commandline.cpp:59
std::string Value(size_t index=0) const