root/trunk/lib-src/getopt.c

Revision 4220, 32.8 kB (checked in by miyoshi, 5 months ago)

Sync up with Emacs22.2.

  • Property svn:eol-style set to native
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, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
6                  1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
7                  2004, 2005, 2006, 2007 Free Software Foundation, Inc.
8    This file is part of the GNU C Library.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3, or (at your option)
13    any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License along
21    with this program; if not, write to the Free Software Foundation,
22    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 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 <stdio.h>
35
36 /* This needs to come after some library #include
37    to get __GNU_LIBRARY__ defined.  */
38 #ifdef  __GNU_LIBRARY__
39 /* Don't include stdlib.h for non-GNU C libraries because some of them
40    contain conflicting prototypes for getopt.  */
41 # include <stdlib.h>
42 # include <unistd.h>
43 #endif  /* GNU C library.  */
44
45 #include <string.h>
46
47 #ifdef VMS
48 # include <unixlib.h>
49 #endif
50
51 #ifdef _LIBC
52 # include <libintl.h>
53 #else
54 # include "gettext.h"
55 # define _(msgid) gettext (msgid)
56 #endif
57
58 #if defined _LIBC && defined USE_IN_LIBIO
59 # include <wchar.h>
60 #endif
61
62 #ifndef attribute_hidden
63 # define attribute_hidden
64 #endif
65
66 /* Unlike standard Unix `getopt', functions like `getopt_long'
67    let the user intersperse the options with the other arguments.
68
69    As `getopt_long' works, it permutes the elements of ARGV so that,
70    when it is done, all the options precede everything else.  Thus
71    all application programs are extended to handle flexible argument order.
72
73    Using `getopt' or setting the environment variable POSIXLY_CORRECT
74    disables permutation.
75    Then the application's behavior is completely standard.
76
77    GNU application programs can use a third alternative mode in which
78    they can distinguish the relative order of options and other arguments.  */
79
80 #include "getopt.h"
81 #include "getopt_int.h"
82
83 /* For communication from `getopt' to the caller.
84    When `getopt' finds an option that takes an argument,
85    the argument value is returned here.
86    Also, when `ordering' is RETURN_IN_ORDER,
87    each non-option ARGV-element is returned here.  */
88
89 char *optarg;
90
91 /* Index in ARGV of the next element to be scanned.
92    This is used for communication to and from the caller
93    and for communication between successive calls to `getopt'.
94
95    On entry to `getopt', zero means this is the first call; initialize.
96
97    When `getopt' returns -1, this is the index of the first of the
98    non-option elements that the caller should itself scan.
99
100    Otherwise, `optind' communicates from one call to the next
101    how much of ARGV has been scanned so far.  */
102
103 /* 1003.2 says this must be 1 before any call.  */
104 int optind = 1;
105
106 /* Callers store zero here to inhibit the error message
107    for unrecognized options.  */
108
109 int opterr = 1;
110
111 /* Set to an option character which was unrecognized.
112    This must be initialized on some systems to avoid linking in the
113    system's own getopt implementation.  */
114
115 int optopt = '?';
116
117 /* Keep a global copy of all internal members of getopt_data.  */
118
119 static struct _getopt_data getopt_data;
120
121
122 #ifndef __GNU_LIBRARY__
123
124 /* Avoid depending on library functions or files
125    whose names are inconsistent.  */
126
127 #ifndef getenv
128 extern char *getenv ();
129 #endif
130
131 #endif /* not __GNU_LIBRARY__ */
132
133 #ifdef _LIBC
134 /* Stored original parameters.
135    XXX This is no good solution.  We should rather copy the args so
136    that we can compare them later.  But we must not use malloc(3).  */
137 extern int __libc_argc;
138 extern char **__libc_argv;
139
140 /* Bash 2.0 gives us an environment variable containing flags
141    indicating ARGV elements that should not be considered arguments.  */
142
143 # ifdef USE_NONOPTION_FLAGS
144 /* Defined in getopt_init.c  */
145 extern char *__getopt_nonoption_flags;
146 # endif
147
148 # ifdef USE_NONOPTION_FLAGS
149 #  define SWAP_FLAGS(ch1, ch2) \
150   if (d->__nonoption_flags_len > 0)                                           \
151     {                                                                         \
152       char __tmp = __getopt_nonoption_flags[ch1];                             \
153       __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];          \
154       __getopt_nonoption_flags[ch2] = __tmp;                                  \
155     }
156 # else
157 #  define SWAP_FLAGS(ch1, ch2)
158 # endif
159 #else   /* !_LIBC */
160 # define SWAP_FLAGS(ch1, ch2)
161 #endif  /* _LIBC */
162
163 /* Exchange two adjacent subsequences of ARGV.
164    One subsequence is elements [first_nonopt,last_nonopt)
165    which contains all the non-options that have been skipped so far.
166    The other is elements [last_nonopt,optind), which contains all
167    the options processed since those non-options were skipped.
168
169    `first_nonopt' and `last_nonopt' are relocated so that they describe
170    the new indices of the non-options in ARGV after they are moved.  */
171
172 static void
173 exchange (char **argv, struct _getopt_data *d)
174 {
175   int bottom = d->__first_nonopt;
176   int middle = d->__last_nonopt;
177   int top = d->optind;
178   char *tem;
179
180   /* Exchange the shorter segment with the far end of the longer segment.
181      That puts the shorter segment into the right place.
182      It leaves the longer segment in the right place overall,
183      but it consists of two parts that need to be swapped next.  */
184
185 #if defined _LIBC && defined USE_NONOPTION_FLAGS
186   /* First make sure the handling of the `__getopt_nonoption_flags'
187      string can work normally.  Our top argument must be in the range
188      of the string.  */
189   if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
190     {
191       /* We must extend the array.  The user plays games with us and
192          presents new arguments.  */
193       char *new_str = malloc (top + 1);
194       if (new_str == NULL)
195         d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
196       else
197         {
198           memset (__mempcpy (new_str, __getopt_nonoption_flags,
199                              d->__nonoption_flags_max_len),
200                   '\0', top + 1 - d->__nonoption_flags_max_len);
201           d->__nonoption_flags_max_len = top + 1;
202           __getopt_nonoption_flags = new_str;
203         }
204     }
205 #endif
206
207   while (top > middle && middle > bottom)
208     {
209       if (top - middle > middle - bottom)
210         {
211           /* Bottom segment is the short one.  */
212           int len = middle - bottom;
213           register int i;
214
215           /* Swap it with the top part of the top segment.  */
216           for (i = 0; i < len; i++)
217             {
218               tem = argv[bottom + i];
219               argv[bottom + i] = argv[top - (middle - bottom) + i];
220               argv[top - (middle - bottom) + i] = tem;
221               SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
222             }
223           /* Exclude the moved bottom segment from further swapping.  */
224           top -= len;
225         }
226       else
227         {
228           /* Top segment is the short one.  */
229           int len = top - middle;
230           register int i;
231
232           /* Swap it with the bottom part of the bottom segment.  */
233           for (i = 0; i < len; i++)
234             {
235               tem = argv[bottom + i];
236               argv[bottom + i] = argv[middle + i];
237               argv[middle + i] = tem;
238               SWAP_FLAGS (bottom + i, middle + i);
239             }
240           /* Exclude the moved top segment from further swapping.  */
241           bottom += len;
242         }
243     }
244
245   /* Update records for the slots the non-options now occupy.  */
246
247   d->__first_nonopt += (d->optind - d->__last_nonopt);
248   d->__last_nonopt = d->optind;
249 }
250
251 /* Initialize the internal data when the first call is made.  */
252
253 static const char *
254 _getopt_initialize (int argc, char **argv, const char *optstring,
255                     int posixly_correct, struct _getopt_data *d)
256 {
257   /* Start processing options with ARGV-element 1 (since ARGV-element 0
258      is the program name); the sequence of previously skipped
259      non-option ARGV-elements is empty.  */
260
261   d->__first_nonopt = d->__last_nonopt = d->optind;
262
263   d->__nextchar = NULL;
264
265   d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
266
267   /* Determine how to handle the ordering of options and nonoptions.  */
268
269   if (optstring[0] == '-')
270     {
271       d->__ordering = RETURN_IN_ORDER;
272       ++optstring;
273     }
274   else if (optstring[0] == '+')
275     {
276       d->__ordering = REQUIRE_ORDER;
277       ++optstring;
278     }
279   else if (d->__posixly_correct)
280     d->__ordering = REQUIRE_ORDER;
281   else
282     d->__ordering = PERMUTE;
283
284 #if defined _LIBC && defined USE_NONOPTION_FLAGS
285   if (!d->__posixly_correct
286       && argc == __libc_argc && argv == __libc_argv)
287     {
288       if (d->__nonoption_flags_max_len == 0)
289         {
290           if (__getopt_nonoption_flags == NULL
291               || __getopt_nonoption_flags[0] == '\0')
292             d->__nonoption_flags_max_len = -1;
293           else
294             {
295               const char *orig_str = __getopt_nonoption_flags;
296               int len = d->__nonoption_flags_max_len = strlen (orig_str);
297               if (d->__nonoption_flags_max_len < argc)
298                 d->__nonoption_flags_max_len = argc;
299               __getopt_nonoption_flags =
300                 (char *) malloc (d->__nonoption_flags_max_len);
301               if (__getopt_nonoption_flags == NULL)
302                 d->__nonoption_flags_max_len = -1;
303               else
304                 memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
305                         '\0', d->__nonoption_flags_max_len - len);
306             }
307         }
308       d->__nonoption_flags_len = d->__nonoption_flags_max_len;
309     }
310   else
311     d->__nonoption_flags_len = 0;
312 #endif
313
314   return optstring;
315 }
316
317 /* Scan elements of ARGV (whose length is ARGC) for option characters
318    given in OPTSTRING.
319
320    If an element of ARGV starts with '-', and is not exactly "-" or "--",
321    then it is an option element.  The characters of this element
322    (aside from the initial '-') are option characters.  If `getopt'
323    is called repeatedly, it returns successively each of the option characters
324    from each of the option elements.
325
326    If `getopt' finds another option character, it returns that character,
327    updating `optind' and `nextchar' so that the next call to `getopt' can
328    resume the scan with the following option character or ARGV-element.
329
330    If there are no more option characters, `getopt' returns -1.
331    Then `optind' is the index in ARGV of the first ARGV-element
332    that is not an option.  (The ARGV-elements have been permuted
333    so that those that are not options now come last.)
334
335    OPTSTRING is a string containing the legitimate option characters.
336    If an option character is seen that is not listed in OPTSTRING,
337    return '?' after printing an error message.  If you set `opterr' to
338    zero, the error message is suppressed but we still return '?'.
339
340    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
341    so the following text in the same ARGV-element, or the text of the following
342    ARGV-element, is returned in `optarg'.  Two colons mean an option that
343    wants an optional arg; if there is text in the current ARGV-element,
344    it is returned in `optarg', otherwise `optarg' is set to zero.
345
346    If OPTSTRING starts with `-' or `+', it requests different methods of
347    handling the non-option ARGV-elements.
348    See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
349
350    Long-named options begin with `--' instead of `-'.
351    Their names may be abbreviated as long as the abbreviation is unique
352    or is an exact match for some defined option.  If they have an
353    argument, it follows the option name in the same ARGV-element, separated
354    from the option name by a `=', or else the in next ARGV-element.
355    When `getopt' finds a long-named option, it returns 0 if that option's
356    `flag' field is nonzero, the value of the option's `val' field
357    if the `flag' field is zero.
358
359    LONGOPTS is a vector of `struct option' terminated by an
360    element containing a name which is zero.
361
362    LONGIND returns the index in LONGOPT of the long-named option found.
363    It is only valid when a long-named option has been found by the most
364    recent call.
365
366    If LONG_ONLY is nonzero, '-' as well as '--' can introduce
367    long-named options.
368
369    If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT
370    environment variable were set.  */
371
372 int
373 _getopt_internal_r (int argc, char **argv, const char *optstring,
374                     const struct option *longopts, int *longind,
375                     int long_only, int posixly_correct, struct _getopt_data *d)
376 {
377   int print_errors = d->opterr;
378   if (optstring[0] == ':')
379     print_errors = 0;
380
381   if (argc < 1)
382     return -1;
383
384   d->optarg = NULL;
385
386   if (d->optind == 0 || !d->__initialized)
387     {
388       if (d->optind == 0)
389         d->optind = 1;  /* Don't scan ARGV[0], the program name.  */
390       optstring = _getopt_initialize (argc, argv, optstring,
391                                       posixly_correct, d);
392       d->__initialized = 1;
393     }
394
395   /* Test whether ARGV[optind] points to a non-option argument.
396      Either it does not have option syntax, or there is an environment flag
397      from the shell indicating it is not an option.  The later information
398      is only used when the used in the GNU libc.  */
399 #if defined _LIBC && defined USE_NONOPTION_FLAGS
400 # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
401                       || (d->optind < d->__nonoption_flags_len                \
402                           && __getopt_nonoption_flags[d->optind] == '1'))
403 #else
404 # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
405 #endif
406
407   if (d->__nextchar == NULL || *d->__nextchar == '\0')
408     {
409       /* Advance to the next ARGV-element.  */
410
411       /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
412          moved back by the user (who may also have changed the arguments).  */
413       if (d->__last_nonopt > d->optind)
414         d->__last_nonopt = d->optind;
415       if (d->__first_nonopt > d->optind)
416         d->__first_nonopt = d->optind;
417
418       if (d->__ordering == PERMUTE)
419         {
420           /* If we have just processed some options following some non-options,
421              exchange them so that the options come first.  */
422
423           if (d->__first_nonopt != d->__last_nonopt
424               && d->__last_nonopt != d->optind)
425             exchange ((char **) argv, d);
426           else if (d->__last_nonopt != d->optind)
427             d->__first_nonopt = d->optind;
428
429           /* Skip any additional non-options
430              and extend the range of non-options previously skipped.  */
431
432           while (d->optind < argc && NONOPTION_P)
433             d->optind++;
434           d->__last_nonopt = d->optind;
435         }
436
437       /* The special ARGV-element `--' means premature end of options.
438          Skip it like a null option,
439          then exchange with previous non-options as if it were an option,
440          then skip everything else like a non-option.  */
441
442       if (d->optind != argc && !strcmp (argv[d->optind], "--"))
443         {
444           d->optind++;
445
446           if (d->__first_nonopt != d->__last_nonopt
447               && d->__last_nonopt != d->optind)
448             exchange ((char **) argv, d);
449           else if (d->__first_nonopt == d->__last_nonopt)
450             d->__first_nonopt = d->optind;
451           d->__last_nonopt = argc;
452
453           d->optind = argc;
454         }
455
456       /* If we have done all the ARGV-elements, stop the scan
457          and back over any non-options that we skipped and permuted.  */
458
459       if (d->optind == argc)
460         {
461           /* Set the next-arg-index to point at the non-options
462              that we previously skipped, so the caller will digest them.  */
463           if (d->__first_nonopt != d->__last_nonopt)
464             d->optind = d->__first_nonopt;
465           return -1;
466         }
467
468       /* If we have come to a non-option and did not permute it,
469          either stop the scan or describe it to the caller and pass it by.  */
470
471       if (NONOPTION_P)
472         {
473           if (d->__ordering == REQUIRE_ORDER)
474             return -1;
475           d->optarg = argv[d->optind++];
476           return 1;
477         }
478
479       /* We have found another option-ARGV-element.
480          Skip the initial punctuation.  */
481
482       d->__nextchar = (argv[d->optind] + 1
483                   + (longopts != NULL && argv[d->optind][1] == '-'));
484     }
485
486   /* Decode the current option-ARGV-element.  */
487
488   /* Check whether the ARGV-element is a long option.
489
490      If long_only and the ARGV-element has the form "-f", where f is
491      a valid short option, don't consider it an abbreviated form of
492      a long option that starts with f.  Otherwise there would be no
493      way to give the -f short option.
494
495      On the other hand, if there's a long option "fubar" and
496      the ARGV-element is "-fu", do consider that an abbreviation of
497      the long option, just like "--fu", and not "-f" with arg "u".
498
499      This distinction seems to be the most useful approach.  */
500
501   if (longopts != NULL
502       && (argv[d->optind][1] == '-'
503           || (long_only && (argv[d->optind][2]
504                             || !strchr (optstring, argv[d->optind][1])))))
505     {
506       char *nameend;
507       const struct option *p;
508       const struct option *pfound = NULL;
509       int exact = 0;
510       int ambig = 0;
511       int indfound = -1;
512       int option_index;
513
514       for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
515         /* Do nothing.  */ ;
516
517       /* Test all long options for either exact match
518          or abbreviated matches.  */
519       for (p = longopts, option_index = 0; p->name; p++, option_index++)
520         if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
521           {
522             if ((unsigned int) (nameend - d->__nextchar)
523                 == (unsigned int) strlen (p->name))
524               {
525                 /* Exact match found.  */
526                 pfound = p;
527                 indfound = option_index;
528                 exact = 1;
529                 break;
530               }
531             else if (pfound == NULL)
532               {
533                 /* First nonexact match found.  */
534                 pfound = p;
535                 indfound = option_index;
536               }
537             else if (long_only
538                      || pfound->has_arg != p->has_arg
539                      || pfound->flag != p->flag
540                      || pfound->val != p->val)
541               /* Second or later nonexact match found.  */
542               ambig = 1;
543           }
544
545       if (ambig && !exact)
546         {
547           if (print_errors)
548             {
549 #if defined _LIBC && defined USE_IN_LIBIO
550               char *buf;
551
552               if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"),
553                               argv[0], argv[d->optind]) >= 0)
554                 {
555                   _IO_flockfile (stderr);
556
557                   int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
558                   ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
559
560                   if (_IO_fwide (stderr, 0) > 0)
561                     __fwprintf (stderr, L"%s", buf);
562                   else
563                     fputs (buf, stderr);
564
565                   ((_IO_FILE *) stderr)->_flags2 = old_flags2;
566                   _IO_funlockfile (stderr);
567
568                   free (buf);
569                 }
570 #else
571               fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
572                        argv[0], argv[d->optind]);
573 #endif
574             }
575           d->__nextchar += strlen (d->__nextchar);
576           d->optind++;
577           d->optopt = 0;
578           return '?';
579         }
580
581       if (pfound != NULL)
582         {
583           option_index = indfound;
584           d->optind++;
585           if (*nameend)
586             {
587               /* Don't test has_arg with >, because some C compilers don't
588                  allow it to be used on enums.  */
589               if (pfound->has_arg)
590                 d->optarg = nameend + 1;
591               else
592                 {
593                   if (print_errors)
594                     {
595 #if defined _LIBC && defined USE_IN_LIBIO
596                       char *buf;
597                       int n;
598 #endif
599
600                       if (argv[d->optind - 1][1] == '-')
601                         {
602