diff -r 6efc85c5493e -r 1c1e3599d66a doc/doxygen/html/TestMasterSlave_2getopt_8c-source.html --- a/doc/doxygen/html/TestMasterSlave_2getopt_8c-source.html Mon Feb 11 11:00:12 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1286 +0,0 @@ - - -CanFestival: examples/TestMasterSlave/getopt.c Source File - - - - -
-
-
-
- -

getopt.c

Go to the documentation of this file.
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 */
-

Generated on Mon Jul 2 19:10:16 2007 for CanFestival by  - -doxygen 1.5.1
- -