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