diff options
-rw-r--r-- | src/misc/getoptdata.cpp | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/src/misc/getoptdata.cpp b/src/misc/getoptdata.cpp index 818e90c17..6ca9a1bfc 100644 --- a/src/misc/getoptdata.cpp +++ b/src/misc/getoptdata.cpp @@ -56,30 +56,23 @@ set_optval: // Handle option value of *odata . return odata->id; case ODF_HAS_VALUE: + case ODF_OPTIONAL_VALUE: if (this->cont != NULL) { // Remainder of the argument is the option value. this->opt = this->cont; this->cont = NULL; return odata->id; } - if (this->numleft == 0) return -2; // Missing the option value. - this->opt = this->argv[0]; + /* No more arguments, either return an error or a value-less option. */ + if (this->numleft == 0) return (odata->flags == ODF_HAS_VALUE) ? -2 : odata->id; + + /* Next argument looks like another option, let's not return it as option value. */ + if (odata->flags == ODF_OPTIONAL_VALUE && this->argv[0][0] == '-') return odata->id; + + this->opt = this->argv[0]; // Next argument is the option value. this->argv++; this->numleft--; return odata->id; - case ODF_OPTIONAL_VALUE: - if (this->cont != NULL) { // Remainder of the argument is the option value. - this->opt = this->cont; - this->cont = NULL; - return odata->id; - } - if (this->numleft > 0 && this->argv[0][0] != '-') { - this->opt = this->argv[0]; - this->argv++; - this->numleft--; - } - return odata->id; - default: NOT_REACHED(); } } |