Blame src/getopt.c

Packit dd8086
/* Getopt for GNU.
Packit dd8086
   NOTE: getopt is part of the C library, so if you don't know what
Packit dd8086
   "Keep this file name-space clean" means, talk to drepper@gnu.org
Packit dd8086
   before changing it!
Packit dd8086
   Copyright (C) 1987-2014 Free Software Foundation, Inc.
Packit dd8086
   This file is part of the GNU C Library.
Packit dd8086
Packit dd8086
   The GNU C Library is free software; you can redistribute it and/or
Packit dd8086
   modify it under the terms of the GNU Lesser General Public
Packit dd8086
   License as published by the Free Software Foundation; either
Packit dd8086
   version 2.1 of the License, or (at your option) any later version.
Packit dd8086
Packit dd8086
   The GNU C Library is distributed in the hope that it will be useful,
Packit dd8086
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit dd8086
   Lesser General Public License for more details.
Packit dd8086
Packit dd8086
   You should have received a copy of the GNU Lesser General Public
Packit dd8086
   License along with the GNU C Library; if not, see
Packit dd8086
   <http://www.gnu.org/licenses/>.  */
Packit dd8086

Packit dd8086
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
Packit dd8086
   Ditto for AIX 3.2 and <stdlib.h>.  */
Packit dd8086
#ifndef _NO_PROTO
Packit dd8086
# define _NO_PROTO
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
# include <config.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
# include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <stdio.h>
Packit dd8086
Packit dd8086
extern int getopt (int argc, char *const *argv, const char *optstring);
Packit dd8086
Packit dd8086
/* Comment out all this code if we are using the GNU C Library, and are not
Packit dd8086
   actually compiling the library itself.  This code is part of the GNU C
Packit dd8086
   Library, but also included in many other GNU distributions.  Compiling
Packit dd8086
   and linking in this code is a waste when using the GNU C library
Packit dd8086
   (especially if it is a shared library).  Rather than having every GNU
Packit dd8086
   program understand `configure --with-gnu-libc' and omit the object files,
Packit dd8086
   it is simpler to just do this in the source for each such file.  */
Packit dd8086
Packit dd8086
#define GETOPT_INTERFACE_VERSION 2
Packit dd8086
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
Packit dd8086
# include <gnu-versions.h>
Packit dd8086
# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
Packit dd8086
#  define ELIDE_CODE
Packit dd8086
# endif
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef ELIDE_CODE
Packit dd8086
Packit dd8086
Packit dd8086
/* This needs to come after some library #include
Packit dd8086
   to get __GNU_LIBRARY__ defined.  */
Packit dd8086
#ifdef	__GNU_LIBRARY__
Packit dd8086
/* Don't include stdlib.h for non-GNU C libraries because some of them
Packit dd8086
   contain conflicting prototypes for getopt.  */
Packit dd8086
# include <stdlib.h>
Packit dd8086
# include <unistd.h>
Packit dd8086
#endif	/* GNU C library.  */
Packit dd8086
Packit dd8086
#include <string.h>
Packit dd8086
Packit dd8086
#ifdef _LIBC
Packit dd8086
# include <libintl.h>
Packit dd8086
#else
Packit dd8086
# define _(msgid) (msgid)
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#if defined _LIBC
Packit dd8086
# include <wchar.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef attribute_hidden
Packit dd8086
# define attribute_hidden
Packit dd8086
#endif
Packit dd8086
Packit dd8086
/* This version of `getopt' appears to the caller like standard Unix `getopt'
Packit dd8086
   but it behaves differently for the user, since it allows the user
Packit dd8086
   to intersperse the options with the other arguments.
Packit dd8086
Packit dd8086
   As `getopt' works, it permutes the elements of ARGV so that,
Packit dd8086
   when it is done, all the options precede everything else.  Thus
Packit dd8086
   all application programs are extended to handle flexible argument order.
Packit dd8086
Packit dd8086
   Setting the environment variable POSIXLY_CORRECT disables permutation.
Packit dd8086
   Then the behavior is completely standard.
Packit dd8086
Packit dd8086
   GNU application programs can use a third alternative mode in which
Packit dd8086
   they can distinguish the relative order of options and other arguments.  */
Packit dd8086
Packit dd8086
#include "getopt.h"
Packit dd8086
#include "getopt_int.h"
Packit dd8086
Packit dd8086
/* For communication from `getopt' to the caller.
Packit dd8086
   When `getopt' finds an option that takes an argument,
Packit dd8086
   the argument value is returned here.
Packit dd8086
   Also, when `ordering' is RETURN_IN_ORDER,
Packit dd8086
   each non-option ARGV-element is returned here.  */
Packit dd8086
Packit dd8086
char *optarg;
Packit dd8086
Packit dd8086
/* Index in ARGV of the next element to be scanned.
Packit dd8086
   This is used for communication to and from the caller
Packit dd8086
   and for communication between successive calls to `getopt'.
Packit dd8086
Packit dd8086
   On entry to `getopt', zero means this is the first call; initialize.
Packit dd8086
Packit dd8086
   When `getopt' returns -1, this is the index of the first of the
Packit dd8086
   non-option elements that the caller should itself scan.
Packit dd8086
Packit dd8086
   Otherwise, `optind' communicates from one call to the next
Packit dd8086
   how much of ARGV has been scanned so far.  */
Packit dd8086
Packit dd8086
/* 1003.2 says this must be 1 before any call.  */
Packit dd8086
int optind = 1;
Packit dd8086
Packit dd8086
/* Callers store zero here to inhibit the error message
Packit dd8086
   for unrecognized options.  */
Packit dd8086
Packit dd8086
int opterr = 1;
Packit dd8086
Packit dd8086
/* Set to an option character which was unrecognized.
Packit dd8086
   This must be initialized on some systems to avoid linking in the
Packit dd8086
   system's own getopt implementation.  */
Packit dd8086
Packit dd8086
int optopt = '?';
Packit dd8086
Packit dd8086
/* Keep a global copy of all internal members of getopt_data.  */
Packit dd8086
Packit dd8086
static struct _getopt_data getopt_data;
Packit dd8086
Packit dd8086

Packit dd8086
#ifndef __GNU_LIBRARY__
Packit dd8086
Packit dd8086
/* Avoid depending on library functions or files
Packit dd8086
   whose names are inconsistent.  */
Packit dd8086
Packit dd8086
#ifndef getenv
Packit dd8086
extern char *getenv (const char *_VarName);
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#endif /* not __GNU_LIBRARY__ */
Packit dd8086

Packit dd8086
#ifdef _LIBC
Packit dd8086
/* Stored original parameters.
Packit dd8086
   XXX This is no good solution.  We should rather copy the args so
Packit dd8086
   that we can compare them later.  But we must not use malloc(3).  */
Packit dd8086
extern int __libc_argc;
Packit dd8086
extern char **__libc_argv;
Packit dd8086
Packit dd8086
/* Bash 2.0 gives us an environment variable containing flags
Packit dd8086
   indicating ARGV elements that should not be considered arguments.  */
Packit dd8086
Packit dd8086
# ifdef USE_NONOPTION_FLAGS
Packit dd8086
/* Defined in getopt_init.c  */
Packit dd8086
extern char *__getopt_nonoption_flags;
Packit dd8086
# endif
Packit dd8086
Packit dd8086
# ifdef USE_NONOPTION_FLAGS
Packit dd8086
#  define SWAP_FLAGS(ch1, ch2) \
Packit dd8086
  if (d->__nonoption_flags_len > 0)					      \
Packit dd8086
    {									      \
Packit dd8086
      char __tmp = __getopt_nonoption_flags[ch1];			      \
Packit dd8086
      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
Packit dd8086
      __getopt_nonoption_flags[ch2] = __tmp;				      \
Packit dd8086
    }
Packit dd8086
# else
Packit dd8086
#  define SWAP_FLAGS(ch1, ch2)
Packit dd8086
# endif
Packit dd8086
#else	/* !_LIBC */
Packit dd8086
# define SWAP_FLAGS(ch1, ch2)
Packit dd8086
#endif	/* _LIBC */
Packit dd8086
Packit dd8086
/* Exchange two adjacent subsequences of ARGV.
Packit dd8086
   One subsequence is elements [first_nonopt,last_nonopt)
Packit dd8086
   which contains all the non-options that have been skipped so far.
Packit dd8086
   The other is elements [last_nonopt,optind), which contains all
Packit dd8086
   the options processed since those non-options were skipped.
Packit dd8086
Packit dd8086
   `first_nonopt' and `last_nonopt' are relocated so that they describe
Packit dd8086
   the new indices of the non-options in ARGV after they are moved.  */
Packit dd8086
Packit dd8086
static void
Packit dd8086
exchange (char **argv, struct _getopt_data *d)
Packit dd8086
{
Packit dd8086
  int bottom = d->__first_nonopt;
Packit dd8086
  int middle = d->__last_nonopt;
Packit dd8086
  int top = d->optind;
Packit dd8086
  char *tem;
Packit dd8086
Packit dd8086
  /* Exchange the shorter segment with the far end of the longer segment.
Packit dd8086
     That puts the shorter segment into the right place.
Packit dd8086
     It leaves the longer segment in the right place overall,
Packit dd8086
     but it consists of two parts that need to be swapped next.  */
Packit dd8086
Packit dd8086
#if defined _LIBC && defined USE_NONOPTION_FLAGS
Packit dd8086
  /* First make sure the handling of the `__getopt_nonoption_flags'
Packit dd8086
     string can work normally.  Our top argument must be in the range
Packit dd8086
     of the string.  */
Packit dd8086
  if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
Packit dd8086
    {
Packit dd8086
      /* We must extend the array.  The user plays games with us and
Packit dd8086
	 presents new arguments.  */
Packit dd8086
      char *new_str = malloc (top + 1);
Packit dd8086
      if (new_str == NULL)
Packit dd8086
	d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
Packit dd8086
      else
Packit dd8086
	{
Packit dd8086
	  memset (__mempcpy (new_str, __getopt_nonoption_flags,
Packit dd8086
			     d->__nonoption_flags_max_len),
Packit dd8086
		  '\0', top + 1 - d->__nonoption_flags_max_len);
Packit dd8086
	  d->__nonoption_flags_max_len = top + 1;
Packit dd8086
	  __getopt_nonoption_flags = new_str;
Packit dd8086
	}
Packit dd8086
    }
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  while (top > middle && middle > bottom)
Packit dd8086
    {
Packit dd8086
      if (top - middle > middle - bottom)
Packit dd8086
	{
Packit dd8086
	  /* Bottom segment is the short one.  */
Packit dd8086
	  int len = middle - bottom;
Packit dd8086
	  int i;
Packit dd8086
Packit dd8086
	  /* Swap it with the top part of the top segment.  */
Packit dd8086
	  for (i = 0; i < len; i++)
Packit dd8086
	    {
Packit dd8086
	      tem = argv[bottom + i];
Packit dd8086
	      argv[bottom + i] = argv[top - (middle - bottom) + i];
Packit dd8086
	      argv[top - (middle - bottom) + i] = tem;
Packit dd8086
	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
Packit dd8086
	    }
Packit dd8086
	  /* Exclude the moved bottom segment from further swapping.  */
Packit dd8086
	  top -= len;
Packit dd8086
	}
Packit dd8086
      else
Packit dd8086
	{
Packit dd8086
	  /* Top segment is the short one.  */
Packit dd8086
	  int len = top - middle;
Packit dd8086
	  int i;
Packit dd8086
Packit dd8086
	  /* Swap it with the bottom part of the bottom segment.  */
Packit dd8086
	  for (i = 0; i < len; i++)
Packit dd8086
	    {
Packit dd8086
	      tem = argv[bottom + i];
Packit dd8086
	      argv[bottom + i] = argv[middle + i];
Packit dd8086
	      argv[middle + i] = tem;
Packit dd8086
	      SWAP_FLAGS (bottom + i, middle + i);
Packit dd8086
	    }
Packit dd8086
	  /* Exclude the moved top segment from further swapping.  */
Packit dd8086
	  bottom += len;
Packit dd8086
	}
Packit dd8086
    }
Packit dd8086
Packit dd8086
  /* Update records for the slots the non-options now occupy.  */
Packit dd8086
Packit dd8086
  d->__first_nonopt += (d->optind - d->__last_nonopt);
Packit dd8086
  d->__last_nonopt = d->optind;
Packit dd8086
}
Packit dd8086
Packit dd8086
/* Initialize the internal data when the first call is made.  */
Packit dd8086
Packit dd8086
static const char *
Packit dd8086
_getopt_initialize (int argc, char *const *argv, const char *optstring,
Packit dd8086
		    struct _getopt_data *d, int posixly_correct)
Packit dd8086
{
Packit dd8086
  /* Start processing options with ARGV-element 1 (since ARGV-element 0
Packit dd8086
     is the program name); the sequence of previously skipped
Packit dd8086
     non-option ARGV-elements is empty.  */
Packit dd8086
Packit dd8086
  d->__first_nonopt = d->__last_nonopt = d->optind;
Packit dd8086
Packit dd8086
  d->__nextchar = NULL;
Packit dd8086
Packit dd8086
  d->__posixly_correct = posixly_correct | !!getenv ("POSIXLY_CORRECT");
Packit dd8086
Packit dd8086
  /* Determine how to handle the ordering of options and nonoptions.  */
Packit dd8086
Packit dd8086
  if (optstring[0] == '-')
Packit dd8086
    {
Packit dd8086
      d->__ordering = RETURN_IN_ORDER;
Packit dd8086
      ++optstring;
Packit dd8086
    }
Packit dd8086
  else if (optstring[0] == '+')
Packit dd8086
    {
Packit dd8086
      d->__ordering = REQUIRE_ORDER;
Packit dd8086
      ++optstring;
Packit dd8086
    }
Packit dd8086
  else if (d->__posixly_correct)
Packit dd8086
    d->__ordering = REQUIRE_ORDER;
Packit dd8086
  else
Packit dd8086
    d->__ordering = PERMUTE;
Packit dd8086
Packit dd8086
#if defined _LIBC && defined USE_NONOPTION_FLAGS
Packit dd8086
  if (!d->__posixly_correct
Packit dd8086
      && argc == __libc_argc && argv == __libc_argv)
Packit dd8086
    {
Packit dd8086
      if (d->__nonoption_flags_max_len == 0)
Packit dd8086
	{
Packit dd8086
	  if (__getopt_nonoption_flags == NULL
Packit dd8086
	      || __getopt_nonoption_flags[0] == '\0')
Packit dd8086
	    d->__nonoption_flags_max_len = -1;
Packit dd8086
	  else
Packit dd8086
	    {
Packit dd8086
	      const char *orig_str = __getopt_nonoption_flags;
Packit dd8086
	      int len = d->__nonoption_flags_max_len = strlen (orig_str);
Packit dd8086
	      if (d->__nonoption_flags_max_len < argc)
Packit dd8086
		d->__nonoption_flags_max_len = argc;
Packit dd8086
	      __getopt_nonoption_flags =
Packit dd8086
		(char *) malloc (d->__nonoption_flags_max_len);
Packit dd8086
	      if (__getopt_nonoption_flags == NULL)
Packit dd8086
		d->__nonoption_flags_max_len = -1;
Packit dd8086
	      else
Packit dd8086
		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
Packit dd8086
			'\0', d->__nonoption_flags_max_len - len);
Packit dd8086
	    }
Packit dd8086
	}
Packit dd8086
      d->__nonoption_flags_len = d->__nonoption_flags_max_len;
Packit dd8086
    }
Packit dd8086
  else
Packit dd8086
    d->__nonoption_flags_len = 0;
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  return optstring;
Packit dd8086
}
Packit dd8086

Packit dd8086
/* Scan elements of ARGV (whose length is ARGC) for option characters
Packit dd8086
   given in OPTSTRING.
Packit dd8086
Packit dd8086
   If an element of ARGV starts with '-', and is not exactly "-" or "--",
Packit dd8086
   then it is an option element.  The characters of this element
Packit dd8086
   (aside from the initial '-') are option characters.  If `getopt'
Packit dd8086
   is called repeatedly, it returns successively each of the option characters
Packit dd8086
   from each of the option elements.
Packit dd8086
Packit dd8086
   If `getopt' finds another option character, it returns that character,
Packit dd8086
   updating `optind' and `nextchar' so that the next call to `getopt' can
Packit dd8086
   resume the scan with the following option character or ARGV-element.
Packit dd8086
Packit dd8086
   If there are no more option characters, `getopt' returns -1.
Packit dd8086
   Then `optind' is the index in ARGV of the first ARGV-element
Packit dd8086
   that is not an option.  (The ARGV-elements have been permuted
Packit dd8086
   so that those that are not options now come last.)
Packit dd8086
Packit dd8086
   OPTSTRING is a string containing the legitimate option characters.
Packit dd8086
   If an option character is seen that is not listed in OPTSTRING,
Packit dd8086
   return '?' after printing an error message.  If you set `opterr' to
Packit dd8086
   zero, the error message is suppressed but we still return '?'.
Packit dd8086
Packit dd8086
   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
Packit dd8086
   so the following text in the same ARGV-element, or the text of the following
Packit dd8086
   ARGV-element, is returned in `optarg'.  Two colons mean an option that
Packit dd8086
   wants an optional arg; if there is text in the current ARGV-element,
Packit dd8086
   it is returned in `optarg', otherwise `optarg' is set to zero.
Packit dd8086
Packit dd8086
   If OPTSTRING starts with `-' or `+', it requests different methods of
Packit dd8086
   handling the non-option ARGV-elements.
Packit dd8086
   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
Packit dd8086
Packit dd8086
   Long-named options begin with `--' instead of `-'.
Packit dd8086
   Their names may be abbreviated as long as the abbreviation is unique
Packit dd8086
   or is an exact match for some defined option.  If they have an
Packit dd8086
   argument, it follows the option name in the same ARGV-element, separated
Packit dd8086
   from the option name by a `=', or else the in next ARGV-element.
Packit dd8086
   When `getopt' finds a long-named option, it returns 0 if that option's
Packit dd8086
   `flag' field is nonzero, the value of the option's `val' field
Packit dd8086
   if the `flag' field is zero.
Packit dd8086
Packit dd8086
   The elements of ARGV aren't really const, because we permute them.
Packit dd8086
   But we pretend they're const in the prototype to be compatible
Packit dd8086
   with other systems.
Packit dd8086
Packit dd8086
   LONGOPTS is a vector of `struct option' terminated by an
Packit dd8086
   element containing a name which is zero.
Packit dd8086
Packit dd8086
   LONGIND returns the index in LONGOPT of the long-named option found.
Packit dd8086
   It is only valid when a long-named option has been found by the most
Packit dd8086
   recent call.
Packit dd8086
Packit dd8086
   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
Packit dd8086
   long-named options.  */
Packit dd8086
Packit dd8086
int
Packit dd8086
_getopt_internal_r (int argc, char *const *argv, const char *optstring,
Packit dd8086
		    const struct option *longopts, int *longind,
Packit dd8086
		    int long_only, struct _getopt_data *d, int posixly_correct)
Packit dd8086
{
Packit dd8086
  int print_errors = d->opterr;
Packit dd8086
Packit dd8086
  if (argc < 1)
Packit dd8086
    return -1;
Packit dd8086
Packit dd8086
  d->optarg = NULL;
Packit dd8086
Packit dd8086
  if (d->optind == 0 || !d->__initialized)
Packit dd8086
    {
Packit dd8086
      if (d->optind == 0)
Packit dd8086
	d->optind = 1;	/* Don't scan ARGV[0], the program name.  */
Packit dd8086
      optstring = _getopt_initialize (argc, argv, optstring, d,
Packit dd8086
				      posixly_correct);
Packit dd8086
      d->__initialized = 1;
Packit dd8086
    }
Packit dd8086
  else if (optstring[0] == '-' || optstring[0] == '+')
Packit dd8086
    optstring++;
Packit dd8086
  if (optstring[0] == ':')
Packit dd8086
    print_errors = 0;
Packit dd8086
Packit dd8086
  /* Test whether ARGV[optind] points to a non-option argument.
Packit dd8086
     Either it does not have option syntax, or there is an environment flag
Packit dd8086
     from the shell indicating it is not an option.  The later information
Packit dd8086
     is only used when the used in the GNU libc.  */
Packit dd8086
#if defined _LIBC && defined USE_NONOPTION_FLAGS
Packit dd8086
# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
Packit dd8086
		      || (d->optind < d->__nonoption_flags_len		      \
Packit dd8086
			  && __getopt_nonoption_flags[d->optind] == '1'))
Packit dd8086
#else
Packit dd8086
# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  if (d->__nextchar == NULL || *d->__nextchar == '\0')
Packit dd8086
    {
Packit dd8086
      /* Advance to the next ARGV-element.  */
Packit dd8086
Packit dd8086
      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
Packit dd8086
	 moved back by the user (who may also have changed the arguments).  */
Packit dd8086
      if (d->__last_nonopt > d->optind)
Packit dd8086
	d->__last_nonopt = d->optind;
Packit dd8086
      if (d->__first_nonopt > d->optind)
Packit dd8086
	d->__first_nonopt = d->optind;
Packit dd8086
Packit dd8086
      if (d->__ordering == PERMUTE)
Packit dd8086
	{
Packit dd8086
	  /* If we have just processed some options following some non-options,
Packit dd8086
	     exchange them so that the options come first.  */
Packit dd8086
Packit dd8086
	  if (d->__first_nonopt != d->__last_nonopt
Packit dd8086
	      && d->__last_nonopt != d->optind)
Packit dd8086
	    exchange ((char **) argv, d);
Packit dd8086
	  else if (d->__last_nonopt != d->optind)
Packit dd8086
	    d->__first_nonopt = d->optind;
Packit dd8086
Packit dd8086
	  /* Skip any additional non-options
Packit dd8086
	     and extend the range of non-options previously skipped.  */
Packit dd8086
Packit dd8086
	  while (d->optind < argc && NONOPTION_P)
Packit dd8086
	    d->optind++;
Packit dd8086
	  d->__last_nonopt = d->optind;
Packit dd8086
	}
Packit dd8086
Packit dd8086
      /* The special ARGV-element `--' means premature end of options.
Packit dd8086
	 Skip it like a null option,
Packit dd8086
	 then exchange with previous non-options as if it were an option,
Packit dd8086
	 then skip everything else like a non-option.  */
Packit dd8086
Packit dd8086
      if (d->optind != argc && !strcmp (argv[d->optind], "--"))
Packit dd8086
	{
Packit dd8086
	  d->optind++;
Packit dd8086
Packit dd8086
	  if (d->__first_nonopt != d->__last_nonopt
Packit dd8086
	      && d->__last_nonopt != d->optind)
Packit dd8086
	    exchange ((char **) argv, d);
Packit dd8086
	  else if (d->__first_nonopt == d->__last_nonopt)
Packit dd8086
	    d->__first_nonopt = d->optind;
Packit dd8086
	  d->__last_nonopt = argc;
Packit dd8086
Packit dd8086
	  d->optind = argc;
Packit dd8086
	}
Packit dd8086
Packit dd8086
      /* If we have done all the ARGV-elements, stop the scan
Packit dd8086
	 and back over any non-options that we skipped and permuted.  */
Packit dd8086
Packit dd8086
      if (d->optind == argc)
Packit dd8086
	{
Packit dd8086
	  /* Set the next-arg-index to point at the non-options
Packit dd8086
	     that we previously skipped, so the caller will digest them.  */
Packit dd8086
	  if (d->__first_nonopt != d->__last_nonopt)
Packit dd8086
	    d->optind = d->__first_nonopt;
Packit dd8086
	  return -1;
Packit dd8086
	}
Packit dd8086
Packit dd8086
      /* If we have come to a non-option and did not permute it,
Packit dd8086
	 either stop the scan or describe it to the caller and pass it by.  */
Packit dd8086
Packit dd8086
      if (NONOPTION_P)
Packit dd8086
	{
Packit dd8086
	  if (d->__ordering == REQUIRE_ORDER)
Packit dd8086
	    return -1;
Packit dd8086
	  d->optarg = argv[d->optind++];
Packit dd8086
	  return 1;
Packit dd8086
	}
Packit dd8086
Packit dd8086
      /* We have found another option-ARGV-element.
Packit dd8086
	 Skip the initial punctuation.  */
Packit dd8086
Packit dd8086
      d->__nextchar = (argv[d->optind] + 1
Packit dd8086
		  + (longopts != NULL && argv[d->optind][1] == '-'));
Packit dd8086
    }
Packit dd8086
Packit dd8086
  /* Decode the current option-ARGV-element.  */
Packit dd8086
Packit dd8086
  /* Check whether the ARGV-element is a long option.
Packit dd8086
Packit dd8086
     If long_only and the ARGV-element has the form "-f", where f is
Packit dd8086
     a valid short option, don't consider it an abbreviated form of
Packit dd8086
     a long option that starts with f.  Otherwise there would be no
Packit dd8086
     way to give the -f short option.
Packit dd8086
Packit dd8086
     On the other hand, if there's a long option "fubar" and
Packit dd8086
     the ARGV-element is "-fu", do consider that an abbreviation of
Packit dd8086
     the long option, just like "--fu", and not "-f" with arg "u".
Packit dd8086
Packit dd8086
     This distinction seems to be the most useful approach.  */
Packit dd8086
Packit dd8086
  if (longopts != NULL
Packit dd8086
      && (argv[d->optind][1] == '-'
Packit dd8086
	  || (long_only && (argv[d->optind][2]
Packit dd8086
			    || !strchr (optstring, argv[d->optind][1])))))
Packit dd8086
    {
Packit dd8086
      char *nameend;
Packit dd8086
      unsigned int namelen;
Packit dd8086
      const struct option *p;
Packit dd8086
      const struct option *pfound = NULL;
Packit dd8086
      struct option_list
Packit dd8086
      {
Packit dd8086
	const struct option *p;
Packit dd8086
	struct option_list *next;
Packit dd8086
      } *ambig_list = NULL;
Packit dd8086
      int exact = 0;
Packit dd8086
      int indfound = -1;
Packit dd8086
      int option_index;
Packit dd8086
Packit dd8086
      for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
Packit dd8086
	/* Do nothing.  */ ;
Packit dd8086
      namelen = nameend - d->__nextchar;
Packit dd8086
Packit dd8086
      /* Test all long options for either exact match
Packit dd8086
	 or abbreviated matches.  */
Packit dd8086
      for (p = longopts, option_index = 0; p->name; p++, option_index++)
Packit dd8086
	if (!strncmp (p->name, d->__nextchar, namelen))
Packit dd8086
	  {
Packit dd8086
	    if (namelen == (unsigned int) strlen (p->name))
Packit dd8086
	      {
Packit dd8086
		/* Exact match found.  */
Packit dd8086
		pfound = p;
Packit dd8086
		indfound = option_index;
Packit dd8086
		exact = 1;
Packit dd8086
		break;
Packit dd8086
	      }
Packit dd8086
	    else if (pfound == NULL)
Packit dd8086
	      {
Packit dd8086
		/* First nonexact match found.  */
Packit dd8086
		pfound = p;
Packit dd8086
		indfound = option_index;
Packit dd8086
	      }
Packit dd8086
	    else if (long_only
Packit dd8086
		     || pfound->has_arg != p->has_arg
Packit dd8086
		     || pfound->flag != p->flag
Packit dd8086
		     || pfound->val != p->val)
Packit dd8086
	      {
Packit dd8086
		/* Second or later nonexact match found.  */
Packit dd8086
		struct option_list *newp = alloca (sizeof (*newp));
Packit dd8086
		newp->p = p;
Packit dd8086
		newp->next = ambig_list;
Packit dd8086
		ambig_list = newp;
Packit dd8086
	      }
Packit dd8086
	  }
Packit dd8086
Packit dd8086
      if (ambig_list != NULL && !exact)
Packit dd8086
	{
Packit dd8086
	  if (print_errors)
Packit dd8086
	    {
Packit dd8086
	      struct option_list first;
Packit dd8086
	      first.p = pfound;
Packit dd8086
	      first.next = ambig_list;
Packit dd8086
	      ambig_list = &first;
Packit dd8086
Packit dd8086
#if defined _LIBC
Packit dd8086
	      char *buf = NULL;
Packit dd8086
	      size_t buflen = 0;
Packit dd8086
Packit dd8086
	      FILE *fp = open_memstream (&buf, &buflen);
Packit dd8086
	      if (fp != NULL)
Packit dd8086
		{
Packit dd8086
		  fprintf (fp,
Packit dd8086
			   _("%s: option '%s' is ambiguous; possibilities:"),
Packit dd8086
			   argv[0], argv[d->optind]);
Packit dd8086
Packit dd8086
		  do
Packit dd8086
		    {
Packit dd8086
		      fprintf (fp, " '--%s'", ambig_list->p->name);
Packit dd8086
		      ambig_list = ambig_list->next;
Packit dd8086
		    }
Packit dd8086
		  while (ambig_list != NULL);
Packit dd8086
Packit dd8086
		  fputc_unlocked ('\n', fp);
Packit dd8086
Packit dd8086
		  if (__builtin_expect (fclose (fp) != EOF, 1))
Packit dd8086
		    {
Packit dd8086
		      _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
		      int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
		      ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
		      __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
		      ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
		      _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
		      free (buf);
Packit dd8086
		    }
Packit dd8086
		}
Packit dd8086
#else
Packit dd8086
	      fprintf (stderr,
Packit dd8086
		       _("%s: option '%s' is ambiguous; possibilities:"),
Packit dd8086
		       argv[0], argv[d->optind]);
Packit dd8086
	      do
Packit dd8086
		{
Packit dd8086
		  fprintf (stderr, " '--%s'", ambig_list->p->name);
Packit dd8086
		  ambig_list = ambig_list->next;
Packit dd8086
		}
Packit dd8086
	      while (ambig_list != NULL);
Packit dd8086
Packit dd8086
	      fputc ('\n', stderr);
Packit dd8086
#endif
Packit dd8086
	    }
Packit dd8086
	  d->__nextchar += strlen (d->__nextchar);
Packit dd8086
	  d->optind++;
Packit dd8086
	  d->optopt = 0;
Packit dd8086
	  return '?';
Packit dd8086
	}
Packit dd8086
Packit dd8086
      if (pfound != NULL)
Packit dd8086
	{
Packit dd8086
	  option_index = indfound;
Packit dd8086
	  d->optind++;
Packit dd8086
	  if (*nameend)
Packit dd8086
	    {
Packit dd8086
	      /* Don't test has_arg with >, because some C compilers don't
Packit dd8086
		 allow it to be used on enums.  */
Packit dd8086
	      if (pfound->has_arg)
Packit dd8086
		d->optarg = nameend + 1;
Packit dd8086
	      else
Packit dd8086
		{
Packit dd8086
		  if (print_errors)
Packit dd8086
		    {
Packit dd8086
#if defined _LIBC
Packit dd8086
		      char *buf;
Packit dd8086
		      int n;
Packit dd8086
#endif
Packit dd8086
Packit dd8086
		      if (argv[d->optind - 1][1] == '-')
Packit dd8086
			{
Packit dd8086
			  /* --option */
Packit dd8086
#if defined _LIBC
Packit dd8086
			  n = __asprintf (&buf, _("\
Packit dd8086
%s: option '--%s' doesn't allow an argument\n"),
Packit dd8086
					  argv[0], pfound->name);
Packit dd8086
#else
Packit dd8086
			  fprintf (stderr, _("\
Packit dd8086
%s: option '--%s' doesn't allow an argument\n"),
Packit dd8086
				   argv[0], pfound->name);
Packit dd8086
#endif
Packit dd8086
			}
Packit dd8086
		      else
Packit dd8086
			{
Packit dd8086
			  /* +option or -option */
Packit dd8086
#if defined _LIBC
Packit dd8086
			  n = __asprintf (&buf, _("\
Packit dd8086
%s: option '%c%s' doesn't allow an argument\n"),
Packit dd8086
					  argv[0], argv[d->optind - 1][0],
Packit dd8086
					  pfound->name);
Packit dd8086
#else
Packit dd8086
			  fprintf (stderr, _("\
Packit dd8086
%s: option '%c%s' doesn't allow an argument\n"),
Packit dd8086
				   argv[0], argv[d->optind - 1][0],
Packit dd8086
				   pfound->name);
Packit dd8086
#endif
Packit dd8086
			}
Packit dd8086
Packit dd8086
#if defined _LIBC
Packit dd8086
		      if (n >= 0)
Packit dd8086
			{
Packit dd8086
			  _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
			  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
			  ((_IO_FILE *) stderr)->_flags2
Packit dd8086
			    |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
			  __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
			  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
			  _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
			  free (buf);
Packit dd8086
			}
Packit dd8086
#endif
Packit dd8086
		    }
Packit dd8086
Packit dd8086
		  d->__nextchar += strlen (d->__nextchar);
Packit dd8086
Packit dd8086
		  d->optopt = pfound->val;
Packit dd8086
		  return '?';
Packit dd8086
		}
Packit dd8086
	    }
Packit dd8086
	  else if (pfound->has_arg == 1)
Packit dd8086
	    {
Packit dd8086
	      if (d->optind < argc)
Packit dd8086
		d->optarg = argv[d->optind++];
Packit dd8086
	      else
Packit dd8086
		{
Packit dd8086
		  if (print_errors)
Packit dd8086
		    {
Packit dd8086
#if defined _LIBC
Packit dd8086
		      char *buf;
Packit dd8086
Packit dd8086
		      if (__asprintf (&buf, _("\
Packit dd8086
%s: option '--%s' requires an argument\n"),
Packit dd8086
				      argv[0], pfound->name) >= 0)
Packit dd8086
			{
Packit dd8086
			  _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
			  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
			  ((_IO_FILE *) stderr)->_flags2
Packit dd8086
			    |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
			  __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
			  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
			  _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
			  free (buf);
Packit dd8086
			}
Packit dd8086
#else
Packit dd8086
		      fprintf (stderr,
Packit dd8086
			       _("%s: option '--%s' requires an argument\n"),
Packit dd8086
			       argv[0], pfound->name);
Packit dd8086
#endif
Packit dd8086
		    }
Packit dd8086
		  d->__nextchar += strlen (d->__nextchar);
Packit dd8086
		  d->optopt = pfound->val;
Packit dd8086
		  return optstring[0] == ':' ? ':' : '?';
Packit dd8086
		}
Packit dd8086
	    }
Packit dd8086
	  d->__nextchar += strlen (d->__nextchar);
Packit dd8086
	  if (longind != NULL)
Packit dd8086
	    *longind = option_index;
Packit dd8086
	  if (pfound->flag)
Packit dd8086
	    {
Packit dd8086
	      *(pfound->flag) = pfound->val;
Packit dd8086
	      return 0;
Packit dd8086
	    }
Packit dd8086
	  return pfound->val;
Packit dd8086
	}
Packit dd8086
Packit dd8086
      /* Can't find it as a long option.  If this is not getopt_long_only,
Packit dd8086
	 or the option starts with '--' or is not a valid short
Packit dd8086
	 option, then it's an error.
Packit dd8086
	 Otherwise interpret it as a short option.  */
Packit dd8086
      if (!long_only || argv[d->optind][1] == '-'
Packit dd8086
	  || strchr (optstring, *d->__nextchar) == NULL)
Packit dd8086
	{
Packit dd8086
	  if (print_errors)
Packit dd8086
	    {
Packit dd8086
#if defined _LIBC
Packit dd8086
	      char *buf;
Packit dd8086
	      int n;
Packit dd8086
#endif
Packit dd8086
Packit dd8086
	      if (argv[d->optind][1] == '-')
Packit dd8086
		{
Packit dd8086
		  /* --option */
Packit dd8086
#if defined _LIBC
Packit dd8086
		  n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"),
Packit dd8086
				  argv[0], d->__nextchar);
Packit dd8086
#else
Packit dd8086
		  fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
Packit dd8086
			   argv[0], d->__nextchar);
Packit dd8086
#endif
Packit dd8086
		}
Packit dd8086
	      else
Packit dd8086
		{
Packit dd8086
		  /* +option or -option */
Packit dd8086
#if defined _LIBC
Packit dd8086
		  n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"),
Packit dd8086
				  argv[0], argv[d->optind][0], d->__nextchar);
Packit dd8086
#else
Packit dd8086
		  fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
Packit dd8086
			   argv[0], argv[d->optind][0], d->__nextchar);
Packit dd8086
#endif
Packit dd8086
		}
Packit dd8086
Packit dd8086
#if defined _LIBC
Packit dd8086
	      if (n >= 0)
Packit dd8086
		{
Packit dd8086
		  _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
		  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
		  ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
		  __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
		  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
		  _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
		  free (buf);
Packit dd8086
		}
Packit dd8086
#endif
Packit dd8086
	    }
Packit dd8086
	  d->__nextchar = (char *) "";
Packit dd8086
	  d->optind++;
Packit dd8086
	  d->optopt = 0;
Packit dd8086
	  return '?';
Packit dd8086
	}
Packit dd8086
    }
Packit dd8086
Packit dd8086
  /* Look at and handle the next short option-character.  */
Packit dd8086
Packit dd8086
  {
Packit dd8086
    char c = *d->__nextchar++;
Packit dd8086
    char *temp = strchr (optstring, c);
Packit dd8086
Packit dd8086
    /* Increment `optind' when we start to process its last character.  */
Packit dd8086
    if (*d->__nextchar == '\0')
Packit dd8086
      ++d->optind;
Packit dd8086
Packit dd8086
    if (temp == NULL || c == ':' || c == ';')
Packit dd8086
      {
Packit dd8086
	if (print_errors)
Packit dd8086
	  {
Packit dd8086
#if defined _LIBC
Packit dd8086
	    char *buf;
Packit dd8086
	    int n;
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#if defined _LIBC
Packit dd8086
	    n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"),
Packit dd8086
			    argv[0], c);
Packit dd8086
#else
Packit dd8086
	    fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#if defined _LIBC
Packit dd8086
	    if (n >= 0)
Packit dd8086
	      {
Packit dd8086
		_IO_flockfile (stderr);
Packit dd8086
Packit dd8086
		int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
		((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
		__fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
		((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
		_IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
		free (buf);
Packit dd8086
	      }
Packit dd8086
#endif
Packit dd8086
	  }
Packit dd8086
	d->optopt = c;
Packit dd8086
	return '?';
Packit dd8086
      }
Packit dd8086
    /* Convenience. Treat POSIX -W foo same as long option --foo */
Packit dd8086
    if (temp[0] == 'W' && temp[1] == ';')
Packit dd8086
      {
Packit dd8086
	char *nameend;
Packit dd8086
	const struct option *p;
Packit dd8086
	const struct option *pfound = NULL;
Packit dd8086
	int exact = 0;
Packit dd8086
	int ambig = 0;
Packit dd8086
	int indfound = 0;
Packit dd8086
	int option_index;
Packit dd8086
Packit dd8086
	if (longopts == NULL)
Packit dd8086
	  goto no_longs;
Packit dd8086
Packit dd8086
	/* This is an option that requires an argument.  */
Packit dd8086
	if (*d->__nextchar != '\0')
Packit dd8086
	  {
Packit dd8086
	    d->optarg = d->__nextchar;
Packit dd8086
	    /* If we end this ARGV-element by taking the rest as an arg,
Packit dd8086
	       we must advance to the next element now.  */
Packit dd8086
	    d->optind++;
Packit dd8086
	  }
Packit dd8086
	else if (d->optind == argc)
Packit dd8086
	  {
Packit dd8086
	    if (print_errors)
Packit dd8086
	      {
Packit dd8086
#if defined _LIBC
Packit dd8086
		char *buf;
Packit dd8086
Packit dd8086
		if (__asprintf (&buf,
Packit dd8086
				_("%s: option requires an argument -- '%c'\n"),
Packit dd8086
				argv[0], c) >= 0)
Packit dd8086
		  {
Packit dd8086
		    _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
		    __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
		    _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
		    free (buf);
Packit dd8086
		  }
Packit dd8086
#else
Packit dd8086
		fprintf (stderr,
Packit dd8086
			 _("%s: option requires an argument -- '%c'\n"),
Packit dd8086
			 argv[0], c);
Packit dd8086
#endif
Packit dd8086
	      }
Packit dd8086
	    d->optopt = c;
Packit dd8086
	    if (optstring[0] == ':')
Packit dd8086
	      c = ':';
Packit dd8086
	    else
Packit dd8086
	      c = '?';
Packit dd8086
	    return c;
Packit dd8086
	  }
Packit dd8086
	else
Packit dd8086
	  /* We already incremented `d->optind' once;
Packit dd8086
	     increment it again when taking next ARGV-elt as argument.  */
Packit dd8086
	  d->optarg = argv[d->optind++];
Packit dd8086
Packit dd8086
	/* optarg is now the argument, see if it's in the
Packit dd8086
	   table of longopts.  */
Packit dd8086
Packit dd8086
	for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
Packit dd8086
	     nameend++)
Packit dd8086
	  /* Do nothing.  */ ;
Packit dd8086
Packit dd8086
	/* Test all long options for either exact match
Packit dd8086
	   or abbreviated matches.  */
Packit dd8086
	for (p = longopts, option_index = 0; p->name; p++, option_index++)
Packit dd8086
	  if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
Packit dd8086
	    {
Packit dd8086
	      if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
Packit dd8086
		{
Packit dd8086
		  /* Exact match found.  */
Packit dd8086
		  pfound = p;
Packit dd8086
		  indfound = option_index;
Packit dd8086
		  exact = 1;
Packit dd8086
		  break;
Packit dd8086
		}
Packit dd8086
	      else if (pfound == NULL)
Packit dd8086
		{
Packit dd8086
		  /* First nonexact match found.  */
Packit dd8086
		  pfound = p;
Packit dd8086
		  indfound = option_index;
Packit dd8086
		}
Packit dd8086
	      else if (long_only
Packit dd8086
		       || pfound->has_arg != p->has_arg
Packit dd8086
		       || pfound->flag != p->flag
Packit dd8086
		       || pfound->val != p->val)
Packit dd8086
		/* Second or later nonexact match found.  */
Packit dd8086
		ambig = 1;
Packit dd8086
	    }
Packit dd8086
	if (ambig && !exact)
Packit dd8086
	  {
Packit dd8086
	    if (print_errors)
Packit dd8086
	      {
Packit dd8086
#if defined _LIBC
Packit dd8086
		char *buf;
Packit dd8086
Packit dd8086
		if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
Packit dd8086
				argv[0], d->optarg) >= 0)
Packit dd8086
		  {
Packit dd8086
		    _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
		    __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
		    _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
		    free (buf);
Packit dd8086
		  }
Packit dd8086
#else
Packit dd8086
		fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
Packit dd8086
			 argv[0], d->optarg);
Packit dd8086
#endif
Packit dd8086
	      }
Packit dd8086
	    d->__nextchar += strlen (d->__nextchar);
Packit dd8086
	    d->optind++;
Packit dd8086
	    return '?';
Packit dd8086
	  }
Packit dd8086
	if (pfound != NULL)
Packit dd8086
	  {
Packit dd8086
	    option_index = indfound;
Packit dd8086
	    if (*nameend)
Packit dd8086
	      {
Packit dd8086
		/* Don't test has_arg with >, because some C compilers don't
Packit dd8086
		   allow it to be used on enums.  */
Packit dd8086
		if (pfound->has_arg)
Packit dd8086
		  d->optarg = nameend + 1;
Packit dd8086
		else
Packit dd8086
		  {
Packit dd8086
		    if (print_errors)
Packit dd8086
		      {
Packit dd8086
#if defined _LIBC
Packit dd8086
			char *buf;
Packit dd8086
Packit dd8086
			if (__asprintf (&buf, _("\
Packit dd8086
%s: option '-W %s' doesn't allow an argument\n"),
Packit dd8086
					argv[0], pfound->name) >= 0)
Packit dd8086
			  {
Packit dd8086
			    _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
			    ((_IO_FILE *) stderr)->_flags2
Packit dd8086
			      |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
			    __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
			    _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
			    free (buf);
Packit dd8086
			  }
Packit dd8086
#else
Packit dd8086
			fprintf (stderr, _("\
Packit dd8086
%s: option '-W %s' doesn't allow an argument\n"),
Packit dd8086
				 argv[0], pfound->name);
Packit dd8086
#endif
Packit dd8086
		      }
Packit dd8086
Packit dd8086
		    d->__nextchar += strlen (d->__nextchar);
Packit dd8086
		    return '?';
Packit dd8086
		  }
Packit dd8086
	      }
Packit dd8086
	    else if (pfound->has_arg == 1)
Packit dd8086
	      {
Packit dd8086
		if (d->optind < argc)
Packit dd8086
		  d->optarg = argv[d->optind++];
Packit dd8086
		else
Packit dd8086
		  {
Packit dd8086
		    if (print_errors)
Packit dd8086
		      {
Packit dd8086
#if defined _LIBC
Packit dd8086
			char *buf;
Packit dd8086
Packit dd8086
			if (__asprintf (&buf, _("\
Packit dd8086
%s: option '-W %s' requires an argument\n"),
Packit dd8086
					argv[0], pfound->name) >= 0)
Packit dd8086
			  {
Packit dd8086
			    _IO_flockfile (stderr);
Packit dd8086
Packit dd8086
			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
			    ((_IO_FILE *) stderr)->_flags2
Packit dd8086
			      |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
			    __fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
			    _IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
			    free (buf);
Packit dd8086
			  }
Packit dd8086
#else
Packit dd8086
			fprintf (stderr, _("\
Packit dd8086
%s: option '-W %s' requires an argument\n"),
Packit dd8086
				 argv[0], pfound->name);
Packit dd8086
#endif
Packit dd8086
		      }
Packit dd8086
		    d->__nextchar += strlen (d->__nextchar);
Packit dd8086
		    return optstring[0] == ':' ? ':' : '?';
Packit dd8086
		  }
Packit dd8086
	      }
Packit dd8086
	    else
Packit dd8086
	      d->optarg = NULL;
Packit dd8086
	    d->__nextchar += strlen (d->__nextchar);
Packit dd8086
	    if (longind != NULL)
Packit dd8086
	      *longind = option_index;
Packit dd8086
	    if (pfound->flag)
Packit dd8086
	      {
Packit dd8086
		*(pfound->flag) = pfound->val;
Packit dd8086
		return 0;
Packit dd8086
	      }
Packit dd8086
	    return pfound->val;
Packit dd8086
	  }
Packit dd8086
Packit dd8086
      no_longs:
Packit dd8086
	d->__nextchar = NULL;
Packit dd8086
	return 'W';	/* Let the application handle it.   */
Packit dd8086
      }
Packit dd8086
    if (temp[1] == ':')
Packit dd8086
      {
Packit dd8086
	if (temp[2] == ':')
Packit dd8086
	  {
Packit dd8086
	    /* This is an option that accepts an argument optionally.  */
Packit dd8086
	    if (*d->__nextchar != '\0')
Packit dd8086
	      {
Packit dd8086
		d->optarg = d->__nextchar;
Packit dd8086
		d->optind++;
Packit dd8086
	      }
Packit dd8086
	    else
Packit dd8086
	      d->optarg = NULL;
Packit dd8086
	    d->__nextchar = NULL;
Packit dd8086
	  }
Packit dd8086
	else
Packit dd8086
	  {
Packit dd8086
	    /* This is an option that requires an argument.  */
Packit dd8086
	    if (*d->__nextchar != '\0')
Packit dd8086
	      {
Packit dd8086
		d->optarg = d->__nextchar;
Packit dd8086
		/* If we end this ARGV-element by taking the rest as an arg,
Packit dd8086
		   we must advance to the next element now.  */
Packit dd8086
		d->optind++;
Packit dd8086
	      }
Packit dd8086
	    else if (d->optind == argc)
Packit dd8086
	      {
Packit dd8086
		if (print_errors)
Packit dd8086
		  {
Packit dd8086
#if defined _LIBC
Packit dd8086
		    char *buf;
Packit dd8086
Packit dd8086
		    if (__asprintf (&buf, _("\
Packit dd8086
%s: option requires an argument -- '%c'\n"),
Packit dd8086
				    argv[0], c) >= 0)
Packit dd8086
		      {
Packit dd8086
			_IO_flockfile (stderr);
Packit dd8086
Packit dd8086
			int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
Packit dd8086
			((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
Packit dd8086
Packit dd8086
			__fxprintf (NULL, "%s", buf);
Packit dd8086
Packit dd8086
			((_IO_FILE *) stderr)->_flags2 = old_flags2;
Packit dd8086
			_IO_funlockfile (stderr);
Packit dd8086
Packit dd8086
			free (buf);
Packit dd8086
		      }
Packit dd8086
#else
Packit dd8086
		    fprintf (stderr,
Packit dd8086
			     _("%s: option requires an argument -- '%c'\n"),
Packit dd8086
			     argv[0], c);
Packit dd8086
#endif
Packit dd8086
		  }
Packit dd8086
		d->optopt = c;
Packit dd8086
		if (optstring[0] == ':')
Packit dd8086
		  c = ':';
Packit dd8086
		else
Packit dd8086
		  c = '?';
Packit dd8086
	      }
Packit dd8086
	    else
Packit dd8086
	      /* We already incremented `optind' once;
Packit dd8086
		 increment it again when taking next ARGV-elt as argument.  */
Packit dd8086
	      d->optarg = argv[d->optind++];
Packit dd8086
	    d->__nextchar = NULL;
Packit dd8086
	  }
Packit dd8086
      }
Packit dd8086
    return c;
Packit dd8086
  }
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
_getopt_internal (int argc, char *const *argv, const char *optstring,
Packit dd8086
		  const struct option *longopts, int *longind, int long_only,
Packit dd8086
		  int posixly_correct)
Packit dd8086
{
Packit dd8086
  int result;
Packit dd8086
Packit dd8086
  getopt_data.optind = optind;
Packit dd8086
  getopt_data.opterr = opterr;
Packit dd8086
Packit dd8086
  result = _getopt_internal_r (argc, argv, optstring, longopts,
Packit dd8086
			       longind, long_only, &getopt_data,
Packit dd8086
			       posixly_correct);
Packit dd8086
Packit dd8086
  optind = getopt_data.optind;
Packit dd8086
  optarg = getopt_data.optarg;
Packit dd8086
  optopt = getopt_data.optopt;
Packit dd8086
Packit dd8086
  return result;
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
getopt (int argc, char *const *argv, const char *optstring)
Packit dd8086
{
Packit dd8086
  return _getopt_internal (argc, argv, optstring,
Packit dd8086
			   (const struct option *) 0,
Packit dd8086
			   (int *) 0,
Packit dd8086
			   0, 0);
Packit dd8086
}
Packit dd8086
Packit dd8086
#ifdef _LIBC
Packit dd8086
int
Packit dd8086
__posix_getopt (int argc, char *const *argv, const char *optstring)
Packit dd8086
{
Packit dd8086
  return _getopt_internal (argc, argv, optstring,
Packit dd8086
			   (const struct option *) 0,
Packit dd8086
			   (int *) 0,
Packit dd8086
			   0, 1);
Packit dd8086
}
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#endif	/* Not ELIDE_CODE.  */
Packit dd8086

Packit dd8086
#ifdef TEST
Packit dd8086
Packit dd8086
/* Compile with -DTEST to make an executable for use in testing
Packit dd8086
   the above definition of `getopt'.  */
Packit dd8086
Packit dd8086
int
Packit dd8086
main (int argc, char **argv)
Packit dd8086
{
Packit dd8086
  int c;
Packit dd8086
  int digit_optind = 0;
Packit dd8086
Packit dd8086
  while (1)
Packit dd8086
    {
Packit dd8086
      int this_option_optind = optind ? optind : 1;
Packit dd8086
Packit dd8086
      c = getopt (argc, argv, "abc:d:0123456789");
Packit dd8086
      if (c == -1)
Packit dd8086
	break;
Packit dd8086
Packit dd8086
      switch (c)
Packit dd8086
	{
Packit dd8086
	case '0':
Packit dd8086
	case '1':
Packit dd8086
	case '2':
Packit dd8086
	case '3':
Packit dd8086
	case '4':
Packit dd8086
	case '5':
Packit dd8086
	case '6':
Packit dd8086
	case '7':
Packit dd8086
	case '8':
Packit dd8086
	case '9':
Packit dd8086
	  if (digit_optind != 0 && digit_optind != this_option_optind)
Packit dd8086
	    printf ("digits occur in two different argv-elements.\n");
Packit dd8086
	  digit_optind = this_option_optind;
Packit dd8086
	  printf ("option %c\n", c);
Packit dd8086
	  break;
Packit dd8086
Packit dd8086
	case 'a':
Packit dd8086
	  printf ("option a\n");
Packit dd8086
	  break;
Packit dd8086
Packit dd8086
	case 'b':
Packit dd8086
	  printf ("option b\n");
Packit dd8086
	  break;
Packit dd8086
Packit dd8086
	case 'c':
Packit dd8086
	  printf ("option c with value '%s'\n", optarg);
Packit dd8086
	  break;
Packit dd8086
Packit dd8086
	case '?':
Packit dd8086
	  break;
Packit dd8086
Packit dd8086
	default:
Packit dd8086
	  printf ("?? getopt returned character code 0%o ??\n", c);
Packit dd8086
	}
Packit dd8086
    }
Packit dd8086
Packit dd8086
  if (optind < argc)
Packit dd8086
    {
Packit dd8086
      printf ("non-option ARGV-elements: ");
Packit dd8086
      while (optind < argc)
Packit dd8086
	printf ("%s ", argv[optind++]);
Packit dd8086
      printf ("\n");
Packit dd8086
    }
Packit dd8086
Packit dd8086
  exit (0);
Packit dd8086
}
Packit dd8086
Packit dd8086
#endif /* TEST */