7 extern int __optpos
, __optreset
;
9 static void permute(char *const *argv
, int dest
, int src
)
11 char **av
= (char **)argv
;
14 for (i
=src
; i
>dest
; i
--)
19 void __getopt_msg(const char *, const char *, const char *, size_t);
21 static int __getopt_long_core(int argc
, char *const *argv
, const char *optstring
, const struct option
*longopts
, int *idx
, int longonly
);
23 static int __getopt_long(int argc
, char *const *argv
, const char *optstring
, const struct option
*longopts
, int *idx
, int longonly
)
25 int ret
, skipped
, resumed
;
26 if (!optind
|| __optreset
) {
31 if (optind
>= argc
|| !argv
[optind
]) return -1;
33 if (optstring
[0] != '+' && optstring
[0] != '-') {
35 for (i
=optind
; ; i
++) {
36 if (i
>= argc
|| !argv
[i
]) return -1;
37 if (argv
[i
][0] == '-' && argv
[i
][1]) break;
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] && argv
[optind
][1] != '-') ||
57 (argv
[optind
][1] == '-' && argv
[optind
][2])))
59 int colon
= optstring
[optstring
[0]=='+'||optstring
[0]=='-']==':';
62 for (cnt
=i
=0; longopts
[i
].name
; i
++) {
63 const char *name
= longopts
[i
].name
;
65 if (*opt
== '-') opt
++;
66 for (; *name
&& *name
== *opt
; name
++, opt
++);
67 if (*opt
&& *opt
!= '=') continue;
79 if (!longopts
[i
].has_arg
) {
80 optopt
= longopts
[i
].val
;
84 ": option does not take an argument: ",
86 strlen(longopts
[i
].name
));
90 } else if (longopts
[i
].has_arg
== required_argument
) {
91 if (!(optarg
= argv
[optind
])) {
92 optopt
= longopts
[i
].val
;
93 if (colon
) return ':';
94 if (!opterr
) return '?';
96 ": option requires an argument: ",
98 strlen(longopts
[i
].name
));
104 if (longopts
[i
].flag
) {
105 *longopts
[i
].flag
= longopts
[i
].val
;
108 return longopts
[i
].val
;
110 if (argv
[optind
][1] == '-') {
112 if (!colon
&& opterr
)
113 __getopt_msg(argv
[0], cnt
?
114 ": option is ambiguous: " :
115 ": unrecognized option: ",
117 strlen(argv
[optind
]+2));
122 return getopt(argc
, argv
, optstring
);
125 int getopt_long(int argc
, char *const *argv
, const char *optstring
, const struct option
*longopts
, int *idx
)
127 return __getopt_long(argc
, argv
, optstring
, longopts
, idx
, 0);
130 int getopt_long_only(int argc
, char *const *argv
, const char *optstring
, const struct option
*longopts
, int *idx
)
132 return __getopt_long(argc
, argv
, optstring
, longopts
, idx
, 1);