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