@@ -297,10 +297,12 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
297
297
bool invalid_arg = false ;
298
298
std::string arg;
299
299
for (int i = 1 ; i < argc; i++) {
300
+ bool found_arg = false ;
300
301
arg = argv[i];
301
302
302
303
for (auto & option : options.string_options ) {
303
304
if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
305
+ found_arg = true ;
304
306
if (++i >= argc) {
305
307
invalid_arg = true ;
306
308
break ;
@@ -314,6 +316,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
314
316
315
317
for (auto & option : options.int_options ) {
316
318
if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
319
+ found_arg = true ;
317
320
if (++i >= argc) {
318
321
invalid_arg = true ;
319
322
break ;
@@ -327,6 +330,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
327
330
328
331
for (auto & option : options.float_options ) {
329
332
if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
333
+ found_arg = true ;
330
334
if (++i >= argc) {
331
335
invalid_arg = true ;
332
336
break ;
@@ -340,6 +344,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
340
344
341
345
for (auto & option : options.bool_options ) {
342
346
if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
347
+ found_arg = true ;
343
348
if (option.keep_true ) {
344
349
*option.target = true ;
345
350
} else {
@@ -353,6 +358,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
353
358
354
359
for (auto & option : options.manual_options ) {
355
360
if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
361
+ found_arg = true ;
356
362
int ret = option.cb (argc, argv, i);
357
363
if (ret < 0 ) {
358
364
invalid_arg = true ;
@@ -364,6 +370,10 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
364
370
if (invalid_arg) {
365
371
break ;
366
372
}
373
+ if (!found_arg) {
374
+ fprintf (stderr, " error: unknown argument: %s\n " , arg.c_str ());
375
+ return false ;
376
+ }
367
377
}
368
378
if (invalid_arg) {
369
379
fprintf (stderr, " error: invalid parameter for argument: %s\n " , arg.c_str ());
0 commit comments