OpenCOBOL 1.1pre-rel
|
00001 /* Getopt for GNU. 00002 NOTE: getopt is now part of the C library, so if you don't know what 00003 "Keep this file name-space clean" means, talk to drepper@gnu.org 00004 before changing it! 00005 Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002 00006 Free Software Foundation, Inc. 00007 This file is part of the GNU C Library. 00008 00009 The GNU C Library is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU Lesser General Public 00011 License as published by the Free Software Foundation; either 00012 version 2.1 of the License, or (at your option) any later version. 00013 00014 The GNU C Library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public 00020 License along with the GNU C Library; if not, write to 00021 the Free Software Foundation, 51 Franklin Street, Fifth Floor 00022 Boston, MA 02110-1301 USA */ 00023 00024 /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. 00025 Ditto for AIX 3.2 and <stdlib.h>. */ 00026 #ifndef _NO_PROTO 00027 # define _NO_PROTO 00028 #endif 00029 00030 #ifdef HAVE_CONFIG_H 00031 # include <config.h> 00032 #endif 00033 00034 #if !defined __STDC__ || !__STDC__ 00035 /* This is a separate conditional since some stdc systems 00036 reject `defined (const)'. */ 00037 # ifndef const 00038 # define const 00039 # endif 00040 #endif 00041 00042 #include <stdio.h> 00043 00044 /* Comment out all this code if we are using the GNU C Library, and are not 00045 actually compiling the library itself. This code is part of the GNU C 00046 Library, but also included in many other GNU distributions. Compiling 00047 and linking in this code is a waste when using the GNU C library 00048 (especially if it is a shared library). Rather than having every GNU 00049 program understand `configure --with-gnu-libc' and omit the object files, 00050 it is simpler to just do this in the source for each such file. */ 00051 00052 #define GETOPT_INTERFACE_VERSION 2 00053 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 00054 # include <gnu-versions.h> 00055 # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION 00056 # define ELIDE_CODE 00057 # endif 00058 #endif 00059 00060 #ifndef ELIDE_CODE 00061 00062 00063 /* This needs to come after some library #include 00064 to get __GNU_LIBRARY__ defined. */ 00065 #ifdef __GNU_LIBRARY__ 00066 /* Don't include stdlib.h for non-GNU C libraries because some of them 00067 contain conflicting prototypes for getopt. */ 00068 # include <stdlib.h> 00069 #ifdef HAVE_UNISTD_H 00070 # include <unistd.h> 00071 #endif 00072 #endif /* GNU C library. */ 00073 00074 #ifdef VMS 00075 # include <unixlib.h> 00076 # if HAVE_STRING_H - 0 00077 # include <string.h> 00078 # endif 00079 #endif 00080 00081 #ifndef _ 00082 /* This is for other GNU distributions with internationalized messages. */ 00083 # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC 00084 # include <libintl.h> 00085 # ifndef _ 00086 # define _(msgid) gettext (msgid) 00087 # endif 00088 # else 00089 # define _(msgid) (msgid) 00090 # endif 00091 # if defined _LIBC && defined USE_IN_LIBIO 00092 # include <wchar.h> 00093 # endif 00094 #endif 00095 00096 #ifndef attribute_hidden 00097 # define attribute_hidden 00098 #endif 00099 00100 /* This version of `getopt' appears to the caller like standard Unix `getopt' 00101 but it behaves differently for the user, since it allows the user 00102 to intersperse the options with the other arguments. 00103 00104 As `getopt' works, it permutes the elements of ARGV so that, 00105 when it is done, all the options precede everything else. Thus 00106 all application programs are extended to handle flexible argument order. 00107 00108 Setting the environment variable POSIXLY_CORRECT disables permutation. 00109 Then the behavior is completely standard. 00110 00111 GNU application programs can use a third alternative mode in which 00112 they can distinguish the relative order of options and other arguments. */ 00113 00114 #include "getopt.h" 00115 00116 /* For communication from `getopt' to the caller. 00117 When `getopt' finds an option that takes an argument, 00118 the argument value is returned here. 00119 Also, when `ordering' is RETURN_IN_ORDER, 00120 each non-option ARGV-element is returned here. */ 00121 00122 char *optarg; 00123 00124 /* Index in ARGV of the next element to be scanned. 00125 This is used for communication to and from the caller 00126 and for communication between successive calls to `getopt'. 00127 00128 On entry to `getopt', zero means this is the first call; initialize. 00129 00130 When `getopt' returns -1, this is the index of the first of the 00131 non-option elements that the caller should itself scan. 00132 00133 Otherwise, `optind' communicates from one call to the next 00134 how much of ARGV has been scanned so far. */ 00135 00136 /* 1003.2 says this must be 1 before any call. */ 00137 int optind = 1; 00138 00139 /* Formerly, initialization of getopt depended on optind==0, which 00140 causes problems with re-calling getopt as programs generally don't 00141 know that. */ 00142 00143 int __getopt_initialized attribute_hidden; 00144 00145 /* The next char to be scanned in the option-element 00146 in which the last option character we returned was found. 00147 This allows us to pick up the scan where we left off. 00148 00149 If this is zero, or a null string, it means resume the scan 00150 by advancing to the next ARGV-element. */ 00151 00152 static char *nextchar; 00153 00154 /* Callers store zero here to inhibit the error message 00155 for unrecognized options. */ 00156 00157 int opterr = 1; 00158 00159 /* Set to an option character which was unrecognized. 00160 This must be initialized on some systems to avoid linking in the 00161 system's own getopt implementation. */ 00162 00163 int optopt = '?'; 00164 00165 /* Describe how to deal with options that follow non-option ARGV-elements. 00166 00167 If the caller did not specify anything, 00168 the default is REQUIRE_ORDER if the environment variable 00169 POSIXLY_CORRECT is defined, PERMUTE otherwise. 00170 00171 REQUIRE_ORDER means don't recognize them as options; 00172 stop option processing when the first non-option is seen. 00173 This is what Unix does. 00174 This mode of operation is selected by either setting the environment 00175 variable POSIXLY_CORRECT, or using `+' as the first character 00176 of the list of option characters. 00177 00178 PERMUTE is the default. We permute the contents of ARGV as we scan, 00179 so that eventually all the non-options are at the end. This allows options 00180 to be given in any order, even with programs that were not written to 00181 expect this. 00182 00183 RETURN_IN_ORDER is an option available to programs that were written 00184 to expect options and other ARGV-elements in any order and that care about 00185 the ordering of the two. We describe each non-option ARGV-element 00186 as if it were the argument of an option with character code 1. 00187 Using `-' as the first character of the list of option characters 00188 selects this mode of operation. 00189 00190 The special argument `--' forces an end of option-scanning regardless 00191 of the value of `ordering'. In the case of RETURN_IN_ORDER, only 00192 `--' can cause `getopt' to return -1 with `optind' != ARGC. */ 00193 00194 static enum 00195 { 00196 REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER 00197 } ordering; 00198 00199 /* Value of POSIXLY_CORRECT environment variable. */ 00200 static char *posixly_correct; 00201 00202 #ifdef __GNU_LIBRARY__ 00203 /* We want to avoid inclusion of string.h with non-GNU libraries 00204 because there are many ways it can cause trouble. 00205 On some systems, it contains special magic macros that don't work 00206 in GCC. */ 00207 # include <string.h> 00208 # define my_index strchr 00209 #else 00210 00211 # if HAVE_STRING_H 00212 # include <string.h> 00213 # else 00214 # include <strings.h> 00215 # endif 00216 00217 /* Avoid depending on library functions or files 00218 whose names are inconsistent. */ 00219 00220 #ifndef getenv 00221 extern char *getenv (); 00222 #endif 00223 00224 static char * 00225 my_index (str, chr) 00226 const char *str; 00227 int chr; 00228 { 00229 while (*str) 00230 { 00231 if (*str == chr) 00232 return (char *) str; 00233 str++; 00234 } 00235 return 0; 00236 } 00237 00238 /* If using GCC, we can safely declare strlen this way. 00239 If not using GCC, it is ok not to declare it. */ 00240 #ifdef __GNUC__ 00241 /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. 00242 That was relevant to code that was here before. */ 00243 # if (!defined __STDC__ || !__STDC__) && !defined strlen 00244 /* gcc with -traditional declares the built-in strlen to return int, 00245 and has done so at least since version 2.4.5. -- rms. */ 00246 extern int strlen (const char *); 00247 # endif /* not __STDC__ */ 00248 #endif /* __GNUC__ */ 00249 00250 #endif /* not __GNU_LIBRARY__ */ 00251 00252 /* Handle permutation of arguments. */ 00253 00254 /* Describe the part of ARGV that contains non-options that have 00255 been skipped. `first_nonopt' is the index in ARGV of the first of them; 00256 `last_nonopt' is the index after the last of them. */ 00257 00258 static int first_nonopt; 00259 static int last_nonopt; 00260 00261 #ifdef _LIBC 00262 /* Stored original parameters. 00263 XXX This is no good solution. We should rather copy the args so 00264 that we can compare them later. But we must not use malloc(3). */ 00265 extern int __libc_argc; 00266 extern char **__libc_argv; 00267 00268 /* Bash 2.0 gives us an environment variable containing flags 00269 indicating ARGV elements that should not be considered arguments. */ 00270 00271 # ifdef USE_NONOPTION_FLAGS 00272 /* Defined in getopt_init.c */ 00273 extern char *__getopt_nonoption_flags; 00274 00275 static int nonoption_flags_max_len; 00276 static int nonoption_flags_len; 00277 # endif 00278 00279 # ifdef USE_NONOPTION_FLAGS 00280 # define SWAP_FLAGS(ch1, ch2) \ 00281 if (nonoption_flags_len > 0) \ 00282 { \ 00283 char __tmp = __getopt_nonoption_flags[ch1]; \ 00284 __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ 00285 __getopt_nonoption_flags[ch2] = __tmp; \ 00286 } 00287 # else 00288 # define SWAP_FLAGS(ch1, ch2) 00289 # endif 00290 #else /* !_LIBC */ 00291 # define SWAP_FLAGS(ch1, ch2) 00292 #endif /* _LIBC */ 00293 00294 /* Exchange two adjacent subsequences of ARGV. 00295 One subsequence is elements [first_nonopt,last_nonopt) 00296 which contains all the non-options that have been skipped so far. 00297 The other is elements [last_nonopt,optind), which contains all 00298 the options processed since those non-options were skipped. 00299 00300 `first_nonopt' and `last_nonopt' are relocated so that they describe 00301 the new indices of the non-options in ARGV after they are moved. */ 00302 00303 #if defined __STDC__ && __STDC__ 00304 static void exchange (char **); 00305 #endif 00306 00307 static void 00308 exchange (argv) 00309 char **argv; 00310 { 00311 int bottom = first_nonopt; 00312 int middle = last_nonopt; 00313 int top = optind; 00314 char *tem; 00315 00316 /* Exchange the shorter segment with the far end of the longer segment. 00317 That puts the shorter segment into the right place. 00318 It leaves the longer segment in the right place overall, 00319 but it consists of two parts that need to be swapped next. */ 00320 00321 #if defined _LIBC && defined USE_NONOPTION_FLAGS 00322 /* First make sure the handling of the `__getopt_nonoption_flags' 00323 string can work normally. Our top argument must be in the range 00324 of the string. */ 00325 if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) 00326 { 00327 /* We must extend the array. The user plays games with us and 00328 presents new arguments. */ 00329 char *new_str = malloc (top + 1); 00330 if (new_str == NULL) 00331 nonoption_flags_len = nonoption_flags_max_len = 0; 00332 else 00333 { 00334 memset (__mempcpy (new_str, __getopt_nonoption_flags, 00335 nonoption_flags_max_len), 00336 '\0', top + 1 - nonoption_flags_max_len); 00337 nonoption_flags_max_len = top + 1; 00338 __getopt_nonoption_flags = new_str; 00339 } 00340 } 00341 #endif 00342 00343 while (top > middle && middle > bottom) 00344 { 00345 if (top - middle > middle - bottom) 00346 { 00347 /* Bottom segment is the short one. */ 00348 int len = middle - bottom; 00349 register int i; 00350 00351 /* Swap it with the top part of the top segment. */ 00352 for (i = 0; i < len; i++) 00353 { 00354 tem = argv[bottom + i]; 00355 argv[bottom + i] = argv[top - (middle - bottom) + i]; 00356 argv[top - (middle - bottom) + i] = tem; 00357 SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); 00358 } 00359 /* Exclude the moved bottom segment from further swapping. */ 00360 top -= len; 00361 } 00362 else 00363 { 00364 /* Top segment is the short one. */ 00365 int len = top - middle; 00366 register int i; 00367 00368 /* Swap it with the bottom part of the bottom segment. */ 00369 for (i = 0; i < len; i++) 00370 { 00371 tem = argv[bottom + i]; 00372 argv[bottom + i] = argv[middle + i]; 00373 argv[middle + i] = tem; 00374 SWAP_FLAGS (bottom + i, middle + i); 00375 } 00376 /* Exclude the moved top segment from further swapping. */ 00377 bottom += len; 00378 } 00379 } 00380 00381 /* Update records for the slots the non-options now occupy. */ 00382 00383 first_nonopt += (optind - last_nonopt); 00384 last_nonopt = optind; 00385 } 00386 00387 /* Initialize the internal data when the first call is made. */ 00388 00389 #if defined __STDC__ && __STDC__ 00390 static const char *_getopt_initialize (int, char *const *, const char *); 00391 #endif 00392 static const char * 00393 _getopt_initialize (argc, argv, optstring) 00394 int argc; 00395 char *const *argv; 00396 const char *optstring; 00397 { 00398 /* Start processing options with ARGV-element 1 (since ARGV-element 0 00399 is the program name); the sequence of previously skipped 00400 non-option ARGV-elements is empty. */ 00401 00402 first_nonopt = last_nonopt = optind; 00403 00404 nextchar = NULL; 00405 00406 posixly_correct = getenv ("POSIXLY_CORRECT"); 00407 00408 /* Determine how to handle the ordering of options and nonoptions. */ 00409 00410 if (optstring[0] == '-') 00411 { 00412 ordering = RETURN_IN_ORDER; 00413 ++optstring; 00414 } 00415 else if (optstring[0] == '+') 00416 { 00417 ordering = REQUIRE_ORDER; 00418 ++optstring; 00419 } 00420 else if (posixly_correct != NULL) 00421 ordering = REQUIRE_ORDER; 00422 else 00423 ordering = PERMUTE; 00424 00425 #if defined _LIBC && defined USE_NONOPTION_FLAGS 00426 if (posixly_correct == NULL 00427 && argc == __libc_argc && argv == __libc_argv) 00428 { 00429 if (nonoption_flags_max_len == 0) 00430 { 00431 if (__getopt_nonoption_flags == NULL 00432 || __getopt_nonoption_flags[0] == '\0') 00433 nonoption_flags_max_len = -1; 00434 else 00435 { 00436 const char *orig_str = __getopt_nonoption_flags; 00437 int len = nonoption_flags_max_len = strlen (orig_str); 00438 if (nonoption_flags_max_len < argc) 00439 nonoption_flags_max_len = argc; 00440 __getopt_nonoption_flags = 00441 (char *) malloc (nonoption_flags_max_len); 00442 if (__getopt_nonoption_flags == NULL) 00443 nonoption_flags_max_len = -1; 00444 else 00445 memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), 00446 '\0', nonoption_flags_max_len - len); 00447 } 00448 } 00449 nonoption_flags_len = nonoption_flags_max_len; 00450 } 00451 else 00452 nonoption_flags_len = 0; 00453 #endif 00454 00455 return optstring; 00456 } 00457 00458 /* Scan elements of ARGV (whose length is ARGC) for option characters 00459 given in OPTSTRING. 00460 00461 If an element of ARGV starts with '-', and is not exactly "-" or "--", 00462 then it is an option element. The characters of this element 00463 (aside from the initial '-') are option characters. If `getopt' 00464 is called repeatedly, it returns successively each of the option characters 00465 from each of the option elements. 00466 00467 If `getopt' finds another option character, it returns that character, 00468 updating `optind' and `nextchar' so that the next call to `getopt' can 00469 resume the scan with the following option character or ARGV-element. 00470 00471 If there are no more option characters, `getopt' returns -1. 00472 Then `optind' is the index in ARGV of the first ARGV-element 00473 that is not an option. (The ARGV-elements have been permuted 00474 so that those that are not options now come last.) 00475 00476 OPTSTRING is a string containing the legitimate option characters. 00477 If an option character is seen that is not listed in OPTSTRING, 00478 return '?' after printing an error message. If you set `opterr' to 00479 zero, the error message is suppressed but we still return '?'. 00480 00481 If a char in OPTSTRING is followed by a colon, that means it wants an arg, 00482 so the following text in the same ARGV-element, or the text of the following 00483 ARGV-element, is returned in `optarg'. Two colons mean an option that 00484 wants an optional arg; if there is text in the current ARGV-element, 00485 it is returned in `optarg', otherwise `optarg' is set to zero. 00486 00487 If OPTSTRING starts with `-' or `+', it requests different methods of 00488 handling the non-option ARGV-elements. 00489 See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. 00490 00491 Long-named options begin with `--' instead of `-'. 00492 Their names may be abbreviated as long as the abbreviation is unique 00493 or is an exact match for some defined option. If they have an 00494 argument, it follows the option name in the same ARGV-element, separated 00495 from the option name by a `=', or else the in next ARGV-element. 00496 When `getopt' finds a long-named option, it returns 0 if that option's 00497 `flag' field is nonzero, the value of the option's `val' field 00498 if the `flag' field is zero. 00499 00500 The elements of ARGV aren't really const, because we permute them. 00501 But we pretend they're const in the prototype to be compatible 00502 with other systems. 00503 00504 LONGOPTS is a vector of `struct option' terminated by an 00505 element containing a name which is zero. 00506 00507 LONGIND returns the index in LONGOPT of the long-named option found. 00508 It is only valid when a long-named option has been found by the most 00509 recent call. 00510 00511 If LONG_ONLY is nonzero, '-' as well as '--' can introduce 00512 long-named options. */ 00513 00514 int 00515 _getopt_internal (argc, argv, optstring, longopts, longind, long_only) 00516 int argc; 00517 char *const *argv; 00518 const char *optstring; 00519 const struct option *longopts; 00520 int *longind; 00521 int long_only; 00522 { 00523 int print_errors = opterr; 00524 if (optstring[0] == ':') 00525 print_errors = 0; 00526 00527 if (argc < 1) 00528 return -1; 00529 00530 optarg = NULL; 00531 00532 if (optind == 0 || !__getopt_initialized) 00533 { 00534 if (optind == 0) 00535 optind = 1; /* Don't scan ARGV[0], the program name. */ 00536 optstring = _getopt_initialize (argc, argv, optstring); 00537 __getopt_initialized = 1; 00538 } 00539 00540 /* Test whether ARGV[optind] points to a non-option argument. 00541 Either it does not have option syntax, or there is an environment flag 00542 from the shell indicating it is not an option. The later information 00543 is only used when the used in the GNU libc. */ 00544 #if defined _LIBC && defined USE_NONOPTION_FLAGS 00545 # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ 00546 || (optind < nonoption_flags_len \ 00547 && __getopt_nonoption_flags[optind] == '1')) 00548 #else 00549 # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') 00550 #endif 00551 00552 if (nextchar == NULL || *nextchar == '\0') 00553 { 00554 /* Advance to the next ARGV-element. */ 00555 00556 /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been 00557 moved back by the user (who may also have changed the arguments). */ 00558 if (last_nonopt > optind) 00559 last_nonopt = optind; 00560 if (first_nonopt > optind) 00561 first_nonopt = optind; 00562 00563 if (ordering == PERMUTE) 00564 { 00565 /* If we have just processed some options following some non-options, 00566 exchange them so that the options come first. */ 00567 00568 if (first_nonopt != last_nonopt && last_nonopt != optind) 00569 exchange ((char **) argv); 00570 else if (last_nonopt != optind) 00571 first_nonopt = optind; 00572 00573 /* Skip any additional non-options 00574 and extend the range of non-options previously skipped. */ 00575 00576 while (optind < argc && NONOPTION_P) 00577 optind++; 00578 last_nonopt = optind; 00579 } 00580 00581 /* The special ARGV-element `--' means premature end of options. 00582 Skip it like a null option, 00583 then exchange with previous non-options as if it were an option, 00584 then skip everything else like a non-option. */ 00585 00586 if (optind != argc && !strcmp (argv[optind], "--")) 00587 { 00588 optind++; 00589 00590 if (first_nonopt != last_nonopt && last_nonopt != optind) 00591 exchange ((char **) argv); 00592 else if (first_nonopt == last_nonopt) 00593 first_nonopt = optind; 00594 last_nonopt = argc; 00595 00596 optind = argc; 00597 } 00598 00599 /* If we have done all the ARGV-elements, stop the scan 00600 and back over any non-options that we skipped and permuted. */ 00601 00602 if (optind == argc) 00603 { 00604 /* Set the next-arg-index to point at the non-options 00605 that we previously skipped, so the caller will digest them. */ 00606 if (first_nonopt != last_nonopt) 00607 optind = first_nonopt; 00608 return -1; 00609 } 00610 00611 /* If we have come to a non-option and did not permute it, 00612 either stop the scan or describe it to the caller and pass it by. */ 00613 00614 if (NONOPTION_P) 00615 { 00616 if (ordering == REQUIRE_ORDER) 00617 return -1; 00618 optarg = argv[optind++]; 00619 return 1; 00620 } 00621 00622 /* We have found another option-ARGV-element. 00623 Skip the initial punctuation. */ 00624 00625 nextchar = (argv[optind] + 1 00626 + (longopts != NULL && argv[optind][1] == '-')); 00627 } 00628 00629 /* Decode the current option-ARGV-element. */ 00630 00631 /* Check whether the ARGV-element is a long option. 00632 00633 If long_only and the ARGV-element has the form "-f", where f is 00634 a valid short option, don't consider it an abbreviated form of 00635 a long option that starts with f. Otherwise there would be no 00636 way to give the -f short option. 00637 00638 On the other hand, if there's a long option "fubar" and 00639 the ARGV-element is "-fu", do consider that an abbreviation of 00640 the long option, just like "--fu", and not "-f" with arg "u". 00641 00642 This distinction seems to be the most useful approach. */ 00643 00644 if (longopts != NULL 00645 && (argv[optind][1] == '-' 00646 || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) 00647 { 00648 char *nameend; 00649 const struct option *p; 00650 const struct option *pfound = NULL; 00651 int exact = 0; 00652 int ambig = 0; 00653 int indfound = -1; 00654 int option_index; 00655 00656 for (nameend = nextchar; *nameend && *nameend != '='; nameend++) 00657 /* Do nothing. */ ; 00658 00659 /* Test all long options for either exact match 00660 or abbreviated matches. */ 00661 for (p = longopts, option_index = 0; p->name; p++, option_index++) 00662 if (!strncmp (p->name, nextchar, nameend - nextchar)) 00663 { 00664 if ((unsigned int) (nameend - nextchar) 00665 == (unsigned int) strlen (p->name)) 00666 { 00667 /* Exact match found. */ 00668 pfound = p; 00669 indfound = option_index; 00670 exact = 1; 00671 break; 00672 } 00673 else if (pfound == NULL) 00674 { 00675 /* First nonexact match found. */ 00676 pfound = p; 00677 indfound = option_index; 00678 } 00679 else if (long_only 00680 || pfound->has_arg != p->has_arg 00681 || pfound->flag != p->flag 00682 || pfound->val != p->val) 00683 /* Second or later nonexact match found. */ 00684 ambig = 1; 00685 } 00686 00687 if (ambig && !exact) 00688 { 00689 if (print_errors) 00690 { 00691 #if defined _LIBC && defined USE_IN_LIBIO 00692 char *buf; 00693 00694 if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), 00695 argv[0], argv[optind]) >= 0) 00696 { 00697 00698 if (_IO_fwide (stderr, 0) > 0) 00699 __fwprintf (stderr, L"%s", buf); 00700 else 00701 fputs (buf, stderr); 00702 00703 free (buf); 00704 } 00705 #else 00706 fprintf (stderr, _("%s: option `%s' is ambiguous\n"), 00707 argv[0], argv[optind]); 00708 #endif 00709 } 00710 nextchar += strlen (nextchar); 00711 optind++; 00712 optopt = 0; 00713 return '?'; 00714 } 00715 00716 if (pfound != NULL) 00717 { 00718 option_index = indfound; 00719 optind++; 00720 if (*nameend) 00721 { 00722 /* Don't test has_arg with >, because some C compilers don't 00723 allow it to be used on enums. */ 00724 if (pfound->has_arg) 00725 optarg = nameend + 1; 00726 else 00727 { 00728 if (print_errors) 00729 { 00730 #if defined _LIBC && defined USE_IN_LIBIO 00731 char *buf; 00732 int n; 00733 #endif 00734 00735 if (argv[optind - 1][1] == '-') 00736 { 00737 /* --option */ 00738 #if defined _LIBC && defined USE_IN_LIBIO 00739 n = __asprintf (&buf, _("\ 00740 %s: option `--%s' doesn't allow an argument\n"), 00741 argv[0], pfound->name); 00742 #else 00743 fprintf (stderr, _("\ 00744 %s: option `--%s' doesn't allow an argument\n"), 00745 argv[0], pfound->name); 00746 #endif 00747 } 00748 else 00749 { 00750 /* +option or -option */ 00751 #if defined _LIBC && defined USE_IN_LIBIO 00752 n = __asprintf (&buf, _("\ 00753 %s: option `%c%s' doesn't allow an argument\n"), 00754 argv[0], argv[optind - 1][0], 00755 pfound->name); 00756 #else 00757 fprintf (stderr, _("\ 00758 %s: option `%c%s' doesn't allow an argument\n"), 00759 argv[0], argv[optind - 1][0], pfound->name); 00760 #endif 00761 } 00762 00763 #if defined _LIBC && defined USE_IN_LIBIO 00764 if (n >= 0) 00765 { 00766 if (_IO_fwide (stderr, 0) > 0) 00767 __fwprintf (stderr, L"%s", buf); 00768 else 00769 fputs (buf, stderr); 00770 00771 free (buf); 00772 } 00773 #endif 00774 } 00775 00776 nextchar += strlen (nextchar); 00777 00778 optopt = pfound->val; 00779 return '?'; 00780 } 00781 } 00782 else if (pfound->has_arg == 1) 00783 { 00784 if (optind < argc) 00785 optarg = argv[optind++]; 00786 else 00787 { 00788 if (print_errors) 00789 { 00790 #if defined _LIBC && defined USE_IN_LIBIO 00791 char *buf; 00792 00793 if (__asprintf (&buf, _("\ 00794 %s: option `%s' requires an argument\n"), 00795 argv[0], argv[optind - 1]) >= 0) 00796 { 00797 if (_IO_fwide (stderr, 0) > 0) 00798 __fwprintf (stderr, L"%s", buf); 00799 else 00800 fputs (buf, stderr); 00801 00802 free (buf); 00803 } 00804 #else 00805 fprintf (stderr, 00806 _("%s: option `%s' requires an argument\n"), 00807 argv[0], argv[optind - 1]); 00808 #endif 00809 } 00810 nextchar += strlen (nextchar); 00811 optopt = pfound->val; 00812 return optstring[0] == ':' ? ':' : '?'; 00813 } 00814 } 00815 nextchar += strlen (nextchar); 00816 if (longind != NULL) 00817 *longind = option_index; 00818 if (pfound->flag) 00819 { 00820 *(pfound->flag) = pfound->val; 00821 return 0; 00822 } 00823 return pfound->val; 00824 } 00825 00826 /* Can't find it as a long option. If this is not getopt_long_only, 00827 or the option starts with '--' or is not a valid short 00828 option, then it's an error. 00829 Otherwise interpret it as a short option. */ 00830 if (!long_only || argv[optind][1] == '-' 00831 || my_index (optstring, *nextchar) == NULL) 00832 { 00833 if (print_errors) 00834 { 00835 #if defined _LIBC && defined USE_IN_LIBIO 00836 char *buf; 00837 int n; 00838 #endif 00839 00840 if (argv[optind][1] == '-') 00841 { 00842 /* --option */ 00843 #if defined _LIBC && defined USE_IN_LIBIO 00844 n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), 00845 argv[0], nextchar); 00846 #else 00847 fprintf (stderr, _("%s: unrecognized option `--%s'\n"), 00848 argv[0], nextchar); 00849 #endif 00850 } 00851 else 00852 { 00853 /* +option or -option */ 00854 #if defined _LIBC && defined USE_IN_LIBIO 00855 n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), 00856 argv[0], argv[optind][0], nextchar); 00857 #else 00858 fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), 00859 argv[0], argv[optind][0], nextchar); 00860 #endif 00861 } 00862 00863 #if defined _LIBC && defined USE_IN_LIBIO 00864 if (n >= 0) 00865 { 00866 if (_IO_fwide (stderr, 0) > 0) 00867 __fwprintf (stderr, L"%s", buf); 00868 else 00869 fputs (buf, stderr); 00870 00871 free (buf); 00872 } 00873 #endif 00874 } 00875 nextchar = (char *) ""; 00876 optind++; 00877 optopt = 0; 00878 return '?'; 00879 } 00880 } 00881 00882 /* Look at and handle the next short option-character. */ 00883 00884 { 00885 char c = *nextchar++; 00886 char *temp = my_index (optstring, c); 00887 00888 /* Increment `optind' when we start to process its last character. */ 00889 if (*nextchar == '\0') 00890 ++optind; 00891 00892 if (temp == NULL || c == ':') 00893 { 00894 if (print_errors) 00895 { 00896 #if defined _LIBC && defined USE_IN_LIBIO 00897 char *buf; 00898 int n; 00899 #endif 00900 00901 if (posixly_correct) 00902 { 00903 /* 1003.2 specifies the format of this message. */ 00904 #if defined _LIBC && defined USE_IN_LIBIO 00905 n = __asprintf (&buf, _("%s: illegal option -- %c\n"), 00906 argv[0], c); 00907 #else 00908 fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); 00909 #endif 00910 } 00911 else 00912 { 00913 #if defined _LIBC && defined USE_IN_LIBIO 00914 n = __asprintf (&buf, _("%s: invalid option -- %c\n"), 00915 argv[0], c); 00916 #else 00917 fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); 00918 #endif 00919 } 00920 00921 #if defined _LIBC && defined USE_IN_LIBIO 00922 if (n >= 0) 00923 { 00924 if (_IO_fwide (stderr, 0) > 0) 00925 __fwprintf (stderr, L"%s", buf); 00926 else 00927 fputs (buf, stderr); 00928 00929 free (buf); 00930 } 00931 #endif 00932 } 00933 optopt = c; 00934 return '?'; 00935 } 00936 /* Convenience. Treat POSIX -W foo same as long option --foo */ 00937 if (temp[0] == 'W' && temp[1] == ';') 00938 { 00939 char *nameend; 00940 const struct option *p; 00941 const struct option *pfound = NULL; 00942 int exact = 0; 00943 int ambig = 0; 00944 int indfound = 0; 00945 int option_index; 00946 00947 /* This is an option that requires an argument. */ 00948 if (*nextchar != '\0') 00949 { 00950 optarg = nextchar; 00951 /* If we end this ARGV-element by taking the rest as an arg, 00952 we must advance to the next element now. */ 00953 optind++; 00954 } 00955 else if (optind == argc) 00956 { 00957 if (print_errors) 00958 { 00959 /* 1003.2 specifies the format of this message. */ 00960 #if defined _LIBC && defined USE_IN_LIBIO 00961 char *buf; 00962 00963 if (__asprintf (&buf, 00964 _("%s: option requires an argument -- %c\n"), 00965 argv[0], c) >= 0) 00966 { 00967 if (_IO_fwide (stderr, 0) > 0) 00968 __fwprintf (stderr, L"%s", buf); 00969 else 00970 fputs (buf, stderr); 00971 00972 free (buf); 00973 } 00974 #else 00975 fprintf (stderr, _("%s: option requires an argument -- %c\n"), 00976 argv[0], c); 00977 #endif 00978 } 00979 optopt = c; 00980 if (optstring[0] == ':') 00981 c = ':'; 00982 else 00983 c = '?'; 00984 return c; 00985 } 00986 else 00987 /* We already incremented `optind' once; 00988 increment it again when taking next ARGV-elt as argument. */ 00989 optarg = argv[optind++]; 00990 00991 /* optarg is now the argument, see if it's in the 00992 table of longopts. */ 00993 00994 for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) 00995 /* Do nothing. */ ; 00996 00997 /* Test all long options for either exact match 00998 or abbreviated matches. */ 00999 for (p = longopts, option_index = 0; p->name; p++, option_index++) 01000 if (!strncmp (p->name, nextchar, nameend - nextchar)) 01001 { 01002 if ((unsigned int) (nameend - nextchar) == strlen (p->name)) 01003 { 01004 /* Exact match found. */ 01005 pfound = p; 01006 indfound = option_index; 01007 exact = 1; 01008 break; 01009 } 01010 else if (pfound == NULL) 01011 { 01012 /* First nonexact match found. */ 01013 pfound = p; 01014 indfound = option_index; 01015 } 01016 else 01017 /* Second or later nonexact match found. */ 01018 ambig = 1; 01019 } 01020 if (ambig && !exact) 01021 { 01022 if (print_errors) 01023 { 01024 #if defined _LIBC && defined USE_IN_LIBIO 01025 char *buf; 01026 01027 if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), 01028 argv[0], argv[optind]) >= 0) 01029 { 01030 if (_IO_fwide (stderr, 0) > 0) 01031 __fwprintf (stderr, L"%s", buf); 01032 else 01033 fputs (buf, stderr); 01034 01035 free (buf); 01036 } 01037 #else 01038 fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), 01039 argv[0], argv[optind]); 01040 #endif 01041 } 01042 nextchar += strlen (nextchar); 01043 optind++; 01044 return '?'; 01045 } 01046 if (pfound != NULL) 01047 { 01048 option_index = indfound; 01049 if (*nameend) 01050 { 01051 /* Don't test has_arg with >, because some C compilers don't 01052 allow it to be used on enums. */ 01053 if (pfound->has_arg) 01054 optarg = nameend + 1; 01055 else 01056 { 01057 if (print_errors) 01058 { 01059 #if defined _LIBC && defined USE_IN_LIBIO 01060 char *buf; 01061 01062 if (__asprintf (&buf, _("\ 01063 %s: option `-W %s' doesn't allow an argument\n"), 01064 argv[0], pfound->name) >= 0) 01065 { 01066 if (_IO_fwide (stderr, 0) > 0) 01067 __fwprintf (stderr, L"%s", buf); 01068 else 01069 fputs (buf, stderr); 01070 01071 free (buf); 01072 } 01073 #else 01074 fprintf (stderr, _("\ 01075 %s: option `-W %s' doesn't allow an argument\n"), 01076 argv[0], pfound->name); 01077 #endif 01078 } 01079 01080 nextchar += strlen (nextchar); 01081 return '?'; 01082 } 01083 } 01084 else if (pfound->has_arg == 1) 01085 { 01086 if (optind < argc) 01087 optarg = argv[optind++]; 01088 else 01089 { 01090 if (print_errors) 01091 { 01092 #if defined _LIBC && defined USE_IN_LIBIO 01093 char *buf; 01094 01095 if (__asprintf (&buf, _("\ 01096 %s: option `%s' requires an argument\n"), 01097 argv[0], argv[optind - 1]) >= 0) 01098 { 01099 if (_IO_fwide (stderr, 0) > 0) 01100 __fwprintf (stderr, L"%s", buf); 01101 else 01102 fputs (buf, stderr); 01103 01104 free (buf); 01105 } 01106 #else 01107 fprintf (stderr, 01108 _("%s: option `%s' requires an argument\n"), 01109 argv[0], argv[optind - 1]); 01110 #endif 01111 } 01112 nextchar += strlen (nextchar); 01113 return optstring[0] == ':' ? ':' : '?'; 01114 } 01115 } 01116 nextchar += strlen (nextchar); 01117 if (longind != NULL) 01118 *longind = option_index; 01119 if (pfound->flag) 01120 { 01121 *(pfound->flag) = pfound->val; 01122 return 0; 01123 } 01124 return pfound->val; 01125 } 01126 nextchar = NULL; 01127 return 'W'; /* Let the application handle it. */ 01128 } 01129 if (temp[1] == ':') 01130 { 01131 if (temp[2] == ':') 01132 { 01133 /* This is an option that accepts an argument optionally. */ 01134 if (*nextchar != '\0') 01135 { 01136 optarg = nextchar; 01137 optind++; 01138 } 01139 else 01140 optarg = NULL; 01141 nextchar = NULL; 01142 } 01143 else 01144 { 01145 /* This is an option that requires an argument. */ 01146 if (*nextchar != '\0') 01147 { 01148 optarg = nextchar; 01149 /* If we end this ARGV-element by taking the rest as an arg, 01150 we must advance to the next element now. */ 01151 optind++; 01152 } 01153 else if (optind == argc) 01154 { 01155 if (print_errors) 01156 { 01157 /* 1003.2 specifies the format of this message. */ 01158 #if defined _LIBC && defined USE_IN_LIBIO 01159 char *buf; 01160 01161 if (__asprintf (&buf, _("\ 01162 %s: option requires an argument -- %c\n"), 01163 argv[0], c) >= 0) 01164 { 01165 if (_IO_fwide (stderr, 0) > 0) 01166 __fwprintf (stderr, L"%s", buf); 01167 else 01168 fputs (buf, stderr); 01169 01170 free (buf); 01171 } 01172 #else 01173 fprintf (stderr, 01174 _("%s: option requires an argument -- %c\n"), 01175 argv[0], c); 01176 #endif 01177 } 01178 optopt = c; 01179 if (optstring[0] == ':') 01180 c = ':'; 01181 else 01182 c = '?'; 01183 } 01184 else 01185 /* We already incremented `optind' once; 01186 increment it again when taking next ARGV-elt as argument. */ 01187 optarg = argv[optind++]; 01188 nextchar = NULL; 01189 } 01190 } 01191 return c; 01192 } 01193 } 01194 01195 int 01196 getopt (argc, argv, optstring) 01197 int argc; 01198 char *const *argv; 01199 const char *optstring; 01200 { 01201 return _getopt_internal (argc, argv, optstring, 01202 (const struct option *) 0, 01203 (int *) 0, 01204 0); 01205 } 01206 01207 #endif /* Not ELIDE_CODE. */ 01208 01209 #ifdef TEST 01210 01211 /* Compile with -DTEST to make an executable for use in testing 01212 the above definition of `getopt'. */ 01213 01214 int 01215 main (argc, argv) 01216 int argc; 01217 char **argv; 01218 { 01219 int c; 01220 int digit_optind = 0; 01221 01222 while (1) 01223 { 01224 int this_option_optind = optind ? optind : 1; 01225 01226 c = getopt (argc, argv, "abc:d:0123456789"); 01227 if (c == -1) 01228 break; 01229 01230 switch (c) 01231 { 01232 case '0': 01233 case '1': 01234 case '2': 01235 case '3': 01236 case '4': 01237 case '5': 01238 case '6': 01239 case '7': 01240 case '8': 01241 case '9': 01242 if (digit_optind != 0 && digit_optind != this_option_optind) 01243 printf ("digits occur in two different argv-elements.\n"); 01244 digit_optind = this_option_optind; 01245 printf ("option %c\n", c); 01246 break; 01247 01248 case 'a': 01249 printf ("option a\n"); 01250 break; 01251 01252 case 'b': 01253 printf ("option b\n"); 01254 break; 01255 01256 case 'c': 01257 printf ("option c with value `%s'\n", optarg); 01258 break; 01259 01260 case '?': 01261 break; 01262 01263 default: 01264 printf ("?? getopt returned character code 0%o ??\n", c); 01265 } 01266 } 01267 01268 if (optind < argc) 01269 { 01270 printf ("non-option ARGV-elements: "); 01271 while (optind < argc) 01272 printf ("%s ", argv[optind++]); 01273 printf ("\n"); 01274 } 01275 01276 exit (0); 01277 } 01278 01279 #endif /* TEST */