6 extern int __optpos, __optreset;
8 static void permute(char *const *argv, int dest, int src)
10 char **av = (char **)argv;
13 for (i=src; i>dest; i--)
18 static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly);
20 static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
22 int ret, skipped, resumed;
23 if (!optind || __optreset) {
28 if (optind >= argc || !argv[optind]) return -1;
30 if (optstring[0] != '+' && optstring[0] != '-') {
32 for (i=optind; ; i++) {
33 if (i >= argc || !argv[i]) return -1;
34 if (argv[i][0] == '-' && argv[i][1]) break;
39 ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly);
40 if (resumed > skipped) {
41 int i, cnt = optind-resumed;
43 permute(argv, skipped, optind-1);
44 optind = skipped + cnt;
49 static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
52 if (longopts && argv[optind][0] == '-' &&
53 ((longonly && argv[optind][1]) ||
54 (argv[optind][1] == '-' && argv[optind][2])))
58 for (cnt=i=0; longopts[i].name; i++) {
59 const char *name = longopts[i].name;
61 if (*opt == '-') opt++;
62 for (; *name && *name == *opt; name++, opt++);
63 if (*opt && *opt != '=') continue;
75 if (!longopts[i].has_arg) return '?';
78 if (longopts[i].has_arg == required_argument) {
79 if (!(optarg = argv[optind]))
85 if (longopts[i].flag) {
86 *longopts[i].flag = longopts[i].val;
89 return longopts[i].val;
91 if (argv[optind][1] == '-') {
96 return getopt(argc, argv, optstring);
99 int getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
101 return __getopt_long(argc, argv, optstring, longopts, idx, 0);
104 int getopt_long_only(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
106 return __getopt_long(argc, argv, optstring, longopts, idx, 1);