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;
36 if (argv[i][1] == '-' && !argv[i][2]) return -1;
42 ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly);
43 if (resumed > skipped) {
44 int i, cnt = optind-resumed;
46 permute(argv, skipped, optind-1);
47 optind = skipped + cnt;
52 static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
55 if (longopts && argv[optind][0] == '-' &&
56 ((longonly && argv[optind][1]) ||
57 (argv[optind][1] == '-' && argv[optind][2])))
61 for (cnt=i=0; longopts[i].name; i++) {
62 const char *name = longopts[i].name;
64 if (*opt == '-') opt++;
65 for (; *name && *name == *opt; name++, opt++);
66 if (*opt && *opt != '=') continue;
78 if (!longopts[i].has_arg) return '?';
81 if (longopts[i].has_arg == required_argument) {
82 if (!(optarg = argv[optind]))
88 if (longopts[i].flag) {
89 *longopts[i].flag = longopts[i].val;
92 return longopts[i].val;
94 if (argv[optind][1] == '-') {
99 return getopt(argc, argv, optstring);
102 int getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
104 return __getopt_long(argc, argv, optstring, longopts, idx, 0);
107 int getopt_long_only(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
109 return __getopt_long(argc, argv, optstring, longopts, idx, 1);