1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Getopt for GNU.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   NOTE: getopt is 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!
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2012 Free Software
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of the GNU C Library.
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   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
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) 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
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _LIBC
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <config.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getopt.h"
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <unistd.h>
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef _LIBC
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <libintl.h>
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "gettext.h"
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define _(msgid) gettext (msgid)
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <wchar.h>
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* This version of 'getopt' appears to the caller like standard Unix 'getopt'
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but it behaves differently for the user, since it allows the user
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   to intersperse the options with the other arguments.
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   As 'getopt_long' works, it permutes the elements of ARGV so that,
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   when it is done, all the options precede everything else.  Thus
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   all application programs are extended to handle flexible argument order.
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Using 'getopt' or setting the environment variable POSIXLY_CORRECT
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   disables permutation.
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Then the behavior is completely standard.
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU application programs can use a third alternative mode in which
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   they can distinguish the relative order of options and other arguments.  */
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getopt_int.h"
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* For communication from 'getopt' to the caller.
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   When 'getopt' finds an option that takes an argument,
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the argument value is returned here.
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Also, when 'ordering' is RETURN_IN_ORDER,
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   each non-option ARGV-element is returned here.  */
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *optarg;
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Index in ARGV of the next element to be scanned.
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This is used for communication to and from the caller
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and for communication between successive calls to 'getopt'.
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   On entry to 'getopt', zero means this is the first call; initialize.
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   When 'getopt' returns -1, this is the index of the first of the
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   non-option elements that the caller should itself scan.
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Otherwise, 'optind' communicates from one call to the next
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   how much of ARGV has been scanned so far.  */
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* 1003.2 says this must be 1 before any call.  */
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint optind = 1;
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Callers store zero here to inhibit the error message
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   for unrecognized options.  */
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint opterr = 1;
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Set to an option character which was unrecognized.
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This must be initialized on some systems to avoid linking in the
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   system's own getopt implementation.  */
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint optopt = '?';
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Keep a global copy of all internal members of getopt_data.  */
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct _getopt_data getopt_data;
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern char *getenv ();
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef _LIBC
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Stored original parameters.
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   XXX This is no good solution.  We should rather copy the args so
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   that we can compare them later.  But we must not use malloc(3).  */
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int __libc_argc;
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern char **__libc_argv;
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Bash 2.0 gives us an environment variable containing flags
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   indicating ARGV elements that should not be considered arguments.  */
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef USE_NONOPTION_FLAGS
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Defined in getopt_init.c  */
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern char *__getopt_nonoption_flags;
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef USE_NONOPTION_FLAGS
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define SWAP_FLAGS(ch1, ch2) \
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (d->__nonoption_flags_len > 0)                                           \
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {                                                                         \
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      char __tmp = __getopt_nonoption_flags[ch1];                             \
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];          \
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      __getopt_nonoption_flags[ch2] = __tmp;                                  \
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define SWAP_FLAGS(ch1, ch2)
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else   /* !_LIBC */
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define SWAP_FLAGS(ch1, ch2)
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif  /* _LIBC */
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Exchange two adjacent subsequences of ARGV.
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   One subsequence is elements [first_nonopt,last_nonopt)
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   which contains all the non-options that have been skipped so far.
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The other is elements [last_nonopt,optind), which contains all
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the options processed since those non-options were skipped.
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   'first_nonopt' and 'last_nonopt' are relocated so that they describe
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the new indices of the non-options in ARGV after they are moved.  */
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexchange (char **argv, struct _getopt_data *d)
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int bottom = d->__first_nonopt;
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int middle = d->__last_nonopt;
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int top = d->optind;
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *tem;
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Exchange the shorter segment with the far end of the longer segment.
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     That puts the shorter segment into the right place.
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     It leaves the longer segment in the right place overall,
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     but it consists of two parts that need to be swapped next.  */
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_NONOPTION_FLAGS
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* First make sure the handling of the '__getopt_nonoption_flags'
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     string can work normally.  Our top argument must be in the range
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     of the string.  */
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* We must extend the array.  The user plays games with us and
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang         presents new arguments.  */
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char *new_str = malloc (top + 1);
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (new_str == NULL)
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          memset (__mempcpy (new_str, __getopt_nonoption_flags,
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             d->__nonoption_flags_max_len),
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  '\0', top + 1 - d->__nonoption_flags_max_len);
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->__nonoption_flags_max_len = top + 1;
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          __getopt_nonoption_flags = new_str;
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (top > middle && middle > bottom)
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (top - middle > middle - bottom)
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Bottom segment is the short one.  */
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          int len = middle - bottom;
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          register int i;
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Swap it with the top part of the top segment.  */
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          for (i = 0; i < len; i++)
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              tem = argv[bottom + i];
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              argv[bottom + i] = argv[top - (middle - bottom) + i];
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              argv[top - (middle - bottom) + i] = tem;
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Exclude the moved bottom segment from further swapping.  */
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          top -= len;
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Top segment is the short one.  */
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          int len = top - middle;
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          register int i;
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Swap it with the bottom part of the bottom segment.  */
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          for (i = 0; i < len; i++)
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              tem = argv[bottom + i];
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              argv[bottom + i] = argv[middle + i];
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              argv[middle + i] = tem;
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              SWAP_FLAGS (bottom + i, middle + i);
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Exclude the moved top segment from further swapping.  */
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          bottom += len;
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Update records for the slots the non-options now occupy.  */
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  d->__first_nonopt += (d->optind - d->__last_nonopt);
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  d->__last_nonopt = d->optind;
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Initialize the internal data when the first call is made.  */
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic const char *
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_getopt_initialize (int argc _GL_UNUSED,
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    char **argv _GL_UNUSED, const char *optstring,
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    struct _getopt_data *d, int posixly_correct)
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Start processing options with ARGV-element 1 (since ARGV-element 0
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     is the program name); the sequence of previously skipped
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     non-option ARGV-elements is empty.  */
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  d->__first_nonopt = d->__last_nonopt = d->optind;
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  d->__nextchar = NULL;
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Determine how to handle the ordering of options and nonoptions.  */
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (optstring[0] == '-')
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      d->__ordering = RETURN_IN_ORDER;
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++optstring;
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else if (optstring[0] == '+')
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      d->__ordering = REQUIRE_ORDER;
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++optstring;
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else if (d->__posixly_correct)
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    d->__ordering = REQUIRE_ORDER;
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    d->__ordering = PERMUTE;
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_NONOPTION_FLAGS
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!d->__posixly_correct
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      && argc == __libc_argc && argv == __libc_argv)
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->__nonoption_flags_max_len == 0)
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (__getopt_nonoption_flags == NULL
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              || __getopt_nonoption_flags[0] == '\0')
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__nonoption_flags_max_len = -1;
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              const char *orig_str = __getopt_nonoption_flags;
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              int len = d->__nonoption_flags_max_len = strlen (orig_str);
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (d->__nonoption_flags_max_len < argc)
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->__nonoption_flags_max_len = argc;
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              __getopt_nonoption_flags =
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                (char *) malloc (d->__nonoption_flags_max_len);
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (__getopt_nonoption_flags == NULL)
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->__nonoption_flags_max_len = -1;
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              else
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        '\0', d->__nonoption_flags_max_len - len);
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      d->__nonoption_flags_len = d->__nonoption_flags_max_len;
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    d->__nonoption_flags_len = 0;
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return optstring;
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Scan elements of ARGV (whose length is ARGC) for option characters
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   given in OPTSTRING.
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If an element of ARGV starts with '-', and is not exactly "-" or "--",
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   then it is an option element.  The characters of this element
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (aside from the initial '-') are option characters.  If 'getopt'
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   is called repeatedly, it returns successively each of the option characters
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   from each of the option elements.
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If 'getopt' finds another option character, it returns that character,
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   updating 'optind' and 'nextchar' so that the next call to 'getopt' can
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   resume the scan with the following option character or ARGV-element.
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If there are no more option characters, 'getopt' returns -1.
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Then 'optind' is the index in ARGV of the first ARGV-element
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   that is not an option.  (The ARGV-elements have been permuted
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   so that those that are not options now come last.)
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   OPTSTRING is a string containing the legitimate option characters.
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If an option character is seen that is not listed in OPTSTRING,
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   return '?' after printing an error message.  If you set 'opterr' to
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   zero, the error message is suppressed but we still return '?'.
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   so the following text in the same ARGV-element, or the text of the following
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ARGV-element, is returned in 'optarg'.  Two colons mean an option that
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   wants an optional arg; if there is text in the current ARGV-element,
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it is returned in 'optarg', otherwise 'optarg' is set to zero.
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If OPTSTRING starts with '-' or '+', it requests different methods of
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   handling the non-option ARGV-elements.
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Long-named options begin with '--' instead of '-'.
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Their names may be abbreviated as long as the abbreviation is unique
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or is an exact match for some defined option.  If they have an
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   argument, it follows the option name in the same ARGV-element, separated
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   from the option name by a '=', or else the in next ARGV-element.
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   When 'getopt' finds a long-named option, it returns 0 if that option's
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   'flag' field is nonzero, the value of the option's 'val' field
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if the 'flag' field is zero.
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   The elements of ARGV aren't really const, because we permute them.
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   But we pretend they're const in the prototype to be compatible
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   with other systems.
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   LONGOPTS is a vector of 'struct option' terminated by an
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   element containing a name which is zero.
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   LONGIND returns the index in LONGOPT of the long-named option found.
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   It is only valid when a long-named option has been found by the most
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   recent call.
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   long-named options.  */
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_getopt_internal_r (int argc, char **argv, const char *optstring,
34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    const struct option *longopts, int *longind,
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    int long_only, struct _getopt_data *d, int posixly_correct)
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int print_errors = d->opterr;
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (argc < 1)
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return -1;
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  d->optarg = NULL;
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (d->optind == 0 || !d->__initialized)
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->optind == 0)
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        d->optind = 1;  /* Don't scan ARGV[0], the program name.  */
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      optstring = _getopt_initialize (argc, argv, optstring, d,
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                      posixly_correct);
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      d->__initialized = 1;
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else if (optstring[0] == '-' || optstring[0] == '+')
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    optstring++;
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (optstring[0] == ':')
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    print_errors = 0;
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Test whether ARGV[optind] points to a non-option argument.
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     Either it does not have option syntax, or there is an environment flag
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     from the shell indicating it is not an option.  The later information
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     is only used when the used in the GNU libc.  */
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_NONOPTION_FLAGS
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      || (d->optind < d->__nonoption_flags_len                \
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          && __getopt_nonoption_flags[d->optind] == '1'))
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (d->__nextchar == NULL || *d->__nextchar == '\0')
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Advance to the next ARGV-element.  */
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang         moved back by the user (who may also have changed the arguments).  */
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->__last_nonopt > d->optind)
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        d->__last_nonopt = d->optind;
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->__first_nonopt > d->optind)
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        d->__first_nonopt = d->optind;
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->__ordering == PERMUTE)
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* If we have just processed some options following some non-options,
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang             exchange them so that the options come first.  */
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (d->__first_nonopt != d->__last_nonopt
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              && d->__last_nonopt != d->optind)
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            exchange ((char **) argv, d);
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else if (d->__last_nonopt != d->optind)
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__first_nonopt = d->optind;
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Skip any additional non-options
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang             and extend the range of non-options previously skipped.  */
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          while (d->optind < argc && NONOPTION_P)
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->optind++;
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->__last_nonopt = d->optind;
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      /* The special ARGV-element '--' means premature end of options.
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang         Skip it like a null option,
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang         then exchange with previous non-options as if it were an option,
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         then skip everything else like a non-option.  */
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->optind != argc && !strcmp (argv[d->optind], "--"))
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optind++;
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (d->__first_nonopt != d->__last_nonopt
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              && d->__last_nonopt != d->optind)
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            exchange ((char **) argv, d);
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else if (d->__first_nonopt == d->__last_nonopt)
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__first_nonopt = d->optind;
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->__last_nonopt = argc;
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optind = argc;
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* If we have done all the ARGV-elements, stop the scan
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang         and back over any non-options that we skipped and permuted.  */
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (d->optind == argc)
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Set the next-arg-index to point at the non-options
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang             that we previously skipped, so the caller will digest them.  */
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (d->__first_nonopt != d->__last_nonopt)
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->optind = d->__first_nonopt;
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          return -1;
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* If we have come to a non-option and did not permute it,
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang         either stop the scan or describe it to the caller and pass it by.  */
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (NONOPTION_P)
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (d->__ordering == REQUIRE_ORDER)
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            return -1;
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optarg = argv[d->optind++];
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          return 1;
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* We have found another option-ARGV-element.
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         Skip the initial punctuation.  */
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      d->__nextchar = (argv[d->optind] + 1
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  + (longopts != NULL && argv[d->optind][1] == '-'));
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Decode the current option-ARGV-element.  */
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Check whether the ARGV-element is a long option.
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     If long_only and the ARGV-element has the form "-f", where f is
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     a valid short option, don't consider it an abbreviated form of
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     a long option that starts with f.  Otherwise there would be no
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     way to give the -f short option.
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     On the other hand, if there's a long option "fubar" and
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     the ARGV-element is "-fu", do consider that an abbreviation of
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     the long option, just like "--fu", and not "-f" with arg "u".
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     This distinction seems to be the most useful approach.  */
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (longopts != NULL
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      && (argv[d->optind][1] == '-'
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          || (long_only && (argv[d->optind][2]
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            || !strchr (optstring, argv[d->optind][1])))))
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char *nameend;
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      unsigned int namelen;
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      const struct option *p;
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      const struct option *pfound = NULL;
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      struct option_list
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        const struct option *p;
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        struct option_list *next;
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      } *ambig_list = NULL;
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int exact = 0;
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int indfound = -1;
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int option_index;
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* Do nothing.  */ ;
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      namelen = nameend - d->__nextchar;
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Test all long options for either exact match
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang         or abbreviated matches.  */
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (p = longopts, option_index = 0; p->name; p++, option_index++)
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (!strncmp (p->name, d->__nextchar, namelen))
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (namelen == (unsigned int) strlen (p->name))
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                /* Exact match found.  */
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                pfound = p;
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                indfound = option_index;
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                exact = 1;
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                break;
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else if (pfound == NULL)
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                /* First nonexact match found.  */
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                pfound = p;
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                indfound = option_index;
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else if (long_only
51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     || pfound->has_arg != p->has_arg
51905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     || pfound->flag != p->flag
52005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     || pfound->val != p->val)
52105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
52205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                /* Second or later nonexact match found.  */
52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                struct option_list *newp = malloc (sizeof (*newp));
52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                newp->p = p;
52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                newp->next = ambig_list;
52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                ambig_list = newp;
52705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
52805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if (ambig_list != NULL && !exact)
53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (print_errors)
53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              struct option_list first;
53505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              first.p = pfound;
53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              first.next = ambig_list;
53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              ambig_list = &first;
53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              char *buf = NULL;
54105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              size_t buflen = 0;
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
54305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              FILE *fp = open_memstream (&buf, &buflen);
54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (fp != NULL)
54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
54605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  fprintf (fp,
54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           _("%s: option '%s' is ambiguous; possibilities:"),
54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           argv[0], argv[d->optind]);
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  do
55105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    {
55205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      fprintf (fp, " '--%s'", ambig_list->p->name);
55305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      ambig_list = ambig_list->next;
55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    }
55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  while (ambig_list != NULL);
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  fputc_unlocked ('\n', fp);
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (__builtin_expect (fclose (fp) != EOF, 1))
56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    {
56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      _IO_flockfile (stderr);
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
56405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      __fxprintf (NULL, "%s", buf);
56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      ((_IO_FILE *) stderr)->_flags2 = old_flags2;
56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      _IO_funlockfile (stderr);
57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      free (buf);
57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    }
57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              fprintf (stderr,
57605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       _("%s: option '%s' is ambiguous; possibilities:"),
57705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       argv[0], argv[d->optind]);
57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              do
57905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
58005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  fprintf (stderr, " '--%s'", ambig_list->p->name);
58105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  ambig_list = ambig_list->next;
58205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              while (ambig_list != NULL);
58405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
58505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              fputc ('\n', stderr);
586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
58805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->__nextchar += strlen (d->__nextchar);
58905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optind++;
59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optopt = 0;
59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          return '?';
59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      while (ambig_list != NULL)
59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
59605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          struct option_list *pn = ambig_list->next;
59705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          free (ambig_list);
59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          ambig_list = pn;
59905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (pfound != NULL)
60205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
60305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          option_index = indfound;
60405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optind++;
60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (*nameend)
60605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              /* Don't test has_arg with >, because some C compilers don't
60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 allow it to be used on enums.  */
60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (pfound->has_arg)
61005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optarg = nameend + 1;
61105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              else
61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (print_errors)
61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    {
615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      char *buf;
61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      int n;
618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      if (argv[d->optind - 1][1] == '-')
62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        {
62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          /* --option */
623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          n = __asprintf (&buf, _("\
62505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '--%s' doesn't allow an argument\n"),
62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          argv[0], pfound->name);
627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
62805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          fprintf (stderr, _("\
62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '--%s' doesn't allow an argument\n"),
63005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   argv[0], pfound->name);
631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        }
63305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      else
63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        {
63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          /* +option or -option */
636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          n = __asprintf (&buf, _("\
63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '%c%s' doesn't allow an argument\n"),
63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          argv[0], argv[d->optind - 1][0],
64005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          pfound->name);
641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          fprintf (stderr, _("\
64305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '%c%s' doesn't allow an argument\n"),
64405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   argv[0], argv[d->optind - 1][0],
64505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   pfound->name);
646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
64705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        }
648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
65005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      if (n >= 0)
65105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        {
65205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          _IO_flockfile (stderr);
653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
65505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          ((_IO_FILE *) stderr)->_flags2
65605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            |= _IO_FLAGS2_NOTCANCEL;
657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          __fxprintf (NULL, "%s", buf);
659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
66005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          ((_IO_FILE *) stderr)->_flags2 = old_flags2;
66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          _IO_funlockfile (stderr);
662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
66305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          free (buf);
66405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        }
665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    }
66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  d->__nextchar += strlen (d->__nextchar);
66905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
67005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  d->optopt = pfound->val;
67105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  return '?';
67205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
67305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
67405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          else if (pfound->has_arg == 1)
67505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
67605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (d->optind < argc)
67705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optarg = argv[d->optind++];
67805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              else
67905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
68005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (print_errors)
68105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    {
682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
68305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      char *buf;
684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
68505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      if (__asprintf (&buf, _("\
68605436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '--%s' requires an argument\n"),
68705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                      argv[0], pfound->name) >= 0)
68805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        {
68905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          _IO_flockfile (stderr);
690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
69205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          ((_IO_FILE *) stderr)->_flags2
69305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            |= _IO_FLAGS2_NOTCANCEL;
694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          __fxprintf (NULL, "%s", buf);
696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          ((_IO_FILE *) stderr)->_flags2 = old_flags2;
69805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          _IO_funlockfile (stderr);
699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
70005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          free (buf);
70105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        }
702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
70305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      fprintf (stderr,
70405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                               _("%s: option '--%s' requires an argument\n"),
70505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                               argv[0], pfound->name);
706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
70705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    }
70805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  d->__nextchar += strlen (d->__nextchar);
70905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  d->optopt = pfound->val;
71005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  return optstring[0] == ':' ? ':' : '?';
71105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
71205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
71305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->__nextchar += strlen (d->__nextchar);
71405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (longind != NULL)
71505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            *longind = option_index;
71605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (pfound->flag)
71705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
71805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              *(pfound->flag) = pfound->val;
71905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              return 0;
72005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
72105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          return pfound->val;
72205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Can't find it as a long option.  If this is not getopt_long_only,
72505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         or the option starts with '--' or is not a valid short
72605436638acc7c010349a69c3395f1a57c642dc62Ying Wang         option, then it's an error.
72705436638acc7c010349a69c3395f1a57c642dc62Ying Wang         Otherwise interpret it as a short option.  */
728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (!long_only || argv[d->optind][1] == '-'
72905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          || strchr (optstring, *d->__nextchar) == NULL)
73005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
73105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (print_errors)
73205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
73405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              char *buf;
73505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              int n;
736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (argv[d->optind][1] == '-')
73905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
74005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  /* --option */
741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
74205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"),
74305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  argv[0], d->__nextchar);
744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
74505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
74605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           argv[0], d->__nextchar);
747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
74805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
74905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              else
75005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
75105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  /* +option or -option */
752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
75305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"),
75405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  argv[0], argv[d->optind][0], d->__nextchar);
755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
75605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
75705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           argv[0], argv[d->optind][0], d->__nextchar);
758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
75905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
76205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if (n >= 0)
76305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
76405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _IO_flockfile (stderr);
765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
76605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
76705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
76905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  __fxprintf (NULL, "%s", buf);
770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
77105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
77205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _IO_funlockfile (stderr);
773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
77405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  free (buf);
77505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
77705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
77805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->__nextchar = (char *) "";
77905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optind++;
78005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optopt = 0;
78105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          return '?';
78205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Look at and handle the next short option-character.  */
786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    char c = *d->__nextchar++;
78905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    const char *temp = strchr (optstring, c);
790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Increment 'optind' when we start to process its last character.  */
792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (*d->__nextchar == '\0')
793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++d->optind;
794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (temp == NULL || c == ':' || c == ';')
796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
79705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (print_errors)
79805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
80005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              char *buf;
80105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              int n;
802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
80505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"),
80605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              argv[0], c);
807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
80805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
81205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (n >= 0)
81305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
81405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                _IO_flockfile (stderr);
815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
81605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
81705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
81905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                __fxprintf (NULL, "%s", buf);
820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                ((_IO_FILE *) stderr)->_flags2 = old_flags2;
82205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                _IO_funlockfile (stderr);
823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                free (buf);
82505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
82705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
82805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        d->optopt = c;
82905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        return '?';
830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    /* Convenience. Treat POSIX -W foo same as long option --foo */
832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (temp[0] == 'W' && temp[1] == ';')
833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
83405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        char *nameend;
83505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        const struct option *p;
83605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        const struct option *pfound = NULL;
83705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        int exact = 0;
83805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        int ambig = 0;
83905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        int indfound = 0;
84005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        int option_index;
84105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
84205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (longopts == NULL)
84305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          goto no_longs;
84405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
84505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* This is an option that requires an argument.  */
84605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (*d->__nextchar != '\0')
84705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
84805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->optarg = d->__nextchar;
84905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            /* If we end this ARGV-element by taking the rest as an arg,
85005436638acc7c010349a69c3395f1a57c642dc62Ying Wang               we must advance to the next element now.  */
85105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->optind++;
85205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
85305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        else if (d->optind == argc)
85405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
85505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (print_errors)
85605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
85805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                char *buf;
859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                if (__asprintf (&buf,
86105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                _("%s: option requires an argument -- '%c'\n"),
86205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                argv[0], c) >= 0)
86305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  {
86405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _IO_flockfile (stderr);
865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
86705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    __fxprintf (NULL, "%s", buf);
870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
87105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
87205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _IO_funlockfile (stderr);
873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
87405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    free (buf);
87505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  }
876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
87705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                fprintf (stderr,
87805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         _("%s: option requires an argument -- '%c'\n"),
87905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         argv[0], c);
880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
88105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
88205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->optopt = c;
88305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (optstring[0] == ':')
88405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              c = ':';
88505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else
88605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              c = '?';
88705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            return c;
88805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
88905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        else
89005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* We already incremented 'd->optind' once;
89105436638acc7c010349a69c3395f1a57c642dc62Ying Wang             increment it again when taking next ARGV-elt as argument.  */
89205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          d->optarg = argv[d->optind++];
89305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
89405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* optarg is now the argument, see if it's in the
89505436638acc7c010349a69c3395f1a57c642dc62Ying Wang           table of longopts.  */
89605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
89705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
89805436638acc7c010349a69c3395f1a57c642dc62Ying Wang             nameend++)
89905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Do nothing.  */ ;
90005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
90105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* Test all long options for either exact match
90205436638acc7c010349a69c3395f1a57c642dc62Ying Wang           or abbreviated matches.  */
90305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        for (p = longopts, option_index = 0; p->name; p++, option_index++)
90405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
90505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
90605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
90705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
90805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  /* Exact match found.  */
90905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  pfound = p;
91005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  indfound = option_index;
91105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  exact = 1;
91205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  break;
91305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
91405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              else if (pfound == NULL)
91505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                {
91605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  /* First nonexact match found.  */
91705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  pfound = p;
91805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  indfound = option_index;
91905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                }
92005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              else if (long_only
92105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       || pfound->has_arg != p->has_arg
92205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       || pfound->flag != p->flag
92305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       || pfound->val != p->val)
92405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                /* Second or later nonexact match found.  */
92505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                ambig = 1;
92605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
92705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (ambig && !exact)
92805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
92905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (print_errors)
93005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
93205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                char *buf;
933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
93505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                argv[0], d->optarg) >= 0)
93605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  {
93705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _IO_flockfile (stderr);
938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
94005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    __fxprintf (NULL, "%s", buf);
943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
94505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    _IO_funlockfile (stderr);
946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    free (buf);
94805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  }
949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
95005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
95105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         argv[0], d->optarg);
952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
95305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
95405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__nextchar += strlen (d->__nextchar);
95505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->optind++;
95605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            return '?';
95705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
95805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (pfound != NULL)
95905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
96005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            option_index = indfound;
96105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (*nameend)
96205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
96305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                /* Don't test has_arg with >, because some C compilers don't
96405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   allow it to be used on enums.  */
96505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                if (pfound->has_arg)
96605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  d->optarg = nameend + 1;
96705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                else
96805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  {
96905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    if (print_errors)
97005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      {
971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
97205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char *buf;
973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
97405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        if (__asprintf (&buf, _("\
97505436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '-W %s' doesn't allow an argument\n"),
97605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        argv[0], pfound->name) >= 0)
97705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          {
97805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            _IO_flockfile (stderr);
979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
98105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            ((_IO_FILE *) stderr)->_flags2
98205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              |= _IO_FLAGS2_NOTCANCEL;
983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            __fxprintf (NULL, "%s", buf);
985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            ((_IO_FILE *) stderr)->_flags2 = old_flags2;
98705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            _IO_funlockfile (stderr);
988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            free (buf);
99005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          }
991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
99205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        fprintf (stderr, _("\
99305436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '-W %s' doesn't allow an argument\n"),
99405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                 argv[0], pfound->name);
995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
99605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      }
99705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
99805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    d->__nextchar += strlen (d->__nextchar);
99905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    return '?';
100005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  }
100105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
100205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else if (pfound->has_arg == 1)
100305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
100405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                if (d->optind < argc)
100505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  d->optarg = argv[d->optind++];
100605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                else
100705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  {
100805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    if (print_errors)
100905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      {
1010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
101105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char *buf;
1012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
101305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        if (__asprintf (&buf, _("\
101405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '-W %s' requires an argument\n"),
101505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        argv[0], pfound->name) >= 0)
101605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          {
101705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            _IO_flockfile (stderr);
1018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
101905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
102005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            ((_IO_FILE *) stderr)->_flags2
102105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              |= _IO_FLAGS2_NOTCANCEL;
1022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            __fxprintf (NULL, "%s", buf);
1024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            ((_IO_FILE *) stderr)->_flags2 = old_flags2;
102605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            _IO_funlockfile (stderr);
1027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            free (buf);
102905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          }
1030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
103105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        fprintf (stderr, _("\
103205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option '-W %s' requires an argument\n"),
103305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                 argv[0], pfound->name);
1034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
103505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      }
103605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    d->__nextchar += strlen (d->__nextchar);
103705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    return optstring[0] == ':' ? ':' : '?';
103805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  }
103905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
104005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else
104105436638acc7c010349a69c3395f1a57c642dc62Ying Wang              d->optarg = NULL;
104205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__nextchar += strlen (d->__nextchar);
104305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (longind != NULL)
104405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              *longind = option_index;
104505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (pfound->flag)
104605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
104705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                *(pfound->flag) = pfound->val;
104805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                return 0;
104905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
105005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            return pfound->val;
105105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
105205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
105305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      no_longs:
105405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        d->__nextchar = NULL;
105505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        return 'W';   /* Let the application handle it.   */
1056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
1057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (temp[1] == ':')
1058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
105905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (temp[2] == ':')
106005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
106105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            /* This is an option that accepts an argument optionally.  */
106205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (*d->__nextchar != '\0')
106305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
106405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optarg = d->__nextchar;
106505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optind++;
106605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
106705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else
106805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              d->optarg = NULL;
106905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__nextchar = NULL;
107005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
107105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        else
107205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
107305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            /* This is an option that requires an argument.  */
107405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            if (*d->__nextchar != '\0')
107505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
107605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optarg = d->__nextchar;
107705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                /* If we end this ARGV-element by taking the rest as an arg,
107805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   we must advance to the next element now.  */
107905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optind++;
108005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
108105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else if (d->optind == argc)
108205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              {
108305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                if (print_errors)
108405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  {
1085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined _LIBC && defined USE_IN_LIBIO
108605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    char *buf;
1087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    if (__asprintf (&buf, _("\
108905436638acc7c010349a69c3395f1a57c642dc62Ying Wang%s: option requires an argument -- '%c'\n"),
109005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    argv[0], c) >= 0)
109105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      {
109205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        _IO_flockfile (stderr);
1093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
109405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
109505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
1096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
109705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        __fxprintf (NULL, "%s", buf);
1098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
109905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        ((_IO_FILE *) stderr)->_flags2 = old_flags2;
110005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        _IO_funlockfile (stderr);
1101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
110205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        free (buf);
110305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      }
1104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
110505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    fprintf (stderr,
110605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             _("%s: option requires an argument -- '%c'\n"),
110705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             argv[0], c);
1108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
110905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  }
111005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                d->optopt = c;
111105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                if (optstring[0] == ':')
111205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  c = ':';
111305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                else
111405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  c = '?';
111505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              }
111605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            else
111705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              /* We already incremented 'optind' once;
111805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 increment it again when taking next ARGV-elt as argument.  */
111905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              d->optarg = argv[d->optind++];
112005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            d->__nextchar = NULL;
112105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
1122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
1123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return c;
1124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  }
1125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
1126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
1128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_getopt_internal (int argc, char **argv, const char *optstring,
112905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  const struct option *longopts, int *longind, int long_only,
113005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  int posixly_correct)
1131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
1132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int result;
1133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  getopt_data.optind = optind;
1135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  getopt_data.opterr = opterr;
1136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
113705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  result = _getopt_internal_r (argc, argv, optstring, longopts,
113805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                               longind, long_only, &getopt_data,
113905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                               posixly_correct);
1140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  optind = getopt_data.optind;
1142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  optarg = getopt_data.optarg;
1143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  optopt = getopt_data.optopt;
1144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return result;
1146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
1147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* glibc gets a LSB-compliant getopt.
1149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Standalone applications get a POSIX-compliant getopt.  */
1150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if _LIBC
1151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum { POSIXLY_CORRECT = 0 };
1152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
1153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum { POSIXLY_CORRECT = 1 };
1154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
1155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
1157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetopt (int argc, char *const *argv, const char *optstring)
1158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
115905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return _getopt_internal (argc, (char **) argv, optstring,
116005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           (const struct option *) 0,
116105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           (int *) 0,
116205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           0, POSIXLY_CORRECT);
1163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
1164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
116505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef _LIBC
116605436638acc7c010349a69c3395f1a57c642dc62Ying Wangint
116705436638acc7c010349a69c3395f1a57c642dc62Ying Wang__posix_getopt (int argc, char *const *argv, const char *optstring)
116805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
116905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return _getopt_internal (argc, argv, optstring,
117005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           (const struct option *) 0,
117105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           (int *) 0,
117205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           0, 1);
117305436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
117405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
117505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef TEST
1178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Compile with -DTEST to make an executable for use in testing
118005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the above definition of 'getopt'.  */
1181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
1183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (int argc, char **argv)
1184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
1185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int c;
1186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int digit_optind = 0;
1187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (1)
1189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
1190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int this_option_optind = optind ? optind : 1;
1191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      c = getopt (argc, argv, "abc:d:0123456789");
1193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (c == -1)
119405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
1195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      switch (c)
119705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
119805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '0':
119905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '1':
120005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '2':
120105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '3':
120205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '4':
120305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '5':
120405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '6':
120505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '7':
120605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '8':
120705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '9':
120805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (digit_optind != 0 && digit_optind != this_option_optind)
120905436638acc7c010349a69c3395f1a57c642dc62Ying Wang            printf ("digits occur in two different argv-elements.\n");
121005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          digit_optind = this_option_optind;
121105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option %c\n", c);
121205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
121305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
121405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'a':
121505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option a\n");
121605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
121705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
121805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'b':
121905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option b\n");
122005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
122105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
122205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'c':
122305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option c with value '%s'\n", optarg);
122405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
122505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
122605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '?':
122705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
122805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
122905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        default:
123005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("?? getopt returned character code 0%o ??\n", c);
123105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
1232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
1233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (optind < argc)
1235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
1236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      printf ("non-option ARGV-elements: ");
1237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (optind < argc)
123805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        printf ("%s ", argv[optind++]);
1239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      printf ("\n");
1240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
1241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  exit (0);
1243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
1244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* TEST */
1246