manual: Clarify undefined behavior of feenableexcept (BZ 31019)
[glibc.git] / posix / getopt.c
blob1e2441c4afee5d005b430b6de875a4c7d05dcb28
1 /* Getopt for GNU.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
3 This file is part of the GNU C Library and is also part of gnulib.
4 Patches to this file should be submitted to both projects.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
20 #ifndef _LIBC
21 # include <config.h>
22 #endif
24 #include "getopt.h"
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
31 #ifdef _LIBC
32 /* When used as part of glibc, error printing must be done differently
33 for standards compliance. getopt is not a cancellation point, so
34 it must not call functions that are, and it is specified by an
35 older standard than stdio locking, so it must not refer to
36 functions in the "user namespace" related to stdio locking.
37 Finally, it must use glibc's internal message translation so that
38 the messages are looked up in the proper text domain. */
39 # include <libintl.h>
40 # define fprintf __fxprintf_nocancel
41 # define flockfile(fp) _IO_flockfile (fp)
42 # define funlockfile(fp) _IO_funlockfile (fp)
43 #else
44 # include "gettext.h"
45 # define _(msgid) gettext (msgid)
46 /* When used standalone, flockfile and funlockfile might not be
47 available. */
48 # if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \
49 || (defined _WIN32 && ! defined __CYGWIN__))
50 # define flockfile(fp) /* nop */
51 # define funlockfile(fp) /* nop */
52 # endif
53 /* When used standalone, do not attempt to use alloca. */
54 # define __libc_use_alloca(size) 0
55 # undef alloca
56 # define alloca(size) (abort (), (void *)0)
57 #endif
59 /* This implementation of 'getopt' has three modes for handling
60 options interspersed with non-option arguments. It can stop
61 scanning for options at the first non-option argument encountered,
62 as POSIX specifies. It can continue scanning for options after the
63 first non-option argument, but permute 'argv' as it goes so that,
64 after 'getopt' is done, all the options precede all the non-option
65 arguments and 'optind' points to the first non-option argument.
66 Or, it can report non-option arguments as if they were arguments to
67 the option character '\x01'.
69 The default behavior of 'getopt_long' is to permute the argument list.
70 When this implementation is used standalone, the default behavior of
71 'getopt' is to stop at the first non-option argument, but when it is
72 used as part of GNU libc it also permutes the argument list. In both
73 cases, setting the environment variable POSIXLY_CORRECT to any value
74 disables permutation.
76 If the first character of the OPTSTRING argument to 'getopt' or
77 'getopt_long' is '+', both functions will stop at the first
78 non-option argument. If it is '-', both functions will report
79 non-option arguments as arguments to the option character '\x01'. */
81 #include "getopt_int.h"
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. */
89 char *optarg;
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'.
95 On entry to 'getopt', zero means this is the first call; initialize.
97 When 'getopt' returns -1, this is the index of the first of the
98 non-option elements that the caller should itself scan.
100 Otherwise, 'optind' communicates from one call to the next
101 how much of ARGV has been scanned so far. */
103 /* 1003.2 says this must be 1 before any call. */
104 int optind = 1;
106 /* Callers store zero here to inhibit the error message
107 for unrecognized options. */
109 int opterr = 1;
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. */
115 int optopt = '?';
117 /* Keep a global copy of all internal members of getopt_data. */
119 static struct _getopt_data getopt_data;
121 /* Exchange two adjacent subsequences of ARGV.
122 One subsequence is elements [first_nonopt,last_nonopt)
123 which contains all the non-options that have been skipped so far.
124 The other is elements [last_nonopt,optind), which contains all
125 the options processed since those non-options were skipped.
127 'first_nonopt' and 'last_nonopt' are relocated so that they describe
128 the new indices of the non-options in ARGV after they are moved. */
130 static void
131 exchange (char **argv, struct _getopt_data *d)
133 int bottom = d->__first_nonopt;
134 int middle = d->__last_nonopt;
135 int top = d->optind;
136 char *tem;
138 /* Exchange the shorter segment with the far end of the longer segment.
139 That puts the shorter segment into the right place.
140 It leaves the longer segment in the right place overall,
141 but it consists of two parts that need to be swapped next. */
143 while (top > middle && middle > bottom)
145 if (top - middle > middle - bottom)
147 /* Bottom segment is the short one. */
148 int len = middle - bottom;
149 int i;
151 /* Swap it with the top part of the top segment. */
152 for (i = 0; i < len; i++)
154 tem = argv[bottom + i];
155 argv[bottom + i] = argv[top - (middle - bottom) + i];
156 argv[top - (middle - bottom) + i] = tem;
158 /* Exclude the moved bottom segment from further swapping. */
159 top -= len;
161 else
163 /* Top segment is the short one. */
164 int len = top - middle;
165 int i;
167 /* Swap it with the bottom part of the bottom segment. */
168 for (i = 0; i < len; i++)
170 tem = argv[bottom + i];
171 argv[bottom + i] = argv[middle + i];
172 argv[middle + i] = tem;
174 /* Exclude the moved top segment from further swapping. */
175 bottom += len;
179 /* Update records for the slots the non-options now occupy. */
181 d->__first_nonopt += (d->optind - d->__last_nonopt);
182 d->__last_nonopt = d->optind;
185 /* Process the argument starting with d->__nextchar as a long option.
186 d->optind should *not* have been advanced over this argument.
188 If the value returned is -1, it was not actually a long option, the
189 state is unchanged, and the argument should be processed as a set
190 of short options (this can only happen when long_only is true).
191 Otherwise, the option (and its argument, if any) have been consumed
192 and the return value is the value to return from _getopt_internal_r. */
193 static int
194 process_long_option (int argc, char **argv, const char *optstring,
195 const struct option *longopts, int *longind,
196 int long_only, struct _getopt_data *d,
197 int print_errors, const char *prefix)
199 char *nameend;
200 size_t namelen;
201 const struct option *p;
202 const struct option *pfound = NULL;
203 int n_options;
204 int option_index;
206 for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
207 /* Do nothing. */ ;
208 namelen = nameend - d->__nextchar;
210 /* First look for an exact match, counting the options as a side
211 effect. */
212 for (p = longopts, n_options = 0; p->name; p++, n_options++)
213 if (!strncmp (p->name, d->__nextchar, namelen)
214 && namelen == strlen (p->name))
216 /* Exact match found. */
217 pfound = p;
218 option_index = n_options;
219 break;
222 if (pfound == NULL)
224 /* Didn't find an exact match, so look for abbreviations. */
225 unsigned char *ambig_set = NULL;
226 int ambig_malloced = 0;
227 int ambig_fallback = 0;
228 int indfound = -1;
230 for (p = longopts, option_index = 0; p->name; p++, option_index++)
231 if (!strncmp (p->name, d->__nextchar, namelen))
233 if (pfound == NULL)
235 /* First nonexact match found. */
236 pfound = p;
237 indfound = option_index;
239 else if (long_only
240 || pfound->has_arg != p->has_arg
241 || pfound->flag != p->flag
242 || pfound->val != p->val)
244 /* Second or later nonexact match found. */
245 if (!ambig_fallback)
247 if (!print_errors)
248 /* Don't waste effort tracking the ambig set if
249 we're not going to print it anyway. */
250 ambig_fallback = 1;
251 else if (!ambig_set)
253 if (__libc_use_alloca (n_options))
254 ambig_set = alloca (n_options);
255 else if ((ambig_set = malloc (n_options)) == NULL)
256 /* Fall back to simpler error message. */
257 ambig_fallback = 1;
258 else
259 ambig_malloced = 1;
261 if (ambig_set)
263 memset (ambig_set, 0, n_options);
264 ambig_set[indfound] = 1;
267 if (ambig_set)
268 ambig_set[option_index] = 1;
273 if (ambig_set || ambig_fallback)
275 if (print_errors)
277 if (ambig_fallback)
278 fprintf (stderr, _("%s: option '%s%s' is ambiguous\n"),
279 argv[0], prefix, d->__nextchar);
280 else
282 flockfile (stderr);
283 fprintf (stderr,
284 _("%s: option '%s%s' is ambiguous; possibilities:"),
285 argv[0], prefix, d->__nextchar);
287 for (option_index = 0; option_index < n_options; option_index++)
288 if (ambig_set[option_index])
289 fprintf (stderr, " '%s%s'",
290 prefix, longopts[option_index].name);
292 /* This must use 'fprintf' even though it's only
293 printing a single character, so that it goes through
294 __fxprintf_nocancel when compiled as part of glibc. */
295 fprintf (stderr, "\n");
296 funlockfile (stderr);
299 if (ambig_malloced)
300 free (ambig_set);
301 d->__nextchar += strlen (d->__nextchar);
302 d->optind++;
303 d->optopt = 0;
304 return '?';
307 option_index = indfound;
310 if (pfound == NULL)
312 /* Can't find it as a long option. If this is not getopt_long_only,
313 or the option starts with '--' or is not a valid short option,
314 then it's an error. */
315 if (!long_only || argv[d->optind][1] == '-'
316 || strchr (optstring, *d->__nextchar) == NULL)
318 if (print_errors)
319 fprintf (stderr, _("%s: unrecognized option '%s%s'\n"),
320 argv[0], prefix, d->__nextchar);
322 d->__nextchar = NULL;
323 d->optind++;
324 d->optopt = 0;
325 return '?';
328 /* Otherwise interpret it as a short option. */
329 return -1;
332 /* We have found a matching long option. Consume it. */
333 d->optind++;
334 d->__nextchar = NULL;
335 if (*nameend)
337 /* Don't test has_arg with >, because some C compilers don't
338 allow it to be used on enums. */
339 if (pfound->has_arg)
340 d->optarg = nameend + 1;
341 else
343 if (print_errors)
344 fprintf (stderr,
345 _("%s: option '%s%s' doesn't allow an argument\n"),
346 argv[0], prefix, pfound->name);
348 d->optopt = pfound->val;
349 return '?';
352 else if (pfound->has_arg == 1)
354 if (d->optind < argc)
355 d->optarg = argv[d->optind++];
356 else
358 if (print_errors)
359 fprintf (stderr,
360 _("%s: option '%s%s' requires an argument\n"),
361 argv[0], prefix, pfound->name);
363 d->optopt = pfound->val;
364 return optstring[0] == ':' ? ':' : '?';
368 if (longind != NULL)
369 *longind = option_index;
370 if (pfound->flag)
372 *(pfound->flag) = pfound->val;
373 return 0;
375 return pfound->val;
378 /* Initialize internal data upon the first call to getopt. */
380 static const char *
381 _getopt_initialize (_GL_UNUSED int argc,
382 _GL_UNUSED char **argv, const char *optstring,
383 struct _getopt_data *d, int posixly_correct)
385 /* Start processing options with ARGV-element 1 (since ARGV-element 0
386 is the program name); the sequence of previously skipped
387 non-option ARGV-elements is empty. */
388 if (d->optind == 0)
389 d->optind = 1;
391 d->__first_nonopt = d->__last_nonopt = d->optind;
392 d->__nextchar = NULL;
394 /* Determine how to handle the ordering of options and nonoptions. */
395 if (optstring[0] == '-')
397 d->__ordering = RETURN_IN_ORDER;
398 ++optstring;
400 else if (optstring[0] == '+')
402 d->__ordering = REQUIRE_ORDER;
403 ++optstring;
405 else if (posixly_correct || !!getenv ("POSIXLY_CORRECT"))
406 d->__ordering = REQUIRE_ORDER;
407 else
408 d->__ordering = PERMUTE;
410 d->__initialized = 1;
411 return optstring;
414 /* Scan elements of ARGV (whose length is ARGC) for option characters
415 given in OPTSTRING.
417 If an element of ARGV starts with '-', and is not exactly "-" or "--",
418 then it is an option element. The characters of this element
419 (aside from the initial '-') are option characters. If 'getopt'
420 is called repeatedly, it returns successively each of the option characters
421 from each of the option elements.
423 If 'getopt' finds another option character, it returns that character,
424 updating 'optind' and 'nextchar' so that the next call to 'getopt' can
425 resume the scan with the following option character or ARGV-element.
427 If there are no more option characters, 'getopt' returns -1.
428 Then 'optind' is the index in ARGV of the first ARGV-element
429 that is not an option. (The ARGV-elements have been permuted
430 so that those that are not options now come last.)
432 OPTSTRING is a string containing the legitimate option characters.
433 If an option character is seen that is not listed in OPTSTRING,
434 return '?' after printing an error message. If you set 'opterr' to
435 zero, the error message is suppressed but we still return '?'.
437 If a char in OPTSTRING is followed by a colon, that means it wants an arg,
438 so the following text in the same ARGV-element, or the text of the following
439 ARGV-element, is returned in 'optarg'. Two colons mean an option that
440 wants an optional arg; if there is text in the current ARGV-element,
441 it is returned in 'optarg', otherwise 'optarg' is set to zero.
443 If OPTSTRING starts with '-' or '+', it requests different methods of
444 handling the non-option ARGV-elements.
445 See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
447 Long-named options begin with '--' instead of '-'.
448 Their names may be abbreviated as long as the abbreviation is unique
449 or is an exact match for some defined option. If they have an
450 argument, it follows the option name in the same ARGV-element, separated
451 from the option name by a '=', or else the in next ARGV-element.
452 When 'getopt' finds a long-named option, it returns 0 if that option's
453 'flag' field is nonzero, the value of the option's 'val' field
454 if the 'flag' field is zero.
456 The elements of ARGV aren't really const, because we permute them.
457 But we pretend they're const in the prototype to be compatible
458 with other systems.
460 LONGOPTS is a vector of 'struct option' terminated by an
461 element containing a name which is zero.
463 LONGIND returns the index in LONGOPT of the long-named option found.
464 It is only valid when a long-named option has been found by the most
465 recent call.
467 If LONG_ONLY is nonzero, '-' as well as '--' can introduce
468 long-named options. */
471 _getopt_internal_r (int argc, char **argv, const char *optstring,
472 const struct option *longopts, int *longind,
473 int long_only, struct _getopt_data *d, int posixly_correct)
475 int print_errors = d->opterr;
477 if (argc < 1)
478 return -1;
480 d->optarg = NULL;
482 if (d->optind == 0 || !d->__initialized)
483 optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct);
484 else if (optstring[0] == '-' || optstring[0] == '+')
485 optstring++;
487 if (optstring[0] == ':')
488 print_errors = 0;
490 /* Test whether ARGV[optind] points to a non-option argument. */
491 #define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
493 if (d->__nextchar == NULL || *d->__nextchar == '\0')
495 /* Advance to the next ARGV-element. */
497 /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
498 moved back by the user (who may also have changed the arguments). */
499 if (d->__last_nonopt > d->optind)
500 d->__last_nonopt = d->optind;
501 if (d->__first_nonopt > d->optind)
502 d->__first_nonopt = d->optind;
504 if (d->__ordering == PERMUTE)
506 /* If we have just processed some options following some non-options,
507 exchange them so that the options come first. */
509 if (d->__first_nonopt != d->__last_nonopt
510 && d->__last_nonopt != d->optind)
511 exchange (argv, d);
512 else if (d->__last_nonopt != d->optind)
513 d->__first_nonopt = d->optind;
515 /* Skip any additional non-options
516 and extend the range of non-options previously skipped. */
518 while (d->optind < argc && NONOPTION_P)
519 d->optind++;
520 d->__last_nonopt = d->optind;
523 /* The special ARGV-element '--' means premature end of options.
524 Skip it like a null option,
525 then exchange with previous non-options as if it were an option,
526 then skip everything else like a non-option. */
528 if (d->optind != argc && !strcmp (argv[d->optind], "--"))
530 d->optind++;
532 if (d->__first_nonopt != d->__last_nonopt
533 && d->__last_nonopt != d->optind)
534 exchange (argv, d);
535 else if (d->__first_nonopt == d->__last_nonopt)
536 d->__first_nonopt = d->optind;
537 d->__last_nonopt = argc;
539 d->optind = argc;
542 /* If we have done all the ARGV-elements, stop the scan
543 and back over any non-options that we skipped and permuted. */
545 if (d->optind == argc)
547 /* Set the next-arg-index to point at the non-options
548 that we previously skipped, so the caller will digest them. */
549 if (d->__first_nonopt != d->__last_nonopt)
550 d->optind = d->__first_nonopt;
551 return -1;
554 /* If we have come to a non-option and did not permute it,
555 either stop the scan or describe it to the caller and pass it by. */
557 if (NONOPTION_P)
559 if (d->__ordering == REQUIRE_ORDER)
560 return -1;
561 d->optarg = argv[d->optind++];
562 return 1;
565 /* We have found another option-ARGV-element.
566 Check whether it might be a long option. */
567 if (longopts)
569 if (argv[d->optind][1] == '-')
571 /* "--foo" is always a long option. The special option
572 "--" was handled above. */
573 d->__nextchar = argv[d->optind] + 2;
574 return process_long_option (argc, argv, optstring, longopts,
575 longind, long_only, d,
576 print_errors, "--");
579 /* If long_only and the ARGV-element has the form "-f",
580 where f is a valid short option, don't consider it an
581 abbreviated form of a long option that starts with f.
582 Otherwise there would be no way to give the -f short
583 option.
585 On the other hand, if there's a long option "fubar" and
586 the ARGV-element is "-fu", do consider that an
587 abbreviation of the long option, just like "--fu", and
588 not "-f" with arg "u".
590 This distinction seems to be the most useful approach. */
591 if (long_only && (argv[d->optind][2]
592 || !strchr (optstring, argv[d->optind][1])))
594 int code;
595 d->__nextchar = argv[d->optind] + 1;
596 code = process_long_option (argc, argv, optstring, longopts,
597 longind, long_only, d,
598 print_errors, "-");
599 if (code != -1)
600 return code;
604 /* It is not a long option. Skip the initial punctuation. */
605 d->__nextchar = argv[d->optind] + 1;
608 /* Look at and handle the next short option-character. */
611 char c = *d->__nextchar++;
612 const char *temp = strchr (optstring, c);
614 /* Increment 'optind' when we start to process its last character. */
615 if (*d->__nextchar == '\0')
616 ++d->optind;
618 if (temp == NULL || c == ':' || c == ';')
620 if (print_errors)
621 fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
622 d->optopt = c;
623 return '?';
626 /* Convenience. Treat POSIX -W foo same as long option --foo */
627 if (temp[0] == 'W' && temp[1] == ';' && longopts != NULL)
629 /* This is an option that requires an argument. */
630 if (*d->__nextchar != '\0')
631 d->optarg = d->__nextchar;
632 else if (d->optind == argc)
634 if (print_errors)
635 fprintf (stderr,
636 _("%s: option requires an argument -- '%c'\n"),
637 argv[0], c);
639 d->optopt = c;
640 if (optstring[0] == ':')
641 c = ':';
642 else
643 c = '?';
644 return c;
646 else
647 d->optarg = argv[d->optind];
649 d->__nextchar = d->optarg;
650 d->optarg = NULL;
651 return process_long_option (argc, argv, optstring, longopts, longind,
652 0 /* long_only */, d, print_errors, "-W ");
654 if (temp[1] == ':')
656 if (temp[2] == ':')
658 /* This is an option that accepts an argument optionally. */
659 if (*d->__nextchar != '\0')
661 d->optarg = d->__nextchar;
662 d->optind++;
664 else
665 d->optarg = NULL;
666 d->__nextchar = NULL;
668 else
670 /* This is an option that requires an argument. */
671 if (*d->__nextchar != '\0')
673 d->optarg = d->__nextchar;
674 /* If we end this ARGV-element by taking the rest as an arg,
675 we must advance to the next element now. */
676 d->optind++;
678 else if (d->optind == argc)
680 if (print_errors)
681 fprintf (stderr,
682 _("%s: option requires an argument -- '%c'\n"),
683 argv[0], c);
685 d->optopt = c;
686 if (optstring[0] == ':')
687 c = ':';
688 else
689 c = '?';
691 else
692 /* We already incremented 'optind' once;
693 increment it again when taking next ARGV-elt as argument. */
694 d->optarg = argv[d->optind++];
695 d->__nextchar = NULL;
698 return c;
703 _getopt_internal (int argc, char **argv, const char *optstring,
704 const struct option *longopts, int *longind, int long_only,
705 int posixly_correct)
707 int result;
709 getopt_data.optind = optind;
710 getopt_data.opterr = opterr;
712 result = _getopt_internal_r (argc, argv, optstring, longopts,
713 longind, long_only, &getopt_data,
714 posixly_correct);
716 optind = getopt_data.optind;
717 optarg = getopt_data.optarg;
718 optopt = getopt_data.optopt;
720 return result;
723 /* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt.
724 Standalone applications just get a POSIX-compliant getopt.
725 POSIX and LSB both require these functions to take 'char *const *argv'
726 even though this is incorrect (because of the permutation). */
727 #define GETOPT_ENTRY(NAME, POSIXLY_CORRECT) \
728 int \
729 NAME (int argc, char *const *argv, const char *optstring) \
731 return _getopt_internal (argc, (char **)argv, optstring, \
732 0, 0, 0, POSIXLY_CORRECT); \
735 #ifdef _LIBC
736 GETOPT_ENTRY(getopt, 0)
737 GETOPT_ENTRY(__posix_getopt, 1)
738 #else
739 GETOPT_ENTRY(getopt, 1)
740 #endif
743 #ifdef TEST
745 /* Compile with -DTEST to make an executable for use in testing
746 the above definition of 'getopt'. */
749 main (int argc, char **argv)
751 int c;
752 int digit_optind = 0;
754 while (1)
756 int this_option_optind = optind ? optind : 1;
758 c = getopt (argc, argv, "abc:d:0123456789");
759 if (c == -1)
760 break;
762 switch (c)
764 case '0':
765 case '1':
766 case '2':
767 case '3':
768 case '4':
769 case '5':
770 case '6':
771 case '7':
772 case '8':
773 case '9':
774 if (digit_optind != 0 && digit_optind != this_option_optind)
775 printf ("digits occur in two different argv-elements.\n");
776 digit_optind = this_option_optind;
777 printf ("option %c\n", c);
778 break;
780 case 'a':
781 printf ("option a\n");
782 break;
784 case 'b':
785 printf ("option b\n");
786 break;
788 case 'c':
789 printf ("option c with value '%s'\n", optarg);
790 break;
792 case '?':
793 break;
795 default:
796 printf ("?? getopt returned character code 0%o ??\n", c);
800 if (optind < argc)
802 printf ("non-option ARGV-elements: ");
803 while (optind < argc)
804 printf ("%s ", argv[optind++]);
805 printf ("\n");
808 exit (0);
811 #endif /* TEST */