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