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