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