X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmisc%2Fgetopt_long.c;h=480c00139e08682fd15d5798d871be4c85111b76;hb=43e9f652bf4b2195b04fc14c93db591b30a7b790;hp=c3593716389c984d9200f63704f97b3cfaff876d;hpb=567cc81c7e3f38c3ca9b223f5d771205711b1f5c;p=musl diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c index c3593716..480c0013 100644 --- a/src/misc/getopt_long.c +++ b/src/misc/getopt_long.c @@ -2,6 +2,7 @@ #include #include #include +#include extern int __optpos, __optreset; @@ -15,6 +16,8 @@ static void permute(char *const *argv, int dest, int src) av[dest] = tmp; } +void __getopt_msg(const char *, const char *, const char *, size_t); + static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly); static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly) @@ -31,9 +34,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,11 +51,12 @@ 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]) || (argv[optind][1] == '-' && argv[optind][2]))) { + int colon = optstring[optstring[0]=='+'||optstring[0]=='-']==':'; int i, cnt, match; char *opt; for (cnt=i=0; longopts[i].name; i++) { @@ -73,15 +75,29 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring if (cnt==1) { i = match; optind++; + optopt = longopts[i].val; if (*opt == '=') { - if (!longopts[i].has_arg) return '?'; + if (!longopts[i].has_arg) { + if (colon || !opterr) + return '?'; + __getopt_msg(argv[0], + ": option does not take an argument: ", + longopts[i].name, + strlen(longopts[i].name)); + return '?'; + } optarg = opt+1; - } else { - if (longopts[i].has_arg == required_argument) { - if (!(optarg = argv[optind])) - return ':'; - optind++; - } else optarg = NULL; + } else if (longopts[i].has_arg == required_argument) { + if (!(optarg = argv[optind])) { + if (colon) return ':'; + if (!opterr) return '?'; + __getopt_msg(argv[0], + ": option requires an argument: ", + longopts[i].name, + strlen(longopts[i].name)); + return '?'; + } + optind++; } if (idx) *idx = i; if (longopts[i].flag) { @@ -91,6 +107,12 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring return longopts[i].val; } if (argv[optind][1] == '-') { + if (!colon && opterr) + __getopt_msg(argv[0], cnt ? + ": option is ambiguous: " : + ": unrecognized option: ", + argv[optind]+2, + strlen(argv[optind]+2)); optind++; return '?'; }