OSDN Git Service

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