1 /* Getopt for GNU.
2 NOTE: getopt is now part of the C library, so if you don't know what
3 "Keep this file name-space clean" means, talk to drepper@gnu.org
4 before changing it!
5 
6 Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
7 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
8 Foundation, Inc.
9 
10 NOTE: The canonical source of this file is maintained with the GNU C Library.
11 Bugs can be reported to bug-glibc@gnu.org.
12 
13 This program is free software; you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by the
15 Free Software Foundation; either version 2, or (at your option) any
16 later version.
17 
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 GNU General Public License for more details.
22 
23 You should have received a copy of the GNU General Public License along with
24 this program; see the file COPYING.  If not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */
26 
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 /* This is for other GNU distributions with internationalized messages.
83    When compiling libc, the _ macro is predefined.  */
84 #include "gettext.h"
85 #define _(msgid)    gettext (msgid)
86 
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 = NULL;
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 = 0;
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 
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 # if HAVE_STRING_H
200 #  include <string.h>
201 # else
202 #  include <strings.h>
203 # endif
204 
205 /* Avoid depending on library functions or files
206    whose names are inconsistent.  */
207 
208 #ifndef getenv
209 extern char *getenv ();
210 #endif
211 
212 static char *
my_index(const char * str,int chr)213 my_index (const char *str, int chr)
214 {
215   while (*str)
216     {
217       if (*str == chr)
218 	return (char *) str;
219       str++;
220     }
221   return 0;
222 }
223 
224 /* If using GCC, we can safely declare strlen this way.
225    If not using GCC, it is ok not to declare it.  */
226 #ifdef __GNUC__
227 /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
228    That was relevant to code that was here before.  */
229 # if (!defined __STDC__ || !__STDC__) && !defined strlen
230 /* gcc with -traditional declares the built-in strlen to return int,
231    and has done so at least since version 2.4.5. -- rms.  */
232 extern int strlen (const char *);
233 # endif /* not __STDC__ */
234 #endif /* __GNUC__ */
235 
236 #endif /* not __GNU_LIBRARY__ */
237 
238 /* Handle permutation of arguments.  */
239 
240 /* Describe the part of ARGV that contains non-options that have
241    been skipped.  `first_nonopt' is the index in ARGV of the first of them;
242    `last_nonopt' is the index after the last of them.  */
243 
244 static int first_nonopt;
245 static int last_nonopt;
246 
247 #ifdef _LIBC
248 /* Bash 2.0 gives us an environment variable containing flags
249    indicating ARGV elements that should not be considered arguments.  */
250 
251 /* Defined in getopt_init.c  */
252 extern char *__getopt_nonoption_flags;
253 
254 static int nonoption_flags_max_len;
255 static int nonoption_flags_len;
256 
257 static int original_argc;
258 static char *const *original_argv;
259 
260 /* Make sure the environment variable bash 2.0 puts in the environment
261    is valid for the getopt call we must make sure that the ARGV passed
262    to getopt is that one passed to the process.  */
263 static void __attribute__ ((unused))
store_args_and_env(int argc,char * const * argv)264 store_args_and_env (int argc, char *const *argv)
265 {
266   /* XXX This is no good solution.  We should rather copy the args so
267      that we can compare them later.  But we must not use malloc(3).  */
268   original_argc = argc;
269   original_argv = argv;
270 }
271 # ifdef text_set_element
272 text_set_element (__libc_subinit, store_args_and_env);
273 # endif /* text_set_element */
274 
275 # define SWAP_FLAGS(ch1, ch2) \
276   if (nonoption_flags_len > 0)						      \
277     {									      \
278       char __tmp = __getopt_nonoption_flags[ch1];			      \
279       __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
280       __getopt_nonoption_flags[ch2] = __tmp;				      \
281     }
282 #else	/* !_LIBC */
283 # define SWAP_FLAGS(ch1, ch2)
284 #endif	/* _LIBC */
285 
286 /* Exchange two adjacent subsequences of ARGV.
287    One subsequence is elements [first_nonopt,last_nonopt)
288    which contains all the non-options that have been skipped so far.
289    The other is elements [last_nonopt,optind), which contains all
290    the options processed since those non-options were skipped.
291 
292    `first_nonopt' and `last_nonopt' are relocated so that they describe
293    the new indices of the non-options in ARGV after they are moved.  */
294 
295 #if defined __STDC__ && __STDC__
296 static void exchange (char **);
297 #endif
298 
299 static void
exchange(char ** argv)300 exchange (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 *
_getopt_initialize(int argc,char * const * argv,const char * optstring)384 _getopt_initialize (int argc, char *const *argv, const char *optstring)
385 {
386   /* Start processing options with ARGV-element 1 (since ARGV-element 0
387      is the program name); the sequence of previously skipped
388      non-option ARGV-elements is empty.  */
389 
390   first_nonopt = last_nonopt = optind;
391 
392   nextchar = NULL;
393 
394   posixly_correct = getenv ("POSIXLY_CORRECT");
395 
396   /* Determine how to handle the ordering of options and nonoptions.  */
397 
398   if (optstring[0] == '-')
399     {
400       ordering = RETURN_IN_ORDER;
401       ++optstring;
402     }
403   else if (optstring[0] == '+')
404     {
405       ordering = REQUIRE_ORDER;
406       ++optstring;
407     }
408   else if (posixly_correct != NULL)
409     ordering = REQUIRE_ORDER;
410   else
411     ordering = PERMUTE;
412 
413 #ifdef _LIBC
414   if (posixly_correct == NULL
415       && argc == original_argc && argv == original_argv)
416     {
417       if (nonoption_flags_max_len == 0)
418 	{
419 	  if (__getopt_nonoption_flags == NULL
420 	      || __getopt_nonoption_flags[0] == '\0')
421 	    nonoption_flags_max_len = -1;
422 	  else
423 	    {
424 	      const char *orig_str = __getopt_nonoption_flags;
425 	      int len = nonoption_flags_max_len = strlen (orig_str);
426 	      if (nonoption_flags_max_len < argc)
427 		nonoption_flags_max_len = argc;
428 	      __getopt_nonoption_flags =
429 		(char *) malloc (nonoption_flags_max_len);
430 	      if (__getopt_nonoption_flags == NULL)
431 		nonoption_flags_max_len = -1;
432 	      else
433 		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
434 			'\0', nonoption_flags_max_len - len);
435 	    }
436 	}
437       nonoption_flags_len = nonoption_flags_max_len;
438     }
439   else
440     nonoption_flags_len = 0;
441 #endif
442 
443   return optstring;
444 }
445 
446 /* Scan elements of ARGV (whose length is ARGC) for option characters
447    given in OPTSTRING.
448 
449    If an element of ARGV starts with '-', and is not exactly "-" or "--",
450    then it is an option element.  The characters of this element
451    (aside from the initial '-') are option characters.  If `getopt'
452    is called repeatedly, it returns successively each of the option characters
453    from each of the option elements.
454 
455    If `getopt' finds another option character, it returns that character,
456    updating `optind' and `nextchar' so that the next call to `getopt' can
457    resume the scan with the following option character or ARGV-element.
458 
459    If there are no more option characters, `getopt' returns -1.
460    Then `optind' is the index in ARGV of the first ARGV-element
461    that is not an option.  (The ARGV-elements have been permuted
462    so that those that are not options now come last.)
463 
464    OPTSTRING is a string containing the legitimate option characters.
465    If an option character is seen that is not listed in OPTSTRING,
466    return '?' after printing an error message.  If you set `opterr' to
467    zero, the error message is suppressed but we still return '?'.
468 
469    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
470    so the following text in the same ARGV-element, or the text of the following
471    ARGV-element, is returned in `optarg'.  Two colons mean an option that
472    wants an optional arg; if there is text in the current ARGV-element,
473    it is returned in `optarg', otherwise `optarg' is set to zero.
474 
475    If OPTSTRING starts with `-' or `+', it requests different methods of
476    handling the non-option ARGV-elements.
477    See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
478 
479    Long-named options begin with `--' instead of `-'.
480    Their names may be abbreviated as long as the abbreviation is unique
481    or is an exact match for some defined option.  If they have an
482    argument, it follows the option name in the same ARGV-element, separated
483    from the option name by a `=', or else the in next ARGV-element.
484    When `getopt' finds a long-named option, it returns 0 if that option's
485    `flag' field is nonzero, the value of the option's `val' field
486    if the `flag' field is zero.
487 
488    The elements of ARGV aren't really const, because we permute them.
489    But we pretend they're const in the prototype to be compatible
490    with other systems.
491 
492    LONGOPTS is a vector of `struct option' terminated by an
493    element containing a name which is zero.
494 
495    LONGIND returns the index in LONGOPT of the long-named option found.
496    It is only valid when a long-named option has been found by the most
497    recent call.
498 
499    If LONG_ONLY is nonzero, '-' as well as '--' can introduce
500    long-named options.  */
501 
502 int
_getopt_internal(int argc,char * const * argv,const char * optstring,const struct option * longopts,int * longind,int long_only)503 _getopt_internal (int argc, char *const *argv, const char *optstring,
504                   const struct option *longopts, int *longind, int long_only)
505 {
506   optarg = NULL;
507 
508   if (optind == 0 || !__getopt_initialized)
509     {
510       if (optind == 0)
511 	optind = 1;	/* Don't scan ARGV[0], the program name.  */
512       optstring = _getopt_initialize (argc, argv, optstring);
513       __getopt_initialized = 1;
514     }
515 
516   /* Test whether ARGV[optind] points to a non-option argument.
517      Either it does not have option syntax, or there is an environment flag
518      from the shell indicating it is not an option.  The later information
519      is only used when the used in the GNU libc.  */
520 #ifdef _LIBC
521 # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \
522 		      || (optind < nonoption_flags_len			      \
523 			  && __getopt_nonoption_flags[optind] == '1'))
524 #else
525 # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
526 #endif
527 
528   if (nextchar == NULL || *nextchar == '\0')
529     {
530       /* Advance to the next ARGV-element.  */
531 
532       /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
533 	 moved back by the user (who may also have changed the arguments).  */
534       if (last_nonopt > optind)
535 	last_nonopt = optind;
536       if (first_nonopt > optind)
537 	first_nonopt = optind;
538 
539       if (ordering == PERMUTE)
540 	{
541 	  /* If we have just processed some options following some non-options,
542 	     exchange them so that the options come first.  */
543 
544 	  if (first_nonopt != last_nonopt && last_nonopt != optind)
545 	    exchange ((char **) argv);
546 	  else if (last_nonopt != optind)
547 	    first_nonopt = optind;
548 
549 	  /* Skip any additional non-options
550 	     and extend the range of non-options previously skipped.  */
551 
552 	  while (optind < argc && NONOPTION_P)
553 	    optind++;
554 	  last_nonopt = optind;
555 	}
556 
557       /* The special ARGV-element `--' means premature end of options.
558 	 Skip it like a null option,
559 	 then exchange with previous non-options as if it were an option,
560 	 then skip everything else like a non-option.  */
561 
562       if (optind != argc && !strcmp (argv[optind], "--"))
563 	{
564 	  optind++;
565 
566 	  if (first_nonopt != last_nonopt && last_nonopt != optind)
567 	    exchange ((char **) argv);
568 	  else if (first_nonopt == last_nonopt)
569 	    first_nonopt = optind;
570 	  last_nonopt = argc;
571 
572 	  optind = argc;
573 	}
574 
575       /* If we have done all the ARGV-elements, stop the scan
576 	 and back over any non-options that we skipped and permuted.  */
577 
578       if (optind == argc)
579 	{
580 	  /* Set the next-arg-index to point at the non-options
581 	     that we previously skipped, so the caller will digest them.  */
582 	  if (first_nonopt != last_nonopt)
583 	    optind = first_nonopt;
584 	  return -1;
585 	}
586 
587       /* If we have come to a non-option and did not permute it,
588 	 either stop the scan or describe it to the caller and pass it by.  */
589 
590       if (NONOPTION_P)
591 	{
592 	  if (ordering == REQUIRE_ORDER)
593 	    return -1;
594 	  optarg = argv[optind++];
595 	  return 1;
596 	}
597 
598       /* We have found another option-ARGV-element.
599 	 Skip the initial punctuation.  */
600 
601       nextchar = (argv[optind] + 1
602 		  + (longopts != NULL && argv[optind][1] == '-'));
603     }
604 
605   /* Decode the current option-ARGV-element.  */
606 
607   /* Check whether the ARGV-element is a long option.
608 
609      If long_only and the ARGV-element has the form "-f", where f is
610      a valid short option, don't consider it an abbreviated form of
611      a long option that starts with f.  Otherwise there would be no
612      way to give the -f short option.
613 
614      On the other hand, if there's a long option "fubar" and
615      the ARGV-element is "-fu", do consider that an abbreviation of
616      the long option, just like "--fu", and not "-f" with arg "u".
617 
618      This distinction seems to be the most useful approach.  */
619 
620   if (longopts != NULL
621       && (argv[optind][1] == '-'
622 	  || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
623     {
624       char *nameend;
625       const struct option *p;
626       const struct option *pfound = NULL;
627       int exact = 0;
628       int ambig = 0;
629       int indfound = -1;
630       int option_index;
631 
632       for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
633 	/* Do nothing.  */ ;
634 
635       /* Test all long options for either exact match
636 	 or abbreviated matches.  */
637       for (p = longopts, option_index = 0; p->name; p++, option_index++)
638 	if (!strncmp (p->name, nextchar, nameend - nextchar))
639 	  {
640 	    if ((unsigned int) (nameend - nextchar)
641 		== (unsigned int) strlen (p->name))
642 	      {
643 		/* Exact match found.  */
644 		pfound = p;
645 		indfound = option_index;
646 		exact = 1;
647 		break;
648 	      }
649 	    else if (pfound == NULL)
650 	      {
651 		/* First nonexact match found.  */
652 		pfound = p;
653 		indfound = option_index;
654 	      }
655 	    else
656 	      /* Second or later nonexact match found.  */
657 	      ambig = 1;
658 	  }
659 
660       if (ambig && !exact)
661 	{
662 	  if (opterr)
663 	    fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
664 		     argv[0], argv[optind]);
665 	  nextchar += strlen (nextchar);
666 	  optind++;
667 	  optopt = 0;
668 	  return '?';
669 	}
670 
671       if (pfound != NULL)
672 	{
673 	  option_index = indfound;
674 	  optind++;
675 	  if (*nameend)
676 	    {
677 	      /* Don't test has_arg with >, because some C compilers don't
678 		 allow it to be used on enums.  */
679 	      if (pfound->has_arg)
680 		optarg = nameend + 1;
681 	      else
682 		{
683 		  if (opterr)
684 		   if (argv[optind - 1][1] == '-')
685 		    /* --option */
686 		    fprintf (stderr,
687 		     _("%s: option `--%s' doesn't allow an argument\n"),
688 		     argv[0], pfound->name);
689 		   else
690 		    /* +option or -option */
691 		    fprintf (stderr,
692 		     _("%s: option `%c%s' doesn't allow an argument\n"),
693 		     argv[0], argv[optind - 1][0], pfound->name);
694 
695 		  nextchar += strlen (nextchar);
696 
697 		  optopt = pfound->val;
698 		  return '?';
699 		}
700 	    }
701 	  else if (pfound->has_arg == 1)
702 	    {
703 	      if (optind < argc)
704 		optarg = argv[optind++];
705 	      else
706 		{
707 		  if (opterr)
708 		    fprintf (stderr,
709 			   _("%s: option `%s' requires an argument\n"),
710 			   argv[0], argv[optind - 1]);
711 		  nextchar += strlen (nextchar);
712 		  optopt = pfound->val;
713 		  return optstring[0] == ':' ? ':' : '?';
714 		}
715 	    }
716 	  nextchar += strlen (nextchar);
717 	  if (longind != NULL)
718 	    *longind = option_index;
719 	  if (pfound->flag)
720 	    {
721 	      *(pfound->flag) = pfound->val;
722 	      return 0;
723 	    }
724 	  return pfound->val;
725 	}
726 
727       /* Can't find it as a long option.  If this is not getopt_long_only,
728 	 or the option starts with '--' or is not a valid short
729 	 option, then it's an error.
730 	 Otherwise interpret it as a short option.  */
731       if (!long_only || argv[optind][1] == '-'
732 	  || my_index (optstring, *nextchar) == NULL)
733 	{
734 	  if (opterr)
735 	    {
736 	      if (argv[optind][1] == '-')
737 		/* --option */
738 		fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
739 			 argv[0], nextchar);
740 	      else
741 		/* +option or -option */
742 		fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
743 			 argv[0], argv[optind][0], nextchar);
744 	    }
745 	  nextchar = (char *) "";
746 	  optind++;
747 	  optopt = 0;
748 	  return '?';
749 	}
750     }
751 
752   /* Look at and handle the next short option-character.  */
753 
754   {
755     char c = *nextchar++;
756     char *temp = my_index (optstring, c);
757 
758     /* Increment `optind' when we start to process its last character.  */
759     if (*nextchar == '\0')
760       ++optind;
761 
762     if (temp == NULL || c == ':')
763       {
764 	if (opterr)
765 	  {
766 	    if (posixly_correct)
767 	      /* 1003.2 specifies the format of this message.  */
768 	      fprintf (stderr, _("%s: illegal option -- %c\n"),
769 		       argv[0], c);
770 	    else
771 	      fprintf (stderr, _("%s: invalid option -- %c\n"),
772 		       argv[0], c);
773 	  }
774 	optopt = c;
775 	return '?';
776       }
777     /* Convenience. Treat POSIX -W foo same as long option --foo */
778     if (temp[0] == 'W' && temp[1] == ';')
779       {
780 	char *nameend;
781 	const struct option *p;
782 	const struct option *pfound = NULL;
783 	int exact = 0;
784 	int ambig = 0;
785 	int indfound = 0;
786 	int option_index;
787 
788 	/* This is an option that requires an argument.  */
789 	if (*nextchar != '\0')
790 	  {
791 	    optarg = nextchar;
792 	    /* If we end this ARGV-element by taking the rest as an arg,
793 	       we must advance to the next element now.  */
794 	    optind++;
795 	  }
796 	else if (optind == argc)
797 	  {
798 	    if (opterr)
799 	      {
800 		/* 1003.2 specifies the format of this message.  */
801 		fprintf (stderr, _("%s: option requires an argument -- %c\n"),
802 			 argv[0], c);
803 	      }
804 	    optopt = c;
805 	    if (optstring[0] == ':')
806 	      c = ':';
807 	    else
808 	      c = '?';
809 	    return c;
810 	  }
811 	else
812 	  /* We already incremented `optind' once;
813 	     increment it again when taking next ARGV-elt as argument.  */
814 	  optarg = argv[optind++];
815 
816 	/* optarg is now the argument, see if it's in the
817 	   table of longopts.  */
818 
819 	for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
820 	  /* Do nothing.  */ ;
821 
822 	/* Test all long options for either exact match
823 	   or abbreviated matches.  */
824 	for (p = longopts, option_index = 0; p->name; p++, option_index++)
825 	  if (!strncmp (p->name, nextchar, nameend - nextchar))
826 	    {
827 	      if ((unsigned int) (nameend - nextchar) == strlen (p->name))
828 		{
829 		  /* Exact match found.  */
830 		  pfound = p;
831 		  indfound = option_index;
832 		  exact = 1;
833 		  break;
834 		}
835 	      else if (pfound == NULL)
836 		{
837 		  /* First nonexact match found.  */
838 		  pfound = p;
839 		  indfound = option_index;
840 		}
841 	      else
842 		/* Second or later nonexact match found.  */
843 		ambig = 1;
844 	    }
845 	if (ambig && !exact)
846 	  {
847 	    if (opterr)
848 	      fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
849 		       argv[0], argv[optind]);
850 	    nextchar += strlen (nextchar);
851 	    optind++;
852 	    return '?';
853 	  }
854 	if (pfound != NULL)
855 	  {
856 	    option_index = indfound;
857 	    if (*nameend)
858 	      {
859 		/* Don't test has_arg with >, because some C compilers don't
860 		   allow it to be used on enums.  */
861 		if (pfound->has_arg)
862 		  optarg = nameend + 1;
863 		else
864 		  {
865 		    if (opterr)
866 		      fprintf (stderr, _("\
867 %s: option `-W %s' doesn't allow an argument\n"),
868 			       argv[0], pfound->name);
869 
870 		    nextchar += strlen (nextchar);
871 		    return '?';
872 		  }
873 	      }
874 	    else if (pfound->has_arg == 1)
875 	      {
876 		if (optind < argc)
877 		  optarg = argv[optind++];
878 		else
879 		  {
880 		    if (opterr)
881 		      fprintf (stderr,
882 			       _("%s: option `%s' requires an argument\n"),
883 			       argv[0], argv[optind - 1]);
884 		    nextchar += strlen (nextchar);
885 		    return optstring[0] == ':' ? ':' : '?';
886 		  }
887 	      }
888 	    nextchar += strlen (nextchar);
889 	    if (longind != NULL)
890 	      *longind = option_index;
891 	    if (pfound->flag)
892 	      {
893 		*(pfound->flag) = pfound->val;
894 		return 0;
895 	      }
896 	    return pfound->val;
897 	  }
898 	  nextchar = NULL;
899 	  return 'W';	/* Let the application handle it.   */
900       }
901     if (temp[1] == ':')
902       {
903 	if (temp[2] == ':')
904 	  {
905 	    /* This is an option that accepts an argument optionally.  */
906 	    if (*nextchar != '\0')
907 	      {
908 		optarg = nextchar;
909 		optind++;
910 	      }
911 	    else
912 	      optarg = NULL;
913 	    nextchar = NULL;
914 	  }
915 	else
916 	  {
917 	    /* This is an option that requires an argument.  */
918 	    if (*nextchar != '\0')
919 	      {
920 		optarg = nextchar;
921 		/* If we end this ARGV-element by taking the rest as an arg,
922 		   we must advance to the next element now.  */
923 		optind++;
924 	      }
925 	    else if (optind == argc)
926 	      {
927 		if (opterr)
928 		  {
929 		    /* 1003.2 specifies the format of this message.  */
930 		    fprintf (stderr,
931 			   _("%s: option requires an argument -- %c\n"),
932 			   argv[0], c);
933 		  }
934 		optopt = c;
935 		if (optstring[0] == ':')
936 		  c = ':';
937 		else
938 		  c = '?';
939 	      }
940 	    else
941 	      /* We already incremented `optind' once;
942 		 increment it again when taking next ARGV-elt as argument.  */
943 	      optarg = argv[optind++];
944 	    nextchar = NULL;
945 	  }
946       }
947     return c;
948   }
949 }
950 
951 int
getopt(int argc,char * const * argv,const char * optstring)952 getopt (int argc, char *const *argv, const char *optstring)
953 {
954   return _getopt_internal (argc, argv, optstring,
955 			   (const struct option *) 0,
956 			   (int *) 0,
957 			   0);
958 }
959 
960 #endif	/* Not ELIDE_CODE.  */
961 
962 #ifdef TEST
963 
964 /* Compile with -DTEST to make an executable for use in testing
965    the above definition of `getopt'.  */
966 
967 int
main(int argc,char ** argv)968 main (int argc, char **argv)
969 {
970   int c;
971   int digit_optind = 0;
972 
973   while (1)
974     {
975       int this_option_optind = optind ? optind : 1;
976 
977       c = getopt (argc, argv, "abc:d:0123456789");
978       if (c == -1)
979 	break;
980 
981       switch (c)
982 	{
983 	case '0':
984 	case '1':
985 	case '2':
986 	case '3':
987 	case '4':
988 	case '5':
989 	case '6':
990 	case '7':
991 	case '8':
992 	case '9':
993 	  if (digit_optind != 0 && digit_optind != this_option_optind)
994 	    printf ("digits occur in two different argv-elements.\n");
995 	  digit_optind = this_option_optind;
996 	  printf ("option %c\n", c);
997 	  break;
998 
999 	case 'a':
1000 	  printf ("option a\n");
1001 	  break;
1002 
1003 	case 'b':
1004 	  printf ("option b\n");
1005 	  break;
1006 
1007 	case 'c':
1008 	  printf ("option c with value `%s'\n", optarg);
1009 	  break;
1010 
1011 	case '?':
1012 	  break;
1013 
1014 	default:
1015 	  printf ("?? getopt returned character code 0%o ??\n", c);
1016 	}
1017     }
1018 
1019   if (optind < argc)
1020     {
1021       printf ("non-option ARGV-elements: ");
1022       while (optind < argc)
1023 	printf ("%s ", argv[optind++]);
1024       printf ("\n");
1025     }
1026 
1027   exit (0);
1028 }
1029 
1030 #endif /* TEST */
1031