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] != '-') continue;
35 if (!argv[i][1]) continue;
41 ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly);
42 if (resumed > skipped) {
43 int i, cnt = optind-resumed;
45 permute(argv, skipped, optind-1);
46 optind = skipped + cnt;
51 static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
54 if (longopts && argv[optind][0] == '-' &&
55 ((longonly && argv[optind][1]) ||
56 (argv[optind][1] == '-' && argv[optind][2])))
60 for (cnt=i=0; longopts[i].name; i++) {
61 const char *name = longopts[i].name;
63 if (*opt == '-') opt++;
64 for (; *name && *name == *opt; name++, opt++);
65 if (*opt && *opt != '=') continue;
77 if (!longopts[i].has_arg) return '?';
80 if (longopts[i].has_arg == required_argument) {
81 if (!(optarg = argv[optind]))
87 if (longopts[i].flag) {
88 *longopts[i].flag = longopts[i].val;
91 return longopts[i].val;
93 if (argv[optind][1] == '-') {
98 return getopt(argc, argv, optstring);
101 int getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
103 return __getopt_long(argc, argv, optstring, longopts, idx, 0);
106 int getopt_long_only(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
108 return __getopt_long(argc, argv, optstring, longopts, idx, 1);