Pakman
LongOptions.cc
1 #include <stdexcept>
2 
3 #include <getopt.h>
4 
5 #include "LongOptions.h"
6 
7 static const struct option null_long_opt =
8 {
9  nullptr, 0, nullptr, 0,
10 };
11 
12 // Constructor
14 {
15  m_long_opts.push_back(null_long_opt);
16  m_short_opts.push_back('\0');
17 }
18 
19 // Add long option
20 void LongOptions::add(struct option long_opt)
21 {
22  // Check if long option is valid
23  if ( (long_opt.name == nullptr)
24  && (long_opt.has_arg == 0)
25  && (long_opt.flag == nullptr)
26  && (long_opt.val == 0))
27  {
28  std::runtime_error e("cannot add empty struct option");
29  throw e;
30  }
31 
32  // Check for duplicates
33  if (m_long_opts_set.count(long_opt.name) == 1)
34  {
35  std::runtime_error e("duplicate long option name");
36  throw e;
37  }
38 
39  if (m_short_opts_set.count(long_opt.val) == 1)
40  {
41  std::runtime_error e("duplicate short option name");
42  throw e;
43  }
44 
45  // Insert long and short option into sets
46  m_long_opts_set.insert(long_opt.name);
47  m_short_opts_set.insert(long_opt.val);
48 
49  // Insert into map
50  m_short_to_long_map[long_opt.val] = long_opt.name;
51 
52  // Insert long option into struct option vector
53  m_long_opts.pop_back();
54  m_long_opts.push_back(long_opt);
55  m_long_opts.push_back(null_long_opt);
56 
57  // Insert short option into char vector
58  m_short_opts.pop_back();
59  m_short_opts.push_back(long_opt.val);
60  if (long_opt.has_arg == required_argument)
61  m_short_opts.push_back(':');
62  else if (long_opt.has_arg == optional_argument)
63  {
64  m_short_opts.push_back(':');
65  m_short_opts.push_back(':');
66  }
67  m_short_opts.push_back('\0');
68 }
69 
70 // Return longopts
71 const struct option* LongOptions::getLongOpts() const
72 {
73  return m_long_opts.data();
74 }
75 
76 // Return optstring
77 const char* LongOptions::getShortOpts() const
78 {
79  return m_short_opts.data();
80 }
81 
82 std::string LongOptions::getLongOptionName(char short_option) const
83 {
84  return m_short_to_long_map.at(short_option);
85 }
std::string getLongOptionName(char short_option) const
Definition: LongOptions.cc:82
const char * getShortOpts() const
Definition: LongOptions.cc:77
void add(struct option long_opt)
Definition: LongOptions.cc:20
const struct option * getLongOpts() const
Definition: LongOptions.cc:71