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