diff options
-rw-r--r-- | src/misc/getopt_long.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c index 008b747c..ddcef949 100644 --- a/src/misc/getopt_long.c +++ b/src/misc/getopt_long.c @@ -1,5 +1,7 @@ #define _GNU_SOURCE #include <stddef.h> +#include <stdlib.h> +#include <limits.h> #include <getopt.h> #include <stdio.h> #include <string.h> @@ -58,10 +60,10 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring { int colon = optstring[optstring[0]=='+'||optstring[0]=='-']==':'; int i, cnt, match; - char *arg, *opt; + char *arg, *opt, *start = argv[optind]+1; for (cnt=i=0; longopts[i].name; i++) { const char *name = longopts[i].name; - opt = argv[optind]+1; + opt = start; if (*opt == '-') opt++; while (*opt && *opt != '=' && *opt == *name) name++, opt++; @@ -74,6 +76,17 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring } cnt++; } + if (cnt==1 && longonly && arg-start == mblen(start, MB_LEN_MAX)) { + int l = arg-start; + for (i=0; optstring[i]; i++) { + int j; + for (j=0; j<l && start[j]==optstring[i+j]; j++); + if (j==l) { + cnt++; + break; + } + } + } if (cnt==1) { i = match; opt = arg; |