X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmisc%2Fgetopt_long.c;h=568ae7ba9dac991eda343bcd2ab2e30371309dff;hb=bd00cc87819875882356298b6c6bdabc1700753f;hp=6d3a4a6e644e5dc4ba3156ba3a7ce4a0c006c9cb;hpb=b9bb8f67bbac9bab5314fb00974ad469476e936e;p=musl diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c index 6d3a4a6e..568ae7ba 100644 --- a/src/misc/getopt_long.c +++ b/src/misc/getopt_long.c @@ -2,30 +2,104 @@ #include #include #include +#include + +extern int __optpos, __optreset; + +static void permute(char *const *argv, int dest, int src) +{ + char **av = (char **)argv; + char *tmp = av[src]; + int i; + for (i=src; i>dest; i--) + av[i] = av[i-1]; + 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) { - if (optind >= argc || !argv[optind] || argv[optind][0] != '-') return -1; - if ((longonly && argv[optind][1]) || - (argv[optind][1] == '-' && argv[optind][2])) - { + int ret, skipped, resumed; + if (!optind || __optreset) { + __optreset = 0; + __optpos = 0; + optind = 1; + } + if (optind >= argc || !argv[optind]) return -1; + skipped = optind; + if (optstring[0] != '+' && optstring[0] != '-') { int i; - for (i=0; longopts[i].name; i++) { + for (i=optind; ; i++) { + if (i >= argc || !argv[i]) return -1; + if (argv[i][0] == '-' && argv[i][1]) break; + } + optind = i; + } + resumed = optind; + ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly); + if (resumed > skipped) { + int i, cnt = optind-resumed; + for (i=0; i