source: git/src/getopt.c @ 76cf7f1

RELEASE/1.2debug-cidebug-ci-sanitiserswalls-data
Last change on this file since 76cf7f1 was 0b5273a, checked in by Olly Betts <olly@…>, 9 years ago

lib/,src/getopt.c: #if 0 out the support for -W longopt (which we
don't use) and the posixly_correct "illegal option" message
("invalid option" is clearer).

  • 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 0
906            if (posixly_correct)
907              {
908                /* 1003.2 specifies the format of this message.  */
909#if defined _LIBC && defined USE_IN_LIBIO
910                n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
911                                argv[0], c);
912#else
913                fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
914#endif
915              }
916            else
917#endif
918              {
919#if defined _LIBC && defined USE_IN_LIBIO
920                n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
921                                argv[0], c);
922#else
923                fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
924#endif
925              }
926
927#if defined _LIBC && defined USE_IN_LIBIO
928            if (n >= 0)
929              {
930                if (_IO_fwide (stderr, 0) > 0)
931                  __fwprintf (stderr, L"%s", buf);
932                else
933                  fputs (buf, stderr);
934
935                free (buf);
936              }
937#endif
938          }
939        optopt = c;
940        return '?';
941      }
942#if 0
943    /* Convenience. Treat POSIX -W foo same as long option --foo */
944    if (temp[0] == 'W' && temp[1] == ';')
945      {
946        char *nameend;
947        const struct option *p;
948        const struct option *pfound = NULL;
949        int exact = 0;
950        int ambig = 0;
951        int indfound = 0;
952        int option_index;
953
954        /* This is an option that requires an argument.  */
955        if (*nextchar != '\0')
956          {
957            optarg = nextchar;
958            /* If we end this ARGV-element by taking the rest as an arg,
959               we must advance to the next element now.  */
960            optind++;
961          }
962        else if (optind == argc)
963          {
964            if (print_errors)
965              {
966                /* 1003.2 specifies the format of this message.  */
967#if defined _LIBC && defined USE_IN_LIBIO
968                char *buf;
969
970                if (__asprintf (&buf,
971                                _("%s: option requires an argument -- %c\n"),
972                                argv[0], c) >= 0)
973                  {
974                    if (_IO_fwide (stderr, 0) > 0)
975                      __fwprintf (stderr, L"%s", buf);
976                    else
977                      fputs (buf, stderr);
978
979                    free (buf);
980                  }
981#else
982                fprintf (stderr, _("%s: option requires an argument -- %c\n"),
983                         argv[0], c);
984#endif
985              }
986            optopt = c;
987            if (optstring[0] == ':')
988              c = ':';
989            else
990              c = '?';
991            return c;
992          }
993        else
994          /* We already incremented `optind' once;
995             increment it again when taking next ARGV-elt as argument.  */
996          optarg = argv[optind++];
997
998        /* optarg is now the argument, see if it's in the
999           table of longopts.  */
1000
1001        for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
1002          /* Do nothing.  */ ;
1003
1004        /* Test all long options for either exact match
1005           or abbreviated matches.  */
1006        for (p = longopts, option_index = 0; p->name; p++, option_index++)
1007          if (!strncmp (p->name, nextchar, nameend - nextchar))
1008            {
1009              if ((unsigned int) (nameend - nextchar) == strlen (p->name))
1010                {
1011                  /* Exact match found.  */
1012                  pfound = p;
1013                  indfound = option_index;
1014                  exact = 1;
1015                  break;
1016                }
1017              else if (pfound == NULL)
1018                {
1019                  /* First nonexact match found.  */
1020                  pfound = p;
1021                  indfound = option_index;
1022                }
1023              else
1024                /* Second or later nonexact match found.  */
1025                ambig = 1;
1026            }
1027        if (ambig && !exact)
1028          {
1029            if (print_errors)
1030              {
1031#if defined _LIBC && defined USE_IN_LIBIO
1032                char *buf;
1033
1034                if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
1035                                argv[0], argv[optind]) >= 0)
1036                  {
1037                    if (_IO_fwide (stderr, 0) > 0)
1038                      __fwprintf (stderr, L"%s", buf);
1039                    else
1040                      fputs (buf, stderr);
1041
1042                    free (buf);
1043                  }
1044#else
1045                fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
1046                         argv[0], argv[optind]);
1047#endif
1048              }
1049            nextchar += strlen (nextchar);
1050            optind++;
1051            return '?';
1052          }
1053        if (pfound != NULL)
1054          {
1055            option_index = indfound;
1056            if (*nameend)
1057              {
1058                /* Don't test has_arg with >, because some C compilers don't
1059                   allow it to be used on enums.  */
1060                if (pfound->has_arg)
1061                  optarg = nameend + 1;
1062                else
1063                  {
1064                    if (print_errors)
1065                      {
1066#if defined _LIBC && defined USE_IN_LIBIO
1067                        char *buf;
1068
1069                        if (__asprintf (&buf, _("\
1070%s: option `-W %s' doesn't allow an argument\n"),
1071                                        argv[0], pfound->name) >= 0)
1072                          {
1073                            if (_IO_fwide (stderr, 0) > 0)
1074                              __fwprintf (stderr, L"%s", buf);
1075                            else
1076                              fputs (buf, stderr);
1077
1078                            free (buf);
1079                          }
1080#else
1081                        fprintf (stderr, _("\
1082%s: option `-W %s' doesn't allow an argument\n"),
1083                                 argv[0], pfound->name);
1084#endif
1085                      }
1086
1087                    nextchar += strlen (nextchar);
1088                    return '?';
1089                  }
1090              }
1091            else if (pfound->has_arg == 1)
1092              {
1093                if (optind < argc)
1094                  optarg = argv[optind++];
1095                else
1096                  {
1097                    if (print_errors)
1098                      {
1099#if defined _LIBC && defined USE_IN_LIBIO
1100                        char *buf;
1101
1102                        if (__asprintf (&buf, _("\
1103%s: option `%s' requires an argument\n"),
1104                                        argv[0], argv[optind - 1]) >= 0)
1105                          {
1106                            if (_IO_fwide (stderr, 0) > 0)
1107                              __fwprintf (stderr, L"%s", buf);
1108                            else
1109                              fputs (buf, stderr);
1110
1111                            free (buf);
1112                          }
1113#else
1114                        fprintf (stderr,
1115                                 _("%s: option `%s' requires an argument\n"),
1116                                 argv[0], argv[optind - 1]);
1117#endif
1118                      }
1119                    nextchar += strlen (nextchar);
1120                    return optstring[0] == ':' ? ':' : '?';
1121                  }
1122              }
1123            nextchar += strlen (nextchar);
1124            if (longind != NULL)
1125              *longind = option_index;
1126            if (pfound->flag)
1127              {
1128                *(pfound->flag) = pfound->val;
1129                return 0;
1130              }
1131            return pfound->val;
1132          }
1133          nextchar = NULL;
1134          return 'W';   /* Let the application handle it.   */
1135      }
1136#endif
1137    if (temp[1] == ':')
1138      {
1139        if (temp[2] == ':')
1140          {
1141            /* This is an option that accepts an argument optionally.  */
1142            if (*nextchar != '\0')
1143              {
1144                optarg = nextchar;
1145                optind++;
1146              }
1147            else
1148              optarg = NULL;
1149            nextchar = NULL;
1150          }
1151        else
1152          {
1153            /* This is an option that requires an argument.  */
1154            if (*nextchar != '\0')
1155              {
1156                optarg = nextchar;
1157                /* If we end this ARGV-element by taking the rest as an arg,
1158                   we must advance to the next element now.  */
1159                optind++;
1160              }
1161            else if (optind == argc)
1162              {
1163                if (print_errors)
1164                  {
1165                    /* 1003.2 specifies the format of this message.  */
1166#if defined _LIBC && defined USE_IN_LIBIO
1167                    char *buf;
1168
1169                    if (__asprintf (&buf, _("\
1170%s: option requires an argument -- %c\n"),
1171                                    argv[0], c) >= 0)
1172                      {
1173                        if (_IO_fwide (stderr, 0) > 0)
1174                          __fwprintf (stderr, L"%s", buf);
1175                        else
1176                          fputs (buf, stderr);
1177
1178                        free (buf);
1179                      }
1180#else
1181                    fprintf (stderr,
1182                             _("%s: option requires an argument -- %c\n"),
1183                             argv[0], c);
1184#endif
1185                  }
1186                optopt = c;
1187                if (optstring[0] == ':')
1188                  c = ':';
1189                else
1190                  c = '?';
1191              }
1192            else
1193              /* We already incremented `optind' once;
1194                 increment it again when taking next ARGV-elt as argument.  */
1195              optarg = argv[optind++];
1196            nextchar = NULL;
1197          }
1198      }
1199    return c;
1200  }
1201}
1202
1203int
1204getopt (argc, argv, optstring)
1205     int argc;
1206     char *const *argv;
1207     const char *optstring;
1208{
1209  return _getopt_internal (argc, argv, optstring,
1210                           (const struct option *) 0,
1211                           (int *) 0,
1212                           0);
1213}
1214
1215#endif  /* Not ELIDE_CODE.  */
1216
1217#ifdef TEST
1218
1219/* Compile with -DTEST to make an executable for use in testing
1220   the above definition of `getopt'.  */
1221
1222int
1223main (argc, argv)
1224     int argc;
1225     char **argv;
1226{
1227  int c;
1228  int digit_optind = 0;
1229
1230  while (1)
1231    {
1232      int this_option_optind = optind ? optind : 1;
1233
1234      c = getopt (argc, argv, "abc:d:0123456789");
1235      if (c == -1)
1236        break;
1237
1238      switch (c)
1239        {
1240        case '0':
1241        case '1':
1242        case '2':
1243        case '3':
1244        case '4':
1245        case '5':
1246        case '6':
1247        case '7':
1248        case '8':
1249        case '9':
1250          if (digit_optind != 0 && digit_optind != this_option_optind)
1251            printf ("digits occur in two different argv-elements.\n");
1252          digit_optind = this_option_optind;
1253          printf ("option %c\n", c);
1254          break;
1255
1256        case 'a':
1257          printf ("option a\n");
1258          break;
1259
1260        case 'b':
1261          printf ("option b\n");
1262          break;
1263
1264        case 'c':
1265          printf ("option c with value `%s'\n", optarg);
1266          break;
1267
1268        case '?':
1269          break;
1270
1271        default:
1272          printf ("?? getopt returned character code 0%o ??\n", c);
1273        }
1274    }
1275
1276  if (optind < argc)
1277    {
1278      printf ("non-option ARGV-elements: ");
1279      while (optind < argc)
1280        printf ("%s ", argv[optind++]);
1281      printf ("\n");
1282    }
1283
1284  exit (0);
1285}
1286
1287#endif /* TEST */
Note: See TracBrowser for help on using the repository browser.