OSDN Git Service

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