Skip to content

Commit ca018f7

Browse files
hannes-steffenhagen-diffblueHannes Steffenhagen
authored and
Hannes Steffenhagen
committed
Move argument parsing into its own function
1 parent 6321bbc commit ca018f7

File tree

2 files changed

+53
-49
lines changed

2 files changed

+53
-49
lines changed

src/util/cmdline.cpp

Lines changed: 52 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -156,55 +156,7 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
156156
clear();
157157

158158
parse_optstring(optstring);
159-
160-
for(int i=1; i<argc; i++)
161-
{
162-
if(argv[i][0]!='-')
163-
args.push_back(argv[i]);
164-
else
165-
{
166-
optionalt<std::size_t> optnr;
167-
168-
if(argv[i][1]!=0 && argv[i][2]==0)
169-
optnr=getoptnr(argv[i][1]); // single-letter option -X
170-
else if(argv[i][1]=='-')
171-
optnr=getoptnr(argv[i]+2); // multi-letter option with --XXX
172-
else
173-
{
174-
// Multi-letter option -XXX, or single-letter with argument -Xval
175-
// We first try single-letter.
176-
optnr=getoptnr(argv[i][1]);
177-
178-
if(!optnr.has_value()) // try multi-letter
179-
optnr=getoptnr(argv[i]+1);
180-
}
181-
182-
if(!optnr.has_value())
183-
{
184-
unknown_arg=argv[i];
185-
return true;
186-
}
187-
188-
options[*optnr].isset=true;
189-
190-
if(options[*optnr].hasval)
191-
{
192-
if(argv[i][2]==0 || options[*optnr].islong)
193-
{
194-
i++;
195-
if(i==argc)
196-
return true;
197-
if(argv[i][0]=='-' && argv[i][1]!=0)
198-
return true;
199-
options[*optnr].values.push_back(argv[i]);
200-
}
201-
else
202-
options[*optnr].values.push_back(argv[i]+2);
203-
}
204-
}
205-
}
206-
207-
return false;
159+
return parse_arguments(argc, argv);
208160
}
209161

210162
cmdlinet::option_namest cmdlinet::option_names() const
@@ -315,6 +267,57 @@ cmdlinet::get_argument_suggestions(const std::string &unknown_argument)
315267
return final_suggestions;
316268
}
317269

270+
bool cmdlinet::parse_arguments(int argc, const char **argv)
271+
{
272+
for(int i = 1; i < argc; i++)
273+
{
274+
if(argv[i][0] != '-')
275+
args.push_back(argv[i]);
276+
else
277+
{
278+
optionalt<std::size_t> optnr;
279+
280+
if(argv[i][1] != 0 && argv[i][2] == 0)
281+
optnr = getoptnr(argv[i][1]); // single-letter option -X
282+
else if(argv[i][1] == '-')
283+
optnr = getoptnr(argv[i] + 2); // multi-letter option with --XXX
284+
else
285+
{
286+
// Multi-letter option -XXX, or single-letter with argument -Xval
287+
// We first try single-letter.
288+
optnr = getoptnr(argv[i][1]);
289+
290+
if(!optnr.has_value()) // try multi-letter
291+
optnr = getoptnr(argv[i] + 1);
292+
}
293+
294+
if(!optnr.has_value())
295+
{
296+
unknown_arg = argv[i];
297+
return true;
298+
}
299+
300+
options[*optnr].isset = true;
301+
302+
if(options[*optnr].hasval)
303+
{
304+
if(argv[i][2] == 0 || options[*optnr].islong)
305+
{
306+
i++;
307+
if(i == argc)
308+
return true;
309+
if(argv[i][0] == '-' && argv[i][1] != 0)
310+
return true;
311+
options[*optnr].values.push_back(argv[i]);
312+
}
313+
else
314+
options[*optnr].values.push_back(argv[i] + 2);
315+
}
316+
}
317+
}
318+
return false;
319+
}
320+
318321
cmdlinet::option_namest::option_names_iteratort::option_names_iteratort(
319322
const cmdlinet *command_line,
320323
std::size_t index)

src/util/cmdline.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ class cmdlinet
116116
};
117117

118118
void parse_optstring(const char *optstring);
119+
bool parse_arguments(int argc, const char **argv);
119120

120121
std::vector<optiont> options;
121122

0 commit comments

Comments
 (0)