Subversion Repositories Kolibri OS

Rev

Rev 6132 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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