source: vendor/gzip/1.3.11/lib/getopt.c

Last change on this file was 3325, checked in by bird, 18 years ago

gzip 1.3.11

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