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