1*c2e0c6b5SAndroid Build Coastguard Worker /* Getopt for GNU.
2*c2e0c6b5SAndroid Build Coastguard Worker NOTE: getopt is now part of the C library, so if you don't know what
3*c2e0c6b5SAndroid Build Coastguard Worker "Keep this file name-space clean" means, talk to [email protected]
4*c2e0c6b5SAndroid Build Coastguard Worker before changing it!
5*c2e0c6b5SAndroid Build Coastguard Worker
6*c2e0c6b5SAndroid Build Coastguard Worker Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
7*c2e0c6b5SAndroid Build Coastguard Worker Free Software Foundation, Inc.
8*c2e0c6b5SAndroid Build Coastguard Worker
9*c2e0c6b5SAndroid Build Coastguard Worker This program is free software; you can redistribute it and/or modify it
10*c2e0c6b5SAndroid Build Coastguard Worker under the terms of the GNU General Public License as published by the
11*c2e0c6b5SAndroid Build Coastguard Worker Free Software Foundation; either version 2, or (at your option) any
12*c2e0c6b5SAndroid Build Coastguard Worker later version.
13*c2e0c6b5SAndroid Build Coastguard Worker
14*c2e0c6b5SAndroid Build Coastguard Worker This program is distributed in the hope that it will be useful,
15*c2e0c6b5SAndroid Build Coastguard Worker but WITHOUT ANY WARRANTY; without even the implied warranty of
16*c2e0c6b5SAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17*c2e0c6b5SAndroid Build Coastguard Worker GNU General Public License for more details.
18*c2e0c6b5SAndroid Build Coastguard Worker
19*c2e0c6b5SAndroid Build Coastguard Worker You should have received a copy of the GNU General Public License
20*c2e0c6b5SAndroid Build Coastguard Worker along with this program; if not, write to the Free Software
21*c2e0c6b5SAndroid Build Coastguard Worker Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22*c2e0c6b5SAndroid Build Coastguard Worker
23*c2e0c6b5SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
24*c2e0c6b5SAndroid Build Coastguard Worker #include "config.h"
25*c2e0c6b5SAndroid Build Coastguard Worker #endif
26*c2e0c6b5SAndroid Build Coastguard Worker
27*c2e0c6b5SAndroid Build Coastguard Worker #ifndef __STDC__
28*c2e0c6b5SAndroid Build Coastguard Worker # ifndef const
29*c2e0c6b5SAndroid Build Coastguard Worker # define const
30*c2e0c6b5SAndroid Build Coastguard Worker # endif
31*c2e0c6b5SAndroid Build Coastguard Worker #endif
32*c2e0c6b5SAndroid Build Coastguard Worker
33*c2e0c6b5SAndroid Build Coastguard Worker /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
34*c2e0c6b5SAndroid Build Coastguard Worker #ifndef _NO_PROTO
35*c2e0c6b5SAndroid Build Coastguard Worker #define _NO_PROTO
36*c2e0c6b5SAndroid Build Coastguard Worker #endif
37*c2e0c6b5SAndroid Build Coastguard Worker
38*c2e0c6b5SAndroid Build Coastguard Worker #include <stdio.h>
39*c2e0c6b5SAndroid Build Coastguard Worker
40*c2e0c6b5SAndroid Build Coastguard Worker /* Comment out all this code if we are using the GNU C Library, and are not
41*c2e0c6b5SAndroid Build Coastguard Worker actually compiling the library itself. This code is part of the GNU C
42*c2e0c6b5SAndroid Build Coastguard Worker Library, but also included in many other GNU distributions. Compiling
43*c2e0c6b5SAndroid Build Coastguard Worker and linking in this code is a waste when using the GNU C library
44*c2e0c6b5SAndroid Build Coastguard Worker (especially if it is a shared library). Rather than having every GNU
45*c2e0c6b5SAndroid Build Coastguard Worker program understand `configure --with-gnu-libc' and omit the object files,
46*c2e0c6b5SAndroid Build Coastguard Worker it is simpler to just do this in the source for each such file. */
47*c2e0c6b5SAndroid Build Coastguard Worker
48*c2e0c6b5SAndroid Build Coastguard Worker #if defined (_LIBC) || !defined (__GNU_LIBRARY__)
49*c2e0c6b5SAndroid Build Coastguard Worker
50*c2e0c6b5SAndroid Build Coastguard Worker
51*c2e0c6b5SAndroid Build Coastguard Worker /* This needs to come after some library #include
52*c2e0c6b5SAndroid Build Coastguard Worker to get __GNU_LIBRARY__ defined. */
53*c2e0c6b5SAndroid Build Coastguard Worker #ifdef __GNU_LIBRARY__
54*c2e0c6b5SAndroid Build Coastguard Worker /* Don't include stdlib.h for non-GNU C libraries because some of them
55*c2e0c6b5SAndroid Build Coastguard Worker contain conflicting prototypes for getopt. */
56*c2e0c6b5SAndroid Build Coastguard Worker #include <stdlib.h>
57*c2e0c6b5SAndroid Build Coastguard Worker #endif /* GNU C library. */
58*c2e0c6b5SAndroid Build Coastguard Worker
59*c2e0c6b5SAndroid Build Coastguard Worker /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
60*c2e0c6b5SAndroid Build Coastguard Worker long-named option. Because this is not POSIX.2 compliant, it is
61*c2e0c6b5SAndroid Build Coastguard Worker being phased out. */
62*c2e0c6b5SAndroid Build Coastguard Worker /* #define GETOPT_COMPAT */
63*c2e0c6b5SAndroid Build Coastguard Worker
64*c2e0c6b5SAndroid Build Coastguard Worker /* This version of `getopt' appears to the caller like standard Unix `getopt'
65*c2e0c6b5SAndroid Build Coastguard Worker but it behaves differently for the user, since it allows the user
66*c2e0c6b5SAndroid Build Coastguard Worker to intersperse the options with the other arguments.
67*c2e0c6b5SAndroid Build Coastguard Worker
68*c2e0c6b5SAndroid Build Coastguard Worker As `getopt' works, it permutes the elements of ARGV so that,
69*c2e0c6b5SAndroid Build Coastguard Worker when it is done, all the options precede everything else. Thus
70*c2e0c6b5SAndroid Build Coastguard Worker all application programs are extended to handle flexible argument order.
71*c2e0c6b5SAndroid Build Coastguard Worker
72*c2e0c6b5SAndroid Build Coastguard Worker Setting the environment variable POSIXLY_CORRECT disables permutation.
73*c2e0c6b5SAndroid Build Coastguard Worker Then the behavior is completely standard.
74*c2e0c6b5SAndroid Build Coastguard Worker
75*c2e0c6b5SAndroid Build Coastguard Worker GNU application programs can use a third alternative mode in which
76*c2e0c6b5SAndroid Build Coastguard Worker they can distinguish the relative order of options and other arguments. */
77*c2e0c6b5SAndroid Build Coastguard Worker
78*c2e0c6b5SAndroid Build Coastguard Worker #include "getopt.h"
79*c2e0c6b5SAndroid Build Coastguard Worker
80*c2e0c6b5SAndroid Build Coastguard Worker /* For communication from `getopt' to the caller.
81*c2e0c6b5SAndroid Build Coastguard Worker When `getopt' finds an option that takes an argument,
82*c2e0c6b5SAndroid Build Coastguard Worker the argument value is returned here.
83*c2e0c6b5SAndroid Build Coastguard Worker Also, when `ordering' is RETURN_IN_ORDER,
84*c2e0c6b5SAndroid Build Coastguard Worker each non-option ARGV-element is returned here. */
85*c2e0c6b5SAndroid Build Coastguard Worker
86*c2e0c6b5SAndroid Build Coastguard Worker char *optarg = 0;
87*c2e0c6b5SAndroid Build Coastguard Worker
88*c2e0c6b5SAndroid Build Coastguard Worker /* Index in ARGV of the next element to be scanned.
89*c2e0c6b5SAndroid Build Coastguard Worker This is used for communication to and from the caller
90*c2e0c6b5SAndroid Build Coastguard Worker and for communication between successive calls to `getopt'.
91*c2e0c6b5SAndroid Build Coastguard Worker
92*c2e0c6b5SAndroid Build Coastguard Worker On entry to `getopt', zero means this is the first call; initialize.
93*c2e0c6b5SAndroid Build Coastguard Worker
94*c2e0c6b5SAndroid Build Coastguard Worker When `getopt' returns EOF, this is the index of the first of the
95*c2e0c6b5SAndroid Build Coastguard Worker non-option elements that the caller should itself scan.
96*c2e0c6b5SAndroid Build Coastguard Worker
97*c2e0c6b5SAndroid Build Coastguard Worker Otherwise, `optind' communicates from one call to the next
98*c2e0c6b5SAndroid Build Coastguard Worker how much of ARGV has been scanned so far. */
99*c2e0c6b5SAndroid Build Coastguard Worker
100*c2e0c6b5SAndroid Build Coastguard Worker /* XXX 1003.2 says this must be 1 before any call. */
101*c2e0c6b5SAndroid Build Coastguard Worker int optind = 0;
102*c2e0c6b5SAndroid Build Coastguard Worker
103*c2e0c6b5SAndroid Build Coastguard Worker /* The next char to be scanned in the option-element
104*c2e0c6b5SAndroid Build Coastguard Worker in which the last option character we returned was found.
105*c2e0c6b5SAndroid Build Coastguard Worker This allows us to pick up the scan where we left off.
106*c2e0c6b5SAndroid Build Coastguard Worker
107*c2e0c6b5SAndroid Build Coastguard Worker If this is zero, or a null string, it means resume the scan
108*c2e0c6b5SAndroid Build Coastguard Worker by advancing to the next ARGV-element. */
109*c2e0c6b5SAndroid Build Coastguard Worker
110*c2e0c6b5SAndroid Build Coastguard Worker static char *nextchar;
111*c2e0c6b5SAndroid Build Coastguard Worker
112*c2e0c6b5SAndroid Build Coastguard Worker /* Callers store zero here to inhibit the error message
113*c2e0c6b5SAndroid Build Coastguard Worker for unrecognized options. */
114*c2e0c6b5SAndroid Build Coastguard Worker
115*c2e0c6b5SAndroid Build Coastguard Worker int opterr = 1;
116*c2e0c6b5SAndroid Build Coastguard Worker
117*c2e0c6b5SAndroid Build Coastguard Worker /* Set to an option character which was unrecognized.
118*c2e0c6b5SAndroid Build Coastguard Worker This must be initialized on some systems to avoid linking in the
119*c2e0c6b5SAndroid Build Coastguard Worker system's own getopt implementation. */
120*c2e0c6b5SAndroid Build Coastguard Worker
121*c2e0c6b5SAndroid Build Coastguard Worker #define BAD_OPTION '\0'
122*c2e0c6b5SAndroid Build Coastguard Worker int optopt = BAD_OPTION;
123*c2e0c6b5SAndroid Build Coastguard Worker
124*c2e0c6b5SAndroid Build Coastguard Worker /* Describe how to deal with options that follow non-option ARGV-elements.
125*c2e0c6b5SAndroid Build Coastguard Worker
126*c2e0c6b5SAndroid Build Coastguard Worker If the caller did not specify anything,
127*c2e0c6b5SAndroid Build Coastguard Worker the default is REQUIRE_ORDER if the environment variable
128*c2e0c6b5SAndroid Build Coastguard Worker POSIXLY_CORRECT is defined, PERMUTE otherwise.
129*c2e0c6b5SAndroid Build Coastguard Worker
130*c2e0c6b5SAndroid Build Coastguard Worker REQUIRE_ORDER means don't recognize them as options;
131*c2e0c6b5SAndroid Build Coastguard Worker stop option processing when the first non-option is seen.
132*c2e0c6b5SAndroid Build Coastguard Worker This is what Unix does.
133*c2e0c6b5SAndroid Build Coastguard Worker This mode of operation is selected by either setting the environment
134*c2e0c6b5SAndroid Build Coastguard Worker variable POSIXLY_CORRECT, or using `+' as the first character
135*c2e0c6b5SAndroid Build Coastguard Worker of the list of option characters.
136*c2e0c6b5SAndroid Build Coastguard Worker
137*c2e0c6b5SAndroid Build Coastguard Worker PERMUTE is the default. We permute the contents of ARGV as we scan,
138*c2e0c6b5SAndroid Build Coastguard Worker so that eventually all the non-options are at the end. This allows options
139*c2e0c6b5SAndroid Build Coastguard Worker to be given in any order, even with programs that were not written to
140*c2e0c6b5SAndroid Build Coastguard Worker expect this.
141*c2e0c6b5SAndroid Build Coastguard Worker
142*c2e0c6b5SAndroid Build Coastguard Worker RETURN_IN_ORDER is an option available to programs that were written
143*c2e0c6b5SAndroid Build Coastguard Worker to expect options and other ARGV-elements in any order and that care about
144*c2e0c6b5SAndroid Build Coastguard Worker the ordering of the two. We describe each non-option ARGV-element
145*c2e0c6b5SAndroid Build Coastguard Worker as if it were the argument of an option with character code 1.
146*c2e0c6b5SAndroid Build Coastguard Worker Using `-' as the first character of the list of option characters
147*c2e0c6b5SAndroid Build Coastguard Worker selects this mode of operation.
148*c2e0c6b5SAndroid Build Coastguard Worker
149*c2e0c6b5SAndroid Build Coastguard Worker The special argument `--' forces an end of option-scanning regardless
150*c2e0c6b5SAndroid Build Coastguard Worker of the value of `ordering'. In the case of RETURN_IN_ORDER, only
151*c2e0c6b5SAndroid Build Coastguard Worker `--' can cause `getopt' to return EOF with `optind' != ARGC. */
152*c2e0c6b5SAndroid Build Coastguard Worker
153*c2e0c6b5SAndroid Build Coastguard Worker static enum {
154*c2e0c6b5SAndroid Build Coastguard Worker REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
155*c2e0c6b5SAndroid Build Coastguard Worker } ordering;
156*c2e0c6b5SAndroid Build Coastguard Worker
157*c2e0c6b5SAndroid Build Coastguard Worker #ifdef __GNU_LIBRARY__
158*c2e0c6b5SAndroid Build Coastguard Worker /* We want to avoid inclusion of string.h with non-GNU libraries
159*c2e0c6b5SAndroid Build Coastguard Worker because there are many ways it can cause trouble.
160*c2e0c6b5SAndroid Build Coastguard Worker On some systems, it contains special magic macros that don't work
161*c2e0c6b5SAndroid Build Coastguard Worker in GCC. */
162*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
163*c2e0c6b5SAndroid Build Coastguard Worker #define my_index strchr
164*c2e0c6b5SAndroid Build Coastguard Worker #define my_strlen strlen
165*c2e0c6b5SAndroid Build Coastguard Worker #define my_strcmp strcmp
166*c2e0c6b5SAndroid Build Coastguard Worker #define my_strncmp strncmp
167*c2e0c6b5SAndroid Build Coastguard Worker #else
168*c2e0c6b5SAndroid Build Coastguard Worker
169*c2e0c6b5SAndroid Build Coastguard Worker /* Avoid depending on library functions or files
170*c2e0c6b5SAndroid Build Coastguard Worker whose names are inconsistent. */
171*c2e0c6b5SAndroid Build Coastguard Worker
172*c2e0c6b5SAndroid Build Coastguard Worker #if __STDC__ || defined(PROTO)
173*c2e0c6b5SAndroid Build Coastguard Worker extern char *getenv(const char *name);
174*c2e0c6b5SAndroid Build Coastguard Worker
175*c2e0c6b5SAndroid Build Coastguard Worker static int my_strlen(const char *s);
176*c2e0c6b5SAndroid Build Coastguard Worker static char *my_index(const char *str, int chr);
177*c2e0c6b5SAndroid Build Coastguard Worker static int my_strncmp(const char *s1, const char *s2, int n);
178*c2e0c6b5SAndroid Build Coastguard Worker static int my_strcmp(const char *s1, const char *s2);
179*c2e0c6b5SAndroid Build Coastguard Worker #else
180*c2e0c6b5SAndroid Build Coastguard Worker extern char *getenv();
181*c2e0c6b5SAndroid Build Coastguard Worker #endif
182*c2e0c6b5SAndroid Build Coastguard Worker
my_strlen(const char * str)183*c2e0c6b5SAndroid Build Coastguard Worker static int my_strlen(const char *str)
184*c2e0c6b5SAndroid Build Coastguard Worker {
185*c2e0c6b5SAndroid Build Coastguard Worker int n = 0;
186*c2e0c6b5SAndroid Build Coastguard Worker while (*str++)
187*c2e0c6b5SAndroid Build Coastguard Worker n++;
188*c2e0c6b5SAndroid Build Coastguard Worker return n;
189*c2e0c6b5SAndroid Build Coastguard Worker }
190*c2e0c6b5SAndroid Build Coastguard Worker
my_index(const char * str,int chr)191*c2e0c6b5SAndroid Build Coastguard Worker static char *my_index(const char *str, int chr)
192*c2e0c6b5SAndroid Build Coastguard Worker {
193*c2e0c6b5SAndroid Build Coastguard Worker while (*str) {
194*c2e0c6b5SAndroid Build Coastguard Worker if (*str == chr)
195*c2e0c6b5SAndroid Build Coastguard Worker return (char *) str;
196*c2e0c6b5SAndroid Build Coastguard Worker str++;
197*c2e0c6b5SAndroid Build Coastguard Worker }
198*c2e0c6b5SAndroid Build Coastguard Worker return 0;
199*c2e0c6b5SAndroid Build Coastguard Worker }
200*c2e0c6b5SAndroid Build Coastguard Worker
my_strncmp(const char * s1,const char * s2,int n)201*c2e0c6b5SAndroid Build Coastguard Worker static int my_strncmp(const char *s1, const char *s2, int n)
202*c2e0c6b5SAndroid Build Coastguard Worker {
203*c2e0c6b5SAndroid Build Coastguard Worker while (n && *s1 && (*s1 == *s2)) {
204*c2e0c6b5SAndroid Build Coastguard Worker ++s1;
205*c2e0c6b5SAndroid Build Coastguard Worker ++s2;
206*c2e0c6b5SAndroid Build Coastguard Worker --n;
207*c2e0c6b5SAndroid Build Coastguard Worker }
208*c2e0c6b5SAndroid Build Coastguard Worker if (n == 0)
209*c2e0c6b5SAndroid Build Coastguard Worker return 0;
210*c2e0c6b5SAndroid Build Coastguard Worker return *(const unsigned char *)s1 - *(const unsigned char *)s2;
211*c2e0c6b5SAndroid Build Coastguard Worker }
212*c2e0c6b5SAndroid Build Coastguard Worker
my_strcmp(const char * s1,const char * s2)213*c2e0c6b5SAndroid Build Coastguard Worker static int my_strcmp(const char *s1, const char *s2)
214*c2e0c6b5SAndroid Build Coastguard Worker {
215*c2e0c6b5SAndroid Build Coastguard Worker return my_strncmp(s1, s2, -1);
216*c2e0c6b5SAndroid Build Coastguard Worker }
217*c2e0c6b5SAndroid Build Coastguard Worker
218*c2e0c6b5SAndroid Build Coastguard Worker #endif /* GNU C library. */
219*c2e0c6b5SAndroid Build Coastguard Worker
220*c2e0c6b5SAndroid Build Coastguard Worker /* Handle permutation of arguments. */
221*c2e0c6b5SAndroid Build Coastguard Worker
222*c2e0c6b5SAndroid Build Coastguard Worker /* Describe the part of ARGV that contains non-options that have
223*c2e0c6b5SAndroid Build Coastguard Worker been skipped. `first_nonopt' is the index in ARGV of the first of them;
224*c2e0c6b5SAndroid Build Coastguard Worker `last_nonopt' is the index after the last of them. */
225*c2e0c6b5SAndroid Build Coastguard Worker
226*c2e0c6b5SAndroid Build Coastguard Worker static int first_nonopt;
227*c2e0c6b5SAndroid Build Coastguard Worker static int last_nonopt;
228*c2e0c6b5SAndroid Build Coastguard Worker
229*c2e0c6b5SAndroid Build Coastguard Worker /* Exchange two adjacent subsequences of ARGV.
230*c2e0c6b5SAndroid Build Coastguard Worker One subsequence is elements [first_nonopt,last_nonopt)
231*c2e0c6b5SAndroid Build Coastguard Worker which contains all the non-options that have been skipped so far.
232*c2e0c6b5SAndroid Build Coastguard Worker The other is elements [last_nonopt,optind), which contains all
233*c2e0c6b5SAndroid Build Coastguard Worker the options processed since those non-options were skipped.
234*c2e0c6b5SAndroid Build Coastguard Worker
235*c2e0c6b5SAndroid Build Coastguard Worker `first_nonopt' and `last_nonopt' are relocated so that they describe
236*c2e0c6b5SAndroid Build Coastguard Worker the new indices of the non-options in ARGV after they are moved.
237*c2e0c6b5SAndroid Build Coastguard Worker
238*c2e0c6b5SAndroid Build Coastguard Worker To perform the swap, we first reverse the order of all elements. So
239*c2e0c6b5SAndroid Build Coastguard Worker all options now come before all non options, but they are in the
240*c2e0c6b5SAndroid Build Coastguard Worker wrong order. So we put back the options and non options in original
241*c2e0c6b5SAndroid Build Coastguard Worker order by reversing them again. For example:
242*c2e0c6b5SAndroid Build Coastguard Worker original input: a b c -x -y
243*c2e0c6b5SAndroid Build Coastguard Worker reverse all: -y -x c b a
244*c2e0c6b5SAndroid Build Coastguard Worker reverse options: -x -y c b a
245*c2e0c6b5SAndroid Build Coastguard Worker reverse non options: -x -y a b c
246*c2e0c6b5SAndroid Build Coastguard Worker */
247*c2e0c6b5SAndroid Build Coastguard Worker
248*c2e0c6b5SAndroid Build Coastguard Worker #if __STDC__ || defined(PROTO)
249*c2e0c6b5SAndroid Build Coastguard Worker static void exchange(char **argv);
250*c2e0c6b5SAndroid Build Coastguard Worker #endif
251*c2e0c6b5SAndroid Build Coastguard Worker
exchange(char ** argv)252*c2e0c6b5SAndroid Build Coastguard Worker static void exchange(char **argv)
253*c2e0c6b5SAndroid Build Coastguard Worker {
254*c2e0c6b5SAndroid Build Coastguard Worker char *temp, **first, **last;
255*c2e0c6b5SAndroid Build Coastguard Worker
256*c2e0c6b5SAndroid Build Coastguard Worker /* Reverse all the elements [first_nonopt, optind) */
257*c2e0c6b5SAndroid Build Coastguard Worker first = &argv[first_nonopt];
258*c2e0c6b5SAndroid Build Coastguard Worker last = &argv[optind - 1];
259*c2e0c6b5SAndroid Build Coastguard Worker while (first < last) {
260*c2e0c6b5SAndroid Build Coastguard Worker temp = *first;
261*c2e0c6b5SAndroid Build Coastguard Worker *first = *last;
262*c2e0c6b5SAndroid Build Coastguard Worker *last = temp;
263*c2e0c6b5SAndroid Build Coastguard Worker first++;
264*c2e0c6b5SAndroid Build Coastguard Worker last--;
265*c2e0c6b5SAndroid Build Coastguard Worker }
266*c2e0c6b5SAndroid Build Coastguard Worker /* Put back the options in order */
267*c2e0c6b5SAndroid Build Coastguard Worker first = &argv[first_nonopt];
268*c2e0c6b5SAndroid Build Coastguard Worker first_nonopt += (optind - last_nonopt);
269*c2e0c6b5SAndroid Build Coastguard Worker last = &argv[first_nonopt - 1];
270*c2e0c6b5SAndroid Build Coastguard Worker while (first < last) {
271*c2e0c6b5SAndroid Build Coastguard Worker temp = *first;
272*c2e0c6b5SAndroid Build Coastguard Worker *first = *last;
273*c2e0c6b5SAndroid Build Coastguard Worker *last = temp;
274*c2e0c6b5SAndroid Build Coastguard Worker first++;
275*c2e0c6b5SAndroid Build Coastguard Worker last--;
276*c2e0c6b5SAndroid Build Coastguard Worker }
277*c2e0c6b5SAndroid Build Coastguard Worker
278*c2e0c6b5SAndroid Build Coastguard Worker /* Put back the non options in order */
279*c2e0c6b5SAndroid Build Coastguard Worker first = &argv[first_nonopt];
280*c2e0c6b5SAndroid Build Coastguard Worker last_nonopt = optind;
281*c2e0c6b5SAndroid Build Coastguard Worker last = &argv[last_nonopt - 1];
282*c2e0c6b5SAndroid Build Coastguard Worker while (first < last) {
283*c2e0c6b5SAndroid Build Coastguard Worker temp = *first;
284*c2e0c6b5SAndroid Build Coastguard Worker *first = *last;
285*c2e0c6b5SAndroid Build Coastguard Worker *last = temp;
286*c2e0c6b5SAndroid Build Coastguard Worker first++;
287*c2e0c6b5SAndroid Build Coastguard Worker last--;
288*c2e0c6b5SAndroid Build Coastguard Worker }
289*c2e0c6b5SAndroid Build Coastguard Worker }
290*c2e0c6b5SAndroid Build Coastguard Worker
291*c2e0c6b5SAndroid Build Coastguard Worker /* Scan elements of ARGV (whose length is ARGC) for option characters
292*c2e0c6b5SAndroid Build Coastguard Worker given in OPTSTRING.
293*c2e0c6b5SAndroid Build Coastguard Worker
294*c2e0c6b5SAndroid Build Coastguard Worker If an element of ARGV starts with '-', and is not exactly "-" or "--",
295*c2e0c6b5SAndroid Build Coastguard Worker then it is an option element. The characters of this element
296*c2e0c6b5SAndroid Build Coastguard Worker (aside from the initial '-') are option characters. If `getopt'
297*c2e0c6b5SAndroid Build Coastguard Worker is called repeatedly, it returns successively each of the option characters
298*c2e0c6b5SAndroid Build Coastguard Worker from each of the option elements.
299*c2e0c6b5SAndroid Build Coastguard Worker
300*c2e0c6b5SAndroid Build Coastguard Worker If `getopt' finds another option character, it returns that character,
301*c2e0c6b5SAndroid Build Coastguard Worker updating `optind' and `nextchar' so that the next call to `getopt' can
302*c2e0c6b5SAndroid Build Coastguard Worker resume the scan with the following option character or ARGV-element.
303*c2e0c6b5SAndroid Build Coastguard Worker
304*c2e0c6b5SAndroid Build Coastguard Worker If there are no more option characters, `getopt' returns `EOF'.
305*c2e0c6b5SAndroid Build Coastguard Worker Then `optind' is the index in ARGV of the first ARGV-element
306*c2e0c6b5SAndroid Build Coastguard Worker that is not an option. (The ARGV-elements have been permuted
307*c2e0c6b5SAndroid Build Coastguard Worker so that those that are not options now come last.)
308*c2e0c6b5SAndroid Build Coastguard Worker
309*c2e0c6b5SAndroid Build Coastguard Worker OPTSTRING is a string containing the legitimate option characters.
310*c2e0c6b5SAndroid Build Coastguard Worker If an option character is seen that is not listed in OPTSTRING,
311*c2e0c6b5SAndroid Build Coastguard Worker return BAD_OPTION after printing an error message. If you set `opterr' to
312*c2e0c6b5SAndroid Build Coastguard Worker zero, the error message is suppressed but we still return BAD_OPTION.
313*c2e0c6b5SAndroid Build Coastguard Worker
314*c2e0c6b5SAndroid Build Coastguard Worker If a char in OPTSTRING is followed by a colon, that means it wants an arg,
315*c2e0c6b5SAndroid Build Coastguard Worker so the following text in the same ARGV-element, or the text of the following
316*c2e0c6b5SAndroid Build Coastguard Worker ARGV-element, is returned in `optarg'. Two colons mean an option that
317*c2e0c6b5SAndroid Build Coastguard Worker wants an optional arg; if there is text in the current ARGV-element,
318*c2e0c6b5SAndroid Build Coastguard Worker it is returned in `optarg', otherwise `optarg' is set to zero.
319*c2e0c6b5SAndroid Build Coastguard Worker
320*c2e0c6b5SAndroid Build Coastguard Worker If OPTSTRING starts with `-' or `+', it requests different methods of
321*c2e0c6b5SAndroid Build Coastguard Worker handling the non-option ARGV-elements.
322*c2e0c6b5SAndroid Build Coastguard Worker See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
323*c2e0c6b5SAndroid Build Coastguard Worker
324*c2e0c6b5SAndroid Build Coastguard Worker Long-named options begin with `--' instead of `-'.
325*c2e0c6b5SAndroid Build Coastguard Worker Their names may be abbreviated as long as the abbreviation is unique
326*c2e0c6b5SAndroid Build Coastguard Worker or is an exact match for some defined option. If they have an
327*c2e0c6b5SAndroid Build Coastguard Worker argument, it follows the option name in the same ARGV-element, separated
328*c2e0c6b5SAndroid Build Coastguard Worker from the option name by a `=', or else the in next ARGV-element.
329*c2e0c6b5SAndroid Build Coastguard Worker When `getopt' finds a long-named option, it returns 0 if that option's
330*c2e0c6b5SAndroid Build Coastguard Worker `flag' field is nonzero, the value of the option's `val' field
331*c2e0c6b5SAndroid Build Coastguard Worker if the `flag' field is zero.
332*c2e0c6b5SAndroid Build Coastguard Worker
333*c2e0c6b5SAndroid Build Coastguard Worker The elements of ARGV aren't really const, because we permute them.
334*c2e0c6b5SAndroid Build Coastguard Worker But we pretend they're const in the prototype to be compatible
335*c2e0c6b5SAndroid Build Coastguard Worker with other systems.
336*c2e0c6b5SAndroid Build Coastguard Worker
337*c2e0c6b5SAndroid Build Coastguard Worker LONGOPTS is a vector of `struct option' terminated by an
338*c2e0c6b5SAndroid Build Coastguard Worker element containing a name which is zero.
339*c2e0c6b5SAndroid Build Coastguard Worker
340*c2e0c6b5SAndroid Build Coastguard Worker LONGIND returns the index in LONGOPT of the long-named option found.
341*c2e0c6b5SAndroid Build Coastguard Worker It is only valid when a long-named option has been found by the most
342*c2e0c6b5SAndroid Build Coastguard Worker recent call.
343*c2e0c6b5SAndroid Build Coastguard Worker
344*c2e0c6b5SAndroid Build Coastguard Worker If LONG_ONLY is nonzero, '-' as well as '--' can introduce
345*c2e0c6b5SAndroid Build Coastguard Worker long-named options. */
346*c2e0c6b5SAndroid Build Coastguard Worker
_getopt_internal(int argc,char * const * argv,const char * optstring,const struct option * longopts,int * longind,int long_only)347*c2e0c6b5SAndroid Build Coastguard Worker int _getopt_internal(int argc, char *const *argv, const char *optstring,
348*c2e0c6b5SAndroid Build Coastguard Worker const struct option *longopts, int *longind, int long_only)
349*c2e0c6b5SAndroid Build Coastguard Worker {
350*c2e0c6b5SAndroid Build Coastguard Worker int option_index;
351*c2e0c6b5SAndroid Build Coastguard Worker
352*c2e0c6b5SAndroid Build Coastguard Worker optarg = 0;
353*c2e0c6b5SAndroid Build Coastguard Worker
354*c2e0c6b5SAndroid Build Coastguard Worker /* Initialize the internal data when the first call is made.
355*c2e0c6b5SAndroid Build Coastguard Worker Start processing options with ARGV-element 1 (since ARGV-element 0
356*c2e0c6b5SAndroid Build Coastguard Worker is the program name); the sequence of previously skipped
357*c2e0c6b5SAndroid Build Coastguard Worker non-option ARGV-elements is empty. */
358*c2e0c6b5SAndroid Build Coastguard Worker
359*c2e0c6b5SAndroid Build Coastguard Worker if (optind == 0) {
360*c2e0c6b5SAndroid Build Coastguard Worker first_nonopt = last_nonopt = optind = 1;
361*c2e0c6b5SAndroid Build Coastguard Worker
362*c2e0c6b5SAndroid Build Coastguard Worker nextchar = NULL;
363*c2e0c6b5SAndroid Build Coastguard Worker
364*c2e0c6b5SAndroid Build Coastguard Worker /* Determine how to handle the ordering of options and nonoptions. */
365*c2e0c6b5SAndroid Build Coastguard Worker
366*c2e0c6b5SAndroid Build Coastguard Worker if (optstring[0] == '-') {
367*c2e0c6b5SAndroid Build Coastguard Worker ordering = RETURN_IN_ORDER;
368*c2e0c6b5SAndroid Build Coastguard Worker ++optstring;
369*c2e0c6b5SAndroid Build Coastguard Worker } else if (optstring[0] == '+') {
370*c2e0c6b5SAndroid Build Coastguard Worker ordering = REQUIRE_ORDER;
371*c2e0c6b5SAndroid Build Coastguard Worker ++optstring;
372*c2e0c6b5SAndroid Build Coastguard Worker } else if (getenv("POSIXLY_CORRECT") != NULL)
373*c2e0c6b5SAndroid Build Coastguard Worker ordering = REQUIRE_ORDER;
374*c2e0c6b5SAndroid Build Coastguard Worker else
375*c2e0c6b5SAndroid Build Coastguard Worker ordering = PERMUTE;
376*c2e0c6b5SAndroid Build Coastguard Worker }
377*c2e0c6b5SAndroid Build Coastguard Worker
378*c2e0c6b5SAndroid Build Coastguard Worker if (nextchar == NULL || *nextchar == '\0') {
379*c2e0c6b5SAndroid Build Coastguard Worker if (ordering == PERMUTE) {
380*c2e0c6b5SAndroid Build Coastguard Worker /* If we have just processed some options following some non-options,
381*c2e0c6b5SAndroid Build Coastguard Worker exchange them so that the options come first. */
382*c2e0c6b5SAndroid Build Coastguard Worker
383*c2e0c6b5SAndroid Build Coastguard Worker if (first_nonopt != last_nonopt && last_nonopt != optind)
384*c2e0c6b5SAndroid Build Coastguard Worker exchange((char **) argv);
385*c2e0c6b5SAndroid Build Coastguard Worker else if (last_nonopt != optind)
386*c2e0c6b5SAndroid Build Coastguard Worker first_nonopt = optind;
387*c2e0c6b5SAndroid Build Coastguard Worker
388*c2e0c6b5SAndroid Build Coastguard Worker /* Now skip any additional non-options
389*c2e0c6b5SAndroid Build Coastguard Worker and extend the range of non-options previously skipped. */
390*c2e0c6b5SAndroid Build Coastguard Worker
391*c2e0c6b5SAndroid Build Coastguard Worker while (optind < argc && (argv[optind][0] != '-' || argv[optind][1] == '\0')
392*c2e0c6b5SAndroid Build Coastguard Worker #ifdef GETOPT_COMPAT
393*c2e0c6b5SAndroid Build Coastguard Worker && (longopts == NULL
394*c2e0c6b5SAndroid Build Coastguard Worker || argv[optind][0] != '+' || argv[optind][1] == '\0')
395*c2e0c6b5SAndroid Build Coastguard Worker #endif /* GETOPT_COMPAT */
396*c2e0c6b5SAndroid Build Coastguard Worker )
397*c2e0c6b5SAndroid Build Coastguard Worker optind++;
398*c2e0c6b5SAndroid Build Coastguard Worker last_nonopt = optind;
399*c2e0c6b5SAndroid Build Coastguard Worker }
400*c2e0c6b5SAndroid Build Coastguard Worker
401*c2e0c6b5SAndroid Build Coastguard Worker /* Special ARGV-element `--' means premature end of options.
402*c2e0c6b5SAndroid Build Coastguard Worker Skip it like a null option,
403*c2e0c6b5SAndroid Build Coastguard Worker then exchange with previous non-options as if it were an option,
404*c2e0c6b5SAndroid Build Coastguard Worker then skip everything else like a non-option. */
405*c2e0c6b5SAndroid Build Coastguard Worker
406*c2e0c6b5SAndroid Build Coastguard Worker if (optind != argc && !my_strcmp(argv[optind], "--")) {
407*c2e0c6b5SAndroid Build Coastguard Worker optind++;
408*c2e0c6b5SAndroid Build Coastguard Worker
409*c2e0c6b5SAndroid Build Coastguard Worker if (first_nonopt != last_nonopt && last_nonopt != optind)
410*c2e0c6b5SAndroid Build Coastguard Worker exchange((char **) argv);
411*c2e0c6b5SAndroid Build Coastguard Worker else if (first_nonopt == last_nonopt)
412*c2e0c6b5SAndroid Build Coastguard Worker first_nonopt = optind;
413*c2e0c6b5SAndroid Build Coastguard Worker last_nonopt = argc;
414*c2e0c6b5SAndroid Build Coastguard Worker
415*c2e0c6b5SAndroid Build Coastguard Worker optind = argc;
416*c2e0c6b5SAndroid Build Coastguard Worker }
417*c2e0c6b5SAndroid Build Coastguard Worker
418*c2e0c6b5SAndroid Build Coastguard Worker /* If we have done all the ARGV-elements, stop the scan
419*c2e0c6b5SAndroid Build Coastguard Worker and back over any non-options that we skipped and permuted. */
420*c2e0c6b5SAndroid Build Coastguard Worker
421*c2e0c6b5SAndroid Build Coastguard Worker if (optind == argc) {
422*c2e0c6b5SAndroid Build Coastguard Worker /* Set the next-arg-index to point at the non-options
423*c2e0c6b5SAndroid Build Coastguard Worker that we previously skipped, so the caller will digest them. */
424*c2e0c6b5SAndroid Build Coastguard Worker if (first_nonopt != last_nonopt)
425*c2e0c6b5SAndroid Build Coastguard Worker optind = first_nonopt;
426*c2e0c6b5SAndroid Build Coastguard Worker return EOF;
427*c2e0c6b5SAndroid Build Coastguard Worker }
428*c2e0c6b5SAndroid Build Coastguard Worker
429*c2e0c6b5SAndroid Build Coastguard Worker /* If we have come to a non-option and did not permute it,
430*c2e0c6b5SAndroid Build Coastguard Worker either stop the scan or describe it to the caller and pass it by. */
431*c2e0c6b5SAndroid Build Coastguard Worker
432*c2e0c6b5SAndroid Build Coastguard Worker if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
433*c2e0c6b5SAndroid Build Coastguard Worker #ifdef GETOPT_COMPAT
434*c2e0c6b5SAndroid Build Coastguard Worker && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0')
435*c2e0c6b5SAndroid Build Coastguard Worker #endif /* GETOPT_COMPAT */
436*c2e0c6b5SAndroid Build Coastguard Worker ) {
437*c2e0c6b5SAndroid Build Coastguard Worker if (ordering == REQUIRE_ORDER)
438*c2e0c6b5SAndroid Build Coastguard Worker return EOF;
439*c2e0c6b5SAndroid Build Coastguard Worker optarg = argv[optind++];
440*c2e0c6b5SAndroid Build Coastguard Worker return 1;
441*c2e0c6b5SAndroid Build Coastguard Worker }
442*c2e0c6b5SAndroid Build Coastguard Worker
443*c2e0c6b5SAndroid Build Coastguard Worker /* We have found another option-ARGV-element.
444*c2e0c6b5SAndroid Build Coastguard Worker Start decoding its characters. */
445*c2e0c6b5SAndroid Build Coastguard Worker
446*c2e0c6b5SAndroid Build Coastguard Worker nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-'));
447*c2e0c6b5SAndroid Build Coastguard Worker }
448*c2e0c6b5SAndroid Build Coastguard Worker
449*c2e0c6b5SAndroid Build Coastguard Worker if (longopts != NULL && ((argv[optind][0] == '-' && (argv[optind][1] == '-' || long_only))
450*c2e0c6b5SAndroid Build Coastguard Worker #ifdef GETOPT_COMPAT
451*c2e0c6b5SAndroid Build Coastguard Worker || argv[optind][0] == '+'
452*c2e0c6b5SAndroid Build Coastguard Worker #endif /* GETOPT_COMPAT */
453*c2e0c6b5SAndroid Build Coastguard Worker )) {
454*c2e0c6b5SAndroid Build Coastguard Worker const struct option *p;
455*c2e0c6b5SAndroid Build Coastguard Worker char *s = nextchar;
456*c2e0c6b5SAndroid Build Coastguard Worker int exact = 0;
457*c2e0c6b5SAndroid Build Coastguard Worker int ambig = 0;
458*c2e0c6b5SAndroid Build Coastguard Worker const struct option *pfound = NULL;
459*c2e0c6b5SAndroid Build Coastguard Worker int indfound = 0;
460*c2e0c6b5SAndroid Build Coastguard Worker
461*c2e0c6b5SAndroid Build Coastguard Worker while (*s && *s != '=')
462*c2e0c6b5SAndroid Build Coastguard Worker s++;
463*c2e0c6b5SAndroid Build Coastguard Worker
464*c2e0c6b5SAndroid Build Coastguard Worker /* Test all options for either exact match or abbreviated matches. */
465*c2e0c6b5SAndroid Build Coastguard Worker for (p = longopts, option_index = 0; p->name; p++, option_index++)
466*c2e0c6b5SAndroid Build Coastguard Worker if (!my_strncmp(p->name, nextchar, s - nextchar)) {
467*c2e0c6b5SAndroid Build Coastguard Worker if (s - nextchar == my_strlen(p->name)) {
468*c2e0c6b5SAndroid Build Coastguard Worker /* Exact match found. */
469*c2e0c6b5SAndroid Build Coastguard Worker pfound = p;
470*c2e0c6b5SAndroid Build Coastguard Worker indfound = option_index;
471*c2e0c6b5SAndroid Build Coastguard Worker exact = 1;
472*c2e0c6b5SAndroid Build Coastguard Worker break;
473*c2e0c6b5SAndroid Build Coastguard Worker } else if (pfound == NULL) {
474*c2e0c6b5SAndroid Build Coastguard Worker /* First nonexact match found. */
475*c2e0c6b5SAndroid Build Coastguard Worker pfound = p;
476*c2e0c6b5SAndroid Build Coastguard Worker indfound = option_index;
477*c2e0c6b5SAndroid Build Coastguard Worker } else
478*c2e0c6b5SAndroid Build Coastguard Worker /* Second nonexact match found. */
479*c2e0c6b5SAndroid Build Coastguard Worker ambig = 1;
480*c2e0c6b5SAndroid Build Coastguard Worker }
481*c2e0c6b5SAndroid Build Coastguard Worker
482*c2e0c6b5SAndroid Build Coastguard Worker if (ambig && !exact) {
483*c2e0c6b5SAndroid Build Coastguard Worker if (opterr)
484*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr, "%s: option `%s' is ambiguous\n",
485*c2e0c6b5SAndroid Build Coastguard Worker argv[0], argv[optind]);
486*c2e0c6b5SAndroid Build Coastguard Worker nextchar += my_strlen(nextchar);
487*c2e0c6b5SAndroid Build Coastguard Worker optind++;
488*c2e0c6b5SAndroid Build Coastguard Worker return BAD_OPTION;
489*c2e0c6b5SAndroid Build Coastguard Worker }
490*c2e0c6b5SAndroid Build Coastguard Worker
491*c2e0c6b5SAndroid Build Coastguard Worker if (pfound != NULL) {
492*c2e0c6b5SAndroid Build Coastguard Worker option_index = indfound;
493*c2e0c6b5SAndroid Build Coastguard Worker optind++;
494*c2e0c6b5SAndroid Build Coastguard Worker if (*s) {
495*c2e0c6b5SAndroid Build Coastguard Worker /* Don't test has_arg with >, because some C compilers don't
496*c2e0c6b5SAndroid Build Coastguard Worker allow it to be used on enums. */
497*c2e0c6b5SAndroid Build Coastguard Worker if (pfound->has_arg)
498*c2e0c6b5SAndroid Build Coastguard Worker optarg = s + 1;
499*c2e0c6b5SAndroid Build Coastguard Worker else {
500*c2e0c6b5SAndroid Build Coastguard Worker if (opterr) {
501*c2e0c6b5SAndroid Build Coastguard Worker if (argv[optind - 1][1] == '-')
502*c2e0c6b5SAndroid Build Coastguard Worker /* --option */
503*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr,
504*c2e0c6b5SAndroid Build Coastguard Worker "%s: option `--%s' doesn't allow an argument\n",
505*c2e0c6b5SAndroid Build Coastguard Worker argv[0], pfound->name);
506*c2e0c6b5SAndroid Build Coastguard Worker else
507*c2e0c6b5SAndroid Build Coastguard Worker /* +option or -option */
508*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr,
509*c2e0c6b5SAndroid Build Coastguard Worker "%s: option `%c%s' doesn't allow an argument\n",
510*c2e0c6b5SAndroid Build Coastguard Worker argv[0], argv[optind - 1][0],
511*c2e0c6b5SAndroid Build Coastguard Worker pfound->name);
512*c2e0c6b5SAndroid Build Coastguard Worker }
513*c2e0c6b5SAndroid Build Coastguard Worker nextchar += my_strlen(nextchar);
514*c2e0c6b5SAndroid Build Coastguard Worker return BAD_OPTION;
515*c2e0c6b5SAndroid Build Coastguard Worker }
516*c2e0c6b5SAndroid Build Coastguard Worker } else if (pfound->has_arg == 1) {
517*c2e0c6b5SAndroid Build Coastguard Worker if (optind < argc)
518*c2e0c6b5SAndroid Build Coastguard Worker optarg = argv[optind++];
519*c2e0c6b5SAndroid Build Coastguard Worker else {
520*c2e0c6b5SAndroid Build Coastguard Worker if (opterr)
521*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr,
522*c2e0c6b5SAndroid Build Coastguard Worker "%s: option `%s' requires an argument\n",
523*c2e0c6b5SAndroid Build Coastguard Worker argv[0], argv[optind - 1]);
524*c2e0c6b5SAndroid Build Coastguard Worker nextchar += my_strlen(nextchar);
525*c2e0c6b5SAndroid Build Coastguard Worker return optstring[0] == ':' ? ':' : BAD_OPTION;
526*c2e0c6b5SAndroid Build Coastguard Worker }
527*c2e0c6b5SAndroid Build Coastguard Worker }
528*c2e0c6b5SAndroid Build Coastguard Worker nextchar += my_strlen(nextchar);
529*c2e0c6b5SAndroid Build Coastguard Worker if (longind != NULL)
530*c2e0c6b5SAndroid Build Coastguard Worker *longind = option_index;
531*c2e0c6b5SAndroid Build Coastguard Worker if (pfound->flag) {
532*c2e0c6b5SAndroid Build Coastguard Worker *(pfound->flag) = pfound->val;
533*c2e0c6b5SAndroid Build Coastguard Worker return 0;
534*c2e0c6b5SAndroid Build Coastguard Worker }
535*c2e0c6b5SAndroid Build Coastguard Worker return pfound->val;
536*c2e0c6b5SAndroid Build Coastguard Worker }
537*c2e0c6b5SAndroid Build Coastguard Worker /* Can't find it as a long option. If this is not getopt_long_only,
538*c2e0c6b5SAndroid Build Coastguard Worker or the option starts with '--' or is not a valid short
539*c2e0c6b5SAndroid Build Coastguard Worker option, then it's an error.
540*c2e0c6b5SAndroid Build Coastguard Worker Otherwise interpret it as a short option. */
541*c2e0c6b5SAndroid Build Coastguard Worker if (!long_only || argv[optind][1] == '-'
542*c2e0c6b5SAndroid Build Coastguard Worker #ifdef GETOPT_COMPAT
543*c2e0c6b5SAndroid Build Coastguard Worker || argv[optind][0] == '+'
544*c2e0c6b5SAndroid Build Coastguard Worker #endif /* GETOPT_COMPAT */
545*c2e0c6b5SAndroid Build Coastguard Worker || my_index(optstring, *nextchar) == NULL) {
546*c2e0c6b5SAndroid Build Coastguard Worker if (opterr) {
547*c2e0c6b5SAndroid Build Coastguard Worker if (argv[optind][1] == '-')
548*c2e0c6b5SAndroid Build Coastguard Worker /* --option */
549*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr, "%s: unrecognized option `--%s'\n",
550*c2e0c6b5SAndroid Build Coastguard Worker argv[0], nextchar);
551*c2e0c6b5SAndroid Build Coastguard Worker else
552*c2e0c6b5SAndroid Build Coastguard Worker /* +option or -option */
553*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr, "%s: unrecognized option `%c%s'\n",
554*c2e0c6b5SAndroid Build Coastguard Worker argv[0], argv[optind][0], nextchar);
555*c2e0c6b5SAndroid Build Coastguard Worker }
556*c2e0c6b5SAndroid Build Coastguard Worker nextchar = (char *) "";
557*c2e0c6b5SAndroid Build Coastguard Worker optind++;
558*c2e0c6b5SAndroid Build Coastguard Worker return BAD_OPTION;
559*c2e0c6b5SAndroid Build Coastguard Worker }
560*c2e0c6b5SAndroid Build Coastguard Worker }
561*c2e0c6b5SAndroid Build Coastguard Worker
562*c2e0c6b5SAndroid Build Coastguard Worker /* Look at and handle the next option-character. */
563*c2e0c6b5SAndroid Build Coastguard Worker
564*c2e0c6b5SAndroid Build Coastguard Worker {
565*c2e0c6b5SAndroid Build Coastguard Worker char c = *nextchar++;
566*c2e0c6b5SAndroid Build Coastguard Worker char *temp = my_index(optstring, c);
567*c2e0c6b5SAndroid Build Coastguard Worker
568*c2e0c6b5SAndroid Build Coastguard Worker /* Increment `optind' when we start to process its last character. */
569*c2e0c6b5SAndroid Build Coastguard Worker if (*nextchar == '\0')
570*c2e0c6b5SAndroid Build Coastguard Worker ++optind;
571*c2e0c6b5SAndroid Build Coastguard Worker
572*c2e0c6b5SAndroid Build Coastguard Worker if (temp == NULL || c == ':') {
573*c2e0c6b5SAndroid Build Coastguard Worker if (opterr) {
574*c2e0c6b5SAndroid Build Coastguard Worker #if 0
575*c2e0c6b5SAndroid Build Coastguard Worker if (c < 040 || c >= 0177)
576*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr,
577*c2e0c6b5SAndroid Build Coastguard Worker "%s: unrecognized option, character code 0%o\n",
578*c2e0c6b5SAndroid Build Coastguard Worker argv[0], c);
579*c2e0c6b5SAndroid Build Coastguard Worker else
580*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr, "%s: unrecognized option `-%c'\n", argv[0],
581*c2e0c6b5SAndroid Build Coastguard Worker c);
582*c2e0c6b5SAndroid Build Coastguard Worker #else
583*c2e0c6b5SAndroid Build Coastguard Worker /* 1003.2 specifies the format of this message. */
584*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr, "%s: illegal option -- %c\n", argv[0], c);
585*c2e0c6b5SAndroid Build Coastguard Worker #endif
586*c2e0c6b5SAndroid Build Coastguard Worker }
587*c2e0c6b5SAndroid Build Coastguard Worker optopt = c;
588*c2e0c6b5SAndroid Build Coastguard Worker return BAD_OPTION;
589*c2e0c6b5SAndroid Build Coastguard Worker }
590*c2e0c6b5SAndroid Build Coastguard Worker if (temp[1] == ':') {
591*c2e0c6b5SAndroid Build Coastguard Worker if (temp[2] == ':') {
592*c2e0c6b5SAndroid Build Coastguard Worker /* This is an option that accepts an argument optionally. */
593*c2e0c6b5SAndroid Build Coastguard Worker if (*nextchar != '\0') {
594*c2e0c6b5SAndroid Build Coastguard Worker optarg = nextchar;
595*c2e0c6b5SAndroid Build Coastguard Worker optind++;
596*c2e0c6b5SAndroid Build Coastguard Worker } else
597*c2e0c6b5SAndroid Build Coastguard Worker optarg = 0;
598*c2e0c6b5SAndroid Build Coastguard Worker nextchar = NULL;
599*c2e0c6b5SAndroid Build Coastguard Worker } else {
600*c2e0c6b5SAndroid Build Coastguard Worker /* This is an option that requires an argument. */
601*c2e0c6b5SAndroid Build Coastguard Worker if (*nextchar != '\0') {
602*c2e0c6b5SAndroid Build Coastguard Worker optarg = nextchar;
603*c2e0c6b5SAndroid Build Coastguard Worker /* If we end this ARGV-element by taking the rest as an arg,
604*c2e0c6b5SAndroid Build Coastguard Worker we must advance to the next element now. */
605*c2e0c6b5SAndroid Build Coastguard Worker optind++;
606*c2e0c6b5SAndroid Build Coastguard Worker } else if (optind == argc) {
607*c2e0c6b5SAndroid Build Coastguard Worker if (opterr) {
608*c2e0c6b5SAndroid Build Coastguard Worker #if 0
609*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr,
610*c2e0c6b5SAndroid Build Coastguard Worker "%s: option `-%c' requires an argument\n",
611*c2e0c6b5SAndroid Build Coastguard Worker argv[0], c);
612*c2e0c6b5SAndroid Build Coastguard Worker #else
613*c2e0c6b5SAndroid Build Coastguard Worker /* 1003.2 specifies the format of this message. */
614*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr,
615*c2e0c6b5SAndroid Build Coastguard Worker "%s: option requires an argument -- %c\n",
616*c2e0c6b5SAndroid Build Coastguard Worker argv[0], c);
617*c2e0c6b5SAndroid Build Coastguard Worker #endif
618*c2e0c6b5SAndroid Build Coastguard Worker }
619*c2e0c6b5SAndroid Build Coastguard Worker optopt = c;
620*c2e0c6b5SAndroid Build Coastguard Worker if (optstring[0] == ':')
621*c2e0c6b5SAndroid Build Coastguard Worker c = ':';
622*c2e0c6b5SAndroid Build Coastguard Worker else
623*c2e0c6b5SAndroid Build Coastguard Worker c = BAD_OPTION;
624*c2e0c6b5SAndroid Build Coastguard Worker } else
625*c2e0c6b5SAndroid Build Coastguard Worker /* We already incremented `optind' once;
626*c2e0c6b5SAndroid Build Coastguard Worker increment it again when taking next ARGV-elt as argument. */
627*c2e0c6b5SAndroid Build Coastguard Worker optarg = argv[optind++];
628*c2e0c6b5SAndroid Build Coastguard Worker nextchar = NULL;
629*c2e0c6b5SAndroid Build Coastguard Worker }
630*c2e0c6b5SAndroid Build Coastguard Worker }
631*c2e0c6b5SAndroid Build Coastguard Worker return c;
632*c2e0c6b5SAndroid Build Coastguard Worker }
633*c2e0c6b5SAndroid Build Coastguard Worker }
634*c2e0c6b5SAndroid Build Coastguard Worker
getopt(int argc,char * const * argv,const char * optstring)635*c2e0c6b5SAndroid Build Coastguard Worker int getopt(int argc, char *const *argv, const char *optstring)
636*c2e0c6b5SAndroid Build Coastguard Worker {
637*c2e0c6b5SAndroid Build Coastguard Worker return _getopt_internal(argc, argv, optstring, (const struct option *) 0, (int *) 0, 0);
638*c2e0c6b5SAndroid Build Coastguard Worker }
639*c2e0c6b5SAndroid Build Coastguard Worker
getopt_long(int argc,char * const * argv,const char * options,const struct option * long_options,int * opt_index)640*c2e0c6b5SAndroid Build Coastguard Worker int getopt_long(int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index)
641*c2e0c6b5SAndroid Build Coastguard Worker {
642*c2e0c6b5SAndroid Build Coastguard Worker return _getopt_internal(argc, argv, options, long_options, opt_index, 0);
643*c2e0c6b5SAndroid Build Coastguard Worker }
644*c2e0c6b5SAndroid Build Coastguard Worker
645*c2e0c6b5SAndroid Build Coastguard Worker #endif /* _LIBC or not __GNU_LIBRARY__. */
646*c2e0c6b5SAndroid Build Coastguard Worker
647*c2e0c6b5SAndroid Build Coastguard Worker #ifdef TEST
648*c2e0c6b5SAndroid Build Coastguard Worker
649*c2e0c6b5SAndroid Build Coastguard Worker /* Compile with -DTEST to make an executable for use in testing
650*c2e0c6b5SAndroid Build Coastguard Worker the above definition of `getopt'. */
651*c2e0c6b5SAndroid Build Coastguard Worker
main(int argc,char ** argv)652*c2e0c6b5SAndroid Build Coastguard Worker int main(int argc, char **argv)
653*c2e0c6b5SAndroid Build Coastguard Worker {
654*c2e0c6b5SAndroid Build Coastguard Worker int c;
655*c2e0c6b5SAndroid Build Coastguard Worker int digit_optind = 0;
656*c2e0c6b5SAndroid Build Coastguard Worker
657*c2e0c6b5SAndroid Build Coastguard Worker while (1) {
658*c2e0c6b5SAndroid Build Coastguard Worker int this_option_optind = optind ? optind : 1;
659*c2e0c6b5SAndroid Build Coastguard Worker
660*c2e0c6b5SAndroid Build Coastguard Worker c = getopt(argc, argv, "abc:d:0123456789");
661*c2e0c6b5SAndroid Build Coastguard Worker if (c == EOF)
662*c2e0c6b5SAndroid Build Coastguard Worker break;
663*c2e0c6b5SAndroid Build Coastguard Worker
664*c2e0c6b5SAndroid Build Coastguard Worker switch (c) {
665*c2e0c6b5SAndroid Build Coastguard Worker case '0':
666*c2e0c6b5SAndroid Build Coastguard Worker case '1':
667*c2e0c6b5SAndroid Build Coastguard Worker case '2':
668*c2e0c6b5SAndroid Build Coastguard Worker case '3':
669*c2e0c6b5SAndroid Build Coastguard Worker case '4':
670*c2e0c6b5SAndroid Build Coastguard Worker case '5':
671*c2e0c6b5SAndroid Build Coastguard Worker case '6':
672*c2e0c6b5SAndroid Build Coastguard Worker case '7':
673*c2e0c6b5SAndroid Build Coastguard Worker case '8':
674*c2e0c6b5SAndroid Build Coastguard Worker case '9':
675*c2e0c6b5SAndroid Build Coastguard Worker if (digit_optind != 0 && digit_optind != this_option_optind)
676*c2e0c6b5SAndroid Build Coastguard Worker printf("digits occur in two different argv-elements.\n");
677*c2e0c6b5SAndroid Build Coastguard Worker digit_optind = this_option_optind;
678*c2e0c6b5SAndroid Build Coastguard Worker printf("option %c\n", c);
679*c2e0c6b5SAndroid Build Coastguard Worker break;
680*c2e0c6b5SAndroid Build Coastguard Worker
681*c2e0c6b5SAndroid Build Coastguard Worker case 'a':
682*c2e0c6b5SAndroid Build Coastguard Worker printf("option a\n");
683*c2e0c6b5SAndroid Build Coastguard Worker break;
684*c2e0c6b5SAndroid Build Coastguard Worker
685*c2e0c6b5SAndroid Build Coastguard Worker case 'b':
686*c2e0c6b5SAndroid Build Coastguard Worker printf("option b\n");
687*c2e0c6b5SAndroid Build Coastguard Worker break;
688*c2e0c6b5SAndroid Build Coastguard Worker
689*c2e0c6b5SAndroid Build Coastguard Worker case 'c':
690*c2e0c6b5SAndroid Build Coastguard Worker printf("option c with value `%s'\n", optarg);
691*c2e0c6b5SAndroid Build Coastguard Worker break;
692*c2e0c6b5SAndroid Build Coastguard Worker
693*c2e0c6b5SAndroid Build Coastguard Worker case BAD_OPTION:
694*c2e0c6b5SAndroid Build Coastguard Worker break;
695*c2e0c6b5SAndroid Build Coastguard Worker
696*c2e0c6b5SAndroid Build Coastguard Worker default:
697*c2e0c6b5SAndroid Build Coastguard Worker printf("?? getopt returned character code 0%o ??\n", c);
698*c2e0c6b5SAndroid Build Coastguard Worker }
699*c2e0c6b5SAndroid Build Coastguard Worker }
700*c2e0c6b5SAndroid Build Coastguard Worker
701*c2e0c6b5SAndroid Build Coastguard Worker if (optind < argc) {
702*c2e0c6b5SAndroid Build Coastguard Worker printf("non-option ARGV-elements: ");
703*c2e0c6b5SAndroid Build Coastguard Worker while (optind < argc)
704*c2e0c6b5SAndroid Build Coastguard Worker printf("%s ", argv[optind++]);
705*c2e0c6b5SAndroid Build Coastguard Worker printf("\n");
706*c2e0c6b5SAndroid Build Coastguard Worker }
707*c2e0c6b5SAndroid Build Coastguard Worker
708*c2e0c6b5SAndroid Build Coastguard Worker exit(0);
709*c2e0c6b5SAndroid Build Coastguard Worker }
710*c2e0c6b5SAndroid Build Coastguard Worker
711*c2e0c6b5SAndroid Build Coastguard Worker #endif /* TEST */
712