aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src/getopt.c
diff options
context:
space:
mode:
authorRichard M. Stallman2002-12-04 11:17:43 +0000
committerRichard M. Stallman2002-12-04 11:17:43 +0000
commit554ed1ff28199ad8bbbb4c732b941e71b7466166 (patch)
treeb58c945982a517cd6ce06a2e21933779fd9f5efa /lib-src/getopt.c
parente1e86c97c5c263835e7245ef9c221519ec234128 (diff)
downloademacs-554ed1ff28199ad8bbbb4c732b941e71b7466166.tar.gz
emacs-554ed1ff28199ad8bbbb4c732b941e71b7466166.zip
(const): Move outside !HAVE_CONFIG_H conditional.
(libintl.h): Include this if _LIBC. Otherwise include gettext.h. (wchar.h): Include, maybe. (attribute_hidden): Define if not defind. (__getopt_initialized): Use attribute_hidden. (__libc_argc, __libc_argv): Renamed from original_argc, etc. (__getopt_nonoption_flags, nonoption_flags_max_len, nonoption_flags_len): Conditional on USE_NONOPTION_FLAGS. (SWAP_FLAGS): New definitions. (exchange): Test USE_NONOPTION_FLAGS. (_getopt_initialize): Test USE_NONOPTION_FLAGS. (_getopt_internal): Error if argc < 1. New local var print_errors. Improve test for ambiguous long option. Add LIBIO support for error message output. (NONOPTION_P): Test USE_NONOPTION_FLAGS.
Diffstat (limited to 'lib-src/getopt.c')
-rw-r--r--lib-src/getopt.c410
1 files changed, 317 insertions, 93 deletions
diff --git a/lib-src/getopt.c b/lib-src/getopt.c
index d176d3e7e72..3e7928a8385 100644
--- a/lib-src/getopt.c
+++ b/lib-src/getopt.c
@@ -1,22 +1,23 @@
1/* Getopt for GNU. 1/* Getopt for GNU.
2 NOTE: The canonical source of this file is maintained with the GNU 2 NOTE: getopt is now part of the C library, so if you don't know what
3 C Library. Bugs can be reported to bug-glibc@gnu.org. 3 "Keep this file name-space clean" means, talk to drepper@gnu.org
4 4 before changing it!
5 Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 5 Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002
6 Free Software Foundation, Inc. 6 Free Software Foundation, Inc.
7 This file is part of the GNU C Library.
7 8
8 This program is free software; you can redistribute it and/or modify it 9 This program is free software; you can redistribute it and/or modify
9 under the terms of the GNU General Public License as published by the 10 it under the terms of the GNU General Public License as published by
10 Free Software Foundation; either version 2, or (at your option) any 11 the Free Software Foundation; either version 2, or (at your option)
11 later version. 12 any later version.
12 13
13 This program is distributed in the hope that it will be useful, 14 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details. 17 GNU General Public License for more details.
17 18
18 You should have received a copy of the GNU General Public License 19 You should have received a copy of the GNU General Public License along
19 along with this program; if not, write to the Free Software Foundation, 20 with this program; if not, write to the Free Software Foundation,
20 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 21 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 22
22/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. 23/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
@@ -27,13 +28,13 @@
27 28
28#ifdef HAVE_CONFIG_H 29#ifdef HAVE_CONFIG_H
29# include <config.h> 30# include <config.h>
30#else 31#endif
31# if !defined __STDC__ || !__STDC__ 32
33#if !defined __STDC__ || !__STDC__
32/* This is a separate conditional since some stdc systems 34/* This is a separate conditional since some stdc systems
33 reject `defined (const)'. */ 35 reject `defined (const)'. */
34# ifndef const 36# ifndef const
35# define const 37# define const
36# endif
37# endif 38# endif
38#endif 39#endif
39 40
@@ -74,15 +75,20 @@
74# endif 75# endif
75#endif 76#endif
76 77
77#ifndef _ 78#ifdef _LIBC
78/* This is for other GNU distributions with internationalized messages. 79# include <libintl.h>
79 When compiling libc, the _ macro is predefined. */ 80#else
80# ifdef HAVE_LIBINTL_H 81/* This is for other GNU distributions with internationalized messages. */
81# include <libintl.h> 82# include "gettext.h"
82# define _(msgid) gettext (msgid) 83#endif
83# else 84#define _(msgid) gettext (msgid)
84# define _(msgid) (msgid) 85
85# endif 86#if defined _LIBC && defined USE_IN_LIBIO
87# include <wchar.h>
88#endif
89
90#ifndef attribute_hidden
91# define attribute_hidden
86#endif 92#endif
87 93
88/* This version of `getopt' appears to the caller like standard Unix `getopt' 94/* This version of `getopt' appears to the caller like standard Unix `getopt'
@@ -128,7 +134,7 @@ int optind = 1;
128 causes problems with re-calling getopt as programs generally don't 134 causes problems with re-calling getopt as programs generally don't
129 know that. */ 135 know that. */
130 136
131int __getopt_initialized; 137int __getopt_initialized attribute_hidden;
132 138
133/* The next char to be scanned in the option-element 139/* The next char to be scanned in the option-element
134 in which the last option character we returned was found. 140 in which the last option character we returned was found.
@@ -247,41 +253,34 @@ static int first_nonopt;
247static int last_nonopt; 253static int last_nonopt;
248 254
249#ifdef _LIBC 255#ifdef _LIBC
256/* Stored original parameters.
257 XXX This is no good solution. We should rather copy the args so
258 that we can compare them later. But we must not use malloc(3). */
259extern int __libc_argc;
260extern char **__libc_argv;
261
250/* Bash 2.0 gives us an environment variable containing flags 262/* Bash 2.0 gives us an environment variable containing flags
251 indicating ARGV elements that should not be considered arguments. */ 263 indicating ARGV elements that should not be considered arguments. */
252 264
265# ifdef USE_NONOPTION_FLAGS
253/* Defined in getopt_init.c */ 266/* Defined in getopt_init.c */
254extern char *__getopt_nonoption_flags; 267extern char *__getopt_nonoption_flags;
255 268
256static int nonoption_flags_max_len; 269static int nonoption_flags_max_len;
257static int nonoption_flags_len; 270static int nonoption_flags_len;
271# endif
258 272
259static int original_argc; 273# ifdef USE_NONOPTION_FLAGS
260static char *const *original_argv; 274# define SWAP_FLAGS(ch1, ch2) \
261
262/* Make sure the environment variable bash 2.0 puts in the environment
263 is valid for the getopt call we must make sure that the ARGV passed
264 to getopt is that one passed to the process. */
265static void
266__attribute__ ((unused))
267store_args_and_env (int argc, char *const *argv)
268{
269 /* XXX This is no good solution. We should rather copy the args so
270 that we can compare them later. But we must not use malloc(3). */
271 original_argc = argc;
272 original_argv = argv;
273}
274# ifdef text_set_element
275text_set_element (__libc_subinit, store_args_and_env);
276# endif /* text_set_element */
277
278# define SWAP_FLAGS(ch1, ch2) \
279 if (nonoption_flags_len > 0) \ 275 if (nonoption_flags_len > 0) \
280 { \ 276 { \
281 char __tmp = __getopt_nonoption_flags[ch1]; \ 277 char __tmp = __getopt_nonoption_flags[ch1]; \
282 __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ 278 __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
283 __getopt_nonoption_flags[ch2] = __tmp; \ 279 __getopt_nonoption_flags[ch2] = __tmp; \
284 } 280 }
281# else
282# define SWAP_FLAGS(ch1, ch2)
283# endif
285#else /* !_LIBC */ 284#else /* !_LIBC */
286# define SWAP_FLAGS(ch1, ch2) 285# define SWAP_FLAGS(ch1, ch2)
287#endif /* _LIBC */ 286#endif /* _LIBC */
@@ -313,7 +312,7 @@ exchange (argv)
313 It leaves the longer segment in the right place overall, 312 It leaves the longer segment in the right place overall,
314 but it consists of two parts that need to be swapped next. */ 313 but it consists of two parts that need to be swapped next. */
315 314
316#ifdef _LIBC 315#if defined _LIBC && defined USE_NONOPTION_FLAGS
317 /* First make sure the handling of the `__getopt_nonoption_flags' 316 /* First make sure the handling of the `__getopt_nonoption_flags'
318 string can work normally. Our top argument must be in the range 317 string can work normally. Our top argument must be in the range
319 of the string. */ 318 of the string. */
@@ -417,9 +416,9 @@ _getopt_initialize (argc, argv, optstring)
417 else 416 else
418 ordering = PERMUTE; 417 ordering = PERMUTE;
419 418
420#ifdef _LIBC 419#if defined _LIBC && defined USE_NONOPTION_FLAGS
421 if (posixly_correct == NULL 420 if (posixly_correct == NULL
422 && argc == original_argc && argv == original_argv) 421 && argc == __libc_argc && argv == __libc_argv)
423 { 422 {
424 if (nonoption_flags_max_len == 0) 423 if (nonoption_flags_max_len == 0)
425 { 424 {
@@ -515,6 +514,13 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
515 int *longind; 514 int *longind;
516 int long_only; 515 int long_only;
517{ 516{
517 int print_errors = opterr;
518 if (optstring[0] == ':')
519 print_errors = 0;
520
521 if (argc < 1)
522 return -1;
523
518 optarg = NULL; 524 optarg = NULL;
519 525
520 if (optind == 0 || !__getopt_initialized) 526 if (optind == 0 || !__getopt_initialized)
@@ -529,7 +535,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
529 Either it does not have option syntax, or there is an environment flag 535 Either it does not have option syntax, or there is an environment flag
530 from the shell indicating it is not an option. The later information 536 from the shell indicating it is not an option. The later information
531 is only used when the used in the GNU libc. */ 537 is only used when the used in the GNU libc. */
532#ifdef _LIBC 538#if defined _LIBC && defined USE_NONOPTION_FLAGS
533# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ 539# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
534 || (optind < nonoption_flags_len \ 540 || (optind < nonoption_flags_len \
535 && __getopt_nonoption_flags[optind] == '1')) 541 && __getopt_nonoption_flags[optind] == '1'))
@@ -664,16 +670,37 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
664 pfound = p; 670 pfound = p;
665 indfound = option_index; 671 indfound = option_index;
666 } 672 }
667 else 673 else if (long_only
674 || pfound->has_arg != p->has_arg
675 || pfound->flag != p->flag
676 || pfound->val != p->val)
668 /* Second or later nonexact match found. */ 677 /* Second or later nonexact match found. */
669 ambig = 1; 678 ambig = 1;
670 } 679 }
671 680
672 if (ambig && !exact) 681 if (ambig && !exact)
673 { 682 {
674 if (opterr) 683 if (print_errors)
675 fprintf (stderr, _("%s: option `%s' is ambiguous\n"), 684 {
676 argv[0], argv[optind]); 685#if defined _LIBC && defined USE_IN_LIBIO
686 char *buf;
687
688 if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"),
689 argv[0], argv[optind]) >= 0)
690 {
691
692 if (_IO_fwide (stderr, 0) > 0)
693 __fwprintf (stderr, L"%s", buf);
694 else
695 fputs (buf, stderr);
696
697 free (buf);
698 }
699#else
700 fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
701 argv[0], argv[optind]);
702#endif
703 }
677 nextchar += strlen (nextchar); 704 nextchar += strlen (nextchar);
678 optind++; 705 optind++;
679 optopt = 0; 706 optopt = 0;
@@ -692,18 +719,52 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
692 optarg = nameend + 1; 719 optarg = nameend + 1;
693 else 720 else
694 { 721 {
695 if (opterr) 722 if (print_errors)
696 { 723 {
724#if defined _LIBC && defined USE_IN_LIBIO
725 char *buf;
726 int n;
727#endif
728
697 if (argv[optind - 1][1] == '-') 729 if (argv[optind - 1][1] == '-')
698 /* --option */ 730 {
699 fprintf (stderr, 731 /* --option */
700 _("%s: option `--%s' doesn't allow an argument\n"), 732#if defined _LIBC && defined USE_IN_LIBIO
701 argv[0], pfound->name); 733 n = __asprintf (&buf, _("\
734%s: option `--%s' doesn't allow an argument\n"),
735 argv[0], pfound->name);
736#else
737 fprintf (stderr, _("\
738%s: option `--%s' doesn't allow an argument\n"),
739 argv[0], pfound->name);
740#endif
741 }
702 else 742 else
703 /* +option or -option */ 743 {
704 fprintf (stderr, 744 /* +option or -option */
705 _("%s: option `%c%s' doesn't allow an argument\n"), 745#if defined _LIBC && defined USE_IN_LIBIO
706 argv[0], argv[optind - 1][0], pfound->name); 746 n = __asprintf (&buf, _("\
747%s: option `%c%s' doesn't allow an argument\n"),
748 argv[0], argv[optind - 1][0],
749 pfound->name);
750#else
751 fprintf (stderr, _("\
752%s: option `%c%s' doesn't allow an argument\n"),
753 argv[0], argv[optind - 1][0], pfound->name);
754#endif
755 }
756
757#if defined _LIBC && defined USE_IN_LIBIO
758 if (n >= 0)
759 {
760 if (_IO_fwide (stderr, 0) > 0)
761 __fwprintf (stderr, L"%s", buf);
762 else
763 fputs (buf, stderr);
764
765 free (buf);
766 }
767#endif
707 } 768 }
708 769
709 nextchar += strlen (nextchar); 770 nextchar += strlen (nextchar);
@@ -718,10 +779,28 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
718 optarg = argv[optind++]; 779 optarg = argv[optind++];
719 else 780 else
720 { 781 {
721 if (opterr) 782 if (print_errors)
722 fprintf (stderr, 783 {
723 _("%s: option `%s' requires an argument\n"), 784#if defined _LIBC && defined USE_IN_LIBIO
724 argv[0], argv[optind - 1]); 785 char *buf;
786
787 if (__asprintf (&buf, _("\
788%s: option `%s' requires an argument\n"),
789 argv[0], argv[optind - 1]) >= 0)
790 {
791 if (_IO_fwide (stderr, 0) > 0)
792 __fwprintf (stderr, L"%s", buf);
793 else
794 fputs (buf, stderr);
795
796 free (buf);
797 }
798#else
799 fprintf (stderr,
800 _("%s: option `%s' requires an argument\n"),
801 argv[0], argv[optind - 1]);
802#endif
803 }
725 nextchar += strlen (nextchar); 804 nextchar += strlen (nextchar);
726 optopt = pfound->val; 805 optopt = pfound->val;
727 return optstring[0] == ':' ? ':' : '?'; 806 return optstring[0] == ':' ? ':' : '?';
@@ -745,16 +824,47 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
745 if (!long_only || argv[optind][1] == '-' 824 if (!long_only || argv[optind][1] == '-'
746 || my_index (optstring, *nextchar) == NULL) 825 || my_index (optstring, *nextchar) == NULL)
747 { 826 {
748 if (opterr) 827 if (print_errors)
749 { 828 {
829#if defined _LIBC && defined USE_IN_LIBIO
830 char *buf;
831 int n;
832#endif
833
750 if (argv[optind][1] == '-') 834 if (argv[optind][1] == '-')
751 /* --option */ 835 {
752 fprintf (stderr, _("%s: unrecognized option `--%s'\n"), 836 /* --option */
753 argv[0], nextchar); 837#if defined _LIBC && defined USE_IN_LIBIO
838 n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"),
839 argv[0], nextchar);
840#else
841 fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
842 argv[0], nextchar);
843#endif
844 }
754 else 845 else
755 /* +option or -option */ 846 {
756 fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), 847 /* +option or -option */
757 argv[0], argv[optind][0], nextchar); 848#if defined _LIBC && defined USE_IN_LIBIO
849 n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"),
850 argv[0], argv[optind][0], nextchar);
851#else
852 fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
853 argv[0], argv[optind][0], nextchar);
854#endif
855 }
856
857#if defined _LIBC && defined USE_IN_LIBIO
858 if (n >= 0)
859 {
860 if (_IO_fwide (stderr, 0) > 0)
861 __fwprintf (stderr, L"%s", buf);
862 else
863 fputs (buf, stderr);
864
865 free (buf);
866 }
867#endif
758 } 868 }
759 nextchar = (char *) ""; 869 nextchar = (char *) "";
760 optind++; 870 optind++;
@@ -775,15 +885,44 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
775 885
776 if (temp == NULL || c == ':') 886 if (temp == NULL || c == ':')
777 { 887 {
778 if (opterr) 888 if (print_errors)
779 { 889 {
890#if defined _LIBC && defined USE_IN_LIBIO
891 char *buf;
892 int n;
893#endif
894
780 if (posixly_correct) 895 if (posixly_correct)
781 /* 1003.2 specifies the format of this message. */ 896 {
782 fprintf (stderr, _("%s: illegal option -- %c\n"), 897 /* 1003.2 specifies the format of this message. */
783 argv[0], c); 898#if defined _LIBC && defined USE_IN_LIBIO
899 n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
900 argv[0], c);
901#else
902 fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
903#endif
904 }
784 else 905 else
785 fprintf (stderr, _("%s: invalid option -- %c\n"), 906 {
786 argv[0], c); 907#if defined _LIBC && defined USE_IN_LIBIO
908 n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
909 argv[0], c);
910#else
911 fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
912#endif
913 }
914
915#if defined _LIBC && defined USE_IN_LIBIO
916 if (n >= 0)
917 {
918 if (_IO_fwide (stderr, 0) > 0)
919 __fwprintf (stderr, L"%s", buf);
920 else
921 fputs (buf, stderr);
922
923 free (buf);
924 }
925#endif
787 } 926 }
788 optopt = c; 927 optopt = c;
789 return '?'; 928 return '?';
@@ -809,11 +948,27 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
809 } 948 }
810 else if (optind == argc) 949 else if (optind == argc)
811 { 950 {
812 if (opterr) 951 if (print_errors)
813 { 952 {
814 /* 1003.2 specifies the format of this message. */ 953 /* 1003.2 specifies the format of this message. */
954#if defined _LIBC && defined USE_IN_LIBIO
955 char *buf;
956
957 if (__asprintf (&buf,
958 _("%s: option requires an argument -- %c\n"),
959 argv[0], c) >= 0)
960 {
961 if (_IO_fwide (stderr, 0) > 0)
962 __fwprintf (stderr, L"%s", buf);
963 else
964 fputs (buf, stderr);
965
966 free (buf);
967 }
968#else
815 fprintf (stderr, _("%s: option requires an argument -- %c\n"), 969 fprintf (stderr, _("%s: option requires an argument -- %c\n"),
816 argv[0], c); 970 argv[0], c);
971#endif
817 } 972 }
818 optopt = c; 973 optopt = c;
819 if (optstring[0] == ':') 974 if (optstring[0] == ':')
@@ -858,9 +1013,26 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
858 } 1013 }
859 if (ambig && !exact) 1014 if (ambig && !exact)
860 { 1015 {
861 if (opterr) 1016 if (print_errors)
862 fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), 1017 {
863 argv[0], argv[optind]); 1018#if defined _LIBC && defined USE_IN_LIBIO
1019 char *buf;
1020
1021 if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
1022 argv[0], argv[optind]) >= 0)
1023 {
1024 if (_IO_fwide (stderr, 0) > 0)
1025 __fwprintf (stderr, L"%s", buf);
1026 else
1027 fputs (buf, stderr);
1028
1029 free (buf);
1030 }
1031#else
1032 fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
1033 argv[0], argv[optind]);
1034#endif
1035 }
864 nextchar += strlen (nextchar); 1036 nextchar += strlen (nextchar);
865 optind++; 1037 optind++;
866 return '?'; 1038 return '?';
@@ -876,10 +1048,28 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
876 optarg = nameend + 1; 1048 optarg = nameend + 1;
877 else 1049 else
878 { 1050 {
879 if (opterr) 1051 if (print_errors)
880 fprintf (stderr, _("\ 1052 {
1053#if defined _LIBC && defined USE_IN_LIBIO
1054 char *buf;
1055
1056 if (__asprintf (&buf, _("\
1057%s: option `-W %s' doesn't allow an argument\n"),
1058 argv[0], pfound->name) >= 0)
1059 {
1060 if (_IO_fwide (stderr, 0) > 0)
1061 __fwprintf (stderr, L"%s", buf);
1062 else
1063 fputs (buf, stderr);
1064
1065 free (buf);
1066 }
1067#else
1068 fprintf (stderr, _("\
881%s: option `-W %s' doesn't allow an argument\n"), 1069%s: option `-W %s' doesn't allow an argument\n"),
882 argv[0], pfound->name); 1070 argv[0], pfound->name);
1071#endif
1072 }
883 1073
884 nextchar += strlen (nextchar); 1074 nextchar += strlen (nextchar);
885 return '?'; 1075 return '?';
@@ -891,10 +1081,28 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
891 optarg = argv[optind++]; 1081 optarg = argv[optind++];
892 else 1082 else
893 { 1083 {
894 if (opterr) 1084 if (print_errors)
895 fprintf (stderr, 1085 {
896 _("%s: option `%s' requires an argument\n"), 1086#if defined _LIBC && defined USE_IN_LIBIO
897 argv[0], argv[optind - 1]); 1087 char *buf;
1088
1089 if (__asprintf (&buf, _("\
1090%s: option `%s' requires an argument\n"),
1091 argv[0], argv[optind - 1]) >= 0)
1092 {
1093 if (_IO_fwide (stderr, 0) > 0)
1094 __fwprintf (stderr, L"%s", buf);
1095 else
1096 fputs (buf, stderr);
1097
1098 free (buf);
1099 }
1100#else
1101 fprintf (stderr,
1102 _("%s: option `%s' requires an argument\n"),
1103 argv[0], argv[optind - 1]);
1104#endif
1105 }
898 nextchar += strlen (nextchar); 1106 nextchar += strlen (nextchar);
899 return optstring[0] == ':' ? ':' : '?'; 1107 return optstring[0] == ':' ? ':' : '?';
900 } 1108 }
@@ -938,12 +1146,28 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
938 } 1146 }
939 else if (optind == argc) 1147 else if (optind == argc)
940 { 1148 {
941 if (opterr) 1149 if (print_errors)
942 { 1150 {
943 /* 1003.2 specifies the format of this message. */ 1151 /* 1003.2 specifies the format of this message. */
1152#if defined _LIBC && defined USE_IN_LIBIO
1153 char *buf;
1154
1155 if (__asprintf (&buf, _("\
1156%s: option requires an argument -- %c\n"),
1157 argv[0], c) >= 0)
1158 {
1159 if (_IO_fwide (stderr, 0) > 0)
1160 __fwprintf (stderr, L"%s", buf);
1161 else
1162 fputs (buf, stderr);
1163
1164 free (buf);
1165 }
1166#else
944 fprintf (stderr, 1167 fprintf (stderr,
945 _("%s: option requires an argument -- %c\n"), 1168 _("%s: option requires an argument -- %c\n"),
946 argv[0], c); 1169 argv[0], c);
1170#endif
947 } 1171 }
948 optopt = c; 1172 optopt = c;
949 if (optstring[0] == ':') 1173 if (optstring[0] == ':')