X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmisc%2Fgetopt_long.c;h=6949ab1c7eec09753b49946da4ceeef6b89e3adc;hb=2404d9d643763e6eceafa9a1918925d80a84ad44;hp=c3593716389c984d9200f63704f97b3cfaff876d;hpb=567cc81c7e3f38c3ca9b223f5d771205711b1f5c;p=musl diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c index c3593716..6949ab1c 100644 --- a/src/misc/getopt_long.c +++ b/src/misc/getopt_long.c @@ -1,7 +1,11 @@ #define _GNU_SOURCE #include +#include +#include #include #include +#include +#include "stdio_impl.h" extern int __optpos, __optreset; @@ -31,9 +35,7 @@ static int __getopt_long(int argc, char *const *argv, const char *optstring, con int i; for (i=optind; ; i++) { if (i >= argc || !argv[i]) return -1; - if (argv[i][0] != '-') continue; - if (!argv[i][1]) continue; - break; + if (argv[i][0] == '-' && argv[i][1]) break; } optind = i; } @@ -50,19 +52,22 @@ static int __getopt_long(int argc, char *const *argv, const char *optstring, con static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly) { - + optarg = 0; if (longopts && argv[optind][0] == '-' && - ((longonly && argv[optind][1]) || + ((longonly && argv[optind][1] && argv[optind][1] != '-') || (argv[optind][1] == '-' && argv[optind][2]))) { + int colon = optstring[optstring[0]=='+'||optstring[0]=='-']==':'; int i, cnt, match; - char *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++; - for (; *name && *name == *opt; name++, opt++); + while (*opt && *opt != '=' && *opt == *name) + name++, opt++; if (*opt && *opt != '=') continue; + arg = opt; match = i; if (!*name) { cnt = 1; @@ -70,18 +75,45 @@ 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