~ubuntu-branches/ubuntu/trusty/wget/trusty-updates

« back to all changes in this revision

Viewing changes to src/getopt.c

  • Committer: Bazaar Package Importer
  • Author(s): Marc Deslauriers
  • Date: 2009-12-12 08:15:59 UTC
  • mfrom: (2.1.5 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091212081559-mvccl4kzdqb138y3
Tags: 1.12-1.1ubuntu1
* Merge from debian testing, remaining changes:
  - Add wget-udeb to ship wget.gnu as alternative to busybox wget
    implementation.
* Keep build dependencies in main:
  - debian/control: remove info2man build-dep
  - debian/patches/00list: disable wget-infopod_generated_manpage.dpatch

Show diffs side-by-side

added added

removed removed

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