xref: /dflybsd-src/contrib/gdb-7/libiberty/getopt.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /* Getopt for GNU.
2*86d7f5d3SJohn Marino    NOTE: getopt is now part of the C library, so if you don't know what
3*86d7f5d3SJohn Marino    "Keep this file name-space clean" means, talk to drepper@gnu.org
4*86d7f5d3SJohn Marino    before changing it!
5*86d7f5d3SJohn Marino 
6*86d7f5d3SJohn Marino    Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
7*86d7f5d3SJohn Marino    1996, 1997, 1998, 2005 Free Software Foundation, Inc.
8*86d7f5d3SJohn Marino 
9*86d7f5d3SJohn Marino    NOTE: This source is derived from an old version taken from the GNU C
10*86d7f5d3SJohn Marino    Library (glibc).
11*86d7f5d3SJohn Marino 
12*86d7f5d3SJohn Marino    This program is free software; you can redistribute it and/or modify it
13*86d7f5d3SJohn Marino    under the terms of the GNU General Public License as published by the
14*86d7f5d3SJohn Marino    Free Software Foundation; either version 2, or (at your option) any
15*86d7f5d3SJohn Marino    later version.
16*86d7f5d3SJohn Marino 
17*86d7f5d3SJohn Marino    This program is distributed in the hope that it will be useful,
18*86d7f5d3SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
19*86d7f5d3SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20*86d7f5d3SJohn Marino    GNU General Public License for more details.
21*86d7f5d3SJohn Marino 
22*86d7f5d3SJohn Marino    You should have received a copy of the GNU General Public License
23*86d7f5d3SJohn Marino    along with this program; if not, write to the Free Software
24*86d7f5d3SJohn Marino    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
25*86d7f5d3SJohn Marino    USA.  */
26*86d7f5d3SJohn Marino 
27*86d7f5d3SJohn Marino /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
28*86d7f5d3SJohn Marino    Ditto for AIX 3.2 and <stdlib.h>.  */
29*86d7f5d3SJohn Marino #ifndef _NO_PROTO
30*86d7f5d3SJohn Marino # define _NO_PROTO
31*86d7f5d3SJohn Marino #endif
32*86d7f5d3SJohn Marino 
33*86d7f5d3SJohn Marino #ifdef HAVE_CONFIG_H
34*86d7f5d3SJohn Marino # include <config.h>
35*86d7f5d3SJohn Marino #endif
36*86d7f5d3SJohn Marino 
37*86d7f5d3SJohn Marino #if !defined __STDC__ || !__STDC__
38*86d7f5d3SJohn Marino /* This is a separate conditional since some stdc systems
39*86d7f5d3SJohn Marino    reject `defined (const)'.  */
40*86d7f5d3SJohn Marino # ifndef const
41*86d7f5d3SJohn Marino #  define const
42*86d7f5d3SJohn Marino # endif
43*86d7f5d3SJohn Marino #endif
44*86d7f5d3SJohn Marino 
45*86d7f5d3SJohn Marino #include "ansidecl.h"
46*86d7f5d3SJohn Marino #include <stdio.h>
47*86d7f5d3SJohn Marino 
48*86d7f5d3SJohn Marino /* Comment out all this code if we are using the GNU C Library, and are not
49*86d7f5d3SJohn Marino    actually compiling the library itself.  This code is part of the GNU C
50*86d7f5d3SJohn Marino    Library, but also included in many other GNU distributions.  Compiling
51*86d7f5d3SJohn Marino    and linking in this code is a waste when using the GNU C library
52*86d7f5d3SJohn Marino    (especially if it is a shared library).  Rather than having every GNU
53*86d7f5d3SJohn Marino    program understand `configure --with-gnu-libc' and omit the object files,
54*86d7f5d3SJohn Marino    it is simpler to just do this in the source for each such file.  */
55*86d7f5d3SJohn Marino 
56*86d7f5d3SJohn Marino #define GETOPT_INTERFACE_VERSION 2
57*86d7f5d3SJohn Marino #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
58*86d7f5d3SJohn Marino # include <gnu-versions.h>
59*86d7f5d3SJohn Marino # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
60*86d7f5d3SJohn Marino #  define ELIDE_CODE
61*86d7f5d3SJohn Marino # endif
62*86d7f5d3SJohn Marino #endif
63*86d7f5d3SJohn Marino 
64*86d7f5d3SJohn Marino #ifndef ELIDE_CODE
65*86d7f5d3SJohn Marino 
66*86d7f5d3SJohn Marino 
67*86d7f5d3SJohn Marino /* This needs to come after some library #include
68*86d7f5d3SJohn Marino    to get __GNU_LIBRARY__ defined.  */
69*86d7f5d3SJohn Marino #ifdef	__GNU_LIBRARY__
70*86d7f5d3SJohn Marino /* Don't include stdlib.h for non-GNU C libraries because some of them
71*86d7f5d3SJohn Marino    contain conflicting prototypes for getopt.  */
72*86d7f5d3SJohn Marino # include <stdlib.h>
73*86d7f5d3SJohn Marino # include <unistd.h>
74*86d7f5d3SJohn Marino #endif	/* GNU C library.  */
75*86d7f5d3SJohn Marino 
76*86d7f5d3SJohn Marino #ifdef VMS
77*86d7f5d3SJohn Marino # include <unixlib.h>
78*86d7f5d3SJohn Marino # if HAVE_STRING_H - 0
79*86d7f5d3SJohn Marino #  include <string.h>
80*86d7f5d3SJohn Marino # endif
81*86d7f5d3SJohn Marino #endif
82*86d7f5d3SJohn Marino 
83*86d7f5d3SJohn Marino #ifndef _
84*86d7f5d3SJohn Marino /* This is for other GNU distributions with internationalized messages.
85*86d7f5d3SJohn Marino    When compiling libc, the _ macro is predefined.  */
86*86d7f5d3SJohn Marino # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
87*86d7f5d3SJohn Marino #  include <libintl.h>
88*86d7f5d3SJohn Marino #  define _(msgid)	gettext (msgid)
89*86d7f5d3SJohn Marino # else
90*86d7f5d3SJohn Marino #  define _(msgid)	(msgid)
91*86d7f5d3SJohn Marino # endif
92*86d7f5d3SJohn Marino #endif
93*86d7f5d3SJohn Marino 
94*86d7f5d3SJohn Marino /* This version of `getopt' appears to the caller like standard Unix `getopt'
95*86d7f5d3SJohn Marino    but it behaves differently for the user, since it allows the user
96*86d7f5d3SJohn Marino    to intersperse the options with the other arguments.
97*86d7f5d3SJohn Marino 
98*86d7f5d3SJohn Marino    As `getopt' works, it permutes the elements of ARGV so that,
99*86d7f5d3SJohn Marino    when it is done, all the options precede everything else.  Thus
100*86d7f5d3SJohn Marino    all application programs are extended to handle flexible argument order.
101*86d7f5d3SJohn Marino 
102*86d7f5d3SJohn Marino    Setting the environment variable POSIXLY_CORRECT disables permutation.
103*86d7f5d3SJohn Marino    Then the behavior is completely standard.
104*86d7f5d3SJohn Marino 
105*86d7f5d3SJohn Marino    GNU application programs can use a third alternative mode in which
106*86d7f5d3SJohn Marino    they can distinguish the relative order of options and other arguments.  */
107*86d7f5d3SJohn Marino 
108*86d7f5d3SJohn Marino #include "getopt.h"
109*86d7f5d3SJohn Marino 
110*86d7f5d3SJohn Marino /* For communication from `getopt' to the caller.
111*86d7f5d3SJohn Marino    When `getopt' finds an option that takes an argument,
112*86d7f5d3SJohn Marino    the argument value is returned here.
113*86d7f5d3SJohn Marino    Also, when `ordering' is RETURN_IN_ORDER,
114*86d7f5d3SJohn Marino    each non-option ARGV-element is returned here.  */
115*86d7f5d3SJohn Marino 
116*86d7f5d3SJohn Marino char *optarg = NULL;
117*86d7f5d3SJohn Marino 
118*86d7f5d3SJohn Marino /* Index in ARGV of the next element to be scanned.
119*86d7f5d3SJohn Marino    This is used for communication to and from the caller
120*86d7f5d3SJohn Marino    and for communication between successive calls to `getopt'.
121*86d7f5d3SJohn Marino 
122*86d7f5d3SJohn Marino    On entry to `getopt', zero means this is the first call; initialize.
123*86d7f5d3SJohn Marino 
124*86d7f5d3SJohn Marino    When `getopt' returns -1, this is the index of the first of the
125*86d7f5d3SJohn Marino    non-option elements that the caller should itself scan.
126*86d7f5d3SJohn Marino 
127*86d7f5d3SJohn Marino    Otherwise, `optind' communicates from one call to the next
128*86d7f5d3SJohn Marino    how much of ARGV has been scanned so far.  */
129*86d7f5d3SJohn Marino 
130*86d7f5d3SJohn Marino /* 1003.2 says this must be 1 before any call.  */
131*86d7f5d3SJohn Marino int optind = 1;
132*86d7f5d3SJohn Marino 
133*86d7f5d3SJohn Marino /* Formerly, initialization of getopt depended on optind==0, which
134*86d7f5d3SJohn Marino    causes problems with re-calling getopt as programs generally don't
135*86d7f5d3SJohn Marino    know that. */
136*86d7f5d3SJohn Marino 
137*86d7f5d3SJohn Marino int __getopt_initialized = 0;
138*86d7f5d3SJohn Marino 
139*86d7f5d3SJohn Marino /* The next char to be scanned in the option-element
140*86d7f5d3SJohn Marino    in which the last option character we returned was found.
141*86d7f5d3SJohn Marino    This allows us to pick up the scan where we left off.
142*86d7f5d3SJohn Marino 
143*86d7f5d3SJohn Marino    If this is zero, or a null string, it means resume the scan
144*86d7f5d3SJohn Marino    by advancing to the next ARGV-element.  */
145*86d7f5d3SJohn Marino 
146*86d7f5d3SJohn Marino static char *nextchar;
147*86d7f5d3SJohn Marino 
148*86d7f5d3SJohn Marino /* Callers store zero here to inhibit the error message
149*86d7f5d3SJohn Marino    for unrecognized options.  */
150*86d7f5d3SJohn Marino 
151*86d7f5d3SJohn Marino int opterr = 1;
152*86d7f5d3SJohn Marino 
153*86d7f5d3SJohn Marino /* Set to an option character which was unrecognized.
154*86d7f5d3SJohn Marino    This must be initialized on some systems to avoid linking in the
155*86d7f5d3SJohn Marino    system's own getopt implementation.  */
156*86d7f5d3SJohn Marino 
157*86d7f5d3SJohn Marino int optopt = '?';
158*86d7f5d3SJohn Marino 
159*86d7f5d3SJohn Marino /* Describe how to deal with options that follow non-option ARGV-elements.
160*86d7f5d3SJohn Marino 
161*86d7f5d3SJohn Marino    If the caller did not specify anything,
162*86d7f5d3SJohn Marino    the default is REQUIRE_ORDER if the environment variable
163*86d7f5d3SJohn Marino    POSIXLY_CORRECT is defined, PERMUTE otherwise.
164*86d7f5d3SJohn Marino 
165*86d7f5d3SJohn Marino    REQUIRE_ORDER means don't recognize them as options;
166*86d7f5d3SJohn Marino    stop option processing when the first non-option is seen.
167*86d7f5d3SJohn Marino    This is what Unix does.
168*86d7f5d3SJohn Marino    This mode of operation is selected by either setting the environment
169*86d7f5d3SJohn Marino    variable POSIXLY_CORRECT, or using `+' as the first character
170*86d7f5d3SJohn Marino    of the list of option characters.
171*86d7f5d3SJohn Marino 
172*86d7f5d3SJohn Marino    PERMUTE is the default.  We permute the contents of ARGV as we scan,
173*86d7f5d3SJohn Marino    so that eventually all the non-options are at the end.  This allows options
174*86d7f5d3SJohn Marino    to be given in any order, even with programs that were not written to
175*86d7f5d3SJohn Marino    expect this.
176*86d7f5d3SJohn Marino 
177*86d7f5d3SJohn Marino    RETURN_IN_ORDER is an option available to programs that were written
178*86d7f5d3SJohn Marino    to expect options and other ARGV-elements in any order and that care about
179*86d7f5d3SJohn Marino    the ordering of the two.  We describe each non-option ARGV-element
180*86d7f5d3SJohn Marino    as if it were the argument of an option with character code 1.
181*86d7f5d3SJohn Marino    Using `-' as the first character of the list of option characters
182*86d7f5d3SJohn Marino    selects this mode of operation.
183*86d7f5d3SJohn Marino 
184*86d7f5d3SJohn Marino    The special argument `--' forces an end of option-scanning regardless
185*86d7f5d3SJohn Marino    of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
186*86d7f5d3SJohn Marino    `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
187*86d7f5d3SJohn Marino 
188*86d7f5d3SJohn Marino static enum
189*86d7f5d3SJohn Marino {
190*86d7f5d3SJohn Marino   REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
191*86d7f5d3SJohn Marino } ordering;
192*86d7f5d3SJohn Marino 
193*86d7f5d3SJohn Marino /* Value of POSIXLY_CORRECT environment variable.  */
194*86d7f5d3SJohn Marino static char *posixly_correct;
195*86d7f5d3SJohn Marino 
196*86d7f5d3SJohn Marino #ifdef	__GNU_LIBRARY__
197*86d7f5d3SJohn Marino /* We want to avoid inclusion of string.h with non-GNU libraries
198*86d7f5d3SJohn Marino    because there are many ways it can cause trouble.
199*86d7f5d3SJohn Marino    On some systems, it contains special magic macros that don't work
200*86d7f5d3SJohn Marino    in GCC.  */
201*86d7f5d3SJohn Marino # include <string.h>
202*86d7f5d3SJohn Marino # define my_index	strchr
203*86d7f5d3SJohn Marino #else
204*86d7f5d3SJohn Marino 
205*86d7f5d3SJohn Marino # if HAVE_STRING_H
206*86d7f5d3SJohn Marino #  include <string.h>
207*86d7f5d3SJohn Marino # else
208*86d7f5d3SJohn Marino #  if HAVE_STRINGS_H
209*86d7f5d3SJohn Marino #   include <strings.h>
210*86d7f5d3SJohn Marino #  endif
211*86d7f5d3SJohn Marino # endif
212*86d7f5d3SJohn Marino 
213*86d7f5d3SJohn Marino /* Avoid depending on library functions or files
214*86d7f5d3SJohn Marino    whose names are inconsistent.  */
215*86d7f5d3SJohn Marino 
216*86d7f5d3SJohn Marino #if HAVE_STDLIB_H && HAVE_DECL_GETENV
217*86d7f5d3SJohn Marino #  include <stdlib.h>
218*86d7f5d3SJohn Marino #elif !defined(getenv)
219*86d7f5d3SJohn Marino #  ifdef __cplusplus
220*86d7f5d3SJohn Marino extern "C" {
221*86d7f5d3SJohn Marino #  endif /* __cplusplus */
222*86d7f5d3SJohn Marino extern char *getenv (const char *);
223*86d7f5d3SJohn Marino #  ifdef __cplusplus
224*86d7f5d3SJohn Marino }
225*86d7f5d3SJohn Marino #  endif /* __cplusplus */
226*86d7f5d3SJohn Marino #endif
227*86d7f5d3SJohn Marino 
228*86d7f5d3SJohn Marino static char *
my_index(const char * str,int chr)229*86d7f5d3SJohn Marino my_index (const char *str, int chr)
230*86d7f5d3SJohn Marino {
231*86d7f5d3SJohn Marino   while (*str)
232*86d7f5d3SJohn Marino     {
233*86d7f5d3SJohn Marino       if (*str == chr)
234*86d7f5d3SJohn Marino 	return (char *) str;
235*86d7f5d3SJohn Marino       str++;
236*86d7f5d3SJohn Marino     }
237*86d7f5d3SJohn Marino   return 0;
238*86d7f5d3SJohn Marino }
239*86d7f5d3SJohn Marino 
240*86d7f5d3SJohn Marino /* If using GCC, we can safely declare strlen this way.
241*86d7f5d3SJohn Marino    If not using GCC, it is ok not to declare it.  */
242*86d7f5d3SJohn Marino #ifdef __GNUC__
243*86d7f5d3SJohn Marino /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
244*86d7f5d3SJohn Marino    That was relevant to code that was here before.  */
245*86d7f5d3SJohn Marino # if (!defined __STDC__ || !__STDC__) && !defined strlen
246*86d7f5d3SJohn Marino /* gcc with -traditional declares the built-in strlen to return int,
247*86d7f5d3SJohn Marino    and has done so at least since version 2.4.5. -- rms.  */
248*86d7f5d3SJohn Marino extern int strlen (const char *);
249*86d7f5d3SJohn Marino # endif /* not __STDC__ */
250*86d7f5d3SJohn Marino #endif /* __GNUC__ */
251*86d7f5d3SJohn Marino 
252*86d7f5d3SJohn Marino #endif /* not __GNU_LIBRARY__ */
253*86d7f5d3SJohn Marino 
254*86d7f5d3SJohn Marino /* Handle permutation of arguments.  */
255*86d7f5d3SJohn Marino 
256*86d7f5d3SJohn Marino /* Describe the part of ARGV that contains non-options that have
257*86d7f5d3SJohn Marino    been skipped.  `first_nonopt' is the index in ARGV of the first of them;
258*86d7f5d3SJohn Marino    `last_nonopt' is the index after the last of them.  */
259*86d7f5d3SJohn Marino 
260*86d7f5d3SJohn Marino static int first_nonopt;
261*86d7f5d3SJohn Marino static int last_nonopt;
262*86d7f5d3SJohn Marino 
263*86d7f5d3SJohn Marino #ifdef _LIBC
264*86d7f5d3SJohn Marino /* Bash 2.0 gives us an environment variable containing flags
265*86d7f5d3SJohn Marino    indicating ARGV elements that should not be considered arguments.  */
266*86d7f5d3SJohn Marino 
267*86d7f5d3SJohn Marino /* Defined in getopt_init.c  */
268*86d7f5d3SJohn Marino extern char *__getopt_nonoption_flags;
269*86d7f5d3SJohn Marino 
270*86d7f5d3SJohn Marino static int nonoption_flags_max_len;
271*86d7f5d3SJohn Marino static int nonoption_flags_len;
272*86d7f5d3SJohn Marino 
273*86d7f5d3SJohn Marino static int original_argc;
274*86d7f5d3SJohn Marino static char *const *original_argv;
275*86d7f5d3SJohn Marino 
276*86d7f5d3SJohn Marino /* Make sure the environment variable bash 2.0 puts in the environment
277*86d7f5d3SJohn Marino    is valid for the getopt call we must make sure that the ARGV passed
278*86d7f5d3SJohn Marino    to getopt is that one passed to the process.  */
279*86d7f5d3SJohn Marino static void
280*86d7f5d3SJohn Marino __attribute__ ((unused))
store_args_and_env(int argc,char * const * argv)281*86d7f5d3SJohn Marino store_args_and_env (int argc, char *const *argv)
282*86d7f5d3SJohn Marino {
283*86d7f5d3SJohn Marino   /* XXX This is no good solution.  We should rather copy the args so
284*86d7f5d3SJohn Marino      that we can compare them later.  But we must not use malloc(3).  */
285*86d7f5d3SJohn Marino   original_argc = argc;
286*86d7f5d3SJohn Marino   original_argv = argv;
287*86d7f5d3SJohn Marino }
288*86d7f5d3SJohn Marino # ifdef text_set_element
289*86d7f5d3SJohn Marino text_set_element (__libc_subinit, store_args_and_env);
290*86d7f5d3SJohn Marino # endif /* text_set_element */
291*86d7f5d3SJohn Marino 
292*86d7f5d3SJohn Marino # define SWAP_FLAGS(ch1, ch2) \
293*86d7f5d3SJohn Marino   if (nonoption_flags_len > 0)						      \
294*86d7f5d3SJohn Marino     {									      \
295*86d7f5d3SJohn Marino       char __tmp = __getopt_nonoption_flags[ch1];			      \
296*86d7f5d3SJohn Marino       __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
297*86d7f5d3SJohn Marino       __getopt_nonoption_flags[ch2] = __tmp;				      \
298*86d7f5d3SJohn Marino     }
299*86d7f5d3SJohn Marino #else	/* !_LIBC */
300*86d7f5d3SJohn Marino # define SWAP_FLAGS(ch1, ch2)
301*86d7f5d3SJohn Marino #endif	/* _LIBC */
302*86d7f5d3SJohn Marino 
303*86d7f5d3SJohn Marino /* Exchange two adjacent subsequences of ARGV.
304*86d7f5d3SJohn Marino    One subsequence is elements [first_nonopt,last_nonopt)
305*86d7f5d3SJohn Marino    which contains all the non-options that have been skipped so far.
306*86d7f5d3SJohn Marino    The other is elements [last_nonopt,optind), which contains all
307*86d7f5d3SJohn Marino    the options processed since those non-options were skipped.
308*86d7f5d3SJohn Marino 
309*86d7f5d3SJohn Marino    `first_nonopt' and `last_nonopt' are relocated so that they describe
310*86d7f5d3SJohn Marino    the new indices of the non-options in ARGV after they are moved.  */
311*86d7f5d3SJohn Marino 
312*86d7f5d3SJohn Marino #if defined __STDC__ && __STDC__
313*86d7f5d3SJohn Marino static void exchange (char **);
314*86d7f5d3SJohn Marino #endif
315*86d7f5d3SJohn Marino 
316*86d7f5d3SJohn Marino static void
exchange(char ** argv)317*86d7f5d3SJohn Marino exchange (char **argv)
318*86d7f5d3SJohn Marino {
319*86d7f5d3SJohn Marino   int bottom = first_nonopt;
320*86d7f5d3SJohn Marino   int middle = last_nonopt;
321*86d7f5d3SJohn Marino   int top = optind;
322*86d7f5d3SJohn Marino   char *tem;
323*86d7f5d3SJohn Marino 
324*86d7f5d3SJohn Marino   /* Exchange the shorter segment with the far end of the longer segment.
325*86d7f5d3SJohn Marino      That puts the shorter segment into the right place.
326*86d7f5d3SJohn Marino      It leaves the longer segment in the right place overall,
327*86d7f5d3SJohn Marino      but it consists of two parts that need to be swapped next.  */
328*86d7f5d3SJohn Marino 
329*86d7f5d3SJohn Marino #ifdef _LIBC
330*86d7f5d3SJohn Marino   /* First make sure the handling of the `__getopt_nonoption_flags'
331*86d7f5d3SJohn Marino      string can work normally.  Our top argument must be in the range
332*86d7f5d3SJohn Marino      of the string.  */
333*86d7f5d3SJohn Marino   if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
334*86d7f5d3SJohn Marino     {
335*86d7f5d3SJohn Marino       /* We must extend the array.  The user plays games with us and
336*86d7f5d3SJohn Marino 	 presents new arguments.  */
337*86d7f5d3SJohn Marino       char *new_str = (char *) malloc (top + 1);
338*86d7f5d3SJohn Marino       if (new_str == NULL)
339*86d7f5d3SJohn Marino 	nonoption_flags_len = nonoption_flags_max_len = 0;
340*86d7f5d3SJohn Marino       else
341*86d7f5d3SJohn Marino 	{
342*86d7f5d3SJohn Marino 	  memset (mempcpy (new_str, __getopt_nonoption_flags,
343*86d7f5d3SJohn Marino 			   nonoption_flags_max_len),
344*86d7f5d3SJohn Marino 		  '\0', top + 1 - nonoption_flags_max_len);
345*86d7f5d3SJohn Marino 	  nonoption_flags_max_len = top + 1;
346*86d7f5d3SJohn Marino 	  __getopt_nonoption_flags = new_str;
347*86d7f5d3SJohn Marino 	}
348*86d7f5d3SJohn Marino     }
349*86d7f5d3SJohn Marino #endif
350*86d7f5d3SJohn Marino 
351*86d7f5d3SJohn Marino   while (top > middle && middle > bottom)
352*86d7f5d3SJohn Marino     {
353*86d7f5d3SJohn Marino       if (top - middle > middle - bottom)
354*86d7f5d3SJohn Marino 	{
355*86d7f5d3SJohn Marino 	  /* Bottom segment is the short one.  */
356*86d7f5d3SJohn Marino 	  int len = middle - bottom;
357*86d7f5d3SJohn Marino 	  register int i;
358*86d7f5d3SJohn Marino 
359*86d7f5d3SJohn Marino 	  /* Swap it with the top part of the top segment.  */
360*86d7f5d3SJohn Marino 	  for (i = 0; i < len; i++)
361*86d7f5d3SJohn Marino 	    {
362*86d7f5d3SJohn Marino 	      tem = argv[bottom + i];
363*86d7f5d3SJohn Marino 	      argv[bottom + i] = argv[top - (middle - bottom) + i];
364*86d7f5d3SJohn Marino 	      argv[top - (middle - bottom) + i] = tem;
365*86d7f5d3SJohn Marino 	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
366*86d7f5d3SJohn Marino 	    }
367*86d7f5d3SJohn Marino 	  /* Exclude the moved bottom segment from further swapping.  */
368*86d7f5d3SJohn Marino 	  top -= len;
369*86d7f5d3SJohn Marino 	}
370*86d7f5d3SJohn Marino       else
371*86d7f5d3SJohn Marino 	{
372*86d7f5d3SJohn Marino 	  /* Top segment is the short one.  */
373*86d7f5d3SJohn Marino 	  int len = top - middle;
374*86d7f5d3SJohn Marino 	  register int i;
375*86d7f5d3SJohn Marino 
376*86d7f5d3SJohn Marino 	  /* Swap it with the bottom part of the bottom segment.  */
377*86d7f5d3SJohn Marino 	  for (i = 0; i < len; i++)
378*86d7f5d3SJohn Marino 	    {
379*86d7f5d3SJohn Marino 	      tem = argv[bottom + i];
380*86d7f5d3SJohn Marino 	      argv[bottom + i] = argv[middle + i];
381*86d7f5d3SJohn Marino 	      argv[middle + i] = tem;
382*86d7f5d3SJohn Marino 	      SWAP_FLAGS (bottom + i, middle + i);
383*86d7f5d3SJohn Marino 	    }
384*86d7f5d3SJohn Marino 	  /* Exclude the moved top segment from further swapping.  */
385*86d7f5d3SJohn Marino 	  bottom += len;
386*86d7f5d3SJohn Marino 	}
387*86d7f5d3SJohn Marino     }
388*86d7f5d3SJohn Marino 
389*86d7f5d3SJohn Marino   /* Update records for the slots the non-options now occupy.  */
390*86d7f5d3SJohn Marino 
391*86d7f5d3SJohn Marino   first_nonopt += (optind - last_nonopt);
392*86d7f5d3SJohn Marino   last_nonopt = optind;
393*86d7f5d3SJohn Marino }
394*86d7f5d3SJohn Marino 
395*86d7f5d3SJohn Marino /* Initialize the internal data when the first call is made.  */
396*86d7f5d3SJohn Marino 
397*86d7f5d3SJohn Marino #if defined __STDC__ && __STDC__
398*86d7f5d3SJohn Marino static const char *_getopt_initialize (int, char *const *, const char *);
399*86d7f5d3SJohn Marino #endif
400*86d7f5d3SJohn Marino static const char *
_getopt_initialize(int argc ATTRIBUTE_UNUSED,char * const * argv ATTRIBUTE_UNUSED,const char * optstring)401*86d7f5d3SJohn Marino _getopt_initialize (int argc ATTRIBUTE_UNUSED,
402*86d7f5d3SJohn Marino 		    char *const *argv ATTRIBUTE_UNUSED,
403*86d7f5d3SJohn Marino 		    const char *optstring)
404*86d7f5d3SJohn Marino {
405*86d7f5d3SJohn Marino   /* Start processing options with ARGV-element 1 (since ARGV-element 0
406*86d7f5d3SJohn Marino      is the program name); the sequence of previously skipped
407*86d7f5d3SJohn Marino      non-option ARGV-elements is empty.  */
408*86d7f5d3SJohn Marino 
409*86d7f5d3SJohn Marino   first_nonopt = last_nonopt = optind;
410*86d7f5d3SJohn Marino 
411*86d7f5d3SJohn Marino   nextchar = NULL;
412*86d7f5d3SJohn Marino 
413*86d7f5d3SJohn Marino   posixly_correct = getenv ("POSIXLY_CORRECT");
414*86d7f5d3SJohn Marino 
415*86d7f5d3SJohn Marino   /* Determine how to handle the ordering of options and nonoptions.  */
416*86d7f5d3SJohn Marino 
417*86d7f5d3SJohn Marino   if (optstring[0] == '-')
418*86d7f5d3SJohn Marino     {
419*86d7f5d3SJohn Marino       ordering = RETURN_IN_ORDER;
420*86d7f5d3SJohn Marino       ++optstring;
421*86d7f5d3SJohn Marino     }
422*86d7f5d3SJohn Marino   else if (optstring[0] == '+')
423*86d7f5d3SJohn Marino     {
424*86d7f5d3SJohn Marino       ordering = REQUIRE_ORDER;
425*86d7f5d3SJohn Marino       ++optstring;
426*86d7f5d3SJohn Marino     }
427*86d7f5d3SJohn Marino   else if (posixly_correct != NULL)
428*86d7f5d3SJohn Marino     ordering = REQUIRE_ORDER;
429*86d7f5d3SJohn Marino   else
430*86d7f5d3SJohn Marino     ordering = PERMUTE;
431*86d7f5d3SJohn Marino 
432*86d7f5d3SJohn Marino #ifdef _LIBC
433*86d7f5d3SJohn Marino   if (posixly_correct == NULL
434*86d7f5d3SJohn Marino       && argc == original_argc && argv == original_argv)
435*86d7f5d3SJohn Marino     {
436*86d7f5d3SJohn Marino       if (nonoption_flags_max_len == 0)
437*86d7f5d3SJohn Marino 	{
438*86d7f5d3SJohn Marino 	  if (__getopt_nonoption_flags == NULL
439*86d7f5d3SJohn Marino 	      || __getopt_nonoption_flags[0] == '\0')
440*86d7f5d3SJohn Marino 	    nonoption_flags_max_len = -1;
441*86d7f5d3SJohn Marino 	  else
442*86d7f5d3SJohn Marino 	    {
443*86d7f5d3SJohn Marino 	      const char *orig_str = __getopt_nonoption_flags;
444*86d7f5d3SJohn Marino 	      int len = nonoption_flags_max_len = strlen (orig_str);
445*86d7f5d3SJohn Marino 	      if (nonoption_flags_max_len < argc)
446*86d7f5d3SJohn Marino 		nonoption_flags_max_len = argc;
447*86d7f5d3SJohn Marino 	      __getopt_nonoption_flags =
448*86d7f5d3SJohn Marino 		(char *) malloc (nonoption_flags_max_len);
449*86d7f5d3SJohn Marino 	      if (__getopt_nonoption_flags == NULL)
450*86d7f5d3SJohn Marino 		nonoption_flags_max_len = -1;
451*86d7f5d3SJohn Marino 	      else
452*86d7f5d3SJohn Marino 		memset (mempcpy (__getopt_nonoption_flags, orig_str, len),
453*86d7f5d3SJohn Marino 			'\0', nonoption_flags_max_len - len);
454*86d7f5d3SJohn Marino 	    }
455*86d7f5d3SJohn Marino 	}
456*86d7f5d3SJohn Marino       nonoption_flags_len = nonoption_flags_max_len;
457*86d7f5d3SJohn Marino     }
458*86d7f5d3SJohn Marino   else
459*86d7f5d3SJohn Marino     nonoption_flags_len = 0;
460*86d7f5d3SJohn Marino #endif
461*86d7f5d3SJohn Marino 
462*86d7f5d3SJohn Marino   return optstring;
463*86d7f5d3SJohn Marino }
464*86d7f5d3SJohn Marino 
465*86d7f5d3SJohn Marino /* Scan elements of ARGV (whose length is ARGC) for option characters
466*86d7f5d3SJohn Marino    given in OPTSTRING.
467*86d7f5d3SJohn Marino 
468*86d7f5d3SJohn Marino    If an element of ARGV starts with '-', and is not exactly "-" or "--",
469*86d7f5d3SJohn Marino    then it is an option element.  The characters of this element
470*86d7f5d3SJohn Marino    (aside from the initial '-') are option characters.  If `getopt'
471*86d7f5d3SJohn Marino    is called repeatedly, it returns successively each of the option characters
472*86d7f5d3SJohn Marino    from each of the option elements.
473*86d7f5d3SJohn Marino 
474*86d7f5d3SJohn Marino    If `getopt' finds another option character, it returns that character,
475*86d7f5d3SJohn Marino    updating `optind' and `nextchar' so that the next call to `getopt' can
476*86d7f5d3SJohn Marino    resume the scan with the following option character or ARGV-element.
477*86d7f5d3SJohn Marino 
478*86d7f5d3SJohn Marino    If there are no more option characters, `getopt' returns -1.
479*86d7f5d3SJohn Marino    Then `optind' is the index in ARGV of the first ARGV-element
480*86d7f5d3SJohn Marino    that is not an option.  (The ARGV-elements have been permuted
481*86d7f5d3SJohn Marino    so that those that are not options now come last.)
482*86d7f5d3SJohn Marino 
483*86d7f5d3SJohn Marino    OPTSTRING is a string containing the legitimate option characters.
484*86d7f5d3SJohn Marino    If an option character is seen that is not listed in OPTSTRING,
485*86d7f5d3SJohn Marino    return '?' after printing an error message.  If you set `opterr' to
486*86d7f5d3SJohn Marino    zero, the error message is suppressed but we still return '?'.
487*86d7f5d3SJohn Marino 
488*86d7f5d3SJohn Marino    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
489*86d7f5d3SJohn Marino    so the following text in the same ARGV-element, or the text of the following
490*86d7f5d3SJohn Marino    ARGV-element, is returned in `optarg'.  Two colons mean an option that
491*86d7f5d3SJohn Marino    wants an optional arg; if there is text in the current ARGV-element,
492*86d7f5d3SJohn Marino    it is returned in `optarg', otherwise `optarg' is set to zero.
493*86d7f5d3SJohn Marino 
494*86d7f5d3SJohn Marino    If OPTSTRING starts with `-' or `+', it requests different methods of
495*86d7f5d3SJohn Marino    handling the non-option ARGV-elements.
496*86d7f5d3SJohn Marino    See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
497*86d7f5d3SJohn Marino 
498*86d7f5d3SJohn Marino    Long-named options begin with `--' instead of `-'.
499*86d7f5d3SJohn Marino    Their names may be abbreviated as long as the abbreviation is unique
500*86d7f5d3SJohn Marino    or is an exact match for some defined option.  If they have an
501*86d7f5d3SJohn Marino    argument, it follows the option name in the same ARGV-element, separated
502*86d7f5d3SJohn Marino    from the option name by a `=', or else the in next ARGV-element.
503*86d7f5d3SJohn Marino    When `getopt' finds a long-named option, it returns 0 if that option's
504*86d7f5d3SJohn Marino    `flag' field is nonzero, the value of the option's `val' field
505*86d7f5d3SJohn Marino    if the `flag' field is zero.
506*86d7f5d3SJohn Marino 
507*86d7f5d3SJohn Marino    The elements of ARGV aren't really const, because we permute them.
508*86d7f5d3SJohn Marino    But we pretend they're const in the prototype to be compatible
509*86d7f5d3SJohn Marino    with other systems.
510*86d7f5d3SJohn Marino 
511*86d7f5d3SJohn Marino    LONGOPTS is a vector of `struct option' terminated by an
512*86d7f5d3SJohn Marino    element containing a name which is zero.
513*86d7f5d3SJohn Marino 
514*86d7f5d3SJohn Marino    LONGIND returns the index in LONGOPT of the long-named option found.
515*86d7f5d3SJohn Marino    It is only valid when a long-named option has been found by the most
516*86d7f5d3SJohn Marino    recent call.
517*86d7f5d3SJohn Marino 
518*86d7f5d3SJohn Marino    If LONG_ONLY is nonzero, '-' as well as '--' can introduce
519*86d7f5d3SJohn Marino    long-named options.  */
520*86d7f5d3SJohn Marino 
521*86d7f5d3SJohn Marino int
_getopt_internal(int argc,char * const * argv,const char * optstring,const struct option * longopts,int * longind,int long_only)522*86d7f5d3SJohn Marino _getopt_internal (int argc, char *const *argv, const char *optstring,
523*86d7f5d3SJohn Marino                   const struct option *longopts,
524*86d7f5d3SJohn Marino                   int *longind, int long_only)
525*86d7f5d3SJohn Marino {
526*86d7f5d3SJohn Marino   optarg = NULL;
527*86d7f5d3SJohn Marino 
528*86d7f5d3SJohn Marino   if (optind == 0 || !__getopt_initialized)
529*86d7f5d3SJohn Marino     {
530*86d7f5d3SJohn Marino       if (optind == 0)
531*86d7f5d3SJohn Marino 	optind = 1;	/* Don't scan ARGV[0], the program name.  */
532*86d7f5d3SJohn Marino       optstring = _getopt_initialize (argc, argv, optstring);
533*86d7f5d3SJohn Marino       __getopt_initialized = 1;
534*86d7f5d3SJohn Marino     }
535*86d7f5d3SJohn Marino 
536*86d7f5d3SJohn Marino   /* Test whether ARGV[optind] points to a non-option argument.
537*86d7f5d3SJohn Marino      Either it does not have option syntax, or there is an environment flag
538*86d7f5d3SJohn Marino      from the shell indicating it is not an option.  The later information
539*86d7f5d3SJohn Marino      is only used when the used in the GNU libc.  */
540*86d7f5d3SJohn Marino #ifdef _LIBC
541*86d7f5d3SJohn Marino # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \
542*86d7f5d3SJohn Marino 		      || (optind < nonoption_flags_len			      \
543*86d7f5d3SJohn Marino 			  && __getopt_nonoption_flags[optind] == '1'))
544*86d7f5d3SJohn Marino #else
545*86d7f5d3SJohn Marino # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
546*86d7f5d3SJohn Marino #endif
547*86d7f5d3SJohn Marino 
548*86d7f5d3SJohn Marino   if (nextchar == NULL || *nextchar == '\0')
549*86d7f5d3SJohn Marino     {
550*86d7f5d3SJohn Marino       /* Advance to the next ARGV-element.  */
551*86d7f5d3SJohn Marino 
552*86d7f5d3SJohn Marino       /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
553*86d7f5d3SJohn Marino 	 moved back by the user (who may also have changed the arguments).  */
554*86d7f5d3SJohn Marino       if (last_nonopt > optind)
555*86d7f5d3SJohn Marino 	last_nonopt = optind;
556*86d7f5d3SJohn Marino       if (first_nonopt > optind)
557*86d7f5d3SJohn Marino 	first_nonopt = optind;
558*86d7f5d3SJohn Marino 
559*86d7f5d3SJohn Marino       if (ordering == PERMUTE)
560*86d7f5d3SJohn Marino 	{
561*86d7f5d3SJohn Marino 	  /* If we have just processed some options following some non-options,
562*86d7f5d3SJohn Marino 	     exchange them so that the options come first.  */
563*86d7f5d3SJohn Marino 
564*86d7f5d3SJohn Marino 	  if (first_nonopt != last_nonopt && last_nonopt != optind)
565*86d7f5d3SJohn Marino 	    exchange ((char **) argv);
566*86d7f5d3SJohn Marino 	  else if (last_nonopt != optind)
567*86d7f5d3SJohn Marino 	    first_nonopt = optind;
568*86d7f5d3SJohn Marino 
569*86d7f5d3SJohn Marino 	  /* Skip any additional non-options
570*86d7f5d3SJohn Marino 	     and extend the range of non-options previously skipped.  */
571*86d7f5d3SJohn Marino 
572*86d7f5d3SJohn Marino 	  while (optind < argc && NONOPTION_P)
573*86d7f5d3SJohn Marino 	    optind++;
574*86d7f5d3SJohn Marino 	  last_nonopt = optind;
575*86d7f5d3SJohn Marino 	}
576*86d7f5d3SJohn Marino 
577*86d7f5d3SJohn Marino       /* The special ARGV-element `--' means premature end of options.
578*86d7f5d3SJohn Marino 	 Skip it like a null option,
579*86d7f5d3SJohn Marino 	 then exchange with previous non-options as if it were an option,
580*86d7f5d3SJohn Marino 	 then skip everything else like a non-option.  */
581*86d7f5d3SJohn Marino 
582*86d7f5d3SJohn Marino       if (optind != argc && !strcmp (argv[optind], "--"))
583*86d7f5d3SJohn Marino 	{
584*86d7f5d3SJohn Marino 	  optind++;
585*86d7f5d3SJohn Marino 
586*86d7f5d3SJohn Marino 	  if (first_nonopt != last_nonopt && last_nonopt != optind)
587*86d7f5d3SJohn Marino 	    exchange ((char **) argv);
588*86d7f5d3SJohn Marino 	  else if (first_nonopt == last_nonopt)
589*86d7f5d3SJohn Marino 	    first_nonopt = optind;
590*86d7f5d3SJohn Marino 	  last_nonopt = argc;
591*86d7f5d3SJohn Marino 
592*86d7f5d3SJohn Marino 	  optind = argc;
593*86d7f5d3SJohn Marino 	}
594*86d7f5d3SJohn Marino 
595*86d7f5d3SJohn Marino       /* If we have done all the ARGV-elements, stop the scan
596*86d7f5d3SJohn Marino 	 and back over any non-options that we skipped and permuted.  */
597*86d7f5d3SJohn Marino 
598*86d7f5d3SJohn Marino       if (optind == argc)
599*86d7f5d3SJohn Marino 	{
600*86d7f5d3SJohn Marino 	  /* Set the next-arg-index to point at the non-options
601*86d7f5d3SJohn Marino 	     that we previously skipped, so the caller will digest them.  */
602*86d7f5d3SJohn Marino 	  if (first_nonopt != last_nonopt)
603*86d7f5d3SJohn Marino 	    optind = first_nonopt;
604*86d7f5d3SJohn Marino 	  return -1;
605*86d7f5d3SJohn Marino 	}
606*86d7f5d3SJohn Marino 
607*86d7f5d3SJohn Marino       /* If we have come to a non-option and did not permute it,
608*86d7f5d3SJohn Marino 	 either stop the scan or describe it to the caller and pass it by.  */
609*86d7f5d3SJohn Marino 
610*86d7f5d3SJohn Marino       if (NONOPTION_P)
611*86d7f5d3SJohn Marino 	{
612*86d7f5d3SJohn Marino 	  if (ordering == REQUIRE_ORDER)
613*86d7f5d3SJohn Marino 	    return -1;
614*86d7f5d3SJohn Marino 	  optarg = argv[optind++];
615*86d7f5d3SJohn Marino 	  return 1;
616*86d7f5d3SJohn Marino 	}
617*86d7f5d3SJohn Marino 
618*86d7f5d3SJohn Marino       /* We have found another option-ARGV-element.
619*86d7f5d3SJohn Marino 	 Skip the initial punctuation.  */
620*86d7f5d3SJohn Marino 
621*86d7f5d3SJohn Marino       nextchar = (argv[optind] + 1
622*86d7f5d3SJohn Marino 		  + (longopts != NULL && argv[optind][1] == '-'));
623*86d7f5d3SJohn Marino     }
624*86d7f5d3SJohn Marino 
625*86d7f5d3SJohn Marino   /* Decode the current option-ARGV-element.  */
626*86d7f5d3SJohn Marino 
627*86d7f5d3SJohn Marino   /* Check whether the ARGV-element is a long option.
628*86d7f5d3SJohn Marino 
629*86d7f5d3SJohn Marino      If long_only and the ARGV-element has the form "-f", where f is
630*86d7f5d3SJohn Marino      a valid short option, don't consider it an abbreviated form of
631*86d7f5d3SJohn Marino      a long option that starts with f.  Otherwise there would be no
632*86d7f5d3SJohn Marino      way to give the -f short option.
633*86d7f5d3SJohn Marino 
634*86d7f5d3SJohn Marino      On the other hand, if there's a long option "fubar" and
635*86d7f5d3SJohn Marino      the ARGV-element is "-fu", do consider that an abbreviation of
636*86d7f5d3SJohn Marino      the long option, just like "--fu", and not "-f" with arg "u".
637*86d7f5d3SJohn Marino 
638*86d7f5d3SJohn Marino      This distinction seems to be the most useful approach.  */
639*86d7f5d3SJohn Marino 
640*86d7f5d3SJohn Marino   if (longopts != NULL
641*86d7f5d3SJohn Marino       && (argv[optind][1] == '-'
642*86d7f5d3SJohn Marino 	  || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
643*86d7f5d3SJohn Marino     {
644*86d7f5d3SJohn Marino       char *nameend;
645*86d7f5d3SJohn Marino       const struct option *p;
646*86d7f5d3SJohn Marino       const struct option *pfound = NULL;
647*86d7f5d3SJohn Marino       int exact = 0;
648*86d7f5d3SJohn Marino       int ambig = 0;
649*86d7f5d3SJohn Marino       int indfound = -1;
650*86d7f5d3SJohn Marino       int option_index;
651*86d7f5d3SJohn Marino 
652*86d7f5d3SJohn Marino       for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
653*86d7f5d3SJohn Marino 	/* Do nothing.  */ ;
654*86d7f5d3SJohn Marino 
655*86d7f5d3SJohn Marino       /* Test all long options for either exact match
656*86d7f5d3SJohn Marino 	 or abbreviated matches.  */
657*86d7f5d3SJohn Marino       for (p = longopts, option_index = 0; p->name; p++, option_index++)
658*86d7f5d3SJohn Marino 	if (!strncmp (p->name, nextchar, nameend - nextchar))
659*86d7f5d3SJohn Marino 	  {
660*86d7f5d3SJohn Marino 	    if ((unsigned int) (nameend - nextchar)
661*86d7f5d3SJohn Marino 		== (unsigned int) strlen (p->name))
662*86d7f5d3SJohn Marino 	      {
663*86d7f5d3SJohn Marino 		/* Exact match found.  */
664*86d7f5d3SJohn Marino 		pfound = p;
665*86d7f5d3SJohn Marino 		indfound = option_index;
666*86d7f5d3SJohn Marino 		exact = 1;
667*86d7f5d3SJohn Marino 		break;
668*86d7f5d3SJohn Marino 	      }
669*86d7f5d3SJohn Marino 	    else if (pfound == NULL)
670*86d7f5d3SJohn Marino 	      {
671*86d7f5d3SJohn Marino 		/* First nonexact match found.  */
672*86d7f5d3SJohn Marino 		pfound = p;
673*86d7f5d3SJohn Marino 		indfound = option_index;
674*86d7f5d3SJohn Marino 	      }
675*86d7f5d3SJohn Marino 	    else
676*86d7f5d3SJohn Marino 	      /* Second or later nonexact match found.  */
677*86d7f5d3SJohn Marino 	      ambig = 1;
678*86d7f5d3SJohn Marino 	  }
679*86d7f5d3SJohn Marino 
680*86d7f5d3SJohn Marino       if (ambig && !exact)
681*86d7f5d3SJohn Marino 	{
682*86d7f5d3SJohn Marino 	  if (opterr)
683*86d7f5d3SJohn Marino 	    fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
684*86d7f5d3SJohn Marino 		     argv[0], argv[optind]);
685*86d7f5d3SJohn Marino 	  nextchar += strlen (nextchar);
686*86d7f5d3SJohn Marino 	  optind++;
687*86d7f5d3SJohn Marino 	  optopt = 0;
688*86d7f5d3SJohn Marino 	  return '?';
689*86d7f5d3SJohn Marino 	}
690*86d7f5d3SJohn Marino 
691*86d7f5d3SJohn Marino       if (pfound != NULL)
692*86d7f5d3SJohn Marino 	{
693*86d7f5d3SJohn Marino 	  option_index = indfound;
694*86d7f5d3SJohn Marino 	  optind++;
695*86d7f5d3SJohn Marino 	  if (*nameend)
696*86d7f5d3SJohn Marino 	    {
697*86d7f5d3SJohn Marino 	      /* Don't test has_arg with >, because some C compilers don't
698*86d7f5d3SJohn Marino 		 allow it to be used on enums.  */
699*86d7f5d3SJohn Marino 	      if (pfound->has_arg)
700*86d7f5d3SJohn Marino 		optarg = nameend + 1;
701*86d7f5d3SJohn Marino 	      else
702*86d7f5d3SJohn Marino 		{
703*86d7f5d3SJohn Marino 		  if (opterr)
704*86d7f5d3SJohn Marino 		    {
705*86d7f5d3SJohn Marino 		      if (argv[optind - 1][1] == '-')
706*86d7f5d3SJohn Marino 			/* --option */
707*86d7f5d3SJohn Marino 			fprintf (stderr,
708*86d7f5d3SJohn Marino 				 _("%s: option `--%s' doesn't allow an argument\n"),
709*86d7f5d3SJohn Marino 				 argv[0], pfound->name);
710*86d7f5d3SJohn Marino 		      else
711*86d7f5d3SJohn Marino 			/* +option or -option */
712*86d7f5d3SJohn Marino 			fprintf (stderr,
713*86d7f5d3SJohn Marino 				 _("%s: option `%c%s' doesn't allow an argument\n"),
714*86d7f5d3SJohn Marino 				 argv[0], argv[optind - 1][0], pfound->name);
715*86d7f5d3SJohn Marino 
716*86d7f5d3SJohn Marino 		      nextchar += strlen (nextchar);
717*86d7f5d3SJohn Marino 
718*86d7f5d3SJohn Marino 		      optopt = pfound->val;
719*86d7f5d3SJohn Marino 		      return '?';
720*86d7f5d3SJohn Marino 		    }
721*86d7f5d3SJohn Marino 		}
722*86d7f5d3SJohn Marino 	    }
723*86d7f5d3SJohn Marino 	  else if (pfound->has_arg == 1)
724*86d7f5d3SJohn Marino 	    {
725*86d7f5d3SJohn Marino 	      if (optind < argc)
726*86d7f5d3SJohn Marino 		optarg = argv[optind++];
727*86d7f5d3SJohn Marino 	      else
728*86d7f5d3SJohn Marino 		{
729*86d7f5d3SJohn Marino 		  if (opterr)
730*86d7f5d3SJohn Marino 		    fprintf (stderr,
731*86d7f5d3SJohn Marino 			   _("%s: option `%s' requires an argument\n"),
732*86d7f5d3SJohn Marino 			   argv[0], argv[optind - 1]);
733*86d7f5d3SJohn Marino 		  nextchar += strlen (nextchar);
734*86d7f5d3SJohn Marino 		  optopt = pfound->val;
735*86d7f5d3SJohn Marino 		  return optstring[0] == ':' ? ':' : '?';
736*86d7f5d3SJohn Marino 		}
737*86d7f5d3SJohn Marino 	    }
738*86d7f5d3SJohn Marino 	  nextchar += strlen (nextchar);
739*86d7f5d3SJohn Marino 	  if (longind != NULL)
740*86d7f5d3SJohn Marino 	    *longind = option_index;
741*86d7f5d3SJohn Marino 	  if (pfound->flag)
742*86d7f5d3SJohn Marino 	    {
743*86d7f5d3SJohn Marino 	      *(pfound->flag) = pfound->val;
744*86d7f5d3SJohn Marino 	      return 0;
745*86d7f5d3SJohn Marino 	    }
746*86d7f5d3SJohn Marino 	  return pfound->val;
747*86d7f5d3SJohn Marino 	}
748*86d7f5d3SJohn Marino 
749*86d7f5d3SJohn Marino       /* Can't find it as a long option.  If this is not getopt_long_only,
750*86d7f5d3SJohn Marino 	 or the option starts with '--' or is not a valid short
751*86d7f5d3SJohn Marino 	 option, then it's an error.
752*86d7f5d3SJohn Marino 	 Otherwise interpret it as a short option.  */
753*86d7f5d3SJohn Marino       if (!long_only || argv[optind][1] == '-'
754*86d7f5d3SJohn Marino 	  || my_index (optstring, *nextchar) == NULL)
755*86d7f5d3SJohn Marino 	{
756*86d7f5d3SJohn Marino 	  if (opterr)
757*86d7f5d3SJohn Marino 	    {
758*86d7f5d3SJohn Marino 	      if (argv[optind][1] == '-')
759*86d7f5d3SJohn Marino 		/* --option */
760*86d7f5d3SJohn Marino 		fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
761*86d7f5d3SJohn Marino 			 argv[0], nextchar);
762*86d7f5d3SJohn Marino 	      else
763*86d7f5d3SJohn Marino 		/* +option or -option */
764*86d7f5d3SJohn Marino 		fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
765*86d7f5d3SJohn Marino 			 argv[0], argv[optind][0], nextchar);
766*86d7f5d3SJohn Marino 	    }
767*86d7f5d3SJohn Marino 	  nextchar = (char *) "";
768*86d7f5d3SJohn Marino 	  optind++;
769*86d7f5d3SJohn Marino 	  optopt = 0;
770*86d7f5d3SJohn Marino 	  return '?';
771*86d7f5d3SJohn Marino 	}
772*86d7f5d3SJohn Marino     }
773*86d7f5d3SJohn Marino 
774*86d7f5d3SJohn Marino   /* Look at and handle the next short option-character.  */
775*86d7f5d3SJohn Marino 
776*86d7f5d3SJohn Marino   {
777*86d7f5d3SJohn Marino     char c = *nextchar++;
778*86d7f5d3SJohn Marino     char *temp = my_index (optstring, c);
779*86d7f5d3SJohn Marino 
780*86d7f5d3SJohn Marino     /* Increment `optind' when we start to process its last character.  */
781*86d7f5d3SJohn Marino     if (*nextchar == '\0')
782*86d7f5d3SJohn Marino       ++optind;
783*86d7f5d3SJohn Marino 
784*86d7f5d3SJohn Marino     if (temp == NULL || c == ':')
785*86d7f5d3SJohn Marino       {
786*86d7f5d3SJohn Marino 	if (opterr)
787*86d7f5d3SJohn Marino 	  {
788*86d7f5d3SJohn Marino 	    if (posixly_correct)
789*86d7f5d3SJohn Marino 	      /* 1003.2 specifies the format of this message.  */
790*86d7f5d3SJohn Marino 	      fprintf (stderr, _("%s: illegal option -- %c\n"),
791*86d7f5d3SJohn Marino 		       argv[0], c);
792*86d7f5d3SJohn Marino 	    else
793*86d7f5d3SJohn Marino 	      fprintf (stderr, _("%s: invalid option -- %c\n"),
794*86d7f5d3SJohn Marino 		       argv[0], c);
795*86d7f5d3SJohn Marino 	  }
796*86d7f5d3SJohn Marino 	optopt = c;
797*86d7f5d3SJohn Marino 	return '?';
798*86d7f5d3SJohn Marino       }
799*86d7f5d3SJohn Marino     /* Convenience. Treat POSIX -W foo same as long option --foo */
800*86d7f5d3SJohn Marino     if (temp[0] == 'W' && temp[1] == ';')
801*86d7f5d3SJohn Marino       {
802*86d7f5d3SJohn Marino 	char *nameend;
803*86d7f5d3SJohn Marino 	const struct option *p;
804*86d7f5d3SJohn Marino 	const struct option *pfound = NULL;
805*86d7f5d3SJohn Marino 	int exact = 0;
806*86d7f5d3SJohn Marino 	int ambig = 0;
807*86d7f5d3SJohn Marino 	int indfound = 0;
808*86d7f5d3SJohn Marino 	int option_index;
809*86d7f5d3SJohn Marino 
810*86d7f5d3SJohn Marino 	/* This is an option that requires an argument.  */
811*86d7f5d3SJohn Marino 	if (*nextchar != '\0')
812*86d7f5d3SJohn Marino 	  {
813*86d7f5d3SJohn Marino 	    optarg = nextchar;
814*86d7f5d3SJohn Marino 	    /* If we end this ARGV-element by taking the rest as an arg,
815*86d7f5d3SJohn Marino 	       we must advance to the next element now.  */
816*86d7f5d3SJohn Marino 	    optind++;
817*86d7f5d3SJohn Marino 	  }
818*86d7f5d3SJohn Marino 	else if (optind == argc)
819*86d7f5d3SJohn Marino 	  {
820*86d7f5d3SJohn Marino 	    if (opterr)
821*86d7f5d3SJohn Marino 	      {
822*86d7f5d3SJohn Marino 		/* 1003.2 specifies the format of this message.  */
823*86d7f5d3SJohn Marino 		fprintf (stderr, _("%s: option requires an argument -- %c\n"),
824*86d7f5d3SJohn Marino 			 argv[0], c);
825*86d7f5d3SJohn Marino 	      }
826*86d7f5d3SJohn Marino 	    optopt = c;
827*86d7f5d3SJohn Marino 	    if (optstring[0] == ':')
828*86d7f5d3SJohn Marino 	      c = ':';
829*86d7f5d3SJohn Marino 	    else
830*86d7f5d3SJohn Marino 	      c = '?';
831*86d7f5d3SJohn Marino 	    return c;
832*86d7f5d3SJohn Marino 	  }
833*86d7f5d3SJohn Marino 	else
834*86d7f5d3SJohn Marino 	  /* We already incremented `optind' once;
835*86d7f5d3SJohn Marino 	     increment it again when taking next ARGV-elt as argument.  */
836*86d7f5d3SJohn Marino 	  optarg = argv[optind++];
837*86d7f5d3SJohn Marino 
838*86d7f5d3SJohn Marino 	/* optarg is now the argument, see if it's in the
839*86d7f5d3SJohn Marino 	   table of longopts.  */
840*86d7f5d3SJohn Marino 
841*86d7f5d3SJohn Marino 	for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
842*86d7f5d3SJohn Marino 	  /* Do nothing.  */ ;
843*86d7f5d3SJohn Marino 
844*86d7f5d3SJohn Marino 	/* Test all long options for either exact match
845*86d7f5d3SJohn Marino 	   or abbreviated matches.  */
846*86d7f5d3SJohn Marino 	for (p = longopts, option_index = 0; p->name; p++, option_index++)
847*86d7f5d3SJohn Marino 	  if (!strncmp (p->name, nextchar, nameend - nextchar))
848*86d7f5d3SJohn Marino 	    {
849*86d7f5d3SJohn Marino 	      if ((unsigned int) (nameend - nextchar) == strlen (p->name))
850*86d7f5d3SJohn Marino 		{
851*86d7f5d3SJohn Marino 		  /* Exact match found.  */
852*86d7f5d3SJohn Marino 		  pfound = p;
853*86d7f5d3SJohn Marino 		  indfound = option_index;
854*86d7f5d3SJohn Marino 		  exact = 1;
855*86d7f5d3SJohn Marino 		  break;
856*86d7f5d3SJohn Marino 		}
857*86d7f5d3SJohn Marino 	      else if (pfound == NULL)
858*86d7f5d3SJohn Marino 		{
859*86d7f5d3SJohn Marino 		  /* First nonexact match found.  */
860*86d7f5d3SJohn Marino 		  pfound = p;
861*86d7f5d3SJohn Marino 		  indfound = option_index;
862*86d7f5d3SJohn Marino 		}
863*86d7f5d3SJohn Marino 	      else
864*86d7f5d3SJohn Marino 		/* Second or later nonexact match found.  */
865*86d7f5d3SJohn Marino 		ambig = 1;
866*86d7f5d3SJohn Marino 	    }
867*86d7f5d3SJohn Marino 	if (ambig && !exact)
868*86d7f5d3SJohn Marino 	  {
869*86d7f5d3SJohn Marino 	    if (opterr)
870*86d7f5d3SJohn Marino 	      fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
871*86d7f5d3SJohn Marino 		       argv[0], argv[optind]);
872*86d7f5d3SJohn Marino 	    nextchar += strlen (nextchar);
873*86d7f5d3SJohn Marino 	    optind++;
874*86d7f5d3SJohn Marino 	    return '?';
875*86d7f5d3SJohn Marino 	  }
876*86d7f5d3SJohn Marino 	if (pfound != NULL)
877*86d7f5d3SJohn Marino 	  {
878*86d7f5d3SJohn Marino 	    option_index = indfound;
879*86d7f5d3SJohn Marino 	    if (*nameend)
880*86d7f5d3SJohn Marino 	      {
881*86d7f5d3SJohn Marino 		/* Don't test has_arg with >, because some C compilers don't
882*86d7f5d3SJohn Marino 		   allow it to be used on enums.  */
883*86d7f5d3SJohn Marino 		if (pfound->has_arg)
884*86d7f5d3SJohn Marino 		  optarg = nameend + 1;
885*86d7f5d3SJohn Marino 		else
886*86d7f5d3SJohn Marino 		  {
887*86d7f5d3SJohn Marino 		    if (opterr)
888*86d7f5d3SJohn Marino 		      fprintf (stderr, _("\
889*86d7f5d3SJohn Marino %s: option `-W %s' doesn't allow an argument\n"),
890*86d7f5d3SJohn Marino 			       argv[0], pfound->name);
891*86d7f5d3SJohn Marino 
892*86d7f5d3SJohn Marino 		    nextchar += strlen (nextchar);
893*86d7f5d3SJohn Marino 		    return '?';
894*86d7f5d3SJohn Marino 		  }
895*86d7f5d3SJohn Marino 	      }
896*86d7f5d3SJohn Marino 	    else if (pfound->has_arg == 1)
897*86d7f5d3SJohn Marino 	      {
898*86d7f5d3SJohn Marino 		if (optind < argc)
899*86d7f5d3SJohn Marino 		  optarg = argv[optind++];
900*86d7f5d3SJohn Marino 		else
901*86d7f5d3SJohn Marino 		  {
902*86d7f5d3SJohn Marino 		    if (opterr)
903*86d7f5d3SJohn Marino 		      fprintf (stderr,
904*86d7f5d3SJohn Marino 			       _("%s: option `%s' requires an argument\n"),
905*86d7f5d3SJohn Marino 			       argv[0], argv[optind - 1]);
906*86d7f5d3SJohn Marino 		    nextchar += strlen (nextchar);
907*86d7f5d3SJohn Marino 		    return optstring[0] == ':' ? ':' : '?';
908*86d7f5d3SJohn Marino 		  }
909*86d7f5d3SJohn Marino 	      }
910*86d7f5d3SJohn Marino 	    nextchar += strlen (nextchar);
911*86d7f5d3SJohn Marino 	    if (longind != NULL)
912*86d7f5d3SJohn Marino 	      *longind = option_index;
913*86d7f5d3SJohn Marino 	    if (pfound->flag)
914*86d7f5d3SJohn Marino 	      {
915*86d7f5d3SJohn Marino 		*(pfound->flag) = pfound->val;
916*86d7f5d3SJohn Marino 		return 0;
917*86d7f5d3SJohn Marino 	      }
918*86d7f5d3SJohn Marino 	    return pfound->val;
919*86d7f5d3SJohn Marino 	  }
920*86d7f5d3SJohn Marino 	  nextchar = NULL;
921*86d7f5d3SJohn Marino 	  return 'W';	/* Let the application handle it.   */
922*86d7f5d3SJohn Marino       }
923*86d7f5d3SJohn Marino     if (temp[1] == ':')
924*86d7f5d3SJohn Marino       {
925*86d7f5d3SJohn Marino 	if (temp[2] == ':')
926*86d7f5d3SJohn Marino 	  {
927*86d7f5d3SJohn Marino 	    /* This is an option that accepts an argument optionally.  */
928*86d7f5d3SJohn Marino 	    if (*nextchar != '\0')
929*86d7f5d3SJohn Marino 	      {
930*86d7f5d3SJohn Marino 		optarg = nextchar;
931*86d7f5d3SJohn Marino 		optind++;
932*86d7f5d3SJohn Marino 	      }
933*86d7f5d3SJohn Marino 	    else
934*86d7f5d3SJohn Marino 	      optarg = NULL;
935*86d7f5d3SJohn Marino 	    nextchar = NULL;
936*86d7f5d3SJohn Marino 	  }
937*86d7f5d3SJohn Marino 	else
938*86d7f5d3SJohn Marino 	  {
939*86d7f5d3SJohn Marino 	    /* This is an option that requires an argument.  */
940*86d7f5d3SJohn Marino 	    if (*nextchar != '\0')
941*86d7f5d3SJohn Marino 	      {
942*86d7f5d3SJohn Marino 		optarg = nextchar;
943*86d7f5d3SJohn Marino 		/* If we end this ARGV-element by taking the rest as an arg,
944*86d7f5d3SJohn Marino 		   we must advance to the next element now.  */
945*86d7f5d3SJohn Marino 		optind++;
946*86d7f5d3SJohn Marino 	      }
947*86d7f5d3SJohn Marino 	    else if (optind == argc)
948*86d7f5d3SJohn Marino 	      {
949*86d7f5d3SJohn Marino 		if (opterr)
950*86d7f5d3SJohn Marino 		  {
951*86d7f5d3SJohn Marino 		    /* 1003.2 specifies the format of this message.  */
952*86d7f5d3SJohn Marino 		    fprintf (stderr,
953*86d7f5d3SJohn Marino 			   _("%s: option requires an argument -- %c\n"),
954*86d7f5d3SJohn Marino 			   argv[0], c);
955*86d7f5d3SJohn Marino 		  }
956*86d7f5d3SJohn Marino 		optopt = c;
957*86d7f5d3SJohn Marino 		if (optstring[0] == ':')
958*86d7f5d3SJohn Marino 		  c = ':';
959*86d7f5d3SJohn Marino 		else
960*86d7f5d3SJohn Marino 		  c = '?';
961*86d7f5d3SJohn Marino 	      }
962*86d7f5d3SJohn Marino 	    else
963*86d7f5d3SJohn Marino 	      /* We already incremented `optind' once;
964*86d7f5d3SJohn Marino 		 increment it again when taking next ARGV-elt as argument.  */
965*86d7f5d3SJohn Marino 	      optarg = argv[optind++];
966*86d7f5d3SJohn Marino 	    nextchar = NULL;
967*86d7f5d3SJohn Marino 	  }
968*86d7f5d3SJohn Marino       }
969*86d7f5d3SJohn Marino     return c;
970*86d7f5d3SJohn Marino   }
971*86d7f5d3SJohn Marino }
972*86d7f5d3SJohn Marino 
973*86d7f5d3SJohn Marino int
getopt(int argc,char * const * argv,const char * optstring)974*86d7f5d3SJohn Marino getopt (int argc, char *const *argv, const char *optstring)
975*86d7f5d3SJohn Marino {
976*86d7f5d3SJohn Marino   return _getopt_internal (argc, argv, optstring,
977*86d7f5d3SJohn Marino 			   (const struct option *) 0,
978*86d7f5d3SJohn Marino 			   (int *) 0,
979*86d7f5d3SJohn Marino 			   0);
980*86d7f5d3SJohn Marino }
981*86d7f5d3SJohn Marino 
982*86d7f5d3SJohn Marino #endif	/* Not ELIDE_CODE.  */
983*86d7f5d3SJohn Marino 
984*86d7f5d3SJohn Marino #ifdef TEST
985*86d7f5d3SJohn Marino 
986*86d7f5d3SJohn Marino /* Compile with -DTEST to make an executable for use in testing
987*86d7f5d3SJohn Marino    the above definition of `getopt'.  */
988*86d7f5d3SJohn Marino 
989*86d7f5d3SJohn Marino int
main(int argc,char ** argv)990*86d7f5d3SJohn Marino main (int argc, char **argv)
991*86d7f5d3SJohn Marino {
992*86d7f5d3SJohn Marino   int c;
993*86d7f5d3SJohn Marino   int digit_optind = 0;
994*86d7f5d3SJohn Marino 
995*86d7f5d3SJohn Marino   while (1)
996*86d7f5d3SJohn Marino     {
997*86d7f5d3SJohn Marino       int this_option_optind = optind ? optind : 1;
998*86d7f5d3SJohn Marino 
999*86d7f5d3SJohn Marino       c = getopt (argc, argv, "abc:d:0123456789");
1000*86d7f5d3SJohn Marino       if (c == -1)
1001*86d7f5d3SJohn Marino 	break;
1002*86d7f5d3SJohn Marino 
1003*86d7f5d3SJohn Marino       switch (c)
1004*86d7f5d3SJohn Marino 	{
1005*86d7f5d3SJohn Marino 	case '0':
1006*86d7f5d3SJohn Marino 	case '1':
1007*86d7f5d3SJohn Marino 	case '2':
1008*86d7f5d3SJohn Marino 	case '3':
1009*86d7f5d3SJohn Marino 	case '4':
1010*86d7f5d3SJohn Marino 	case '5':
1011*86d7f5d3SJohn Marino 	case '6':
1012*86d7f5d3SJohn Marino 	case '7':
1013*86d7f5d3SJohn Marino 	case '8':
1014*86d7f5d3SJohn Marino 	case '9':
1015*86d7f5d3SJohn Marino 	  if (digit_optind != 0 && digit_optind != this_option_optind)
1016*86d7f5d3SJohn Marino 	    printf ("digits occur in two different argv-elements.\n");
1017*86d7f5d3SJohn Marino 	  digit_optind = this_option_optind;
1018*86d7f5d3SJohn Marino 	  printf ("option %c\n", c);
1019*86d7f5d3SJohn Marino 	  break;
1020*86d7f5d3SJohn Marino 
1021*86d7f5d3SJohn Marino 	case 'a':
1022*86d7f5d3SJohn Marino 	  printf ("option a\n");
1023*86d7f5d3SJohn Marino 	  break;
1024*86d7f5d3SJohn Marino 
1025*86d7f5d3SJohn Marino 	case 'b':
1026*86d7f5d3SJohn Marino 	  printf ("option b\n");
1027*86d7f5d3SJohn Marino 	  break;
1028*86d7f5d3SJohn Marino 
1029*86d7f5d3SJohn Marino 	case 'c':
1030*86d7f5d3SJohn Marino 	  printf ("option c with value `%s'\n", optarg);
1031*86d7f5d3SJohn Marino 	  break;
1032*86d7f5d3SJohn Marino 
1033*86d7f5d3SJohn Marino 	case '?':
1034*86d7f5d3SJohn Marino 	  break;
1035*86d7f5d3SJohn Marino 
1036*86d7f5d3SJohn Marino 	default:
1037*86d7f5d3SJohn Marino 	  printf ("?? getopt returned character code 0%o ??\n", c);
1038*86d7f5d3SJohn Marino 	}
1039*86d7f5d3SJohn Marino     }
1040*86d7f5d3SJohn Marino 
1041*86d7f5d3SJohn Marino   if (optind < argc)
1042*86d7f5d3SJohn Marino     {
1043*86d7f5d3SJohn Marino       printf ("non-option ARGV-elements: ");
1044*86d7f5d3SJohn Marino       while (optind < argc)
1045*86d7f5d3SJohn Marino 	printf ("%s ", argv[optind++]);
1046*86d7f5d3SJohn Marino       printf ("\n");
1047*86d7f5d3SJohn Marino     }
1048*86d7f5d3SJohn Marino 
1049*86d7f5d3SJohn Marino   exit (0);
1050*86d7f5d3SJohn Marino }
1051*86d7f5d3SJohn Marino 
1052*86d7f5d3SJohn Marino #endif /* TEST */
1053