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