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