diff --git a/VERSION b/VERSION index 28c08d81..b8e843c0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -a12-185-ge22f33a44b+1 \ No newline at end of file +a12-186-gb662128708+1 \ No newline at end of file diff --git a/common/include/common/option.h b/common/include/common/option.h index f6356c58..f001ddcb 100644 --- a/common/include/common/option.h +++ b/common/include/common/option.h @@ -51,7 +51,11 @@ struct Option bool (*validator)(struct Option * opt, const char ** error); char * (*toString )(struct Option * opt); StringList (*getValues)(struct Option * opt); - void (*printHelp)(); + + void (*printHelp)(); + + // internal use only + bool failed_set; }; // register an NULL terminated array of options diff --git a/common/src/option.c b/common/src/option.c index 23dc14c2..07c259cd 100644 --- a/common/src/option.c +++ b/common/src/option.c @@ -220,7 +220,14 @@ void option_free() static bool option_set(struct Option * opt, const char * value) { - return opt->parser(opt, value); + if (!opt->parser(opt, value)) + { + opt->failed_set = true; + return false; + } + + opt->failed_set = false; + return true; } bool option_parse(int argc, char * argv[]) @@ -266,7 +273,6 @@ bool option_parse(int argc, char * argv[]) if (!option_set(o, value)) { - DEBUG_ERROR("Failed to set the option value"); free(arg); continue; } @@ -456,31 +462,35 @@ bool option_validate() { struct Option * o = &state.options[i]; const char * error = NULL; - if (o->validator) - if (!o->validator(o, &error)) + bool invalid = o->failed_set; + + if (!invalid && o->validator) + invalid = !o->validator(o, &error); + + if (invalid) + { + printf("\nInvalid value provided to the option: %s:%s\n", o->module, o->name); + + if (error) + printf("\n Error: %s\n", error); + + if (o->getValues) { - printf("\nInvalid value provided to the option: %s:%s\n", o->module, o->name); - - if (error) - printf("\n Error: %s\n", error); - - if (o->getValues) - { - StringList values = o->getValues(o); - printf("\nValid values are:\n\n"); - for(unsigned int v = 0; v < stringlist_count(values); ++v) - printf(" * %s\n", stringlist_at(values, v)); - stringlist_free(&values); - } - - if (o->printHelp) - { - printf("\n"); - o->printHelp(); - } - - ok = false; + StringList values = o->getValues(o); + printf("\nValid values are:\n\n"); + for(unsigned int v = 0; v < stringlist_count(values); ++v) + printf(" * %s\n", stringlist_at(values, v)); + stringlist_free(&values); } + + if (o->printHelp) + { + printf("\n"); + o->printHelp(); + } + + ok = false; + } } if (!ok)