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