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