xref: /aosp_15_r20/external/pciutils/compat/getopt.c (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
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