source: git/src/getopt.c @ 21a159f

RELEASE/1.2debug-cidebug-ci-sanitisersstereowalls-datawalls-data-hanging-as-warning
Last change on this file since 21a159f was 21a159f, checked in by Olly Betts <olly@…>, 9 years ago

src/getopt.c,src/gettexttomsg.pl: Take preprocessor directives into
account to avoid converting gettext() uses which won't be used.

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