|
|
1.1 ! root 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 [email protected] ! 4: before changing it! ! 5: ! 6: Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 ! 7: Free Software Foundation, Inc. ! 8: ! 9: This program is free software; you can redistribute it and/or modify it ! 10: under the terms of the GNU General Public License as published by the ! 11: Free Software Foundation; either version 2, or (at your option) any ! 12: later version. ! 13: ! 14: This program is distributed in the hope that it will be useful, ! 15: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 17: GNU General Public License for more details. ! 18: ! 19: You should have received a copy of the GNU General Public License ! 20: along with this program; if not, write to the Free Software ! 21: Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 22: ! 23: #ifdef HAVE_CONFIG_H ! 24: #if defined (emacs) || defined (CONFIG_BROKETS) ! 25: /* We use <config.h> instead of "config.h" so that a compilation ! 26: using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h ! 27: (which it would do because it found this file in $srcdir). */ ! 28: #include <config.h> ! 29: #else ! 30: #include "config.h" ! 31: #endif ! 32: #endif ! 33: ! 34: #ifndef __STDC__ ! 35: /* This is a separate conditional since some stdc systems ! 36: reject `defined (const)'. */ ! 37: #ifndef const ! 38: #define const ! 39: #endif ! 40: #endif ! 41: ! 42: /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */ ! 43: #ifndef _NO_PROTO ! 44: #define _NO_PROTO ! 45: #endif ! 46: ! 47: #include <stdio.h> ! 48: ! 49: /* Comment out all this code if we are using the GNU C Library, and are not ! 50: actually compiling the library itself. This code is part of the GNU C ! 51: Library, but also included in many other GNU distributions. Compiling ! 52: and linking in this code is a waste when using the GNU C library ! 53: (especially if it is a shared library). Rather than having every GNU ! 54: program understand `configure --with-gnu-libc' and omit the object files, ! 55: it is simpler to just do this in the source for each such file. */ ! 56: ! 57: #if defined (_LIBC) || !defined (__GNU_LIBRARY__) ! 58: ! 59: ! 60: /* This needs to come after some library #include ! 61: to get __GNU_LIBRARY__ defined. */ ! 62: #ifdef __GNU_LIBRARY__ ! 63: /* Don't include stdlib.h for non-GNU C libraries because some of them ! 64: contain conflicting prototypes for getopt. */ ! 65: #include <stdlib.h> ! 66: #endif /* GNU C library. */ ! 67: ! 68: /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a ! 69: long-named option. Because this is not POSIX.2 compliant, it is ! 70: being phased out. */ ! 71: /* #define GETOPT_COMPAT */ ! 72: ! 73: /* This version of `getopt' appears to the caller like standard Unix `getopt' ! 74: but it behaves differently for the user, since it allows the user ! 75: to intersperse the options with the other arguments. ! 76: ! 77: As `getopt' works, it permutes the elements of ARGV so that, ! 78: when it is done, all the options precede everything else. Thus ! 79: all application programs are extended to handle flexible argument order. ! 80: ! 81: Setting the environment variable POSIXLY_CORRECT disables permutation. ! 82: Then the behavior is completely standard. ! 83: ! 84: GNU application programs can use a third alternative mode in which ! 85: they can distinguish the relative order of options and other arguments. */ ! 86: ! 87: #include "getopt.h" ! 88: ! 89: /* For communication from `getopt' to the caller. ! 90: When `getopt' finds an option that takes an argument, ! 91: the argument value is returned here. ! 92: Also, when `ordering' is RETURN_IN_ORDER, ! 93: each non-option ARGV-element is returned here. */ ! 94: ! 95: char *optarg = 0; ! 96: ! 97: /* Index in ARGV of the next element to be scanned. ! 98: This is used for communication to and from the caller ! 99: and for communication between successive calls to `getopt'. ! 100: ! 101: On entry to `getopt', zero means this is the first call; initialize. ! 102: ! 103: When `getopt' returns EOF, this is the index of the first of the ! 104: non-option elements that the caller should itself scan. ! 105: ! 106: Otherwise, `optind' communicates from one call to the next ! 107: how much of ARGV has been scanned so far. */ ! 108: ! 109: /* XXX 1003.2 says this must be 1 before any call. */ ! 110: int optind = 0; ! 111: ! 112: /* The next char to be scanned in the option-element ! 113: in which the last option character we returned was found. ! 114: This allows us to pick up the scan where we left off. ! 115: ! 116: If this is zero, or a null string, it means resume the scan ! 117: by advancing to the next ARGV-element. */ ! 118: ! 119: static char *nextchar; ! 120: ! 121: /* Callers store zero here to inhibit the error message ! 122: for unrecognized options. */ ! 123: ! 124: int opterr = 1; ! 125: ! 126: /* Set to an option character which was unrecognized. ! 127: This must be initialized on some systems to avoid linking in the ! 128: system's own getopt implementation. */ ! 129: ! 130: int optopt = '?'; ! 131: ! 132: /* Describe how to deal with options that follow non-option ARGV-elements. ! 133: ! 134: If the caller did not specify anything, ! 135: the default is REQUIRE_ORDER if the environment variable ! 136: POSIXLY_CORRECT is defined, PERMUTE otherwise. ! 137: ! 138: REQUIRE_ORDER means don't recognize them as options; ! 139: stop option processing when the first non-option is seen. ! 140: This is what Unix does. ! 141: This mode of operation is selected by either setting the environment ! 142: variable POSIXLY_CORRECT, or using `+' as the first character ! 143: of the list of option characters. ! 144: ! 145: PERMUTE is the default. We permute the contents of ARGV as we scan, ! 146: so that eventually all the non-options are at the end. This allows options ! 147: to be given in any order, even with programs that were not written to ! 148: expect this. ! 149: ! 150: RETURN_IN_ORDER is an option available to programs that were written ! 151: to expect options and other ARGV-elements in any order and that care about ! 152: the ordering of the two. We describe each non-option ARGV-element ! 153: as if it were the argument of an option with character code 1. ! 154: Using `-' as the first character of the list of option characters ! 155: selects this mode of operation. ! 156: ! 157: The special argument `--' forces an end of option-scanning regardless ! 158: of the value of `ordering'. In the case of RETURN_IN_ORDER, only ! 159: `--' can cause `getopt' to return EOF with `optind' != ARGC. */ ! 160: ! 161: static enum ! 162: { ! 163: REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER ! 164: } ordering; ! 165: ! 166: #ifdef __GNU_LIBRARY__ ! 167: /* We want to avoid inclusion of string.h with non-GNU libraries ! 168: because there are many ways it can cause trouble. ! 169: On some systems, it contains special magic macros that don't work ! 170: in GCC. */ ! 171: #include <string.h> ! 172: #define my_index strchr ! 173: #else ! 174: ! 175: /* Avoid depending on library functions or files ! 176: whose names are inconsistent. */ ! 177: ! 178: char *getenv (); ! 179: ! 180: static char * ! 181: my_index (str, chr) ! 182: const char *str; ! 183: int chr; ! 184: { ! 185: while (*str) ! 186: { ! 187: if (*str == chr) ! 188: return (char *) str; ! 189: str++; ! 190: } ! 191: return 0; ! 192: } ! 193: ! 194: /* If using GCC, we can safely declare strlen this way. ! 195: If not using GCC, it is ok not to declare it. ! 196: (Supposedly there are some machines where it might get a warning, ! 197: but changing this conditional to __STDC__ is too risky.) */ ! 198: #ifdef __GNUC__ ! 199: #ifdef IN_GCC ! 200: #include "gstddef.h" ! 201: #else ! 202: #include <stddef.h> ! 203: #endif ! 204: extern size_t strlen (const char *); ! 205: #endif ! 206: ! 207: #endif /* GNU C library. */ ! 208: ! 209: /* Handle permutation of arguments. */ ! 210: ! 211: /* Describe the part of ARGV that contains non-options that have ! 212: been skipped. `first_nonopt' is the index in ARGV of the first of them; ! 213: `last_nonopt' is the index after the last of them. */ ! 214: ! 215: static int first_nonopt; ! 216: static int last_nonopt; ! 217: ! 218: /* Exchange two adjacent subsequences of ARGV. ! 219: One subsequence is elements [first_nonopt,last_nonopt) ! 220: which contains all the non-options that have been skipped so far. ! 221: The other is elements [last_nonopt,optind), which contains all ! 222: the options processed since those non-options were skipped. ! 223: ! 224: `first_nonopt' and `last_nonopt' are relocated so that they describe ! 225: the new indices of the non-options in ARGV after they are moved. */ ! 226: ! 227: static void ! 228: exchange (argv) ! 229: char **argv; ! 230: { ! 231: int bottom = first_nonopt; ! 232: int middle = last_nonopt; ! 233: int top = optind; ! 234: char *tem; ! 235: ! 236: /* Exchange the shorter segment with the far end of the longer segment. ! 237: That puts the shorter segment into the right place. ! 238: It leaves the longer segment in the right place overall, ! 239: but it consists of two parts that need to be swapped next. */ ! 240: ! 241: while (top > middle && middle > bottom) ! 242: { ! 243: if (top - middle > middle - bottom) ! 244: { ! 245: /* Bottom segment is the short one. */ ! 246: int len = middle - bottom; ! 247: register int i; ! 248: ! 249: /* Swap it with the top part of the top segment. */ ! 250: for (i = 0; i < len; i++) ! 251: { ! 252: tem = argv[bottom + i]; ! 253: argv[bottom + i] = argv[top - (middle - bottom) + i]; ! 254: argv[top - (middle - bottom) + i] = tem; ! 255: } ! 256: /* Exclude the moved bottom segment from further swapping. */ ! 257: top -= len; ! 258: } ! 259: else ! 260: { ! 261: /* Top segment is the short one. */ ! 262: int len = top - middle; ! 263: register int i; ! 264: ! 265: /* Swap it with the bottom part of the bottom segment. */ ! 266: for (i = 0; i < len; i++) ! 267: { ! 268: tem = argv[bottom + i]; ! 269: argv[bottom + i] = argv[middle + i]; ! 270: argv[middle + i] = tem; ! 271: } ! 272: /* Exclude the moved top segment from further swapping. */ ! 273: bottom += len; ! 274: } ! 275: } ! 276: ! 277: /* Update records for the slots the non-options now occupy. */ ! 278: ! 279: first_nonopt += (optind - last_nonopt); ! 280: last_nonopt = optind; ! 281: } ! 282: ! 283: /* Scan elements of ARGV (whose length is ARGC) for option characters ! 284: given in OPTSTRING. ! 285: ! 286: If an element of ARGV starts with '-', and is not exactly "-" or "--", ! 287: then it is an option element. The characters of this element ! 288: (aside from the initial '-') are option characters. If `getopt' ! 289: is called repeatedly, it returns successively each of the option characters ! 290: from each of the option elements. ! 291: ! 292: If `getopt' finds another option character, it returns that character, ! 293: updating `optind' and `nextchar' so that the next call to `getopt' can ! 294: resume the scan with the following option character or ARGV-element. ! 295: ! 296: If there are no more option characters, `getopt' returns `EOF'. ! 297: Then `optind' is the index in ARGV of the first ARGV-element ! 298: that is not an option. (The ARGV-elements have been permuted ! 299: so that those that are not options now come last.) ! 300: ! 301: OPTSTRING is a string containing the legitimate option characters. ! 302: If an option character is seen that is not listed in OPTSTRING, ! 303: return '?' after printing an error message. If you set `opterr' to ! 304: zero, the error message is suppressed but we still return '?'. ! 305: ! 306: If a char in OPTSTRING is followed by a colon, that means it wants an arg, ! 307: so the following text in the same ARGV-element, or the text of the following ! 308: ARGV-element, is returned in `optarg'. Two colons mean an option that ! 309: wants an optional arg; if there is text in the current ARGV-element, ! 310: it is returned in `optarg', otherwise `optarg' is set to zero. ! 311: ! 312: If OPTSTRING starts with `-' or `+', it requests different methods of ! 313: handling the non-option ARGV-elements. ! 314: See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. ! 315: ! 316: Long-named options begin with `--' instead of `-'. ! 317: Their names may be abbreviated as long as the abbreviation is unique ! 318: or is an exact match for some defined option. If they have an ! 319: argument, it follows the option name in the same ARGV-element, separated ! 320: from the option name by a `=', or else the in next ARGV-element. ! 321: When `getopt' finds a long-named option, it returns 0 if that option's ! 322: `flag' field is nonzero, the value of the option's `val' field ! 323: if the `flag' field is zero. ! 324: ! 325: The elements of ARGV aren't really const, because we permute them. ! 326: But we pretend they're const in the prototype to be compatible ! 327: with other systems. ! 328: ! 329: LONGOPTS is a vector of `struct option' terminated by an ! 330: element containing a name which is zero. ! 331: ! 332: LONGIND returns the index in LONGOPT of the long-named option found. ! 333: It is only valid when a long-named option has been found by the most ! 334: recent call. ! 335: ! 336: If LONG_ONLY is nonzero, '-' as well as '--' can introduce ! 337: long-named options. */ ! 338: ! 339: int ! 340: _getopt_internal (argc, argv, optstring, longopts, longind, long_only) ! 341: int argc; ! 342: char *const *argv; ! 343: const char *optstring; ! 344: const struct option *longopts; ! 345: int *longind; ! 346: int long_only; ! 347: { ! 348: int option_index; ! 349: ! 350: optarg = 0; ! 351: ! 352: /* Initialize the internal data when the first call is made. ! 353: Start processing options with ARGV-element 1 (since ARGV-element 0 ! 354: is the program name); the sequence of previously skipped ! 355: non-option ARGV-elements is empty. */ ! 356: ! 357: if (optind == 0) ! 358: { ! 359: first_nonopt = last_nonopt = optind = 1; ! 360: ! 361: nextchar = NULL; ! 362: ! 363: /* Determine how to handle the ordering of options and nonoptions. */ ! 364: ! 365: if (optstring[0] == '-') ! 366: { ! 367: ordering = RETURN_IN_ORDER; ! 368: ++optstring; ! 369: } ! 370: else if (optstring[0] == '+') ! 371: { ! 372: ordering = REQUIRE_ORDER; ! 373: ++optstring; ! 374: } ! 375: else if (getenv ("POSIXLY_CORRECT") != NULL) ! 376: ordering = REQUIRE_ORDER; ! 377: else ! 378: ordering = PERMUTE; ! 379: } ! 380: ! 381: if (nextchar == NULL || *nextchar == '\0') ! 382: { ! 383: if (ordering == PERMUTE) ! 384: { ! 385: /* If we have just processed some options following some non-options, ! 386: exchange them so that the options come first. */ ! 387: ! 388: if (first_nonopt != last_nonopt && last_nonopt != optind) ! 389: exchange ((char **) argv); ! 390: else if (last_nonopt != optind) ! 391: first_nonopt = optind; ! 392: ! 393: /* Now skip any additional non-options ! 394: and extend the range of non-options previously skipped. */ ! 395: ! 396: while (optind < argc ! 397: && (argv[optind][0] != '-' || argv[optind][1] == '\0') ! 398: #ifdef GETOPT_COMPAT ! 399: && (longopts == NULL ! 400: || argv[optind][0] != '+' || argv[optind][1] == '\0') ! 401: #endif /* GETOPT_COMPAT */ ! 402: ) ! 403: optind++; ! 404: last_nonopt = optind; ! 405: } ! 406: ! 407: /* Special ARGV-element `--' means premature end of options. ! 408: Skip it like a null option, ! 409: then exchange with previous non-options as if it were an option, ! 410: then skip everything else like a non-option. */ ! 411: ! 412: if (optind != argc && !strcmp (argv[optind], "--")) ! 413: { ! 414: optind++; ! 415: ! 416: if (first_nonopt != last_nonopt && last_nonopt != optind) ! 417: exchange ((char **) argv); ! 418: else if (first_nonopt == last_nonopt) ! 419: first_nonopt = optind; ! 420: last_nonopt = argc; ! 421: ! 422: optind = argc; ! 423: } ! 424: ! 425: /* If we have done all the ARGV-elements, stop the scan ! 426: and back over any non-options that we skipped and permuted. */ ! 427: ! 428: if (optind == argc) ! 429: { ! 430: /* Set the next-arg-index to point at the non-options ! 431: that we previously skipped, so the caller will digest them. */ ! 432: if (first_nonopt != last_nonopt) ! 433: optind = first_nonopt; ! 434: return EOF; ! 435: } ! 436: ! 437: /* If we have come to a non-option and did not permute it, ! 438: either stop the scan or describe it to the caller and pass it by. */ ! 439: ! 440: if ((argv[optind][0] != '-' || argv[optind][1] == '\0') ! 441: #ifdef GETOPT_COMPAT ! 442: && (longopts == NULL ! 443: || argv[optind][0] != '+' || argv[optind][1] == '\0') ! 444: #endif /* GETOPT_COMPAT */ ! 445: ) ! 446: { ! 447: if (ordering == REQUIRE_ORDER) ! 448: return EOF; ! 449: optarg = argv[optind++]; ! 450: return 1; ! 451: } ! 452: ! 453: /* We have found another option-ARGV-element. ! 454: Start decoding its characters. */ ! 455: ! 456: nextchar = (argv[optind] + 1 ! 457: + (longopts != NULL && argv[optind][1] == '-')); ! 458: } ! 459: ! 460: if (longopts != NULL ! 461: && ((argv[optind][0] == '-' ! 462: && (argv[optind][1] == '-' || long_only)) ! 463: #ifdef GETOPT_COMPAT ! 464: || argv[optind][0] == '+' ! 465: #endif /* GETOPT_COMPAT */ ! 466: )) ! 467: { ! 468: const struct option *p; ! 469: char *s = nextchar; ! 470: int exact = 0; ! 471: int ambig = 0; ! 472: const struct option *pfound = NULL; ! 473: int indfound; ! 474: ! 475: while (*s && *s != '=') ! 476: s++; ! 477: ! 478: /* Test all options for either exact match or abbreviated matches. */ ! 479: for (p = longopts, option_index = 0; p->name; ! 480: p++, option_index++) ! 481: if (!strncmp (p->name, nextchar, s - nextchar)) ! 482: { ! 483: if (s - nextchar == strlen (p->name)) ! 484: { ! 485: /* Exact match found. */ ! 486: pfound = p; ! 487: indfound = option_index; ! 488: exact = 1; ! 489: break; ! 490: } ! 491: else if (pfound == NULL) ! 492: { ! 493: /* First nonexact match found. */ ! 494: pfound = p; ! 495: indfound = option_index; ! 496: } ! 497: else ! 498: /* Second nonexact match found. */ ! 499: ambig = 1; ! 500: } ! 501: ! 502: if (ambig && !exact) ! 503: { ! 504: if (opterr) ! 505: fprintf (stderr, "%s: option `%s' is ambiguous\n", ! 506: argv[0], argv[optind]); ! 507: nextchar += strlen (nextchar); ! 508: optind++; ! 509: return '?'; ! 510: } ! 511: ! 512: if (pfound != NULL) ! 513: { ! 514: option_index = indfound; ! 515: optind++; ! 516: if (*s) ! 517: { ! 518: /* Don't test has_arg with >, because some C compilers don't ! 519: allow it to be used on enums. */ ! 520: if (pfound->has_arg) ! 521: optarg = s + 1; ! 522: else ! 523: { ! 524: if (opterr) ! 525: { ! 526: if (argv[optind - 1][1] == '-') ! 527: /* --option */ ! 528: fprintf (stderr, ! 529: "%s: option `--%s' doesn't allow an argument\n", ! 530: argv[0], pfound->name); ! 531: else ! 532: /* +option or -option */ ! 533: fprintf (stderr, ! 534: "%s: option `%c%s' doesn't allow an argument\n", ! 535: argv[0], argv[optind - 1][0], pfound->name); ! 536: } ! 537: nextchar += strlen (nextchar); ! 538: return '?'; ! 539: } ! 540: } ! 541: else if (pfound->has_arg == 1) ! 542: { ! 543: if (optind < argc) ! 544: optarg = argv[optind++]; ! 545: else ! 546: { ! 547: if (opterr) ! 548: fprintf (stderr, "%s: option `%s' requires an argument\n", ! 549: argv[0], argv[optind - 1]); ! 550: nextchar += strlen (nextchar); ! 551: return optstring[0] == ':' ? ':' : '?'; ! 552: } ! 553: } ! 554: nextchar += strlen (nextchar); ! 555: if (longind != NULL) ! 556: *longind = option_index; ! 557: if (pfound->flag) ! 558: { ! 559: *(pfound->flag) = pfound->val; ! 560: return 0; ! 561: } ! 562: return pfound->val; ! 563: } ! 564: /* Can't find it as a long option. If this is not getopt_long_only, ! 565: or the option starts with '--' or is not a valid short ! 566: option, then it's an error. ! 567: Otherwise interpret it as a short option. */ ! 568: if (!long_only || argv[optind][1] == '-' ! 569: #ifdef GETOPT_COMPAT ! 570: || argv[optind][0] == '+' ! 571: #endif /* GETOPT_COMPAT */ ! 572: || my_index (optstring, *nextchar) == NULL) ! 573: { ! 574: if (opterr) ! 575: { ! 576: if (argv[optind][1] == '-') ! 577: /* --option */ ! 578: fprintf (stderr, "%s: unrecognized option `--%s'\n", ! 579: argv[0], nextchar); ! 580: else ! 581: /* +option or -option */ ! 582: fprintf (stderr, "%s: unrecognized option `%c%s'\n", ! 583: argv[0], argv[optind][0], nextchar); ! 584: } ! 585: nextchar = (char *) ""; ! 586: optind++; ! 587: return '?'; ! 588: } ! 589: } ! 590: ! 591: /* Look at and handle the next option-character. */ ! 592: ! 593: { ! 594: char c = *nextchar++; ! 595: char *temp = my_index (optstring, c); ! 596: ! 597: /* Increment `optind' when we start to process its last character. */ ! 598: if (*nextchar == '\0') ! 599: ++optind; ! 600: ! 601: if (temp == NULL || c == ':') ! 602: { ! 603: if (opterr) ! 604: { ! 605: #if 0 ! 606: if (c < 040 || c >= 0177) ! 607: fprintf (stderr, "%s: unrecognized option, character code 0%o\n", ! 608: argv[0], c); ! 609: else ! 610: fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); ! 611: #else ! 612: /* 1003.2 specifies the format of this message. */ ! 613: fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); ! 614: #endif ! 615: } ! 616: optopt = c; ! 617: return '?'; ! 618: } ! 619: if (temp[1] == ':') ! 620: { ! 621: if (temp[2] == ':') ! 622: { ! 623: /* This is an option that accepts an argument optionally. */ ! 624: if (*nextchar != '\0') ! 625: { ! 626: optarg = nextchar; ! 627: optind++; ! 628: } ! 629: else ! 630: optarg = 0; ! 631: nextchar = NULL; ! 632: } ! 633: else ! 634: { ! 635: /* This is an option that requires an argument. */ ! 636: if (*nextchar != '\0') ! 637: { ! 638: optarg = nextchar; ! 639: /* If we end this ARGV-element by taking the rest as an arg, ! 640: we must advance to the next element now. */ ! 641: optind++; ! 642: } ! 643: else if (optind == argc) ! 644: { ! 645: if (opterr) ! 646: { ! 647: #if 0 ! 648: fprintf (stderr, "%s: option `-%c' requires an argument\n", ! 649: argv[0], c); ! 650: #else ! 651: /* 1003.2 specifies the format of this message. */ ! 652: fprintf (stderr, "%s: option requires an argument -- %c\n", ! 653: argv[0], c); ! 654: #endif ! 655: } ! 656: optopt = c; ! 657: if (optstring[0] == ':') ! 658: c = ':'; ! 659: else ! 660: c = '?'; ! 661: } ! 662: else ! 663: /* We already incremented `optind' once; ! 664: increment it again when taking next ARGV-elt as argument. */ ! 665: optarg = argv[optind++]; ! 666: nextchar = NULL; ! 667: } ! 668: } ! 669: return c; ! 670: } ! 671: } ! 672: ! 673: int ! 674: getopt (argc, argv, optstring) ! 675: int argc; ! 676: char *const *argv; ! 677: const char *optstring; ! 678: { ! 679: return _getopt_internal (argc, argv, optstring, ! 680: (const struct option *) 0, ! 681: (int *) 0, ! 682: 0); ! 683: } ! 684: ! 685: #endif /* _LIBC or not __GNU_LIBRARY__. */ ! 686: ! 687: #ifdef TEST ! 688: ! 689: /* Compile with -DTEST to make an executable for use in testing ! 690: the above definition of `getopt'. */ ! 691: ! 692: int ! 693: main (argc, argv) ! 694: int argc; ! 695: char **argv; ! 696: { ! 697: int c; ! 698: int digit_optind = 0; ! 699: ! 700: while (1) ! 701: { ! 702: int this_option_optind = optind ? optind : 1; ! 703: ! 704: c = getopt (argc, argv, "abc:d:0123456789"); ! 705: if (c == EOF) ! 706: break; ! 707: ! 708: switch (c) ! 709: { ! 710: case '0': ! 711: case '1': ! 712: case '2': ! 713: case '3': ! 714: case '4': ! 715: case '5': ! 716: case '6': ! 717: case '7': ! 718: case '8': ! 719: case '9': ! 720: if (digit_optind != 0 && digit_optind != this_option_optind) ! 721: printf ("digits occur in two different argv-elements.\n"); ! 722: digit_optind = this_option_optind; ! 723: printf ("option %c\n", c); ! 724: break; ! 725: ! 726: case 'a': ! 727: printf ("option a\n"); ! 728: break; ! 729: ! 730: case 'b': ! 731: printf ("option b\n"); ! 732: break; ! 733: ! 734: case 'c': ! 735: printf ("option c with value `%s'\n", optarg); ! 736: break; ! 737: ! 738: case '?': ! 739: break; ! 740: ! 741: default: ! 742: printf ("?? getopt returned character code 0%o ??\n", c); ! 743: } ! 744: } ! 745: ! 746: if (optind < argc) ! 747: { ! 748: printf ("non-option ARGV-elements: "); ! 749: while (optind < argc) ! 750: printf ("%s ", argv[optind++]); ! 751: printf ("\n"); ! 752: } ! 753: ! 754: exit (0); ! 755: } ! 756: ! 757: #endif /* TEST */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.