@@ -297,10 +297,12 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
297297 bool invalid_arg = false ;
298298 std::string arg;
299299 for (int i = 1 ; i < argc; i++) {
300+ bool found_arg = false ;
300301 arg = argv[i];
301302
302303 for (auto & option : options.string_options ) {
303304 if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
305+ found_arg = true ;
304306 if (++i >= argc) {
305307 invalid_arg = true ;
306308 break ;
@@ -314,6 +316,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
314316
315317 for (auto & option : options.int_options ) {
316318 if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
319+ found_arg = true ;
317320 if (++i >= argc) {
318321 invalid_arg = true ;
319322 break ;
@@ -327,6 +330,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
327330
328331 for (auto & option : options.float_options ) {
329332 if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
333+ found_arg = true ;
330334 if (++i >= argc) {
331335 invalid_arg = true ;
332336 break ;
@@ -340,6 +344,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
340344
341345 for (auto & option : options.bool_options ) {
342346 if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
347+ found_arg = true ;
343348 if (option.keep_true ) {
344349 *option.target = true ;
345350 } else {
@@ -353,6 +358,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
353358
354359 for (auto & option : options.manual_options ) {
355360 if ((option.short_name .size () > 0 && arg == option.short_name ) || (option.long_name .size () > 0 && arg == option.long_name )) {
361+ found_arg = true ;
356362 int ret = option.cb (argc, argv, i);
357363 if (ret < 0 ) {
358364 invalid_arg = true ;
@@ -364,6 +370,10 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
364370 if (invalid_arg) {
365371 break ;
366372 }
373+ if (!found_arg) {
374+ fprintf (stderr, " error: unknown argument: %s\n " , arg.c_str ());
375+ return false ;
376+ }
367377 }
368378 if (invalid_arg) {
369379 fprintf (stderr, " error: invalid parameter for argument: %s\n " , arg.c_str ());
0 commit comments