cprover
cmdline.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #include "cmdline.h"
10 
11 #include <cassert>
12 #include <cstdlib>
13 #include <iostream>
14 
16 {
17 }
18 
20 {
21  clear();
22 }
23 
25 {
26  options.clear();
27  args.clear();
28 }
29 
30 bool cmdlinet::isset(char option) const
31 {
32  int i=getoptnr(option);
33  if(i<0)
34  return false;
35  return options[i].isset;
36 }
37 
38 bool cmdlinet::isset(const char *option) const
39 {
40  int i=getoptnr(option);
41  if(i<0)
42  return false;
43  return options[i].isset;
44 }
45 
46 std::string cmdlinet::get_value(char option) const
47 {
48  int i=getoptnr(option);
49  if(i<0)
50  return "";
51  if(options[i].values.empty())
52  return "";
53  return options[i].values.front();
54 }
55 
56 void cmdlinet::set(const std::string &option)
57 {
58  int i=getoptnr(option);
59  if(i<0)
60  return; // ignore
61  options[i].isset=true;
62 }
63 
64 void cmdlinet::set(const std::string &option, const std::string &value)
65 {
66  int i=getoptnr(option);
67  if(i<0)
68  return; // ignore
69  options[i].isset=true;
70  options[i].values.push_back(value);
71 }
72 
73 const std::list<std::string> &cmdlinet::get_values(char option) const
74 {
75  int i=getoptnr(option);
76  assert(i>=0);
77  return options[i].values;
78 }
79 
80 std::string cmdlinet::get_value(const char *option) const
81 {
82  int i=getoptnr(option);
83  if(i<0)
84  return "";
85  if(options[i].values.empty())
86  return "";
87  return options[i].values.front();
88 }
89 
90 const std::list<std::string> &cmdlinet::get_values(
91  const std::string &option) const
92 {
93  int i=getoptnr(option);
94  assert(i>=0);
95  return options[i].values;
96 }
97 
98 int cmdlinet::getoptnr(char option) const
99 {
100  for(unsigned i=0; i<options.size(); i++)
101  if(options[i].optchar==option)
102  return i;
103 
104  return -1;
105 }
106 
107 int cmdlinet::getoptnr(const std::string &option) const
108 {
109  for(unsigned i=0; i<options.size(); i++)
110  if(options[i].optstring==option)
111  return i;
112 
113  return -1;
114 }
115 
116 bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
117 {
118  clear();
119 
120  while(optstring[0]!=0)
121  {
122  optiont option;
123 
124  if(optstring[0]==':')
125  {
126  std::cerr << "cmdlinet::parse: Invalid option string\n";
127  abort();
128  }
129 
130  if(optstring[0]=='(')
131  {
132  option.islong=true;
133  option.optchar=0;
134  option.isset=false;
135  option.optstring="";
136 
137  for(optstring++; optstring[0]!=')' && optstring[0]!=0; optstring++)
138  option.optstring+=optstring[0];
139 
140  if(optstring[0]==')')
141  optstring++;
142  }
143  else
144  {
145  option.islong=false;
146  option.optchar=optstring[0];
147  option.optstring="";
148  option.isset=false;
149 
150  optstring++;
151  }
152 
153  if(optstring[0]==':')
154  {
155  option.hasval=true;
156  optstring++;
157  }
158  else
159  option.hasval=false;
160 
161  options.push_back(option);
162  }
163 
164  for(int i=1; i<argc; i++)
165  {
166  if(argv[i][0]!='-')
167  args.push_back(argv[i]);
168  else
169  {
170  int optnr;
171 
172  if(argv[i][1]!=0 && argv[i][2]==0)
173  optnr=getoptnr(argv[i][1]); // single-letter option -X
174  else if(argv[i][1]=='-')
175  optnr=getoptnr(argv[i]+2); // multi-letter option with --XXX
176  else
177  {
178  // Multi-letter option -XXX, or single-letter with argument -Xval
179  // We first try single-letter.
180  optnr=getoptnr(argv[i][1]);
181 
182  if(optnr<0) // try multi-letter
183  optnr=getoptnr(argv[i]+1);
184  }
185 
186  if(optnr<0)
187  return true;
188  options[optnr].isset=true;
189  if(options[optnr].hasval)
190  {
191  if(argv[i][2]==0 || options[optnr].islong)
192  {
193  i++;
194  if(i==argc)
195  return true;
196  if(argv[i][0]=='-' && argv[i][1]!=0)
197  return true;
198  options[optnr].values.push_back(argv[i]);
199  }
200  else
201  options[optnr].values.push_back(argv[i]+2);
202  }
203  }
204  }
205 
206  return false;
207 }
virtual ~cmdlinet()
Definition: cmdline.cpp:19
const std::list< std::string > & get_values(const std::string &option) const
Definition: cmdline.cpp:90
cmdlinet()
Definition: cmdline.cpp:15
std::string get_value(char option) const
Definition: cmdline.cpp:46
virtual bool parse(int argc, const char **argv, const char *optstring)
Definition: cmdline.cpp:116
argst args
Definition: cmdline.h:35
virtual bool isset(char option) const
Definition: cmdline.cpp:30
virtual void set(const std::string &option)
Definition: cmdline.cpp:56
virtual void clear()
Definition: cmdline.cpp:24
int getoptnr(char option) const
Definition: cmdline.cpp:98
std::vector< optiont > options
Definition: cmdline.h:58
std::string optstring
Definition: cmdline.h:47