diff options
273 files changed, 20118 insertions, 11261 deletions
@@ -5,7 +5,6 @@ NP-VERSION-FILE | |||
5 | # / | 5 | # / |
6 | /aclocal.m4 | 6 | /aclocal.m4 |
7 | /autom4te*.cache | 7 | /autom4te*.cache |
8 | /build-* | ||
9 | /Cache.pm | 8 | /Cache.pm |
10 | /command.cfg | 9 | /command.cfg |
11 | /compile | 10 | /compile |
@@ -25,12 +24,14 @@ NP-VERSION-FILE | |||
25 | /THANKS | 24 | /THANKS |
26 | 25 | ||
27 | # /build-aux/ | 26 | # /build-aux/ |
27 | /build-aux/*~ | ||
28 | /build-aux/compile | 28 | /build-aux/compile |
29 | /build-aux/config.guess | 29 | /build-aux/config.guess |
30 | /build-aux/config.sub | 30 | /build-aux/config.sub |
31 | /build-aux/depcomp | 31 | /build-aux/depcomp |
32 | /build-aux/install-sh | 32 | /build-aux/install-sh |
33 | /build-aux/missing | 33 | /build-aux/missing |
34 | /build-aux/mkinstalldirs | ||
34 | 35 | ||
35 | # /doc/ | 36 | # /doc/ |
36 | /doc/developer-guidelines.html | 37 | /doc/developer-guidelines.html |
@@ -46,28 +47,38 @@ NP-VERSION-FILE | |||
46 | # /gl/ | 47 | # /gl/ |
47 | /gl/.deps | 48 | /gl/.deps |
48 | /gl/alloca.h | 49 | /gl/alloca.h |
50 | /gl/arg-nonnull.h | ||
49 | /gl/arpa | 51 | /gl/arpa |
52 | /gl/arpa_inet.h | ||
53 | /gl/c++defs.h | ||
54 | /gl/charset.alias | ||
50 | /gl/configmake.h | 55 | /gl/configmake.h |
51 | /gl/errno.h | 56 | /gl/errno.h |
52 | /gl/float.h | ||
53 | /gl/fcntl.h | 57 | /gl/fcntl.h |
58 | /gl/float.h | ||
54 | /gl/getopt.h | 59 | /gl/getopt.h |
60 | /gl/langinfo.h | ||
55 | /gl/libgnu.a | 61 | /gl/libgnu.a |
62 | /gl/locale.h | ||
56 | /gl/Makefile | 63 | /gl/Makefile |
57 | /gl/Makefile.in | 64 | /gl/Makefile.in |
58 | /gl/math.h | 65 | /gl/math.h |
66 | /gl/netdb.h | ||
59 | /gl/netinet_in.h | 67 | /gl/netinet_in.h |
60 | /gl/ref-del.sed | ||
61 | /gl/ref-add.sed | 68 | /gl/ref-add.sed |
62 | /gl/charset.alias | 69 | /gl/ref-del.sed |
63 | /gl/stdint.h | ||
64 | /gl/stdbool.h | 70 | /gl/stdbool.h |
65 | /gl/stdlib.h | 71 | /gl/stddef.h |
72 | /gl/stdint.h | ||
66 | /gl/stdio.h | 73 | /gl/stdio.h |
74 | /gl/stdlib.h | ||
67 | /gl/string.h | 75 | /gl/string.h |
68 | /gl/sys_socket.h | 76 | /gl/sys_socket.h |
77 | /gl/sys_stat.h | ||
78 | /gl/sys | ||
69 | /gl/time.h | 79 | /gl/time.h |
70 | /gl/unistd.h | 80 | /gl/unistd.h |
81 | /gl/warn-on-use.h | ||
71 | /gl/wchar.h | 82 | /gl/wchar.h |
72 | /gl/wctype.h | 83 | /gl/wctype.h |
73 | 84 | ||
diff --git a/build-aux/arg-nonnull.h b/build-aux/arg-nonnull.h new file mode 100644 index 00000000..7e3e2db8 --- /dev/null +++ b/build-aux/arg-nonnull.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* A C macro for declaring that specific arguments must not be NULL. | ||
2 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published | ||
6 | by the Free Software Foundation; either version 3 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | Lesser General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
16 | |||
17 | /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools | ||
18 | that the values passed as arguments n, ..., m must be non-NULL pointers. | ||
19 | n = 1 stands for the first argument, n = 2 for the second argument etc. */ | ||
20 | #ifndef _GL_ARG_NONNULL | ||
21 | # if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3 | ||
22 | # define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params)) | ||
23 | # else | ||
24 | # define _GL_ARG_NONNULL(params) | ||
25 | # endif | ||
26 | #endif | ||
diff --git a/build-aux/c++defs.h b/build-aux/c++defs.h new file mode 100644 index 00000000..7d710898 --- /dev/null +++ b/build-aux/c++defs.h | |||
@@ -0,0 +1,251 @@ | |||
1 | /* C++ compatible function declaration macros. | ||
2 | Copyright (C) 2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published | ||
6 | by the Free Software Foundation; either version 3 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | Lesser General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
16 | |||
17 | #ifndef _GL_CXXDEFS_H | ||
18 | #define _GL_CXXDEFS_H | ||
19 | |||
20 | /* The three most frequent use cases of these macros are: | ||
21 | |||
22 | * For providing a substitute for a function that is missing on some | ||
23 | platforms, but is declared and works fine on the platforms on which | ||
24 | it exists: | ||
25 | |||
26 | #if @GNULIB_FOO@ | ||
27 | # if !@HAVE_FOO@ | ||
28 | _GL_FUNCDECL_SYS (foo, ...); | ||
29 | # endif | ||
30 | _GL_CXXALIAS_SYS (foo, ...); | ||
31 | _GL_CXXALIASWARN (foo); | ||
32 | #elif defined GNULIB_POSIXCHECK | ||
33 | ... | ||
34 | #endif | ||
35 | |||
36 | * For providing a replacement for a function that exists on all platforms, | ||
37 | but is broken/insufficient and needs to be replaced on some platforms: | ||
38 | |||
39 | #if @GNULIB_FOO@ | ||
40 | # if @REPLACE_FOO@ | ||
41 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
42 | # undef foo | ||
43 | # define foo rpl_foo | ||
44 | # endif | ||
45 | _GL_FUNCDECL_RPL (foo, ...); | ||
46 | _GL_CXXALIAS_RPL (foo, ...); | ||
47 | # else | ||
48 | _GL_CXXALIAS_SYS (foo, ...); | ||
49 | # endif | ||
50 | _GL_CXXALIASWARN (foo); | ||
51 | #elif defined GNULIB_POSIXCHECK | ||
52 | ... | ||
53 | #endif | ||
54 | |||
55 | * For providing a replacement for a function that exists on some platforms | ||
56 | but is broken/insufficient and needs to be replaced on some of them and | ||
57 | is additionally either missing or undeclared on some other platforms: | ||
58 | |||
59 | #if @GNULIB_FOO@ | ||
60 | # if @REPLACE_FOO@ | ||
61 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
62 | # undef foo | ||
63 | # define foo rpl_foo | ||
64 | # endif | ||
65 | _GL_FUNCDECL_RPL (foo, ...); | ||
66 | _GL_CXXALIAS_RPL (foo, ...); | ||
67 | # else | ||
68 | # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@ | ||
69 | _GL_FUNCDECL_SYS (foo, ...); | ||
70 | # endif | ||
71 | _GL_CXXALIAS_SYS (foo, ...); | ||
72 | # endif | ||
73 | _GL_CXXALIASWARN (foo); | ||
74 | #elif defined GNULIB_POSIXCHECK | ||
75 | ... | ||
76 | #endif | ||
77 | */ | ||
78 | |||
79 | /* _GL_EXTERN_C declaration; | ||
80 | performs the declaration with C linkage. */ | ||
81 | #if defined __cplusplus | ||
82 | # define _GL_EXTERN_C extern "C" | ||
83 | #else | ||
84 | # define _GL_EXTERN_C extern | ||
85 | #endif | ||
86 | |||
87 | /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); | ||
88 | declares a replacement function, named rpl_func, with the given prototype, | ||
89 | consisting of return type, parameters, and attributes. | ||
90 | Example: | ||
91 | _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) | ||
92 | _GL_ARG_NONNULL ((1))); | ||
93 | */ | ||
94 | #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ | ||
95 | _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) | ||
96 | #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ | ||
97 | _GL_EXTERN_C rettype rpl_func parameters_and_attributes | ||
98 | |||
99 | /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); | ||
100 | declares the system function, named func, with the given prototype, | ||
101 | consisting of return type, parameters, and attributes. | ||
102 | Example: | ||
103 | _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) | ||
104 | _GL_ARG_NONNULL ((1))); | ||
105 | */ | ||
106 | #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ | ||
107 | _GL_EXTERN_C rettype func parameters_and_attributes | ||
108 | |||
109 | /* _GL_CXXALIAS_RPL (func, rettype, parameters); | ||
110 | declares a C++ alias called GNULIB_NAMESPACE::func | ||
111 | that redirects to rpl_func, if GNULIB_NAMESPACE is defined. | ||
112 | Example: | ||
113 | _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); | ||
114 | */ | ||
115 | #define _GL_CXXALIAS_RPL(func,rettype,parameters) \ | ||
116 | _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) | ||
117 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
118 | # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ | ||
119 | namespace GNULIB_NAMESPACE \ | ||
120 | { \ | ||
121 | rettype (*const func) parameters = ::rpl_func; \ | ||
122 | } \ | ||
123 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
124 | #else | ||
125 | # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ | ||
126 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
127 | #endif | ||
128 | |||
129 | /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); | ||
130 | is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); | ||
131 | except that the C function rpl_func may have a slightly different | ||
132 | declaration. A cast is used to silence the "invalid conversion" error | ||
133 | that would otherwise occur. */ | ||
134 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
135 | # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ | ||
136 | namespace GNULIB_NAMESPACE \ | ||
137 | { \ | ||
138 | rettype (*const func) parameters = \ | ||
139 | reinterpret_cast<rettype(*)parameters>(::rpl_func); \ | ||
140 | } \ | ||
141 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
142 | #else | ||
143 | # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ | ||
144 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
145 | #endif | ||
146 | |||
147 | /* _GL_CXXALIAS_SYS (func, rettype, parameters); | ||
148 | declares a C++ alias called GNULIB_NAMESPACE::func | ||
149 | that redirects to the system provided function func, if GNULIB_NAMESPACE | ||
150 | is defined. | ||
151 | Example: | ||
152 | _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); | ||
153 | */ | ||
154 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
155 | /* If we were to write | ||
156 | rettype (*const func) parameters = ::func; | ||
157 | like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls | ||
158 | better (remove an indirection through a 'static' pointer variable), | ||
159 | but then the _GL_CXXALIASWARN macro below would cause a warning not only | ||
160 | for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */ | ||
161 | # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ | ||
162 | namespace GNULIB_NAMESPACE \ | ||
163 | { \ | ||
164 | static rettype (*func) parameters = ::func; \ | ||
165 | } \ | ||
166 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
167 | #else | ||
168 | # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ | ||
169 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
170 | #endif | ||
171 | |||
172 | /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); | ||
173 | is like _GL_CXXALIAS_SYS (func, rettype, parameters); | ||
174 | except that the C function func may have a slightly different declaration. | ||
175 | A cast is used to silence the "invalid conversion" error that would | ||
176 | otherwise occur. */ | ||
177 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
178 | # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ | ||
179 | namespace GNULIB_NAMESPACE \ | ||
180 | { \ | ||
181 | static rettype (*func) parameters = \ | ||
182 | reinterpret_cast<rettype(*)parameters>(::func); \ | ||
183 | } \ | ||
184 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
185 | #else | ||
186 | # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ | ||
187 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
188 | #endif | ||
189 | |||
190 | /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); | ||
191 | is like _GL_CXXALIAS_SYS (func, rettype, parameters); | ||
192 | except that the C function is picked among a set of overloaded functions, | ||
193 | namely the one with rettype2 and parameters2. Two consecutive casts | ||
194 | are used to silence the "cannot find a match" and "invalid conversion" | ||
195 | errors that would otherwise occur. */ | ||
196 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
197 | /* The outer cast must be a reinterpret_cast. | ||
198 | The inner cast: When the function is defined as a set of overloaded | ||
199 | functions, it works as a static_cast<>, choosing the designated variant. | ||
200 | When the function is defined as a single variant, it works as a | ||
201 | reinterpret_cast<>. The parenthesized cast syntax works both ways. */ | ||
202 | # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ | ||
203 | namespace GNULIB_NAMESPACE \ | ||
204 | { \ | ||
205 | static rettype (*func) parameters = \ | ||
206 | reinterpret_cast<rettype(*)parameters>( \ | ||
207 | (rettype2(*)parameters2)(::func)); \ | ||
208 | } \ | ||
209 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
210 | #else | ||
211 | # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ | ||
212 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
213 | #endif | ||
214 | |||
215 | /* _GL_CXXALIASWARN (func); | ||
216 | causes a warning to be emitted when ::func is used but not when | ||
217 | GNULIB_NAMESPACE::func is used. func must be defined without overloaded | ||
218 | variants. */ | ||
219 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
220 | # define _GL_CXXALIASWARN(func) \ | ||
221 | _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) | ||
222 | # define _GL_CXXALIASWARN_1(func,namespace) \ | ||
223 | _GL_CXXALIASWARN_2 (func, namespace) | ||
224 | # define _GL_CXXALIASWARN_2(func,namespace) \ | ||
225 | _GL_WARN_ON_USE (func, \ | ||
226 | "The symbol ::" #func " refers to the system function. " \ | ||
227 | "Use " #namespace "::" #func " instead.") | ||
228 | #else | ||
229 | # define _GL_CXXALIASWARN(func) \ | ||
230 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
231 | #endif | ||
232 | |||
233 | /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); | ||
234 | causes a warning to be emitted when the given overloaded variant of ::func | ||
235 | is used but not when GNULIB_NAMESPACE::func is used. */ | ||
236 | #if defined __cplusplus && defined GNULIB_NAMESPACE | ||
237 | # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ | ||
238 | _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ | ||
239 | GNULIB_NAMESPACE) | ||
240 | # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ | ||
241 | _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) | ||
242 | # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ | ||
243 | _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ | ||
244 | "The symbol ::" #func " refers to the system function. " \ | ||
245 | "Use " #namespace "::" #func " instead.") | ||
246 | #else | ||
247 | # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ | ||
248 | _GL_EXTERN_C int _gl_cxxalias_dummy | ||
249 | #endif | ||
250 | |||
251 | #endif /* _GL_CXXDEFS_H */ | ||
diff --git a/build-aux/config.rpath b/build-aux/config.rpath index 85c2f209..17298f23 100755 --- a/build-aux/config.rpath +++ b/build-aux/config.rpath | |||
@@ -2,7 +2,7 @@ | |||
2 | # Output a system dependent set of variables, describing how to set the | 2 | # Output a system dependent set of variables, describing how to set the |
3 | # run time search path of shared libraries in an executable. | 3 | # run time search path of shared libraries in an executable. |
4 | # | 4 | # |
5 | # Copyright 1996-2008 Free Software Foundation, Inc. | 5 | # Copyright 1996-2010 Free Software Foundation, Inc. |
6 | # Taken from GNU libtool, 2001 | 6 | # Taken from GNU libtool, 2001 |
7 | # Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 | 7 | # Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 |
8 | # | 8 | # |
diff --git a/build-aux/mkinstalldirs b/build-aux/mkinstalldirs deleted file mode 100755 index 259dbfcd..00000000 --- a/build-aux/mkinstalldirs +++ /dev/null | |||
@@ -1,158 +0,0 @@ | |||
1 | #! /bin/sh | ||
2 | # mkinstalldirs --- make directory hierarchy | ||
3 | |||
4 | scriptversion=2005-06-29.22 | ||
5 | |||
6 | # Original author: Noah Friedman <friedman@prep.ai.mit.edu> | ||
7 | # Created: 1993-05-16 | ||
8 | # Public domain. | ||
9 | # | ||
10 | # This file is maintained in Automake, please report | ||
11 | # bugs to <bug-automake@gnu.org> or send patches to | ||
12 | # <automake-patches@gnu.org>. | ||
13 | |||
14 | errstatus=0 | ||
15 | dirmode= | ||
16 | |||
17 | usage="\ | ||
18 | Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... | ||
19 | |||
20 | Create each directory DIR (with mode MODE, if specified), including all | ||
21 | leading file name components. | ||
22 | |||
23 | Report bugs to <bug-automake@gnu.org>." | ||
24 | |||
25 | # process command line arguments | ||
26 | while test $# -gt 0 ; do | ||
27 | case $1 in | ||
28 | -h | --help | --h*) # -h for help | ||
29 | echo "$usage" | ||
30 | exit $? | ||
31 | ;; | ||
32 | -m) # -m PERM arg | ||
33 | shift | ||
34 | test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } | ||
35 | dirmode=$1 | ||
36 | shift | ||
37 | ;; | ||
38 | --version) | ||
39 | echo "$0 $scriptversion" | ||
40 | exit $? | ||
41 | ;; | ||
42 | --) # stop option processing | ||
43 | shift | ||
44 | break | ||
45 | ;; | ||
46 | -*) # unknown option | ||
47 | echo "$usage" 1>&2 | ||
48 | exit 1 | ||
49 | ;; | ||
50 | *) # first non-opt arg | ||
51 | break | ||
52 | ;; | ||
53 | esac | ||
54 | done | ||
55 | |||
56 | for file | ||
57 | do | ||
58 | if test -d "$file"; then | ||
59 | shift | ||
60 | else | ||
61 | break | ||
62 | fi | ||
63 | done | ||
64 | |||
65 | case $# in | ||
66 | 0) exit 0 ;; | ||
67 | esac | ||
68 | |||
69 | # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and | ||
70 | # mkdir -p a/c at the same time, both will detect that a is missing, | ||
71 | # one will create a, then the other will try to create a and die with | ||
72 | # a "File exists" error. This is a problem when calling mkinstalldirs | ||
73 | # from a parallel make. We use --version in the probe to restrict | ||
74 | # ourselves to GNU mkdir, which is thread-safe. | ||
75 | case $dirmode in | ||
76 | '') | ||
77 | if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then | ||
78 | echo "mkdir -p -- $*" | ||
79 | exec mkdir -p -- "$@" | ||
80 | else | ||
81 | # On NextStep and OpenStep, the `mkdir' command does not | ||
82 | # recognize any option. It will interpret all options as | ||
83 | # directories to create, and then abort because `.' already | ||
84 | # exists. | ||
85 | test -d ./-p && rmdir ./-p | ||
86 | test -d ./--version && rmdir ./--version | ||
87 | fi | ||
88 | ;; | ||
89 | *) | ||
90 | if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && | ||
91 | test ! -d ./--version; then | ||
92 | echo "mkdir -m $dirmode -p -- $*" | ||
93 | exec mkdir -m "$dirmode" -p -- "$@" | ||
94 | else | ||
95 | # Clean up after NextStep and OpenStep mkdir. | ||
96 | for d in ./-m ./-p ./--version "./$dirmode"; | ||
97 | do | ||
98 | test -d $d && rmdir $d | ||
99 | done | ||
100 | fi | ||
101 | ;; | ||
102 | esac | ||
103 | |||
104 | for file | ||
105 | do | ||
106 | case $file in | ||
107 | /*) pathcomp=/ ;; | ||
108 | *) pathcomp= ;; | ||
109 | esac | ||
110 | oIFS=$IFS | ||
111 | IFS=/ | ||
112 | set fnord $file | ||
113 | shift | ||
114 | IFS=$oIFS | ||
115 | |||
116 | for d | ||
117 | do | ||
118 | test "x$d" = x && continue | ||
119 | |||
120 | pathcomp=$pathcomp$d | ||
121 | case $pathcomp in | ||
122 | -*) pathcomp=./$pathcomp ;; | ||
123 | esac | ||
124 | |||
125 | if test ! -d "$pathcomp"; then | ||
126 | echo "mkdir $pathcomp" | ||
127 | |||
128 | mkdir "$pathcomp" || lasterr=$? | ||
129 | |||
130 | if test ! -d "$pathcomp"; then | ||
131 | errstatus=$lasterr | ||
132 | else | ||
133 | if test ! -z "$dirmode"; then | ||
134 | echo "chmod $dirmode $pathcomp" | ||
135 | lasterr= | ||
136 | chmod "$dirmode" "$pathcomp" || lasterr=$? | ||
137 | |||
138 | if test ! -z "$lasterr"; then | ||
139 | errstatus=$lasterr | ||
140 | fi | ||
141 | fi | ||
142 | fi | ||
143 | fi | ||
144 | |||
145 | pathcomp=$pathcomp/ | ||
146 | done | ||
147 | done | ||
148 | |||
149 | exit $errstatus | ||
150 | |||
151 | # Local Variables: | ||
152 | # mode: shell-script | ||
153 | # sh-indentation: 2 | ||
154 | # eval: (add-hook 'write-file-hooks 'time-stamp) | ||
155 | # time-stamp-start: "scriptversion=" | ||
156 | # time-stamp-format: "%:y-%02m-%02d.%02H" | ||
157 | # time-stamp-end: "$" | ||
158 | # End: | ||
diff --git a/build-aux/warn-on-use.h b/build-aux/warn-on-use.h new file mode 100644 index 00000000..1cd5062d --- /dev/null +++ b/build-aux/warn-on-use.h | |||
@@ -0,0 +1,102 @@ | |||
1 | /* A C macro for emitting warnings if a function is used. | ||
2 | Copyright (C) 2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published | ||
6 | by the Free Software Foundation; either version 3 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | Lesser General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
16 | |||
17 | /* _GL_WARN_ON_USE (function, "literal string") issues a declaration | ||
18 | for FUNCTION which will then trigger a compiler warning containing | ||
19 | the text of "literal string" anywhere that function is called, if | ||
20 | supported by the compiler. If the compiler does not support this | ||
21 | feature, the macro expands to an unused extern declaration. | ||
22 | |||
23 | This macro is useful for marking a function as a potential | ||
24 | portability trap, with the intent that "literal string" include | ||
25 | instructions on the replacement function that should be used | ||
26 | instead. However, one of the reasons that a function is a | ||
27 | portability trap is if it has the wrong signature. Declaring | ||
28 | FUNCTION with a different signature in C is a compilation error, so | ||
29 | this macro must use the same type as any existing declaration so | ||
30 | that programs that avoid the problematic FUNCTION do not fail to | ||
31 | compile merely because they included a header that poisoned the | ||
32 | function. But this implies that _GL_WARN_ON_USE is only safe to | ||
33 | use if FUNCTION is known to already have a declaration. Use of | ||
34 | this macro implies that there must not be any other macro hiding | ||
35 | the declaration of FUNCTION; but undefining FUNCTION first is part | ||
36 | of the poisoning process anyway (although for symbols that are | ||
37 | provided only via a macro, the result is a compilation error rather | ||
38 | than a warning containing "literal string"). Also note that in | ||
39 | C++, it is only safe to use if FUNCTION has no overloads. | ||
40 | |||
41 | For an example, it is possible to poison 'getline' by: | ||
42 | - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]], | ||
43 | [getline]) in configure.ac, which potentially defines | ||
44 | HAVE_RAW_DECL_GETLINE | ||
45 | - adding this code to a header that wraps the system <stdio.h>: | ||
46 | #undef getline | ||
47 | #if HAVE_RAW_DECL_GETLINE | ||
48 | _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but" | ||
49 | "not universally present; use the gnulib module getline"); | ||
50 | #endif | ||
51 | |||
52 | It is not possible to directly poison global variables. But it is | ||
53 | possible to write a wrapper accessor function, and poison that | ||
54 | (less common usage, like &environ, will cause a compilation error | ||
55 | rather than issue the nice warning, but the end result of informing | ||
56 | the developer about their portability problem is still achieved): | ||
57 | #if HAVE_RAW_DECL_ENVIRON | ||
58 | static inline char ***rpl_environ (void) { return &environ; } | ||
59 | _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared"); | ||
60 | # undef environ | ||
61 | # define environ (*rpl_environ ()) | ||
62 | #endif | ||
63 | */ | ||
64 | #ifndef _GL_WARN_ON_USE | ||
65 | |||
66 | # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) | ||
67 | /* A compiler attribute is available in gcc versions 4.3.0 and later. */ | ||
68 | # define _GL_WARN_ON_USE(function, message) \ | ||
69 | extern __typeof__ (function) function __attribute__ ((__warning__ (message))) | ||
70 | |||
71 | # else /* Unsupported. */ | ||
72 | # define _GL_WARN_ON_USE(function, message) \ | ||
73 | _GL_WARN_EXTERN_C int _gl_warn_on_use | ||
74 | # endif | ||
75 | #endif | ||
76 | |||
77 | /* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string") | ||
78 | is like _GL_WARN_ON_USE (function, "string"), except that the function is | ||
79 | declared with the given prototype, consisting of return type, parameters, | ||
80 | and attributes. | ||
81 | This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does | ||
82 | not work in this case. */ | ||
83 | #ifndef _GL_WARN_ON_USE_CXX | ||
84 | # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) | ||
85 | # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ | ||
86 | extern rettype function parameters_and_attributes \ | ||
87 | __attribute__ ((__warning__ (msg))) | ||
88 | # else /* Unsupported. */ | ||
89 | # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ | ||
90 | _GL_WARN_EXTERN_C int _gl_warn_on_use | ||
91 | # endif | ||
92 | #endif | ||
93 | |||
94 | /* _GL_WARN_EXTERN_C declaration; | ||
95 | performs the declaration with C linkage. */ | ||
96 | #ifndef _GL_WARN_EXTERN_C | ||
97 | # if defined __cplusplus | ||
98 | # define _GL_WARN_EXTERN_C extern "C" | ||
99 | # else | ||
100 | # define _GL_WARN_EXTERN_C extern | ||
101 | # endif | ||
102 | #endif | ||
diff --git a/gl/Makefile.am b/gl/Makefile.am index 87fe0316..e2dc38b7 100644 --- a/gl/Makefile.am +++ b/gl/Makefile.am | |||
@@ -1,6 +1,6 @@ | |||
1 | ## DO NOT EDIT! GENERATED AUTOMATICALLY! | 1 | ## DO NOT EDIT! GENERATED AUTOMATICALLY! |
2 | ## Process this file with automake to produce Makefile.in. | 2 | ## Process this file with automake to produce Makefile.in. |
3 | # Copyright (C) 2002-2009 Free Software Foundation, Inc. | 3 | # Copyright (C) 2002-2010 Free Software Foundation, Inc. |
4 | # | 4 | # |
5 | # This file is free software, distributed under the terms of the GNU | 5 | # This file is free software, distributed under the terms of the GNU |
6 | # General Public License. As a special exception to the GNU General | 6 | # General Public License. As a special exception to the GNU General |
@@ -62,9 +62,10 @@ BUILT_SOURCES += $(ALLOCA_H) | |||
62 | # We need the following in order to create <alloca.h> when the system | 62 | # We need the following in order to create <alloca.h> when the system |
63 | # doesn't have one that works with the given compiler. | 63 | # doesn't have one that works with the given compiler. |
64 | alloca.h: alloca.in.h | 64 | alloca.h: alloca.in.h |
65 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
65 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 66 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
66 | cat $(srcdir)/alloca.in.h; \ | 67 | cat $(srcdir)/alloca.in.h; \ |
67 | } > $@-t | 68 | } > $@-t && \ |
68 | mv -f $@-t $@ | 69 | mv -f $@-t $@ |
69 | MOSTLYCLEANFILES += alloca.h alloca.h-t | 70 | MOSTLYCLEANFILES += alloca.h alloca.h-t |
70 | 71 | ||
@@ -72,15 +73,39 @@ EXTRA_DIST += alloca.in.h | |||
72 | 73 | ||
73 | ## end gnulib module alloca-opt | 74 | ## end gnulib module alloca-opt |
74 | 75 | ||
76 | ## begin gnulib module arg-nonnull | ||
77 | |||
78 | # The BUILT_SOURCES created by this Makefile snippet are not used via #include | ||
79 | # statements but through direct file reference. Therefore this snippet must be | ||
80 | # present in all Makefile.am that need it. This is ensured by the applicability | ||
81 | # 'all' defined above. | ||
82 | |||
83 | BUILT_SOURCES += arg-nonnull.h | ||
84 | # The arg-nonnull.h that gets inserted into generated .h files is the same as | ||
85 | # build-aux/arg-nonnull.h, except that it has the copyright header cut off. | ||
86 | arg-nonnull.h: $(top_srcdir)/build-aux/arg-nonnull.h | ||
87 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
88 | sed -n -e '/GL_ARG_NONNULL/,$$p' \ | ||
89 | < $(top_srcdir)/build-aux/arg-nonnull.h \ | ||
90 | > $@-t && \ | ||
91 | mv $@-t $@ | ||
92 | MOSTLYCLEANFILES += arg-nonnull.h arg-nonnull.h-t | ||
93 | |||
94 | ARG_NONNULL_H=arg-nonnull.h | ||
95 | |||
96 | EXTRA_DIST += $(top_srcdir)/build-aux/arg-nonnull.h | ||
97 | |||
98 | ## end gnulib module arg-nonnull | ||
99 | |||
75 | ## begin gnulib module arpa_inet | 100 | ## begin gnulib module arpa_inet |
76 | 101 | ||
77 | BUILT_SOURCES += $(ARPA_INET_H) | 102 | BUILT_SOURCES += arpa/inet.h |
78 | 103 | ||
79 | # We need the following in order to create <arpa/inet.h> when the system | 104 | # We need the following in order to create <arpa/inet.h> when the system |
80 | # doesn't have one. | 105 | # doesn't have one. |
81 | arpa/inet.h: arpa_inet.in.h | 106 | arpa/inet.h: arpa_inet.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H) |
82 | @MKDIR_P@ arpa | 107 | $(AM_V_at)$(MKDIR_P) arpa |
83 | rm -f $@-t $@ | 108 | $(AM_V_GEN)rm -f $@-t $@ && \ |
84 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 109 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
85 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 110 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
86 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 111 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
@@ -90,9 +115,10 @@ arpa/inet.h: arpa_inet.in.h | |||
90 | -e 's|@''GNULIB_INET_PTON''@|$(GNULIB_INET_PTON)|g' \ | 115 | -e 's|@''GNULIB_INET_PTON''@|$(GNULIB_INET_PTON)|g' \ |
91 | -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \ | 116 | -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \ |
92 | -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \ | 117 | -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \ |
93 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 118 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ |
119 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
94 | < $(srcdir)/arpa_inet.in.h; \ | 120 | < $(srcdir)/arpa_inet.in.h; \ |
95 | } > $@-t | 121 | } > $@-t && \ |
96 | mv $@-t $@ | 122 | mv $@-t $@ |
97 | MOSTLYCLEANFILES += arpa/inet.h arpa/inet.h-t | 123 | MOSTLYCLEANFILES += arpa/inet.h arpa/inet.h-t |
98 | MOSTLYCLEANDIRS += arpa | 124 | MOSTLYCLEANDIRS += arpa |
@@ -116,6 +142,30 @@ EXTRA_libgnu_a_SOURCES += btowc.c | |||
116 | 142 | ||
117 | ## end gnulib module btowc | 143 | ## end gnulib module btowc |
118 | 144 | ||
145 | ## begin gnulib module c++defs | ||
146 | |||
147 | # The BUILT_SOURCES created by this Makefile snippet are not used via #include | ||
148 | # statements but through direct file reference. Therefore this snippet must be | ||
149 | # present in all Makefile.am that need it. This is ensured by the applicability | ||
150 | # 'all' defined above. | ||
151 | |||
152 | BUILT_SOURCES += c++defs.h | ||
153 | # The c++defs.h that gets inserted into generated .h files is the same as | ||
154 | # build-aux/c++defs.h, except that it has the copyright header cut off. | ||
155 | c++defs.h: $(top_srcdir)/build-aux/c++defs.h | ||
156 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
157 | sed -n -e '/_GL_CXXDEFS/,$$p' \ | ||
158 | < $(top_srcdir)/build-aux/c++defs.h \ | ||
159 | > $@-t && \ | ||
160 | mv $@-t $@ | ||
161 | MOSTLYCLEANFILES += c++defs.h c++defs.h-t | ||
162 | |||
163 | CXXDEFS_H=c++defs.h | ||
164 | |||
165 | EXTRA_DIST += $(top_srcdir)/build-aux/c++defs.h | ||
166 | |||
167 | ## end gnulib module c++defs | ||
168 | |||
119 | ## begin gnulib module c-strtod | 169 | ## begin gnulib module c-strtod |
120 | 170 | ||
121 | 171 | ||
@@ -134,6 +184,14 @@ EXTRA_libgnu_a_SOURCES += cloexec.c | |||
134 | 184 | ||
135 | ## end gnulib module cloexec | 185 | ## end gnulib module cloexec |
136 | 186 | ||
187 | ## begin gnulib module close-hook | ||
188 | |||
189 | libgnu_a_SOURCES += close-hook.c | ||
190 | |||
191 | EXTRA_DIST += close-hook.h | ||
192 | |||
193 | ## end gnulib module close-hook | ||
194 | |||
137 | ## begin gnulib module configmake | 195 | ## begin gnulib module configmake |
138 | 196 | ||
139 | # Retrieve values of the variables through 'configure' followed by | 197 | # Retrieve values of the variables through 'configure' followed by |
@@ -154,7 +212,7 @@ EXTRA_libgnu_a_SOURCES += cloexec.c | |||
154 | # The Automake-defined pkg* macros are appended, in the order | 212 | # The Automake-defined pkg* macros are appended, in the order |
155 | # listed in the Automake 1.10a+ documentation. | 213 | # listed in the Automake 1.10a+ documentation. |
156 | configmake.h: Makefile | 214 | configmake.h: Makefile |
157 | rm -f $@-t | 215 | $(AM_V_GEN)rm -f $@-t && \ |
158 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 216 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
159 | echo '#define PREFIX "$(prefix)"'; \ | 217 | echo '#define PREFIX "$(prefix)"'; \ |
160 | echo '#define EXEC_PREFIX "$(exec_prefix)"'; \ | 218 | echo '#define EXEC_PREFIX "$(exec_prefix)"'; \ |
@@ -183,7 +241,7 @@ configmake.h: Makefile | |||
183 | echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \ | 241 | echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \ |
184 | echo '#define PKGLIBDIR "$(pkglibdir)"'; \ | 242 | echo '#define PKGLIBDIR "$(pkglibdir)"'; \ |
185 | echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \ | 243 | echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \ |
186 | } | sed '/""/d' > $@-t | 244 | } | sed '/""/d' > $@-t && \ |
187 | if test -f $@ && cmp $@-t $@ > /dev/null; then \ | 245 | if test -f $@ && cmp $@-t $@ > /dev/null; then \ |
188 | rm -f $@-t; \ | 246 | rm -f $@-t; \ |
189 | else \ | 247 | else \ |
@@ -198,12 +256,30 @@ CLEANFILES += configmake.h configmake.h-t | |||
198 | ## begin gnulib module dirname | 256 | ## begin gnulib module dirname |
199 | 257 | ||
200 | 258 | ||
201 | EXTRA_DIST += basename.c dirname.c dirname.h stripslash.c | 259 | EXTRA_DIST += basename.c dirname.c stripslash.c |
202 | 260 | ||
203 | EXTRA_libgnu_a_SOURCES += basename.c dirname.c stripslash.c | 261 | EXTRA_libgnu_a_SOURCES += basename.c dirname.c stripslash.c |
204 | 262 | ||
205 | ## end gnulib module dirname | 263 | ## end gnulib module dirname |
206 | 264 | ||
265 | ## begin gnulib module dirname-lgpl | ||
266 | |||
267 | |||
268 | EXTRA_DIST += basename-lgpl.c dirname-lgpl.c dirname.h stripslash.c | ||
269 | |||
270 | EXTRA_libgnu_a_SOURCES += basename-lgpl.c dirname-lgpl.c stripslash.c | ||
271 | |||
272 | ## end gnulib module dirname-lgpl | ||
273 | |||
274 | ## begin gnulib module dup2 | ||
275 | |||
276 | |||
277 | EXTRA_DIST += dup2.c | ||
278 | |||
279 | EXTRA_libgnu_a_SOURCES += dup2.c | ||
280 | |||
281 | ## end gnulib module dup2 | ||
282 | |||
207 | ## begin gnulib module errno | 283 | ## begin gnulib module errno |
208 | 284 | ||
209 | BUILT_SOURCES += $(ERRNO_H) | 285 | BUILT_SOURCES += $(ERRNO_H) |
@@ -211,7 +287,7 @@ BUILT_SOURCES += $(ERRNO_H) | |||
211 | # We need the following in order to create <errno.h> when the system | 287 | # We need the following in order to create <errno.h> when the system |
212 | # doesn't have one that is POSIX compliant. | 288 | # doesn't have one that is POSIX compliant. |
213 | errno.h: errno.in.h | 289 | errno.h: errno.in.h |
214 | rm -f $@-t $@ | 290 | $(AM_V_GEN)rm -f $@-t $@ && \ |
215 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 291 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
216 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 292 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
217 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 293 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
@@ -223,7 +299,7 @@ errno.h: errno.in.h | |||
223 | -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ | 299 | -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \ |
224 | -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ | 300 | -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \ |
225 | < $(srcdir)/errno.in.h; \ | 301 | < $(srcdir)/errno.in.h; \ |
226 | } > $@-t | 302 | } > $@-t && \ |
227 | mv $@-t $@ | 303 | mv $@-t $@ |
228 | MOSTLYCLEANFILES += errno.h errno.h-t | 304 | MOSTLYCLEANFILES += errno.h errno.h-t |
229 | 305 | ||
@@ -242,35 +318,52 @@ EXTRA_libgnu_a_SOURCES += error.c | |||
242 | 318 | ||
243 | ## begin gnulib module exitfail | 319 | ## begin gnulib module exitfail |
244 | 320 | ||
321 | libgnu_a_SOURCES += exitfail.c | ||
245 | 322 | ||
246 | EXTRA_DIST += exitfail.c exitfail.h | 323 | EXTRA_DIST += exitfail.h |
247 | |||
248 | EXTRA_libgnu_a_SOURCES += exitfail.c | ||
249 | 324 | ||
250 | ## end gnulib module exitfail | 325 | ## end gnulib module exitfail |
251 | 326 | ||
252 | ## begin gnulib module fcntl | 327 | ## begin gnulib module fcntl |
253 | 328 | ||
254 | BUILT_SOURCES += $(FCNTL_H) | 329 | |
330 | EXTRA_DIST += fcntl.c | ||
331 | |||
332 | EXTRA_libgnu_a_SOURCES += fcntl.c | ||
333 | |||
334 | ## end gnulib module fcntl | ||
335 | |||
336 | ## begin gnulib module fcntl-h | ||
337 | |||
338 | BUILT_SOURCES += fcntl.h | ||
255 | 339 | ||
256 | # We need the following in order to create <fcntl.h> when the system | 340 | # We need the following in order to create <fcntl.h> when the system |
257 | # doesn't have one that works with the given compiler. | 341 | # doesn't have one that works with the given compiler. |
258 | fcntl.h: fcntl.in.h | 342 | fcntl.h: fcntl.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
259 | rm -f $@-t $@ | 343 | $(AM_V_GEN)rm -f $@-t $@ && \ |
260 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 344 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
261 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 345 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
262 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 346 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
263 | -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ | 347 | -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ |
348 | -e 's|@''GNULIB_FCNTL''@|$(GNULIB_FCNTL)|g' \ | ||
264 | -e 's|@''GNULIB_OPEN''@|$(GNULIB_OPEN)|g' \ | 349 | -e 's|@''GNULIB_OPEN''@|$(GNULIB_OPEN)|g' \ |
350 | -e 's|@''GNULIB_OPENAT''@|$(GNULIB_OPENAT)|g' \ | ||
351 | -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \ | ||
352 | -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \ | ||
353 | -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \ | ||
265 | -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ | 354 | -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ |
355 | -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \ | ||
356 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
357 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
358 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
266 | < $(srcdir)/fcntl.in.h; \ | 359 | < $(srcdir)/fcntl.in.h; \ |
267 | } > $@-t | 360 | } > $@-t && \ |
268 | mv $@-t $@ | 361 | mv $@-t $@ |
269 | MOSTLYCLEANFILES += fcntl.h fcntl.h-t | 362 | MOSTLYCLEANFILES += fcntl.h fcntl.h-t |
270 | 363 | ||
271 | EXTRA_DIST += fcntl.in.h | 364 | EXTRA_DIST += fcntl.in.h |
272 | 365 | ||
273 | ## end gnulib module fcntl | 366 | ## end gnulib module fcntl-h |
274 | 367 | ||
275 | ## begin gnulib module fcntl-safer | 368 | ## begin gnulib module fcntl-safer |
276 | 369 | ||
@@ -288,13 +381,13 @@ BUILT_SOURCES += $(FLOAT_H) | |||
288 | # We need the following in order to create <float.h> when the system | 381 | # We need the following in order to create <float.h> when the system |
289 | # doesn't have one that works with the given compiler. | 382 | # doesn't have one that works with the given compiler. |
290 | float.h: float.in.h | 383 | float.h: float.in.h |
291 | rm -f $@-t $@ | 384 | $(AM_V_GEN)rm -f $@-t $@ && \ |
292 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 385 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
293 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 386 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
294 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 387 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
295 | -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ | 388 | -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ |
296 | < $(srcdir)/float.in.h; \ | 389 | < $(srcdir)/float.in.h; \ |
297 | } > $@-t | 390 | } > $@-t && \ |
298 | mv $@-t $@ | 391 | mv $@-t $@ |
299 | MOSTLYCLEANFILES += float.h float.h-t | 392 | MOSTLYCLEANFILES += float.h float.h-t |
300 | 393 | ||
@@ -341,10 +434,19 @@ EXTRA_libgnu_a_SOURCES += gai_strerror.c getaddrinfo.c | |||
341 | 434 | ||
342 | ## end gnulib module getaddrinfo | 435 | ## end gnulib module getaddrinfo |
343 | 436 | ||
437 | ## begin gnulib module getdtablesize | ||
438 | |||
439 | |||
440 | EXTRA_DIST += getdtablesize.c | ||
441 | |||
442 | EXTRA_libgnu_a_SOURCES += getdtablesize.c | ||
443 | |||
444 | ## end gnulib module getdtablesize | ||
445 | |||
344 | ## begin gnulib module gethostname | 446 | ## begin gnulib module gethostname |
345 | 447 | ||
346 | 448 | ||
347 | EXTRA_DIST += gethostname.c | 449 | EXTRA_DIST += gethostname.c w32sock.h |
348 | 450 | ||
349 | EXTRA_libgnu_a_SOURCES += gethostname.c | 451 | EXTRA_libgnu_a_SOURCES += gethostname.c |
350 | 452 | ||
@@ -359,16 +461,22 @@ EXTRA_libgnu_a_SOURCES += getloadavg.c | |||
359 | 461 | ||
360 | ## end gnulib module getloadavg | 462 | ## end gnulib module getloadavg |
361 | 463 | ||
362 | ## begin gnulib module getopt | 464 | ## begin gnulib module getopt-posix |
363 | 465 | ||
364 | BUILT_SOURCES += $(GETOPT_H) | 466 | BUILT_SOURCES += $(GETOPT_H) |
365 | 467 | ||
366 | # We need the following in order to create <getopt.h> when the system | 468 | # We need the following in order to create <getopt.h> when the system |
367 | # doesn't have one that works with the given compiler. | 469 | # doesn't have one that works with the given compiler. |
368 | getopt.h: getopt.in.h | 470 | getopt.h: getopt.in.h $(ARG_NONNULL_H) |
471 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
369 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 472 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
370 | cat $(srcdir)/getopt.in.h; \ | 473 | sed -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \ |
371 | } > $@-t | 474 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
475 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | ||
476 | -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \ | ||
477 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
478 | < $(srcdir)/getopt.in.h; \ | ||
479 | } > $@-t && \ | ||
372 | mv -f $@-t $@ | 480 | mv -f $@-t $@ |
373 | MOSTLYCLEANFILES += getopt.h getopt.h-t | 481 | MOSTLYCLEANFILES += getopt.h getopt.h-t |
374 | 482 | ||
@@ -376,7 +484,7 @@ EXTRA_DIST += getopt.c getopt.in.h getopt1.c getopt_int.h | |||
376 | 484 | ||
377 | EXTRA_libgnu_a_SOURCES += getopt.c getopt1.c | 485 | EXTRA_libgnu_a_SOURCES += getopt.c getopt1.c |
378 | 486 | ||
379 | ## end gnulib module getopt | 487 | ## end gnulib module getopt-posix |
380 | 488 | ||
381 | ## begin gnulib module gettext | 489 | ## begin gnulib module gettext |
382 | 490 | ||
@@ -423,13 +531,34 @@ EXTRA_DIST += intprops.h | |||
423 | 531 | ||
424 | ## end gnulib module intprops | 532 | ## end gnulib module intprops |
425 | 533 | ||
426 | ## begin gnulib module link-warning | 534 | ## begin gnulib module langinfo |
427 | 535 | ||
428 | LINK_WARNING_H=$(top_srcdir)/build-aux/link-warning.h | 536 | BUILT_SOURCES += langinfo.h |
429 | 537 | ||
430 | EXTRA_DIST += $(top_srcdir)/build-aux/link-warning.h | 538 | # We need the following in order to create an empty placeholder for |
539 | # <langinfo.h> when the system doesn't have one. | ||
540 | langinfo.h: langinfo.in.h $(CXXDEFS_H) $(WARN_ON_USE_H) | ||
541 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
542 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | ||
543 | sed -e 's|@''HAVE_LANGINFO_H''@|$(HAVE_LANGINFO_H)|g' \ | ||
544 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | ||
545 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | ||
546 | -e 's|@''NEXT_LANGINFO_H''@|$(NEXT_LANGINFO_H)|g' \ | ||
547 | -e 's|@''GNULIB_NL_LANGINFO''@|$(GNULIB_NL_LANGINFO)|g' \ | ||
548 | -e 's|@''HAVE_LANGINFO_CODESET''@|$(HAVE_LANGINFO_CODESET)|g' \ | ||
549 | -e 's|@''HAVE_LANGINFO_ERA''@|$(HAVE_LANGINFO_ERA)|g' \ | ||
550 | -e 's|@''HAVE_NL_LANGINFO''@|$(HAVE_NL_LANGINFO)|g' \ | ||
551 | -e 's|@''REPLACE_NL_LANGINFO''@|$(REPLACE_NL_LANGINFO)|g' \ | ||
552 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
553 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
554 | < $(srcdir)/langinfo.in.h; \ | ||
555 | } > $@-t && \ | ||
556 | mv $@-t $@ | ||
557 | MOSTLYCLEANFILES += langinfo.h langinfo.h-t | ||
558 | |||
559 | EXTRA_DIST += langinfo.in.h | ||
431 | 560 | ||
432 | ## end gnulib module link-warning | 561 | ## end gnulib module langinfo |
433 | 562 | ||
434 | ## begin gnulib module localcharset | 563 | ## begin gnulib module localcharset |
435 | 564 | ||
@@ -489,14 +618,14 @@ uninstall-localcharset: all-local | |||
489 | fi | 618 | fi |
490 | 619 | ||
491 | charset.alias: config.charset | 620 | charset.alias: config.charset |
492 | rm -f t-$@ $@ | 621 | $(AM_V_GEN)rm -f t-$@ $@ && \ |
493 | $(SHELL) $(srcdir)/config.charset '$(host)' > t-$@ | 622 | $(SHELL) $(srcdir)/config.charset '$(host)' > t-$@ && \ |
494 | mv t-$@ $@ | 623 | mv t-$@ $@ |
495 | 624 | ||
496 | SUFFIXES += .sed .sin | 625 | SUFFIXES += .sed .sin |
497 | .sin.sed: | 626 | .sin.sed: |
498 | rm -f t-$@ $@ | 627 | $(AM_V_GEN)rm -f t-$@ $@ && \ |
499 | sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@ | 628 | sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@ && \ |
500 | mv t-$@ $@ | 629 | mv t-$@ $@ |
501 | 630 | ||
502 | CLEANFILES += charset.alias ref-add.sed ref-del.sed | 631 | CLEANFILES += charset.alias ref-add.sed ref-del.sed |
@@ -505,6 +634,34 @@ EXTRA_DIST += config.charset ref-add.sin ref-del.sin | |||
505 | 634 | ||
506 | ## end gnulib module localcharset | 635 | ## end gnulib module localcharset |
507 | 636 | ||
637 | ## begin gnulib module locale | ||
638 | |||
639 | BUILT_SOURCES += locale.h | ||
640 | |||
641 | # We need the following in order to create <locale.h> when the system | ||
642 | # doesn't have one that provides all definitions. | ||
643 | locale.h: locale.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) | ||
644 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
645 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | ||
646 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | ||
647 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | ||
648 | -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \ | ||
649 | -e 's|@''GNULIB_DUPLOCALE''@|$(GNULIB_DUPLOCALE)|g' \ | ||
650 | -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \ | ||
651 | -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \ | ||
652 | -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \ | ||
653 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
654 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
655 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
656 | < $(srcdir)/locale.in.h; \ | ||
657 | } > $@-t && \ | ||
658 | mv $@-t $@ | ||
659 | MOSTLYCLEANFILES += locale.h locale.h-t | ||
660 | |||
661 | EXTRA_DIST += locale.in.h | ||
662 | |||
663 | ## end gnulib module locale | ||
664 | |||
508 | ## begin gnulib module malloc | 665 | ## begin gnulib module malloc |
509 | 666 | ||
510 | 667 | ||
@@ -529,14 +686,19 @@ BUILT_SOURCES += math.h | |||
529 | 686 | ||
530 | # We need the following in order to create <math.h> when the system | 687 | # We need the following in order to create <math.h> when the system |
531 | # doesn't have one that works with the given compiler. | 688 | # doesn't have one that works with the given compiler. |
532 | math.h: math.in.h | 689 | math.h: math.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
533 | rm -f $@-t $@ | 690 | $(AM_V_GEN)rm -f $@-t $@ && \ |
534 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 691 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
535 | sed -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \ | 692 | sed -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \ |
536 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 693 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
537 | -e 's|@''NEXT_MATH_H''@|$(NEXT_MATH_H)|g' \ | 694 | -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \ |
695 | -e 's|@''GNULIB_ACOSL''@|$(GNULIB_ACOSL)|g' \ | ||
696 | -e 's|@''GNULIB_ASINL''@|$(GNULIB_ASINL)|g' \ | ||
697 | -e 's|@''GNULIB_ATANL''@|$(GNULIB_ATANL)|g' \ | ||
538 | -e 's|@''GNULIB_CEILF''@|$(GNULIB_CEILF)|g' \ | 698 | -e 's|@''GNULIB_CEILF''@|$(GNULIB_CEILF)|g' \ |
539 | -e 's|@''GNULIB_CEILL''@|$(GNULIB_CEILL)|g' \ | 699 | -e 's|@''GNULIB_CEILL''@|$(GNULIB_CEILL)|g' \ |
700 | -e 's|@''GNULIB_COSL''@|$(GNULIB_COSL)|g' \ | ||
701 | -e 's|@''GNULIB_EXPL''@|$(GNULIB_EXPL)|g' \ | ||
540 | -e 's|@''GNULIB_FLOORF''@|$(GNULIB_FLOORF)|g' \ | 702 | -e 's|@''GNULIB_FLOORF''@|$(GNULIB_FLOORF)|g' \ |
541 | -e 's|@''GNULIB_FLOORL''@|$(GNULIB_FLOORL)|g' \ | 703 | -e 's|@''GNULIB_FLOORL''@|$(GNULIB_FLOORL)|g' \ |
542 | -e 's|@''GNULIB_FREXP''@|$(GNULIB_FREXP)|g' \ | 704 | -e 's|@''GNULIB_FREXP''@|$(GNULIB_FREXP)|g' \ |
@@ -548,30 +710,52 @@ math.h: math.in.h | |||
548 | -e 's|@''GNULIB_ISNAND''@|$(GNULIB_ISNAND)|g' \ | 710 | -e 's|@''GNULIB_ISNAND''@|$(GNULIB_ISNAND)|g' \ |
549 | -e 's|@''GNULIB_ISNANL''@|$(GNULIB_ISNANL)|g' \ | 711 | -e 's|@''GNULIB_ISNANL''@|$(GNULIB_ISNANL)|g' \ |
550 | -e 's|@''GNULIB_LDEXPL''@|$(GNULIB_LDEXPL)|g' \ | 712 | -e 's|@''GNULIB_LDEXPL''@|$(GNULIB_LDEXPL)|g' \ |
551 | -e 's|@''GNULIB_MATHL''@|$(GNULIB_MATHL)|g' \ | 713 | -e 's|@''GNULIB_LOGB''@|$(GNULIB_LOGB)|g' \ |
714 | -e 's|@''GNULIB_LOGL''@|$(GNULIB_LOGL)|g' \ | ||
552 | -e 's|@''GNULIB_ROUND''@|$(GNULIB_ROUND)|g' \ | 715 | -e 's|@''GNULIB_ROUND''@|$(GNULIB_ROUND)|g' \ |
553 | -e 's|@''GNULIB_ROUNDF''@|$(GNULIB_ROUNDF)|g' \ | 716 | -e 's|@''GNULIB_ROUNDF''@|$(GNULIB_ROUNDF)|g' \ |
554 | -e 's|@''GNULIB_ROUNDL''@|$(GNULIB_ROUNDL)|g' \ | 717 | -e 's|@''GNULIB_ROUNDL''@|$(GNULIB_ROUNDL)|g' \ |
555 | -e 's|@''GNULIB_SIGNBIT''@|$(GNULIB_SIGNBIT)|g' \ | 718 | -e 's|@''GNULIB_SIGNBIT''@|$(GNULIB_SIGNBIT)|g' \ |
719 | -e 's|@''GNULIB_SINL''@|$(GNULIB_SINL)|g' \ | ||
720 | -e 's|@''GNULIB_SQRTL''@|$(GNULIB_SQRTL)|g' \ | ||
721 | -e 's|@''GNULIB_TANL''@|$(GNULIB_TANL)|g' \ | ||
556 | -e 's|@''GNULIB_TRUNC''@|$(GNULIB_TRUNC)|g' \ | 722 | -e 's|@''GNULIB_TRUNC''@|$(GNULIB_TRUNC)|g' \ |
557 | -e 's|@''GNULIB_TRUNCF''@|$(GNULIB_TRUNCF)|g' \ | 723 | -e 's|@''GNULIB_TRUNCF''@|$(GNULIB_TRUNCF)|g' \ |
558 | -e 's|@''GNULIB_TRUNCL''@|$(GNULIB_TRUNCL)|g' \ | 724 | -e 's|@''GNULIB_TRUNCL''@|$(GNULIB_TRUNCL)|g' \ |
725 | -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \ | ||
726 | -e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \ | ||
727 | -e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \ | ||
728 | -e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \ | ||
729 | -e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \ | ||
559 | -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \ | 730 | -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \ |
560 | -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \ | 731 | -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \ |
561 | -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \ | 732 | -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \ |
733 | -e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \ | ||
734 | -e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \ | ||
735 | -e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \ | ||
736 | -e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \ | ||
562 | -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \ | 737 | -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \ |
563 | -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \ | 738 | -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \ |
564 | -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \ | 739 | -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \ |
740 | -e 's|@''HAVE_DECL_CEILF''@|$(HAVE_DECL_CEILF)|g' \ | ||
741 | -e 's|@''HAVE_DECL_CEILL''@|$(HAVE_DECL_CEILL)|g' \ | ||
565 | -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \ | 742 | -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \ |
566 | -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \ | 743 | -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \ |
744 | -e 's|@''HAVE_DECL_FLOORF''@|$(HAVE_DECL_FLOORF)|g' \ | ||
745 | -e 's|@''HAVE_DECL_FLOORL''@|$(HAVE_DECL_FLOORL)|g' \ | ||
567 | -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \ | 746 | -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \ |
568 | -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \ | 747 | -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \ |
748 | -e 's|@''HAVE_DECL_LOGB''@|$(HAVE_DECL_LOGB)|g' \ | ||
569 | -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \ | 749 | -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \ |
750 | -e 's|@''HAVE_DECL_ROUND''@|$(HAVE_DECL_ROUND)|g' \ | ||
751 | -e 's|@''HAVE_DECL_ROUNDF''@|$(HAVE_DECL_ROUNDF)|g' \ | ||
752 | -e 's|@''HAVE_DECL_ROUNDL''@|$(HAVE_DECL_ROUNDL)|g' \ | ||
570 | -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \ | 753 | -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \ |
571 | -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \ | 754 | -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \ |
572 | -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \ | 755 | -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \ |
573 | -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \ | 756 | -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \ |
574 | -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \ | 757 | -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \ |
758 | -e 's|@''HAVE_DECL_TRUNCL''@|$(HAVE_DECL_TRUNCL)|g' \ | ||
575 | -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \ | 759 | -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \ |
576 | -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \ | 760 | -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \ |
577 | -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \ | 761 | -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \ |
@@ -590,9 +774,11 @@ math.h: math.in.h | |||
590 | -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \ | 774 | -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \ |
591 | -e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \ | 775 | -e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \ |
592 | -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \ | 776 | -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \ |
593 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 777 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ |
778 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
779 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
594 | < $(srcdir)/math.in.h; \ | 780 | < $(srcdir)/math.in.h; \ |
595 | } > $@-t | 781 | } > $@-t && \ |
596 | mv $@-t $@ | 782 | mv $@-t $@ |
597 | MOSTLYCLEANFILES += math.h math.h-t | 783 | MOSTLYCLEANFILES += math.h math.h-t |
598 | 784 | ||
@@ -618,10 +804,19 @@ EXTRA_libgnu_a_SOURCES += mbsinit.c | |||
618 | 804 | ||
619 | ## end gnulib module mbsinit | 805 | ## end gnulib module mbsinit |
620 | 806 | ||
807 | ## begin gnulib module memchr | ||
808 | |||
809 | |||
810 | EXTRA_DIST += memchr.c memchr.valgrind | ||
811 | |||
812 | EXTRA_libgnu_a_SOURCES += memchr.c | ||
813 | |||
814 | ## end gnulib module memchr | ||
815 | |||
621 | ## begin gnulib module mktime | 816 | ## begin gnulib module mktime |
622 | 817 | ||
623 | 818 | ||
624 | EXTRA_DIST += mktime.c | 819 | EXTRA_DIST += mktime-internal.h mktime.c |
625 | 820 | ||
626 | EXTRA_libgnu_a_SOURCES += mktime.c | 821 | EXTRA_libgnu_a_SOURCES += mktime.c |
627 | 822 | ||
@@ -642,8 +837,8 @@ BUILT_SOURCES += $(NETDB_H) | |||
642 | 837 | ||
643 | # We need the following in order to create <netdb.h> when the system | 838 | # We need the following in order to create <netdb.h> when the system |
644 | # doesn't have one that works with the given compiler. | 839 | # doesn't have one that works with the given compiler. |
645 | netdb.h: netdb.in.h | 840 | netdb.h: netdb.in.h $(ARG_NONNULL_H) |
646 | rm -f $@-t $@ | 841 | $(AM_V_GEN)rm -f $@-t $@ && \ |
647 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 842 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
648 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 843 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
649 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 844 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
@@ -655,8 +850,9 @@ netdb.h: netdb.in.h | |||
655 | -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \ | 850 | -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \ |
656 | -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \ | 851 | -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \ |
657 | -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \ | 852 | -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \ |
853 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
658 | < $(srcdir)/netdb.in.h; \ | 854 | < $(srcdir)/netdb.in.h; \ |
659 | } > $@-t | 855 | } > $@-t && \ |
660 | mv $@-t $@ | 856 | mv $@-t $@ |
661 | MOSTLYCLEANFILES += netdb.h netdb.h-t | 857 | MOSTLYCLEANFILES += netdb.h netdb.h-t |
662 | 858 | ||
@@ -671,15 +867,15 @@ BUILT_SOURCES += $(NETINET_IN_H) | |||
671 | # We need the following in order to create <netinet/in.h> when the system | 867 | # We need the following in order to create <netinet/in.h> when the system |
672 | # doesn't have one. | 868 | # doesn't have one. |
673 | netinet/in.h: netinet_in.in.h | 869 | netinet/in.h: netinet_in.in.h |
674 | @MKDIR_P@ netinet | 870 | $(AM_V_at)$(MKDIR_P) netinet |
675 | rm -f $@-t $@ | 871 | $(AM_V_GEN)rm -f $@-t $@ && \ |
676 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 872 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
677 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 873 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
678 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 874 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
679 | -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \ | 875 | -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \ |
680 | -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \ | 876 | -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \ |
681 | < $(srcdir)/netinet_in.in.h; \ | 877 | < $(srcdir)/netinet_in.in.h; \ |
682 | } > $@-t | 878 | } > $@-t && \ |
683 | mv $@-t $@ | 879 | mv $@-t $@ |
684 | MOSTLYCLEANFILES += netinet/in.h netinet/in.h-t | 880 | MOSTLYCLEANFILES += netinet/in.h netinet/in.h-t |
685 | MOSTLYCLEANDIRS += netinet | 881 | MOSTLYCLEANDIRS += netinet |
@@ -688,6 +884,15 @@ EXTRA_DIST += netinet_in.in.h | |||
688 | 884 | ||
689 | ## end gnulib module netinet_in | 885 | ## end gnulib module netinet_in |
690 | 886 | ||
887 | ## begin gnulib module nl_langinfo | ||
888 | |||
889 | |||
890 | EXTRA_DIST += nl_langinfo.c | ||
891 | |||
892 | EXTRA_libgnu_a_SOURCES += nl_langinfo.c | ||
893 | |||
894 | ## end gnulib module nl_langinfo | ||
895 | |||
691 | ## begin gnulib module open | 896 | ## begin gnulib module open |
692 | 897 | ||
693 | 898 | ||
@@ -739,6 +944,23 @@ EXTRA_libgnu_a_SOURCES += snprintf.c | |||
739 | 944 | ||
740 | ## end gnulib module snprintf | 945 | ## end gnulib module snprintf |
741 | 946 | ||
947 | ## begin gnulib module sockets | ||
948 | |||
949 | libgnu_a_SOURCES += sockets.h sockets.c | ||
950 | |||
951 | EXTRA_DIST += w32sock.h | ||
952 | |||
953 | ## end gnulib module sockets | ||
954 | |||
955 | ## begin gnulib module stat | ||
956 | |||
957 | |||
958 | EXTRA_DIST += stat.c | ||
959 | |||
960 | EXTRA_libgnu_a_SOURCES += stat.c | ||
961 | |||
962 | ## end gnulib module stat | ||
963 | |||
742 | ## begin gnulib module stdbool | 964 | ## begin gnulib module stdbool |
743 | 965 | ||
744 | BUILT_SOURCES += $(STDBOOL_H) | 966 | BUILT_SOURCES += $(STDBOOL_H) |
@@ -746,10 +968,10 @@ BUILT_SOURCES += $(STDBOOL_H) | |||
746 | # We need the following in order to create <stdbool.h> when the system | 968 | # We need the following in order to create <stdbool.h> when the system |
747 | # doesn't have one that works. | 969 | # doesn't have one that works. |
748 | stdbool.h: stdbool.in.h | 970 | stdbool.h: stdbool.in.h |
749 | rm -f $@-t $@ | 971 | $(AM_V_GEN)rm -f $@-t $@ && \ |
750 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 972 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
751 | sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ | 973 | sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ |
752 | } > $@-t | 974 | } > $@-t && \ |
753 | mv $@-t $@ | 975 | mv $@-t $@ |
754 | MOSTLYCLEANFILES += stdbool.h stdbool.h-t | 976 | MOSTLYCLEANFILES += stdbool.h stdbool.h-t |
755 | 977 | ||
@@ -757,6 +979,29 @@ EXTRA_DIST += stdbool.in.h | |||
757 | 979 | ||
758 | ## end gnulib module stdbool | 980 | ## end gnulib module stdbool |
759 | 981 | ||
982 | ## begin gnulib module stddef | ||
983 | |||
984 | BUILT_SOURCES += $(STDDEF_H) | ||
985 | |||
986 | # We need the following in order to create <stddef.h> when the system | ||
987 | # doesn't have one that works with the given compiler. | ||
988 | stddef.h: stddef.in.h | ||
989 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
990 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | ||
991 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | ||
992 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | ||
993 | -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \ | ||
994 | -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \ | ||
995 | -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \ | ||
996 | < $(srcdir)/stddef.in.h; \ | ||
997 | } > $@-t && \ | ||
998 | mv $@-t $@ | ||
999 | MOSTLYCLEANFILES += stddef.h stddef.h-t | ||
1000 | |||
1001 | EXTRA_DIST += stddef.in.h | ||
1002 | |||
1003 | ## end gnulib module stddef | ||
1004 | |||
760 | ## begin gnulib module stdint | 1005 | ## begin gnulib module stdint |
761 | 1006 | ||
762 | BUILT_SOURCES += $(STDINT_H) | 1007 | BUILT_SOURCES += $(STDINT_H) |
@@ -764,7 +1009,7 @@ BUILT_SOURCES += $(STDINT_H) | |||
764 | # We need the following in order to create <stdint.h> when the system | 1009 | # We need the following in order to create <stdint.h> when the system |
765 | # doesn't have one that works with the given compiler. | 1010 | # doesn't have one that works with the given compiler. |
766 | stdint.h: stdint.in.h | 1011 | stdint.h: stdint.in.h |
767 | rm -f $@-t $@ | 1012 | $(AM_V_GEN)rm -f $@-t $@ && \ |
768 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 1013 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
769 | sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ | 1014 | sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ |
770 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1015 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
@@ -791,7 +1036,7 @@ stdint.h: stdint.in.h | |||
791 | -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ | 1036 | -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \ |
792 | -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ | 1037 | -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \ |
793 | < $(srcdir)/stdint.in.h; \ | 1038 | < $(srcdir)/stdint.in.h; \ |
794 | } > $@-t | 1039 | } > $@-t && \ |
795 | mv $@-t $@ | 1040 | mv $@-t $@ |
796 | MOSTLYCLEANFILES += stdint.h stdint.h-t | 1041 | MOSTLYCLEANFILES += stdint.h stdint.h-t |
797 | 1042 | ||
@@ -805,81 +1050,100 @@ BUILT_SOURCES += stdio.h | |||
805 | 1050 | ||
806 | # We need the following in order to create <stdio.h> when the system | 1051 | # We need the following in order to create <stdio.h> when the system |
807 | # doesn't have one that works with the given compiler. | 1052 | # doesn't have one that works with the given compiler. |
808 | stdio.h: stdio.in.h | 1053 | stdio.h: stdio.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
809 | rm -f $@-t $@ | 1054 | $(AM_V_GEN)rm -f $@-t $@ && \ |
810 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 1055 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
811 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1056 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
812 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1057 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
813 | -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ | 1058 | -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ |
814 | -e 's|@''GNULIB_FPRINTF''@|$(GNULIB_FPRINTF)|g' \ | ||
815 | -e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \ | ||
816 | -e 's|@''GNULIB_PRINTF''@|$(GNULIB_PRINTF)|g' \ | ||
817 | -e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_POSIX)|g' \ | ||
818 | -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \ | ||
819 | -e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \ | ||
820 | -e 's|@''GNULIB_VFPRINTF''@|$(GNULIB_VFPRINTF)|g' \ | ||
821 | -e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|g' \ | ||
822 | -e 's|@''GNULIB_VPRINTF''@|$(GNULIB_VPRINTF)|g' \ | ||
823 | -e 's|@''GNULIB_VPRINTF_POSIX''@|$(GNULIB_VPRINTF_POSIX)|g' \ | ||
824 | -e 's|@''GNULIB_VSNPRINTF''@|$(GNULIB_VSNPRINTF)|g' \ | ||
825 | -e 's|@''GNULIB_VSPRINTF_POSIX''@|$(GNULIB_VSPRINTF_POSIX)|g' \ | ||
826 | -e 's|@''GNULIB_DPRINTF''@|$(GNULIB_DPRINTF)|g' \ | 1059 | -e 's|@''GNULIB_DPRINTF''@|$(GNULIB_DPRINTF)|g' \ |
827 | -e 's|@''GNULIB_VDPRINTF''@|$(GNULIB_VDPRINTF)|g' \ | 1060 | -e 's|@''GNULIB_FCLOSE''@|$(GNULIB_FCLOSE)|g' \ |
828 | -e 's|@''GNULIB_VASPRINTF''@|$(GNULIB_VASPRINTF)|g' \ | 1061 | -e 's|@''GNULIB_FFLUSH''@|$(GNULIB_FFLUSH)|g' \ |
829 | -e 's|@''GNULIB_OBSTACK_PRINTF''@|$(GNULIB_OBSTACK_PRINTF)|g' \ | ||
830 | -e 's|@''GNULIB_OBSTACK_PRINTF_POSIX''@|$(GNULIB_OBSTACK_PRINTF_POSIX)|g' \ | ||
831 | -e 's|@''GNULIB_FOPEN''@|$(GNULIB_FOPEN)|g' \ | 1062 | -e 's|@''GNULIB_FOPEN''@|$(GNULIB_FOPEN)|g' \ |
1063 | -e 's|@''GNULIB_FPRINTF''@|$(GNULIB_FPRINTF)|g' \ | ||
1064 | -e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \ | ||
1065 | -e 's|@''GNULIB_FPURGE''@|$(GNULIB_FPURGE)|g' \ | ||
1066 | -e 's|@''GNULIB_FPUTC''@|$(GNULIB_FPUTC)|g' \ | ||
1067 | -e 's|@''GNULIB_FPUTS''@|$(GNULIB_FPUTS)|g' \ | ||
832 | -e 's|@''GNULIB_FREOPEN''@|$(GNULIB_FREOPEN)|g' \ | 1068 | -e 's|@''GNULIB_FREOPEN''@|$(GNULIB_FREOPEN)|g' \ |
833 | -e 's|@''GNULIB_FSEEK''@|$(GNULIB_FSEEK)|g' \ | 1069 | -e 's|@''GNULIB_FSEEK''@|$(GNULIB_FSEEK)|g' \ |
834 | -e 's|@''GNULIB_FSEEKO''@|$(GNULIB_FSEEKO)|g' \ | 1070 | -e 's|@''GNULIB_FSEEKO''@|$(GNULIB_FSEEKO)|g' \ |
835 | -e 's|@''GNULIB_FTELL''@|$(GNULIB_FTELL)|g' \ | 1071 | -e 's|@''GNULIB_FTELL''@|$(GNULIB_FTELL)|g' \ |
836 | -e 's|@''GNULIB_FTELLO''@|$(GNULIB_FTELLO)|g' \ | 1072 | -e 's|@''GNULIB_FTELLO''@|$(GNULIB_FTELLO)|g' \ |
837 | -e 's|@''GNULIB_FFLUSH''@|$(GNULIB_FFLUSH)|g' \ | ||
838 | -e 's|@''GNULIB_FCLOSE''@|$(GNULIB_FCLOSE)|g' \ | ||
839 | -e 's|@''GNULIB_FPUTC''@|$(GNULIB_FPUTC)|g' \ | ||
840 | -e 's|@''GNULIB_PUTC''@|$(GNULIB_PUTC)|g' \ | ||
841 | -e 's|@''GNULIB_PUTCHAR''@|$(GNULIB_PUTCHAR)|g' \ | ||
842 | -e 's|@''GNULIB_FPUTS''@|$(GNULIB_FPUTS)|g' \ | ||
843 | -e 's|@''GNULIB_PUTS''@|$(GNULIB_PUTS)|g' \ | ||
844 | -e 's|@''GNULIB_FWRITE''@|$(GNULIB_FWRITE)|g' \ | 1073 | -e 's|@''GNULIB_FWRITE''@|$(GNULIB_FWRITE)|g' \ |
845 | -e 's|@''GNULIB_GETDELIM''@|$(GNULIB_GETDELIM)|g' \ | 1074 | -e 's|@''GNULIB_GETDELIM''@|$(GNULIB_GETDELIM)|g' \ |
846 | -e 's|@''GNULIB_GETLINE''@|$(GNULIB_GETLINE)|g' \ | 1075 | -e 's|@''GNULIB_GETLINE''@|$(GNULIB_GETLINE)|g' \ |
1076 | -e 's|@''GNULIB_OBSTACK_PRINTF''@|$(GNULIB_OBSTACK_PRINTF)|g' \ | ||
1077 | -e 's|@''GNULIB_OBSTACK_PRINTF_POSIX''@|$(GNULIB_OBSTACK_PRINTF_POSIX)|g' \ | ||
847 | -e 's|@''GNULIB_PERROR''@|$(GNULIB_PERROR)|g' \ | 1078 | -e 's|@''GNULIB_PERROR''@|$(GNULIB_PERROR)|g' \ |
1079 | -e 's|@''GNULIB_POPEN''@|$(GNULIB_POPEN)|g' \ | ||
1080 | -e 's|@''GNULIB_PRINTF''@|$(GNULIB_PRINTF)|g' \ | ||
1081 | -e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_POSIX)|g' \ | ||
1082 | -e 's|@''GNULIB_PUTC''@|$(GNULIB_PUTC)|g' \ | ||
1083 | -e 's|@''GNULIB_PUTCHAR''@|$(GNULIB_PUTCHAR)|g' \ | ||
1084 | -e 's|@''GNULIB_PUTS''@|$(GNULIB_PUTS)|g' \ | ||
1085 | -e 's|@''GNULIB_REMOVE''@|$(GNULIB_REMOVE)|g' \ | ||
1086 | -e 's|@''GNULIB_RENAME''@|$(GNULIB_RENAME)|g' \ | ||
1087 | -e 's|@''GNULIB_RENAMEAT''@|$(GNULIB_RENAMEAT)|g' \ | ||
1088 | -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \ | ||
1089 | -e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \ | ||
848 | -e 's|@''GNULIB_STDIO_H_SIGPIPE''@|$(GNULIB_STDIO_H_SIGPIPE)|g' \ | 1090 | -e 's|@''GNULIB_STDIO_H_SIGPIPE''@|$(GNULIB_STDIO_H_SIGPIPE)|g' \ |
849 | -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \ | 1091 | -e 's|@''GNULIB_TMPFILE''@|$(GNULIB_TMPFILE)|g' \ |
850 | -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ | 1092 | -e 's|@''GNULIB_VASPRINTF''@|$(GNULIB_VASPRINTF)|g' \ |
851 | -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \ | 1093 | -e 's|@''GNULIB_VDPRINTF''@|$(GNULIB_VDPRINTF)|g' \ |
852 | -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \ | 1094 | -e 's|@''GNULIB_VFPRINTF''@|$(GNULIB_VFPRINTF)|g' \ |
853 | -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \ | 1095 | -e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|g' \ |
854 | -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \ | 1096 | -e 's|@''GNULIB_VPRINTF''@|$(GNULIB_VPRINTF)|g' \ |
1097 | -e 's|@''GNULIB_VPRINTF_POSIX''@|$(GNULIB_VPRINTF_POSIX)|g' \ | ||
1098 | -e 's|@''GNULIB_VSNPRINTF''@|$(GNULIB_VSNPRINTF)|g' \ | ||
1099 | -e 's|@''GNULIB_VSPRINTF_POSIX''@|$(GNULIB_VSPRINTF_POSIX)|g' \ | ||
1100 | < $(srcdir)/stdio.in.h | \ | ||
1101 | sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \ | ||
1102 | -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ | ||
1103 | -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ | ||
1104 | -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ | ||
855 | -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ | 1105 | -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \ |
856 | -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \ | ||
857 | -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ | 1106 | -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \ |
858 | -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \ | ||
859 | -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ | ||
860 | -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ | 1107 | -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \ |
861 | -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \ | 1108 | -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \ |
862 | -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \ | 1109 | -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \ |
863 | -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \ | 1110 | -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \ |
864 | -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ | 1111 | -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \ |
865 | -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ | 1112 | -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \ |
866 | -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ | 1113 | -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \ |
867 | -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ | 1114 | -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \ |
1115 | -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ | ||
868 | -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ | 1116 | -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \ |
1117 | -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \ | ||
1118 | -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \ | ||
869 | -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ | 1119 | -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \ |
870 | -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ | ||
871 | -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \ | 1120 | -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \ |
872 | -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ | 1121 | -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \ |
873 | -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \ | 1122 | -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \ |
874 | -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \ | 1123 | -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \ |
875 | -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \ | 1124 | -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \ |
876 | -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ | ||
877 | -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ | ||
878 | -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ | 1125 | -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ |
1126 | -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ | ||
879 | -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \ | 1127 | -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \ |
880 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 1128 | -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \ |
881 | < $(srcdir)/stdio.in.h; \ | 1129 | -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \ |
882 | } > $@-t | 1130 | -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \ |
1131 | -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \ | ||
1132 | -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \ | ||
1133 | -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \ | ||
1134 | -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \ | ||
1135 | -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \ | ||
1136 | -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \ | ||
1137 | -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \ | ||
1138 | -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \ | ||
1139 | -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \ | ||
1140 | -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \ | ||
1141 | -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \ | ||
1142 | -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \ | ||
1143 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
1144 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1145 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ | ||
1146 | } > $@-t && \ | ||
883 | mv $@-t $@ | 1147 | mv $@-t $@ |
884 | MOSTLYCLEANFILES += stdio.h stdio.h-t | 1148 | MOSTLYCLEANFILES += stdio.h stdio.h-t |
885 | 1149 | ||
@@ -895,36 +1159,53 @@ BUILT_SOURCES += stdlib.h | |||
895 | 1159 | ||
896 | # We need the following in order to create <stdlib.h> when the system | 1160 | # We need the following in order to create <stdlib.h> when the system |
897 | # doesn't have one that works with the given compiler. | 1161 | # doesn't have one that works with the given compiler. |
898 | stdlib.h: stdlib.in.h | 1162 | stdlib.h: stdlib.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
899 | rm -f $@-t $@ | 1163 | $(AM_V_GEN)rm -f $@-t $@ && \ |
900 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 1164 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
901 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1165 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
902 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1166 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
903 | -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ | 1167 | -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ |
904 | -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ | ||
905 | -e 's|@''GNULIB_MALLOC_POSIX''@|$(GNULIB_MALLOC_POSIX)|g' \ | ||
906 | -e 's|@''GNULIB_REALLOC_POSIX''@|$(GNULIB_REALLOC_POSIX)|g' \ | ||
907 | -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \ | ||
908 | -e 's|@''GNULIB_ATOLL''@|$(GNULIB_ATOLL)|g' \ | 1168 | -e 's|@''GNULIB_ATOLL''@|$(GNULIB_ATOLL)|g' \ |
1169 | -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \ | ||
1170 | -e 's|@''GNULIB_CANONICALIZE_FILE_NAME''@|$(GNULIB_CANONICALIZE_FILE_NAME)|g' \ | ||
909 | -e 's|@''GNULIB_GETLOADAVG''@|$(GNULIB_GETLOADAVG)|g' \ | 1171 | -e 's|@''GNULIB_GETLOADAVG''@|$(GNULIB_GETLOADAVG)|g' \ |
910 | -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \ | 1172 | -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \ |
1173 | -e 's|@''GNULIB_GRANTPT''@|$(GNULIB_GRANTPT)|g' \ | ||
1174 | -e 's|@''GNULIB_MALLOC_POSIX''@|$(GNULIB_MALLOC_POSIX)|g' \ | ||
911 | -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \ | 1175 | -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \ |
1176 | -e 's|@''GNULIB_MKOSTEMP''@|$(GNULIB_MKOSTEMP)|g' \ | ||
1177 | -e 's|@''GNULIB_MKOSTEMPS''@|$(GNULIB_MKOSTEMPS)|g' \ | ||
912 | -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \ | 1178 | -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \ |
1179 | -e 's|@''GNULIB_MKSTEMPS''@|$(GNULIB_MKSTEMPS)|g' \ | ||
1180 | -e 's|@''GNULIB_PTSNAME''@|$(GNULIB_PTSNAME)|g' \ | ||
913 | -e 's|@''GNULIB_PUTENV''@|$(GNULIB_PUTENV)|g' \ | 1181 | -e 's|@''GNULIB_PUTENV''@|$(GNULIB_PUTENV)|g' \ |
914 | -e 's|@''GNULIB_RANDOM_R''@|$(GNULIB_RANDOM_R)|g' \ | 1182 | -e 's|@''GNULIB_RANDOM_R''@|$(GNULIB_RANDOM_R)|g' \ |
1183 | -e 's|@''GNULIB_REALLOC_POSIX''@|$(GNULIB_REALLOC_POSIX)|g' \ | ||
1184 | -e 's|@''GNULIB_REALPATH''@|$(GNULIB_REALPATH)|g' \ | ||
915 | -e 's|@''GNULIB_RPMATCH''@|$(GNULIB_RPMATCH)|g' \ | 1185 | -e 's|@''GNULIB_RPMATCH''@|$(GNULIB_RPMATCH)|g' \ |
916 | -e 's|@''GNULIB_SETENV''@|$(GNULIB_SETENV)|g' \ | 1186 | -e 's|@''GNULIB_SETENV''@|$(GNULIB_SETENV)|g' \ |
917 | -e 's|@''GNULIB_STRTOD''@|$(GNULIB_STRTOD)|g' \ | 1187 | -e 's|@''GNULIB_STRTOD''@|$(GNULIB_STRTOD)|g' \ |
918 | -e 's|@''GNULIB_STRTOLL''@|$(GNULIB_STRTOLL)|g' \ | 1188 | -e 's|@''GNULIB_STRTOLL''@|$(GNULIB_STRTOLL)|g' \ |
919 | -e 's|@''GNULIB_STRTOULL''@|$(GNULIB_STRTOULL)|g' \ | 1189 | -e 's|@''GNULIB_STRTOULL''@|$(GNULIB_STRTOULL)|g' \ |
1190 | -e 's|@''GNULIB_UNLOCKPT''@|$(GNULIB_UNLOCKPT)|g' \ | ||
920 | -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \ | 1191 | -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \ |
921 | -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ | 1192 | -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ |
922 | -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \ | 1193 | -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \ |
1194 | -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ | ||
1195 | -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ | ||
923 | -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ | 1196 | -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ |
1197 | -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ | ||
924 | -e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \ | 1198 | -e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \ |
925 | -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ | 1199 | -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ |
926 | -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \ | 1200 | -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ |
1201 | -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ | ||
1202 | -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \ | ||
1203 | -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \ | ||
1204 | -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ | ||
1205 | -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ | ||
927 | -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ | 1206 | -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ |
1207 | -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \ | ||
1208 | -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ | ||
928 | -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ | 1209 | -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ |
929 | -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \ | 1210 | -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \ |
930 | -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ | 1211 | -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ |
@@ -932,15 +1213,20 @@ stdlib.h: stdlib.in.h | |||
932 | -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ | 1213 | -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \ |
933 | -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ | 1214 | -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \ |
934 | -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ | 1215 | -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ |
1216 | -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ | ||
935 | -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \ | 1217 | -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \ |
936 | -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ | 1218 | -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ |
937 | -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ | 1219 | -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ |
938 | -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ | 1220 | -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ |
1221 | -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ | ||
1222 | -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ | ||
939 | -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ | 1223 | -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ |
940 | -e 's|@''VOID_UNSETENV''@|$(VOID_UNSETENV)|g' \ | 1224 | -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \ |
941 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 1225 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ |
1226 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1227 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
942 | < $(srcdir)/stdlib.in.h; \ | 1228 | < $(srcdir)/stdlib.in.h; \ |
943 | } > $@-t | 1229 | } > $@-t && \ |
944 | mv $@-t $@ | 1230 | mv $@-t $@ |
945 | MOSTLYCLEANFILES += stdlib.h stdlib.h-t | 1231 | MOSTLYCLEANFILES += stdlib.h stdlib.h-t |
946 | 1232 | ||
@@ -979,8 +1265,8 @@ BUILT_SOURCES += string.h | |||
979 | 1265 | ||
980 | # We need the following in order to create <string.h> when the system | 1266 | # We need the following in order to create <string.h> when the system |
981 | # doesn't have one that works with the given compiler. | 1267 | # doesn't have one that works with the given compiler. |
982 | string.h: string.in.h | 1268 | string.h: string.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
983 | rm -f $@-t $@ | 1269 | $(AM_V_GEN)rm -f $@-t $@ && \ |
984 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 1270 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
985 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1271 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
986 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1272 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
@@ -999,6 +1285,7 @@ string.h: string.in.h | |||
999 | -e 's|@''GNULIB_MBSSPN''@|$(GNULIB_MBSSPN)|g' \ | 1285 | -e 's|@''GNULIB_MBSSPN''@|$(GNULIB_MBSSPN)|g' \ |
1000 | -e 's|@''GNULIB_MBSSEP''@|$(GNULIB_MBSSEP)|g' \ | 1286 | -e 's|@''GNULIB_MBSSEP''@|$(GNULIB_MBSSEP)|g' \ |
1001 | -e 's|@''GNULIB_MBSTOK_R''@|$(GNULIB_MBSTOK_R)|g' \ | 1287 | -e 's|@''GNULIB_MBSTOK_R''@|$(GNULIB_MBSTOK_R)|g' \ |
1288 | -e 's|@''GNULIB_MEMCHR''@|$(GNULIB_MEMCHR)|g' \ | ||
1002 | -e 's|@''GNULIB_MEMMEM''@|$(GNULIB_MEMMEM)|g' \ | 1289 | -e 's|@''GNULIB_MEMMEM''@|$(GNULIB_MEMMEM)|g' \ |
1003 | -e 's|@''GNULIB_MEMPCPY''@|$(GNULIB_MEMPCPY)|g' \ | 1290 | -e 's|@''GNULIB_MEMPCPY''@|$(GNULIB_MEMPCPY)|g' \ |
1004 | -e 's|@''GNULIB_MEMRCHR''@|$(GNULIB_MEMRCHR)|g' \ | 1291 | -e 's|@''GNULIB_MEMRCHR''@|$(GNULIB_MEMRCHR)|g' \ |
@@ -1007,6 +1294,7 @@ string.h: string.in.h | |||
1007 | -e 's|@''GNULIB_STPNCPY''@|$(GNULIB_STPNCPY)|g' \ | 1294 | -e 's|@''GNULIB_STPNCPY''@|$(GNULIB_STPNCPY)|g' \ |
1008 | -e 's|@''GNULIB_STRCHRNUL''@|$(GNULIB_STRCHRNUL)|g' \ | 1295 | -e 's|@''GNULIB_STRCHRNUL''@|$(GNULIB_STRCHRNUL)|g' \ |
1009 | -e 's|@''GNULIB_STRDUP''@|$(GNULIB_STRDUP)|g' \ | 1296 | -e 's|@''GNULIB_STRDUP''@|$(GNULIB_STRDUP)|g' \ |
1297 | -e 's|@''GNULIB_STRNCAT''@|$(GNULIB_STRNCAT)|g' \ | ||
1010 | -e 's|@''GNULIB_STRNDUP''@|$(GNULIB_STRNDUP)|g' \ | 1298 | -e 's|@''GNULIB_STRNDUP''@|$(GNULIB_STRNDUP)|g' \ |
1011 | -e 's|@''GNULIB_STRNLEN''@|$(GNULIB_STRNLEN)|g' \ | 1299 | -e 's|@''GNULIB_STRNLEN''@|$(GNULIB_STRNLEN)|g' \ |
1012 | -e 's|@''GNULIB_STRPBRK''@|$(GNULIB_STRPBRK)|g' \ | 1300 | -e 's|@''GNULIB_STRPBRK''@|$(GNULIB_STRPBRK)|g' \ |
@@ -1017,6 +1305,9 @@ string.h: string.in.h | |||
1017 | -e 's|@''GNULIB_STRERROR''@|$(GNULIB_STRERROR)|g' \ | 1305 | -e 's|@''GNULIB_STRERROR''@|$(GNULIB_STRERROR)|g' \ |
1018 | -e 's|@''GNULIB_STRSIGNAL''@|$(GNULIB_STRSIGNAL)|g' \ | 1306 | -e 's|@''GNULIB_STRSIGNAL''@|$(GNULIB_STRSIGNAL)|g' \ |
1019 | -e 's|@''GNULIB_STRVERSCMP''@|$(GNULIB_STRVERSCMP)|g' \ | 1307 | -e 's|@''GNULIB_STRVERSCMP''@|$(GNULIB_STRVERSCMP)|g' \ |
1308 | < $(srcdir)/string.in.h | \ | ||
1309 | sed -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \ | ||
1310 | -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \ | ||
1020 | -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ | 1311 | -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ |
1021 | -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ | 1312 | -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ |
1022 | -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ | 1313 | -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ |
@@ -1025,25 +1316,31 @@ string.h: string.in.h | |||
1025 | -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ | 1316 | -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \ |
1026 | -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \ | 1317 | -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \ |
1027 | -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \ | 1318 | -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \ |
1028 | -e 's|@''HAVE_STRNDUP''@|$(HAVE_STRNDUP)|g' \ | ||
1029 | -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \ | 1319 | -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \ |
1030 | -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \ | 1320 | -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \ |
1031 | -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \ | 1321 | -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \ |
1032 | -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \ | 1322 | -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \ |
1033 | -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ | 1323 | -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \ |
1034 | -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ | 1324 | -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ |
1035 | -e 's|@''HAVE_DECL_STRERROR''@|$(HAVE_DECL_STRERROR)|g' \ | ||
1036 | -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ | 1325 | -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ |
1037 | -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ | 1326 | -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ |
1327 | -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \ | ||
1328 | -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \ | ||
1038 | -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ | 1329 | -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ |
1039 | -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ | 1330 | -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ |
1040 | -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ | 1331 | -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \ |
1041 | -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ | 1332 | -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ |
1042 | -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ | 1333 | -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ |
1334 | -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \ | ||
1335 | -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \ | ||
1043 | -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ | 1336 | -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ |
1044 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 1337 | -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \ |
1338 | -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \ | ||
1339 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
1340 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1341 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ | ||
1045 | < $(srcdir)/string.in.h; \ | 1342 | < $(srcdir)/string.in.h; \ |
1046 | } > $@-t | 1343 | } > $@-t && \ |
1047 | mv $@-t $@ | 1344 | mv $@-t $@ |
1048 | MOSTLYCLEANFILES += string.h string.h-t | 1345 | MOSTLYCLEANFILES += string.h string.h-t |
1049 | 1346 | ||
@@ -1069,14 +1366,24 @@ EXTRA_libgnu_a_SOURCES += strnlen.c | |||
1069 | 1366 | ||
1070 | ## end gnulib module strnlen | 1367 | ## end gnulib module strnlen |
1071 | 1368 | ||
1369 | ## begin gnulib module strstr-simple | ||
1370 | |||
1371 | |||
1372 | EXTRA_DIST += str-two-way.h strstr.c | ||
1373 | |||
1374 | EXTRA_libgnu_a_SOURCES += strstr.c | ||
1375 | |||
1376 | ## end gnulib module strstr-simple | ||
1377 | |||
1072 | ## begin gnulib module sys_socket | 1378 | ## begin gnulib module sys_socket |
1073 | 1379 | ||
1074 | BUILT_SOURCES += $(SYS_SOCKET_H) | 1380 | BUILT_SOURCES += sys/socket.h |
1075 | 1381 | ||
1076 | # We need the following in order to create <sys/socket.h> when the system | 1382 | # We need the following in order to create <sys/socket.h> when the system |
1077 | # doesn't have one that works with the given compiler. | 1383 | # doesn't have one that works with the given compiler. |
1078 | sys/socket.h: sys_socket.in.h | 1384 | sys/socket.h: sys_socket.in.h $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H) |
1079 | @MKDIR_P@ sys | 1385 | $(AM_V_at)$(MKDIR_P) sys |
1386 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
1080 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 1387 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
1081 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1388 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
1082 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1389 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
@@ -1097,12 +1404,17 @@ sys/socket.h: sys_socket.in.h | |||
1097 | -e 's|@''GNULIB_SENDTO''@|$(GNULIB_SENDTO)|g' \ | 1404 | -e 's|@''GNULIB_SENDTO''@|$(GNULIB_SENDTO)|g' \ |
1098 | -e 's|@''GNULIB_SETSOCKOPT''@|$(GNULIB_SETSOCKOPT)|g' \ | 1405 | -e 's|@''GNULIB_SETSOCKOPT''@|$(GNULIB_SETSOCKOPT)|g' \ |
1099 | -e 's|@''GNULIB_SHUTDOWN''@|$(GNULIB_SHUTDOWN)|g' \ | 1406 | -e 's|@''GNULIB_SHUTDOWN''@|$(GNULIB_SHUTDOWN)|g' \ |
1407 | -e 's|@''GNULIB_ACCEPT4''@|$(GNULIB_ACCEPT4)|g' \ | ||
1100 | -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ | 1408 | -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ |
1101 | -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \ | 1409 | -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \ |
1102 | -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \ | 1410 | -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \ |
1103 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 1411 | -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \ |
1412 | -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \ | ||
1413 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
1414 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1415 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
1104 | < $(srcdir)/sys_socket.in.h; \ | 1416 | < $(srcdir)/sys_socket.in.h; \ |
1105 | } > $@-t | 1417 | } > $@-t && \ |
1106 | mv -f $@-t $@ | 1418 | mv -f $@-t $@ |
1107 | MOSTLYCLEANFILES += sys/socket.h sys/socket.h-t | 1419 | MOSTLYCLEANFILES += sys/socket.h sys/socket.h-t |
1108 | MOSTLYCLEANDIRS += sys | 1420 | MOSTLYCLEANDIRS += sys |
@@ -1111,26 +1423,96 @@ EXTRA_DIST += sys_socket.in.h | |||
1111 | 1423 | ||
1112 | ## end gnulib module sys_socket | 1424 | ## end gnulib module sys_socket |
1113 | 1425 | ||
1426 | ## begin gnulib module sys_stat | ||
1427 | |||
1428 | BUILT_SOURCES += sys/stat.h | ||
1429 | |||
1430 | # We need the following in order to create <sys/stat.h> when the system | ||
1431 | # has one that is incomplete. | ||
1432 | sys/stat.h: sys_stat.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) | ||
1433 | $(AM_V_at)$(MKDIR_P) sys | ||
1434 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
1435 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | ||
1436 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | ||
1437 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | ||
1438 | -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ | ||
1439 | -e 's|@''GNULIB_FCHMODAT''@|$(GNULIB_FCHMODAT)|g' \ | ||
1440 | -e 's|@''GNULIB_FSTATAT''@|$(GNULIB_FSTATAT)|g' \ | ||
1441 | -e 's|@''GNULIB_FUTIMENS''@|$(GNULIB_FUTIMENS)|g' \ | ||
1442 | -e 's|@''GNULIB_LCHMOD''@|$(GNULIB_LCHMOD)|g' \ | ||
1443 | -e 's|@''GNULIB_LSTAT''@|$(GNULIB_LSTAT)|g' \ | ||
1444 | -e 's|@''GNULIB_MKDIRAT''@|$(GNULIB_MKDIRAT)|g' \ | ||
1445 | -e 's|@''GNULIB_MKFIFO''@|$(GNULIB_MKFIFO)|g' \ | ||
1446 | -e 's|@''GNULIB_MKFIFOAT''@|$(GNULIB_MKFIFOAT)|g' \ | ||
1447 | -e 's|@''GNULIB_MKNOD''@|$(GNULIB_MKNOD)|g' \ | ||
1448 | -e 's|@''GNULIB_MKNODAT''@|$(GNULIB_MKNODAT)|g' \ | ||
1449 | -e 's|@''GNULIB_STAT''@|$(GNULIB_STAT)|g' \ | ||
1450 | -e 's|@''GNULIB_UTIMENSAT''@|$(GNULIB_UTIMENSAT)|g' \ | ||
1451 | -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ | ||
1452 | -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ | ||
1453 | -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \ | ||
1454 | -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ | ||
1455 | -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \ | ||
1456 | -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \ | ||
1457 | -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \ | ||
1458 | -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \ | ||
1459 | -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \ | ||
1460 | -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \ | ||
1461 | -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \ | ||
1462 | -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \ | ||
1463 | -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \ | ||
1464 | -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \ | ||
1465 | -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \ | ||
1466 | -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \ | ||
1467 | -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \ | ||
1468 | -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \ | ||
1469 | -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \ | ||
1470 | -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \ | ||
1471 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
1472 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1473 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
1474 | < $(srcdir)/sys_stat.in.h; \ | ||
1475 | } > $@-t && \ | ||
1476 | mv $@-t $@ | ||
1477 | MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t | ||
1478 | MOSTLYCLEANDIRS += sys | ||
1479 | |||
1480 | EXTRA_DIST += sys_stat.in.h | ||
1481 | |||
1482 | ## end gnulib module sys_stat | ||
1483 | |||
1114 | ## begin gnulib module time | 1484 | ## begin gnulib module time |
1115 | 1485 | ||
1116 | BUILT_SOURCES += time.h | 1486 | BUILT_SOURCES += time.h |
1117 | 1487 | ||
1118 | # We need the following in order to create <time.h> when the system | 1488 | # We need the following in order to create <time.h> when the system |
1119 | # doesn't have one that works with the given compiler. | 1489 | # doesn't have one that works with the given compiler. |
1120 | time.h: time.in.h | 1490 | time.h: time.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
1121 | rm -f $@-t $@ | 1491 | $(AM_V_GEN)rm -f $@-t $@ && \ |
1122 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ | 1492 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ |
1123 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1493 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
1124 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1494 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
1125 | -e 's|@NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ | 1495 | -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ |
1126 | -e 's|@REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ | 1496 | -e 's|@''GNULIB_MKTIME''@|$(GNULIB_MKTIME)|g' \ |
1127 | -e 's|@REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ | 1497 | -e 's|@''GNULIB_NANOSLEEP''@|$(GNULIB_NANOSLEEP)|g' \ |
1128 | -e 's|@REPLACE_STRPTIME''@|$(REPLACE_STRPTIME)|g' \ | 1498 | -e 's|@''GNULIB_STRPTIME''@|$(GNULIB_STRPTIME)|g' \ |
1129 | -e 's|@REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ | 1499 | -e 's|@''GNULIB_TIMEGM''@|$(GNULIB_TIMEGM)|g' \ |
1130 | -e 's|@SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ | 1500 | -e 's|@''GNULIB_TIME_R''@|$(GNULIB_TIME_R)|g' \ |
1131 | -e 's|@TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ | 1501 | -e 's|@''HAVE_LOCALTIME_R''@|$(HAVE_LOCALTIME_R)|g' \ |
1502 | -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ | ||
1503 | -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ | ||
1504 | -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ | ||
1505 | -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ | ||
1506 | -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ | ||
1507 | -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ | ||
1508 | -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ | ||
1509 | -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ | ||
1510 | -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ | ||
1511 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
1512 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1513 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
1132 | < $(srcdir)/time.in.h; \ | 1514 | < $(srcdir)/time.in.h; \ |
1133 | } > $@-t | 1515 | } > $@-t && \ |
1134 | mv $@-t $@ | 1516 | mv $@-t $@ |
1135 | MOSTLYCLEANFILES += time.h time.h-t | 1517 | MOSTLYCLEANFILES += time.h time.h-t |
1136 | 1518 | ||
@@ -1150,7 +1532,7 @@ EXTRA_libgnu_a_SOURCES += time_r.c | |||
1150 | ## begin gnulib module timegm | 1532 | ## begin gnulib module timegm |
1151 | 1533 | ||
1152 | 1534 | ||
1153 | EXTRA_DIST += timegm.c | 1535 | EXTRA_DIST += mktime-internal.h timegm.c |
1154 | 1536 | ||
1155 | EXTRA_libgnu_a_SOURCES += timegm.c | 1537 | EXTRA_libgnu_a_SOURCES += timegm.c |
1156 | 1538 | ||
@@ -1162,8 +1544,8 @@ BUILT_SOURCES += unistd.h | |||
1162 | 1544 | ||
1163 | # We need the following in order to create an empty placeholder for | 1545 | # We need the following in order to create an empty placeholder for |
1164 | # <unistd.h> when the system doesn't have one. | 1546 | # <unistd.h> when the system doesn't have one. |
1165 | unistd.h: unistd.in.h | 1547 | unistd.h: unistd.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
1166 | rm -f $@-t $@ | 1548 | $(AM_V_GEN)rm -f $@-t $@ && \ |
1167 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 1549 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
1168 | sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ | 1550 | sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ |
1169 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1551 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
@@ -1172,53 +1554,104 @@ unistd.h: unistd.in.h | |||
1172 | -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \ | 1554 | -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \ |
1173 | -e 's|@''GNULIB_CLOSE''@|$(GNULIB_CLOSE)|g' \ | 1555 | -e 's|@''GNULIB_CLOSE''@|$(GNULIB_CLOSE)|g' \ |
1174 | -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \ | 1556 | -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \ |
1557 | -e 's|@''GNULIB_DUP3''@|$(GNULIB_DUP3)|g' \ | ||
1175 | -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \ | 1558 | -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \ |
1176 | -e 's|@''GNULIB_EUIDACCESS''@|$(GNULIB_EUIDACCESS)|g' \ | 1559 | -e 's|@''GNULIB_EUIDACCESS''@|$(GNULIB_EUIDACCESS)|g' \ |
1560 | -e 's|@''GNULIB_FACCESSAT''@|$(GNULIB_FACCESSAT)|g' \ | ||
1177 | -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \ | 1561 | -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \ |
1562 | -e 's|@''GNULIB_FCHOWNAT''@|$(GNULIB_FCHOWNAT)|g' \ | ||
1178 | -e 's|@''GNULIB_FSYNC''@|$(GNULIB_FSYNC)|g' \ | 1563 | -e 's|@''GNULIB_FSYNC''@|$(GNULIB_FSYNC)|g' \ |
1179 | -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \ | 1564 | -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \ |
1180 | -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \ | 1565 | -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \ |
1181 | -e 's|@''GNULIB_GETDOMAINNAME''@|$(GNULIB_GETDOMAINNAME)|g' \ | 1566 | -e 's|@''GNULIB_GETDOMAINNAME''@|$(GNULIB_GETDOMAINNAME)|g' \ |
1182 | -e 's|@''GNULIB_GETDTABLESIZE''@|$(GNULIB_GETDTABLESIZE)|g' \ | 1567 | -e 's|@''GNULIB_GETDTABLESIZE''@|$(GNULIB_GETDTABLESIZE)|g' \ |
1568 | -e 's|@''GNULIB_GETGROUPS''@|$(GNULIB_GETGROUPS)|g' \ | ||
1183 | -e 's|@''GNULIB_GETHOSTNAME''@|$(GNULIB_GETHOSTNAME)|g' \ | 1569 | -e 's|@''GNULIB_GETHOSTNAME''@|$(GNULIB_GETHOSTNAME)|g' \ |
1570 | -e 's|@''GNULIB_GETLOGIN''@|$(GNULIB_GETLOGIN)|g' \ | ||
1184 | -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \ | 1571 | -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \ |
1185 | -e 's|@''GNULIB_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \ | 1572 | -e 's|@''GNULIB_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \ |
1186 | -e 's|@''GNULIB_GETUSERSHELL''@|$(GNULIB_GETUSERSHELL)|g' \ | 1573 | -e 's|@''GNULIB_GETUSERSHELL''@|$(GNULIB_GETUSERSHELL)|g' \ |
1187 | -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \ | 1574 | -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \ |
1188 | -e 's|@''GNULIB_LINK''@|$(GNULIB_LINK)|g' \ | 1575 | -e 's|@''GNULIB_LINK''@|$(GNULIB_LINK)|g' \ |
1576 | -e 's|@''GNULIB_LINKAT''@|$(GNULIB_LINKAT)|g' \ | ||
1189 | -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \ | 1577 | -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \ |
1578 | -e 's|@''GNULIB_PIPE2''@|$(GNULIB_PIPE2)|g' \ | ||
1579 | -e 's|@''GNULIB_PREAD''@|$(GNULIB_PREAD)|g' \ | ||
1190 | -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \ | 1580 | -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \ |
1581 | -e 's|@''GNULIB_READLINKAT''@|$(GNULIB_READLINKAT)|g' \ | ||
1582 | -e 's|@''GNULIB_RMDIR''@|$(GNULIB_RMDIR)|g' \ | ||
1191 | -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \ | 1583 | -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \ |
1584 | -e 's|@''GNULIB_SYMLINK''@|$(GNULIB_SYMLINK)|g' \ | ||
1585 | -e 's|@''GNULIB_SYMLINKAT''@|$(GNULIB_SYMLINKAT)|g' \ | ||
1586 | -e 's|@''GNULIB_TTYNAME_R''@|$(GNULIB_TTYNAME_R)|g' \ | ||
1587 | -e 's|@''GNULIB_UNISTD_H_GETOPT''@|$(GNULIB_UNISTD_H_GETOPT)|g' \ | ||
1192 | -e 's|@''GNULIB_UNISTD_H_SIGPIPE''@|$(GNULIB_UNISTD_H_SIGPIPE)|g' \ | 1588 | -e 's|@''GNULIB_UNISTD_H_SIGPIPE''@|$(GNULIB_UNISTD_H_SIGPIPE)|g' \ |
1589 | -e 's|@''GNULIB_UNLINK''@|$(GNULIB_UNLINK)|g' \ | ||
1590 | -e 's|@''GNULIB_UNLINKAT''@|$(GNULIB_UNLINKAT)|g' \ | ||
1591 | -e 's|@''GNULIB_USLEEP''@|$(GNULIB_USLEEP)|g' \ | ||
1193 | -e 's|@''GNULIB_WRITE''@|$(GNULIB_WRITE)|g' \ | 1592 | -e 's|@''GNULIB_WRITE''@|$(GNULIB_WRITE)|g' \ |
1593 | < $(srcdir)/unistd.in.h | \ | ||
1594 | sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \ | ||
1194 | -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ | 1595 | -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \ |
1596 | -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \ | ||
1195 | -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ | 1597 | -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \ |
1598 | -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \ | ||
1599 | -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \ | ||
1600 | -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \ | ||
1196 | -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ | 1601 | -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \ |
1197 | -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ | 1602 | -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \ |
1198 | -e 's|@''HAVE_GETDOMAINNAME''@|$(HAVE_GETDOMAINNAME)|g' \ | 1603 | -e 's|@''HAVE_GETDOMAINNAME''@|$(HAVE_GETDOMAINNAME)|g' \ |
1199 | -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ | 1604 | -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \ |
1605 | -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \ | ||
1200 | -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ | 1606 | -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \ |
1607 | -e 's|@''HAVE_GETLOGIN''@|$(HAVE_GETLOGIN)|g' \ | ||
1201 | -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ | 1608 | -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ |
1202 | -e 's|@''HAVE_GETUSERSHELL''@|$(HAVE_GETUSERSHELL)|g' \ | 1609 | -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \ |
1203 | -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ | 1610 | -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \ |
1611 | -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \ | ||
1612 | -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \ | ||
1613 | -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \ | ||
1204 | -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ | 1614 | -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ |
1615 | -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \ | ||
1205 | -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ | 1616 | -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ |
1617 | -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \ | ||
1618 | -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \ | ||
1619 | -e 's|@''HAVE_TTYNAME_R''@|$(HAVE_TTYNAME_R)|g' \ | ||
1620 | -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \ | ||
1621 | -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \ | ||
1206 | -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ | 1622 | -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ |
1207 | -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ | 1623 | -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ |
1624 | -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \ | ||
1625 | -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \ | ||
1208 | -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ | 1626 | -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ |
1209 | -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ | 1627 | -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \ |
1210 | -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ | 1628 | -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \ |
1211 | -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ | 1629 | -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \ |
1212 | -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \ | 1630 | -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \ |
1631 | -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \ | ||
1632 | -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \ | ||
1213 | -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ | 1633 | -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \ |
1634 | -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \ | ||
1214 | -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ | 1635 | -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ |
1215 | -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ | 1636 | -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ |
1637 | -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \ | ||
1638 | -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \ | ||
1216 | -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ | 1639 | -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ |
1640 | -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \ | ||
1641 | -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \ | ||
1642 | -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \ | ||
1643 | -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \ | ||
1644 | -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \ | ||
1645 | -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \ | ||
1646 | -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \ | ||
1647 | -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \ | ||
1217 | -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ | 1648 | -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \ |
1218 | -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ | 1649 | -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \ |
1219 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 1650 | -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \ |
1220 | < $(srcdir)/unistd.in.h; \ | 1651 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ |
1221 | } > $@-t | 1652 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ |
1653 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \ | ||
1654 | } > $@-t && \ | ||
1222 | mv $@-t $@ | 1655 | mv $@-t $@ |
1223 | MOSTLYCLEANFILES += unistd.h unistd.h-t | 1656 | MOSTLYCLEANFILES += unistd.h unistd.h-t |
1224 | 1657 | ||
@@ -1268,14 +1701,33 @@ EXTRA_libgnu_a_SOURCES += vsnprintf.c | |||
1268 | 1701 | ||
1269 | ## end gnulib module vsnprintf | 1702 | ## end gnulib module vsnprintf |
1270 | 1703 | ||
1704 | ## begin gnulib module warn-on-use | ||
1705 | |||
1706 | BUILT_SOURCES += warn-on-use.h | ||
1707 | # The warn-on-use.h that gets inserted into generated .h files is the same as | ||
1708 | # build-aux/warn-on-use.h, except that it has the copyright header cut off. | ||
1709 | warn-on-use.h: $(top_srcdir)/build-aux/warn-on-use.h | ||
1710 | $(AM_V_GEN)rm -f $@-t $@ && \ | ||
1711 | sed -n -e '/^.ifndef/,$$p' \ | ||
1712 | < $(top_srcdir)/build-aux/warn-on-use.h \ | ||
1713 | > $@-t && \ | ||
1714 | mv $@-t $@ | ||
1715 | MOSTLYCLEANFILES += warn-on-use.h warn-on-use.h-t | ||
1716 | |||
1717 | WARN_ON_USE_H=warn-on-use.h | ||
1718 | |||
1719 | EXTRA_DIST += $(top_srcdir)/build-aux/warn-on-use.h | ||
1720 | |||
1721 | ## end gnulib module warn-on-use | ||
1722 | |||
1271 | ## begin gnulib module wchar | 1723 | ## begin gnulib module wchar |
1272 | 1724 | ||
1273 | BUILT_SOURCES += $(WCHAR_H) | 1725 | BUILT_SOURCES += wchar.h |
1274 | 1726 | ||
1275 | # We need the following in order to create <wchar.h> when the system | 1727 | # We need the following in order to create <wchar.h> when the system |
1276 | # version does not work standalone. | 1728 | # version does not work standalone. |
1277 | wchar.h: wchar.in.h | 1729 | wchar.h: wchar.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) |
1278 | rm -f $@-t $@ | 1730 | $(AM_V_GEN)rm -f $@-t $@ && \ |
1279 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 1731 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
1280 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1732 | sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
1281 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1733 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
@@ -1316,9 +1768,11 @@ wchar.h: wchar.in.h | |||
1316 | -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \ | 1768 | -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \ |
1317 | -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \ | 1769 | -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \ |
1318 | -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ | 1770 | -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ |
1319 | -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ | 1771 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ |
1772 | -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ | ||
1773 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
1320 | < $(srcdir)/wchar.in.h; \ | 1774 | < $(srcdir)/wchar.in.h; \ |
1321 | } > $@-t | 1775 | } > $@-t && \ |
1322 | mv $@-t $@ | 1776 | mv $@-t $@ |
1323 | MOSTLYCLEANFILES += wchar.h wchar.h-t | 1777 | MOSTLYCLEANFILES += wchar.h wchar.h-t |
1324 | 1778 | ||
@@ -1337,22 +1791,25 @@ EXTRA_libgnu_a_SOURCES += wcrtomb.c | |||
1337 | 1791 | ||
1338 | ## begin gnulib module wctype | 1792 | ## begin gnulib module wctype |
1339 | 1793 | ||
1340 | BUILT_SOURCES += $(WCTYPE_H) | 1794 | BUILT_SOURCES += wctype.h |
1341 | 1795 | ||
1342 | # We need the following in order to create <wctype.h> when the system | 1796 | # We need the following in order to create <wctype.h> when the system |
1343 | # doesn't have one that works with the given compiler. | 1797 | # doesn't have one that works with the given compiler. |
1344 | wctype.h: wctype.in.h | 1798 | wctype.h: wctype.in.h $(CXXDEFS_H) $(WARN_ON_USE_H) |
1345 | rm -f $@-t $@ | 1799 | $(AM_V_GEN)rm -f $@-t $@ && \ |
1346 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ | 1800 | { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ |
1347 | sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ | 1801 | sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ |
1348 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ | 1802 | -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ |
1349 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ | 1803 | -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ |
1350 | -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ | 1804 | -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ |
1805 | -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \ | ||
1351 | -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ | 1806 | -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ |
1352 | -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ | 1807 | -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ |
1353 | -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \ | 1808 | -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \ |
1809 | -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ | ||
1810 | -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ | ||
1354 | < $(srcdir)/wctype.in.h; \ | 1811 | < $(srcdir)/wctype.in.h; \ |
1355 | } > $@-t | 1812 | } > $@-t && \ |
1356 | mv $@-t $@ | 1813 | mv $@-t $@ |
1357 | MOSTLYCLEANFILES += wctype.h wctype.h-t | 1814 | MOSTLYCLEANFILES += wctype.h wctype.h-t |
1358 | 1815 | ||
diff --git a/gl/alignof.h b/gl/alignof.h index 896382b0..240468c6 100644 --- a/gl/alignof.h +++ b/gl/alignof.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Determine alignment of types. | 1 | /* Determine alignment of types. |
2 | Copyright (C) 2003-2004, 2006, 2009 Free Software Foundation, Inc. | 2 | Copyright (C) 2003-2004, 2006, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -20,14 +20,34 @@ | |||
20 | 20 | ||
21 | #include <stddef.h> | 21 | #include <stddef.h> |
22 | 22 | ||
23 | /* Determine the alignment of a type at compile time. */ | 23 | /* Determine the alignment of a structure slot (field) of a given type, |
24 | #if defined __GNUC__ | 24 | at compile time. Note that the result depends on the ABI. |
25 | # define alignof __alignof__ | 25 | Note: The result cannot be used as a value for an 'enum' constant, |
26 | #elif defined __cplusplus | 26 | due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ |
27 | #if defined __cplusplus | ||
27 | template <class type> struct alignof_helper { char __slot1; type __slot2; }; | 28 | template <class type> struct alignof_helper { char __slot1; type __slot2; }; |
28 | # define alignof(type) offsetof (alignof_helper<type>, __slot2) | 29 | # define alignof_slot(type) offsetof (alignof_helper<type>, __slot2) |
30 | #else | ||
31 | # define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) | ||
32 | #endif | ||
33 | |||
34 | /* Determine the good alignment of a object of the given type at compile time. | ||
35 | Note that this is not necessarily the same as alignof_slot(type). | ||
36 | For example, with GNU C on x86 platforms: alignof_type(double) = 8, but | ||
37 | - when -malign-double is not specified: alignof_slot(double) = 4, | ||
38 | - when -malign-double is specified: alignof_slot(double) = 8. | ||
39 | Note: The result cannot be used as a value for an 'enum' constant, | ||
40 | due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ | ||
41 | #if defined __GNUC__ | ||
42 | # define alignof_type __alignof__ | ||
29 | #else | 43 | #else |
30 | # define alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) | 44 | # define alignof_type alignof_slot |
31 | #endif | 45 | #endif |
32 | 46 | ||
47 | /* alignof is an alias for alignof_slot semantics, since that's what most | ||
48 | callers need. | ||
49 | Note: The result cannot be used as a value for an 'enum' constant, | ||
50 | due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ | ||
51 | #define alignof alignof_slot | ||
52 | |||
33 | #endif /* _ALIGNOF_H */ | 53 | #endif /* _ALIGNOF_H */ |
diff --git a/gl/alloca.c b/gl/alloca.c index ff1cb7e9..75afdb96 100644 --- a/gl/alloca.c +++ b/gl/alloca.c | |||
@@ -81,37 +81,37 @@ long i00afunc (); | |||
81 | STACK_DIRECTION = 0 => direction of growth unknown */ | 81 | STACK_DIRECTION = 0 => direction of growth unknown */ |
82 | 82 | ||
83 | # ifndef STACK_DIRECTION | 83 | # ifndef STACK_DIRECTION |
84 | # define STACK_DIRECTION 0 /* Direction unknown. */ | 84 | # define STACK_DIRECTION 0 /* Direction unknown. */ |
85 | # endif | 85 | # endif |
86 | 86 | ||
87 | # if STACK_DIRECTION != 0 | 87 | # if STACK_DIRECTION != 0 |
88 | 88 | ||
89 | # define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ | 89 | # define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ |
90 | 90 | ||
91 | # else /* STACK_DIRECTION == 0; need run-time code. */ | 91 | # else /* STACK_DIRECTION == 0; need run-time code. */ |
92 | 92 | ||
93 | static int stack_dir; /* 1 or -1 once known. */ | 93 | static int stack_dir; /* 1 or -1 once known. */ |
94 | # define STACK_DIR stack_dir | 94 | # define STACK_DIR stack_dir |
95 | 95 | ||
96 | static void | 96 | static void |
97 | find_stack_direction (void) | 97 | find_stack_direction (void) |
98 | { | 98 | { |
99 | static char *addr = NULL; /* Address of first `dummy', once known. */ | 99 | static char *addr = NULL; /* Address of first `dummy', once known. */ |
100 | auto char dummy; /* To get stack address. */ | 100 | auto char dummy; /* To get stack address. */ |
101 | 101 | ||
102 | if (addr == NULL) | 102 | if (addr == NULL) |
103 | { /* Initial entry. */ | 103 | { /* Initial entry. */ |
104 | addr = ADDRESS_FUNCTION (dummy); | 104 | addr = ADDRESS_FUNCTION (dummy); |
105 | 105 | ||
106 | find_stack_direction (); /* Recurse once. */ | 106 | find_stack_direction (); /* Recurse once. */ |
107 | } | 107 | } |
108 | else | 108 | else |
109 | { | 109 | { |
110 | /* Second entry. */ | 110 | /* Second entry. */ |
111 | if (ADDRESS_FUNCTION (dummy) > addr) | 111 | if (ADDRESS_FUNCTION (dummy) > addr) |
112 | stack_dir = 1; /* Stack grew upward. */ | 112 | stack_dir = 1; /* Stack grew upward. */ |
113 | else | 113 | else |
114 | stack_dir = -1; /* Stack grew downward. */ | 114 | stack_dir = -1; /* Stack grew downward. */ |
115 | } | 115 | } |
116 | } | 116 | } |
117 | 117 | ||
@@ -124,21 +124,21 @@ find_stack_direction (void) | |||
124 | It is very important that sizeof(header) agree with malloc | 124 | It is very important that sizeof(header) agree with malloc |
125 | alignment chunk size. The following default should work okay. */ | 125 | alignment chunk size. The following default should work okay. */ |
126 | 126 | ||
127 | # ifndef ALIGN_SIZE | 127 | # ifndef ALIGN_SIZE |
128 | # define ALIGN_SIZE sizeof(double) | 128 | # define ALIGN_SIZE sizeof(double) |
129 | # endif | 129 | # endif |
130 | 130 | ||
131 | typedef union hdr | 131 | typedef union hdr |
132 | { | 132 | { |
133 | char align[ALIGN_SIZE]; /* To force sizeof(header). */ | 133 | char align[ALIGN_SIZE]; /* To force sizeof(header). */ |
134 | struct | 134 | struct |
135 | { | 135 | { |
136 | union hdr *next; /* For chaining headers. */ | 136 | union hdr *next; /* For chaining headers. */ |
137 | char *deep; /* For stack depth measure. */ | 137 | char *deep; /* For stack depth measure. */ |
138 | } h; | 138 | } h; |
139 | } header; | 139 | } header; |
140 | 140 | ||
141 | static header *last_alloca_header = NULL; /* -> last alloca header. */ | 141 | static header *last_alloca_header = NULL; /* -> last alloca header. */ |
142 | 142 | ||
143 | /* Return a pointer to at least SIZE bytes of storage, | 143 | /* Return a pointer to at least SIZE bytes of storage, |
144 | which will be automatically reclaimed upon exit from | 144 | which will be automatically reclaimed upon exit from |
@@ -150,11 +150,11 @@ static header *last_alloca_header = NULL; /* -> last alloca header. */ | |||
150 | void * | 150 | void * |
151 | alloca (size_t size) | 151 | alloca (size_t size) |
152 | { | 152 | { |
153 | auto char probe; /* Probes stack depth: */ | 153 | auto char probe; /* Probes stack depth: */ |
154 | register char *depth = ADDRESS_FUNCTION (probe); | 154 | register char *depth = ADDRESS_FUNCTION (probe); |
155 | 155 | ||
156 | # if STACK_DIRECTION == 0 | 156 | # if STACK_DIRECTION == 0 |
157 | if (STACK_DIR == 0) /* Unknown growth direction. */ | 157 | if (STACK_DIR == 0) /* Unknown growth direction. */ |
158 | find_stack_direction (); | 158 | find_stack_direction (); |
159 | # endif | 159 | # endif |
160 | 160 | ||
@@ -162,7 +162,7 @@ alloca (size_t size) | |||
162 | was allocated from deeper in the stack than currently. */ | 162 | was allocated from deeper in the stack than currently. */ |
163 | 163 | ||
164 | { | 164 | { |
165 | register header *hp; /* Traverses linked list. */ | 165 | register header *hp; /* Traverses linked list. */ |
166 | 166 | ||
167 | # ifdef emacs | 167 | # ifdef emacs |
168 | BLOCK_INPUT; | 168 | BLOCK_INPUT; |
@@ -170,18 +170,18 @@ alloca (size_t size) | |||
170 | 170 | ||
171 | for (hp = last_alloca_header; hp != NULL;) | 171 | for (hp = last_alloca_header; hp != NULL;) |
172 | if ((STACK_DIR > 0 && hp->h.deep > depth) | 172 | if ((STACK_DIR > 0 && hp->h.deep > depth) |
173 | || (STACK_DIR < 0 && hp->h.deep < depth)) | 173 | || (STACK_DIR < 0 && hp->h.deep < depth)) |
174 | { | 174 | { |
175 | register header *np = hp->h.next; | 175 | register header *np = hp->h.next; |
176 | 176 | ||
177 | free (hp); /* Collect garbage. */ | 177 | free (hp); /* Collect garbage. */ |
178 | 178 | ||
179 | hp = np; /* -> next header. */ | 179 | hp = np; /* -> next header. */ |
180 | } | 180 | } |
181 | else | 181 | else |
182 | break; /* Rest are not deeper. */ | 182 | break; /* Rest are not deeper. */ |
183 | 183 | ||
184 | last_alloca_header = hp; /* -> last valid storage. */ | 184 | last_alloca_header = hp; /* -> last valid storage. */ |
185 | 185 | ||
186 | # ifdef emacs | 186 | # ifdef emacs |
187 | UNBLOCK_INPUT; | 187 | UNBLOCK_INPUT; |
@@ -189,7 +189,7 @@ alloca (size_t size) | |||
189 | } | 189 | } |
190 | 190 | ||
191 | if (size == 0) | 191 | if (size == 0) |
192 | return NULL; /* No allocation required. */ | 192 | return NULL; /* No allocation required. */ |
193 | 193 | ||
194 | /* Allocate combined header + user data storage. */ | 194 | /* Allocate combined header + user data storage. */ |
195 | 195 | ||
@@ -229,10 +229,10 @@ alloca (size_t size) | |||
229 | /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ | 229 | /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ |
230 | struct stack_control_header | 230 | struct stack_control_header |
231 | { | 231 | { |
232 | long shgrow:32; /* Number of times stack has grown. */ | 232 | long shgrow:32; /* Number of times stack has grown. */ |
233 | long shaseg:32; /* Size of increments to stack. */ | 233 | long shaseg:32; /* Size of increments to stack. */ |
234 | long shhwm:32; /* High water mark of stack. */ | 234 | long shhwm:32; /* High water mark of stack. */ |
235 | long shsize:32; /* Current size of stack (all segments). */ | 235 | long shsize:32; /* Current size of stack (all segments). */ |
236 | }; | 236 | }; |
237 | 237 | ||
238 | /* The stack segment linkage control information occurs at | 238 | /* The stack segment linkage control information occurs at |
@@ -244,21 +244,21 @@ struct stack_control_header | |||
244 | 244 | ||
245 | struct stack_segment_linkage | 245 | struct stack_segment_linkage |
246 | { | 246 | { |
247 | long ss[0200]; /* 0200 overflow words. */ | 247 | long ss[0200]; /* 0200 overflow words. */ |
248 | long sssize:32; /* Number of words in this segment. */ | 248 | long sssize:32; /* Number of words in this segment. */ |
249 | long ssbase:32; /* Offset to stack base. */ | 249 | long ssbase:32; /* Offset to stack base. */ |
250 | long:32; | 250 | long:32; |
251 | long sspseg:32; /* Offset to linkage control of previous | 251 | long sspseg:32; /* Offset to linkage control of previous |
252 | segment of stack. */ | 252 | segment of stack. */ |
253 | long:32; | 253 | long:32; |
254 | long sstcpt:32; /* Pointer to task common address block. */ | 254 | long sstcpt:32; /* Pointer to task common address block. */ |
255 | long sscsnm; /* Private control structure number for | 255 | long sscsnm; /* Private control structure number for |
256 | microtasking. */ | 256 | microtasking. */ |
257 | long ssusr1; /* Reserved for user. */ | 257 | long ssusr1; /* Reserved for user. */ |
258 | long ssusr2; /* Reserved for user. */ | 258 | long ssusr2; /* Reserved for user. */ |
259 | long sstpid; /* Process ID for pid based multi-tasking. */ | 259 | long sstpid; /* Process ID for pid based multi-tasking. */ |
260 | long ssgvup; /* Pointer to multitasking thread giveup. */ | 260 | long ssgvup; /* Pointer to multitasking thread giveup. */ |
261 | long sscray[7]; /* Reserved for Cray Research. */ | 261 | long sscray[7]; /* Reserved for Cray Research. */ |
262 | long ssa0; | 262 | long ssa0; |
263 | long ssa1; | 263 | long ssa1; |
264 | long ssa2; | 264 | long ssa2; |
@@ -282,27 +282,27 @@ struct stack_segment_linkage | |||
282 | returned by the STKSTAT library routine. */ | 282 | returned by the STKSTAT library routine. */ |
283 | struct stk_stat | 283 | struct stk_stat |
284 | { | 284 | { |
285 | long now; /* Current total stack size. */ | 285 | long now; /* Current total stack size. */ |
286 | long maxc; /* Amount of contiguous space which would | 286 | long maxc; /* Amount of contiguous space which would |
287 | be required to satisfy the maximum | 287 | be required to satisfy the maximum |
288 | stack demand to date. */ | 288 | stack demand to date. */ |
289 | long high_water; /* Stack high-water mark. */ | 289 | long high_water; /* Stack high-water mark. */ |
290 | long overflows; /* Number of stack overflow ($STKOFEN) calls. */ | 290 | long overflows; /* Number of stack overflow ($STKOFEN) calls. */ |
291 | long hits; /* Number of internal buffer hits. */ | 291 | long hits; /* Number of internal buffer hits. */ |
292 | long extends; /* Number of block extensions. */ | 292 | long extends; /* Number of block extensions. */ |
293 | long stko_mallocs; /* Block allocations by $STKOFEN. */ | 293 | long stko_mallocs; /* Block allocations by $STKOFEN. */ |
294 | long underflows; /* Number of stack underflow calls ($STKRETN). */ | 294 | long underflows; /* Number of stack underflow calls ($STKRETN). */ |
295 | long stko_free; /* Number of deallocations by $STKRETN. */ | 295 | long stko_free; /* Number of deallocations by $STKRETN. */ |
296 | long stkm_free; /* Number of deallocations by $STKMRET. */ | 296 | long stkm_free; /* Number of deallocations by $STKMRET. */ |
297 | long segments; /* Current number of stack segments. */ | 297 | long segments; /* Current number of stack segments. */ |
298 | long maxs; /* Maximum number of stack segments so far. */ | 298 | long maxs; /* Maximum number of stack segments so far. */ |
299 | long pad_size; /* Stack pad size. */ | 299 | long pad_size; /* Stack pad size. */ |
300 | long current_address; /* Current stack segment address. */ | 300 | long current_address; /* Current stack segment address. */ |
301 | long current_size; /* Current stack segment size. This | 301 | long current_size; /* Current stack segment size. This |
302 | number is actually corrupted by STKSTAT to | 302 | number is actually corrupted by STKSTAT to |
303 | include the fifteen word trailer area. */ | 303 | include the fifteen word trailer area. */ |
304 | long initial_address; /* Address of initial segment. */ | 304 | long initial_address; /* Address of initial segment. */ |
305 | long initial_size; /* Size of initial segment. */ | 305 | long initial_size; /* Size of initial segment. */ |
306 | }; | 306 | }; |
307 | 307 | ||
308 | /* The following structure describes the data structure which trails | 308 | /* The following structure describes the data structure which trails |
@@ -311,13 +311,13 @@ struct stk_stat | |||
311 | 311 | ||
312 | struct stk_trailer | 312 | struct stk_trailer |
313 | { | 313 | { |
314 | long this_address; /* Address of this block. */ | 314 | long this_address; /* Address of this block. */ |
315 | long this_size; /* Size of this block (does not include | 315 | long this_size; /* Size of this block (does not include |
316 | this trailer). */ | 316 | this trailer). */ |
317 | long unknown2; | 317 | long unknown2; |
318 | long unknown3; | 318 | long unknown3; |
319 | long link; /* Address of trailer block of previous | 319 | long link; /* Address of trailer block of previous |
320 | segment. */ | 320 | segment. */ |
321 | long unknown5; | 321 | long unknown5; |
322 | long unknown6; | 322 | long unknown6; |
323 | long unknown7; | 323 | long unknown7; |
@@ -355,8 +355,8 @@ i00afunc (long *address) | |||
355 | /* Set up the iteration. */ | 355 | /* Set up the iteration. */ |
356 | 356 | ||
357 | trailer = (struct stk_trailer *) (status.current_address | 357 | trailer = (struct stk_trailer *) (status.current_address |
358 | + status.current_size | 358 | + status.current_size |
359 | - 15); | 359 | - 15); |
360 | 360 | ||
361 | /* There must be at least one stack segment. Therefore it is | 361 | /* There must be at least one stack segment. Therefore it is |
362 | a fatal error if "trailer" is null. */ | 362 | a fatal error if "trailer" is null. */ |
@@ -371,10 +371,10 @@ i00afunc (long *address) | |||
371 | block = (long *) trailer->this_address; | 371 | block = (long *) trailer->this_address; |
372 | size = trailer->this_size; | 372 | size = trailer->this_size; |
373 | if (block == 0 || size == 0) | 373 | if (block == 0 || size == 0) |
374 | abort (); | 374 | abort (); |
375 | trailer = (struct stk_trailer *) trailer->link; | 375 | trailer = (struct stk_trailer *) trailer->link; |
376 | if ((block <= address) && (address < (block + size))) | 376 | if ((block <= address) && (address < (block + size))) |
377 | break; | 377 | break; |
378 | } | 378 | } |
379 | 379 | ||
380 | /* Set the result to the offset in this segment and add the sizes | 380 | /* Set the result to the offset in this segment and add the sizes |
@@ -390,7 +390,7 @@ i00afunc (long *address) | |||
390 | do | 390 | do |
391 | { | 391 | { |
392 | if (trailer->this_size <= 0) | 392 | if (trailer->this_size <= 0) |
393 | abort (); | 393 | abort (); |
394 | result += trailer->this_size; | 394 | result += trailer->this_size; |
395 | trailer = (struct stk_trailer *) trailer->link; | 395 | trailer = (struct stk_trailer *) trailer->link; |
396 | } | 396 | } |
@@ -453,7 +453,7 @@ i00afunc (long address) | |||
453 | fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); | 453 | fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); |
454 | # endif | 454 | # endif |
455 | if (pseg == 0) | 455 | if (pseg == 0) |
456 | break; | 456 | break; |
457 | stkl = stkl - pseg; | 457 | stkl = stkl - pseg; |
458 | ssptr = (struct stack_segment_linkage *) stkl; | 458 | ssptr = (struct stack_segment_linkage *) stkl; |
459 | size = ssptr->sssize; | 459 | size = ssptr->sssize; |
diff --git a/gl/alloca.in.h b/gl/alloca.in.h index 6269607a..44f20b7a 100644 --- a/gl/alloca.in.h +++ b/gl/alloca.in.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* Memory allocation on the stack. | 1 | /* Memory allocation on the stack. |
2 | 2 | ||
3 | Copyright (C) 1995, 1999, 2001-2004, 2006-2008 Free Software | 3 | Copyright (C) 1995, 1999, 2001-2004, 2006-2010 Free Software Foundation, |
4 | Foundation, Inc. | 4 | Inc. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms of the GNU General Public License as published | 7 | under the terms of the GNU General Public License as published |
diff --git a/gl/arpa_inet.in.h b/gl/arpa_inet.in.h index ac933991..f7c3bc72 100644 --- a/gl/arpa_inet.in.h +++ b/gl/arpa_inet.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A GNU-like <arpa/inet.h>. | 1 | /* A GNU-like <arpa/inet.h>. |
2 | 2 | ||
3 | Copyright (C) 2005-2006, 2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2008-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -18,16 +18,19 @@ | |||
18 | 18 | ||
19 | #ifndef _GL_ARPA_INET_H | 19 | #ifndef _GL_ARPA_INET_H |
20 | 20 | ||
21 | #if __GNUC__ >= 3 | ||
22 | @PRAGMA_SYSTEM_HEADER@ | ||
23 | #endif | ||
24 | |||
21 | /* Gnulib's sys/socket.h is responsible for pulling in winsock2.h etc | 25 | /* Gnulib's sys/socket.h is responsible for pulling in winsock2.h etc |
22 | under MinGW. */ | 26 | under MinGW. |
23 | #include <sys/socket.h> | 27 | But avoid namespace pollution on glibc systems. */ |
28 | #ifndef __GLIBC__ | ||
29 | # include <sys/socket.h> | ||
30 | #endif | ||
24 | 31 | ||
25 | #if @HAVE_ARPA_INET_H@ | 32 | #if @HAVE_ARPA_INET_H@ |
26 | 33 | ||
27 | # if __GNUC__ >= 3 | ||
28 | @PRAGMA_SYSTEM_HEADER@ | ||
29 | # endif | ||
30 | |||
31 | /* The include_next requires a split double-inclusion guard. */ | 34 | /* The include_next requires a split double-inclusion guard. */ |
32 | # @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@ | 35 | # @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@ |
33 | 36 | ||
@@ -36,7 +39,9 @@ | |||
36 | #ifndef _GL_ARPA_INET_H | 39 | #ifndef _GL_ARPA_INET_H |
37 | #define _GL_ARPA_INET_H | 40 | #define _GL_ARPA_INET_H |
38 | 41 | ||
39 | /* The definition of GL_LINK_WARNING is copied here. */ | 42 | /* The definition of _GL_ARG_NONNULL is copied here. */ |
43 | |||
44 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
40 | 45 | ||
41 | #ifdef __cplusplus | 46 | #ifdef __cplusplus |
42 | extern "C" { | 47 | extern "C" { |
@@ -60,26 +65,28 @@ extern "C" { | |||
60 | For more details, see the POSIX:2001 specification | 65 | For more details, see the POSIX:2001 specification |
61 | <http://www.opengroup.org/susv3xsh/inet_ntop.html>. */ | 66 | <http://www.opengroup.org/susv3xsh/inet_ntop.html>. */ |
62 | extern const char *inet_ntop (int af, const void *restrict src, | 67 | extern const char *inet_ntop (int af, const void *restrict src, |
63 | char *restrict dst, socklen_t cnt); | 68 | char *restrict dst, socklen_t cnt) |
69 | _GL_ARG_NONNULL ((2, 3)); | ||
64 | # endif | 70 | # endif |
65 | #elif defined GNULIB_POSIXCHECK | 71 | #elif defined GNULIB_POSIXCHECK |
66 | # undef inet_ntop | 72 | # undef inet_ntop |
67 | # define inet_ntop(af,src,dst,cnt) \ | 73 | # if HAVE_RAW_DECL_INET_NTOP |
68 | (GL_LINK_WARNING ("inet_ntop is unportable - " \ | 74 | _GL_WARN_ON_USE (inet_ntop, "inet_ntop is unportable - " |
69 | "use gnulib module inet_ntop for portability"), \ | 75 | "use gnulib module inet_ntop for portability"); |
70 | inet_ntop (af, src, dst, cnt)) | 76 | # endif |
71 | #endif | 77 | #endif |
72 | 78 | ||
73 | #if @GNULIB_INET_PTON@ | 79 | #if @GNULIB_INET_PTON@ |
74 | # if !@HAVE_DECL_INET_PTON@ | 80 | # if !@HAVE_DECL_INET_PTON@ |
75 | extern int inet_pton (int af, const char *restrict src, void *restrict dst); | 81 | extern int inet_pton (int af, const char *restrict src, void *restrict dst) |
82 | _GL_ARG_NONNULL ((2, 3)); | ||
76 | # endif | 83 | # endif |
77 | #elif defined GNULIB_POSIXCHECK | 84 | #elif defined GNULIB_POSIXCHECK |
78 | # undef inet_pton | 85 | # undef inet_pton |
79 | # define inet_pton(af,src,dst) \ | 86 | # if HAVE_RAW_DECL_INET_PTON |
80 | (GL_LINK_WARNING ("inet_pton is unportable - " \ | 87 | _GL_WARN_ON_USE (inet_pton, "inet_pton is unportable - " |
81 | "use gnulib module inet_pton for portability"), \ | 88 | "use gnulib module inet_pton for portability"); |
82 | inet_pton (af, src, dst)) | 89 | # endif |
83 | #endif | 90 | #endif |
84 | 91 | ||
85 | #ifdef __cplusplus | 92 | #ifdef __cplusplus |
diff --git a/gl/asnprintf.c b/gl/asnprintf.c index bf2abf3c..3bd2229d 100644 --- a/gl/asnprintf.c +++ b/gl/asnprintf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Formatted output to strings. | 1 | /* Formatted output to strings. |
2 | Copyright (C) 1999, 2002, 2006 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002, 2006, 2009, 2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/asprintf.c b/gl/asprintf.c index 0bbecf81..8273ecf9 100644 --- a/gl/asprintf.c +++ b/gl/asprintf.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* Formatted output to strings. | 1 | /* Formatted output to strings. |
2 | Copyright (C) 1999, 2002, 2006-2007 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation, |
3 | Inc. | ||
3 | 4 | ||
4 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/base64.c b/gl/base64.c index 42ccc9c2..d99e175f 100644 --- a/gl/base64.c +++ b/gl/base64.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* base64.c -- Encode binary data using printable characters. | 1 | /* base64.c -- Encode binary data using printable characters. |
2 | Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006 Free Software | 2 | Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006, 2009, 2010 Free Software |
3 | Foundation, Inc. | 3 | Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -67,7 +67,7 @@ to_uchar (char ch) | |||
67 | terminate the output buffer. */ | 67 | terminate the output buffer. */ |
68 | void | 68 | void |
69 | base64_encode (const char *restrict in, size_t inlen, | 69 | base64_encode (const char *restrict in, size_t inlen, |
70 | char *restrict out, size_t outlen) | 70 | char *restrict out, size_t outlen) |
71 | { | 71 | { |
72 | static const char b64str[64] = | 72 | static const char b64str[64] = |
73 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | 73 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
@@ -76,27 +76,27 @@ base64_encode (const char *restrict in, size_t inlen, | |||
76 | { | 76 | { |
77 | *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; | 77 | *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; |
78 | if (!--outlen) | 78 | if (!--outlen) |
79 | break; | 79 | break; |
80 | *out++ = b64str[((to_uchar (in[0]) << 4) | 80 | *out++ = b64str[((to_uchar (in[0]) << 4) |
81 | + (--inlen ? to_uchar (in[1]) >> 4 : 0)) | 81 | + (--inlen ? to_uchar (in[1]) >> 4 : 0)) |
82 | & 0x3f]; | 82 | & 0x3f]; |
83 | if (!--outlen) | 83 | if (!--outlen) |
84 | break; | 84 | break; |
85 | *out++ = | 85 | *out++ = |
86 | (inlen | 86 | (inlen |
87 | ? b64str[((to_uchar (in[1]) << 2) | 87 | ? b64str[((to_uchar (in[1]) << 2) |
88 | + (--inlen ? to_uchar (in[2]) >> 6 : 0)) | 88 | + (--inlen ? to_uchar (in[2]) >> 6 : 0)) |
89 | & 0x3f] | 89 | & 0x3f] |
90 | : '='); | 90 | : '='); |
91 | if (!--outlen) | 91 | if (!--outlen) |
92 | break; | 92 | break; |
93 | *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; | 93 | *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; |
94 | if (!--outlen) | 94 | if (!--outlen) |
95 | break; | 95 | break; |
96 | if (inlen) | 96 | if (inlen) |
97 | inlen--; | 97 | inlen--; |
98 | if (inlen) | 98 | if (inlen) |
99 | in += 3; | 99 | in += 3; |
100 | } | 100 | } |
101 | 101 | ||
102 | if (outlen) | 102 | if (outlen) |
@@ -153,71 +153,71 @@ base64_encode_alloc (const char *in, size_t inlen, char **out) | |||
153 | 153 | ||
154 | IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" | 154 | IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" |
155 | as the formal parameter rather than "x". */ | 155 | as the formal parameter rather than "x". */ |
156 | #define B64(_) \ | 156 | #define B64(_) \ |
157 | ((_) == 'A' ? 0 \ | 157 | ((_) == 'A' ? 0 \ |
158 | : (_) == 'B' ? 1 \ | 158 | : (_) == 'B' ? 1 \ |
159 | : (_) == 'C' ? 2 \ | 159 | : (_) == 'C' ? 2 \ |
160 | : (_) == 'D' ? 3 \ | 160 | : (_) == 'D' ? 3 \ |
161 | : (_) == 'E' ? 4 \ | 161 | : (_) == 'E' ? 4 \ |
162 | : (_) == 'F' ? 5 \ | 162 | : (_) == 'F' ? 5 \ |
163 | : (_) == 'G' ? 6 \ | 163 | : (_) == 'G' ? 6 \ |
164 | : (_) == 'H' ? 7 \ | 164 | : (_) == 'H' ? 7 \ |
165 | : (_) == 'I' ? 8 \ | 165 | : (_) == 'I' ? 8 \ |
166 | : (_) == 'J' ? 9 \ | 166 | : (_) == 'J' ? 9 \ |
167 | : (_) == 'K' ? 10 \ | 167 | : (_) == 'K' ? 10 \ |
168 | : (_) == 'L' ? 11 \ | 168 | : (_) == 'L' ? 11 \ |
169 | : (_) == 'M' ? 12 \ | 169 | : (_) == 'M' ? 12 \ |
170 | : (_) == 'N' ? 13 \ | 170 | : (_) == 'N' ? 13 \ |
171 | : (_) == 'O' ? 14 \ | 171 | : (_) == 'O' ? 14 \ |
172 | : (_) == 'P' ? 15 \ | 172 | : (_) == 'P' ? 15 \ |
173 | : (_) == 'Q' ? 16 \ | 173 | : (_) == 'Q' ? 16 \ |
174 | : (_) == 'R' ? 17 \ | 174 | : (_) == 'R' ? 17 \ |
175 | : (_) == 'S' ? 18 \ | 175 | : (_) == 'S' ? 18 \ |
176 | : (_) == 'T' ? 19 \ | 176 | : (_) == 'T' ? 19 \ |
177 | : (_) == 'U' ? 20 \ | 177 | : (_) == 'U' ? 20 \ |
178 | : (_) == 'V' ? 21 \ | 178 | : (_) == 'V' ? 21 \ |
179 | : (_) == 'W' ? 22 \ | 179 | : (_) == 'W' ? 22 \ |
180 | : (_) == 'X' ? 23 \ | 180 | : (_) == 'X' ? 23 \ |
181 | : (_) == 'Y' ? 24 \ | 181 | : (_) == 'Y' ? 24 \ |
182 | : (_) == 'Z' ? 25 \ | 182 | : (_) == 'Z' ? 25 \ |
183 | : (_) == 'a' ? 26 \ | 183 | : (_) == 'a' ? 26 \ |
184 | : (_) == 'b' ? 27 \ | 184 | : (_) == 'b' ? 27 \ |
185 | : (_) == 'c' ? 28 \ | 185 | : (_) == 'c' ? 28 \ |
186 | : (_) == 'd' ? 29 \ | 186 | : (_) == 'd' ? 29 \ |
187 | : (_) == 'e' ? 30 \ | 187 | : (_) == 'e' ? 30 \ |
188 | : (_) == 'f' ? 31 \ | 188 | : (_) == 'f' ? 31 \ |
189 | : (_) == 'g' ? 32 \ | 189 | : (_) == 'g' ? 32 \ |
190 | : (_) == 'h' ? 33 \ | 190 | : (_) == 'h' ? 33 \ |
191 | : (_) == 'i' ? 34 \ | 191 | : (_) == 'i' ? 34 \ |
192 | : (_) == 'j' ? 35 \ | 192 | : (_) == 'j' ? 35 \ |
193 | : (_) == 'k' ? 36 \ | 193 | : (_) == 'k' ? 36 \ |
194 | : (_) == 'l' ? 37 \ | 194 | : (_) == 'l' ? 37 \ |
195 | : (_) == 'm' ? 38 \ | 195 | : (_) == 'm' ? 38 \ |
196 | : (_) == 'n' ? 39 \ | 196 | : (_) == 'n' ? 39 \ |
197 | : (_) == 'o' ? 40 \ | 197 | : (_) == 'o' ? 40 \ |
198 | : (_) == 'p' ? 41 \ | 198 | : (_) == 'p' ? 41 \ |
199 | : (_) == 'q' ? 42 \ | 199 | : (_) == 'q' ? 42 \ |
200 | : (_) == 'r' ? 43 \ | 200 | : (_) == 'r' ? 43 \ |
201 | : (_) == 's' ? 44 \ | 201 | : (_) == 's' ? 44 \ |
202 | : (_) == 't' ? 45 \ | 202 | : (_) == 't' ? 45 \ |
203 | : (_) == 'u' ? 46 \ | 203 | : (_) == 'u' ? 46 \ |
204 | : (_) == 'v' ? 47 \ | 204 | : (_) == 'v' ? 47 \ |
205 | : (_) == 'w' ? 48 \ | 205 | : (_) == 'w' ? 48 \ |
206 | : (_) == 'x' ? 49 \ | 206 | : (_) == 'x' ? 49 \ |
207 | : (_) == 'y' ? 50 \ | 207 | : (_) == 'y' ? 50 \ |
208 | : (_) == 'z' ? 51 \ | 208 | : (_) == 'z' ? 51 \ |
209 | : (_) == '0' ? 52 \ | 209 | : (_) == '0' ? 52 \ |
210 | : (_) == '1' ? 53 \ | 210 | : (_) == '1' ? 53 \ |
211 | : (_) == '2' ? 54 \ | 211 | : (_) == '2' ? 54 \ |
212 | : (_) == '3' ? 55 \ | 212 | : (_) == '3' ? 55 \ |
213 | : (_) == '4' ? 56 \ | 213 | : (_) == '4' ? 56 \ |
214 | : (_) == '5' ? 57 \ | 214 | : (_) == '5' ? 57 \ |
215 | : (_) == '6' ? 58 \ | 215 | : (_) == '6' ? 58 \ |
216 | : (_) == '7' ? 59 \ | 216 | : (_) == '7' ? 59 \ |
217 | : (_) == '8' ? 60 \ | 217 | : (_) == '8' ? 60 \ |
218 | : (_) == '9' ? 61 \ | 218 | : (_) == '9' ? 61 \ |
219 | : (_) == '+' ? 62 \ | 219 | : (_) == '+' ? 62 \ |
220 | : (_) == '/' ? 63 \ | 220 | : (_) == '/' ? 63 \ |
221 | : -1) | 221 | : -1) |
222 | 222 | ||
223 | static const signed char b64[0x100] = { | 223 | static const signed char b64[0x100] = { |
@@ -328,12 +328,12 @@ get_4 (struct base64_decode_context *ctx, | |||
328 | { | 328 | { |
329 | char const *t = *in; | 329 | char const *t = *in; |
330 | if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL) | 330 | if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL) |
331 | { | 331 | { |
332 | /* This is the common case: no newline. */ | 332 | /* This is the common case: no newline. */ |
333 | *in += 4; | 333 | *in += 4; |
334 | *n_non_newline = 4; | 334 | *n_non_newline = 4; |
335 | return (char *) t; | 335 | return (char *) t; |
336 | } | 336 | } |
337 | } | 337 | } |
338 | 338 | ||
339 | { | 339 | { |
@@ -341,13 +341,13 @@ get_4 (struct base64_decode_context *ctx, | |||
341 | char const *p = *in; | 341 | char const *p = *in; |
342 | while (p < in_end) | 342 | while (p < in_end) |
343 | { | 343 | { |
344 | char c = *p++; | 344 | char c = *p++; |
345 | if (c != '\n') | 345 | if (c != '\n') |
346 | { | 346 | { |
347 | ctx->buf[ctx->i++] = c; | 347 | ctx->buf[ctx->i++] = c; |
348 | if (ctx->i == 4) | 348 | if (ctx->i == 4) |
349 | break; | 349 | break; |
350 | } | 350 | } |
351 | } | 351 | } |
352 | 352 | ||
353 | *in = p; | 353 | *in = p; |
@@ -356,12 +356,12 @@ get_4 (struct base64_decode_context *ctx, | |||
356 | } | 356 | } |
357 | } | 357 | } |
358 | 358 | ||
359 | #define return_false \ | 359 | #define return_false \ |
360 | do \ | 360 | do \ |
361 | { \ | 361 | { \ |
362 | *outp = out; \ | 362 | *outp = out; \ |
363 | return false; \ | 363 | return false; \ |
364 | } \ | 364 | } \ |
365 | while (false) | 365 | while (false) |
366 | 366 | ||
367 | /* Decode up to four bytes of base64-encoded data, IN, of length INLEN | 367 | /* Decode up to four bytes of base64-encoded data, IN, of length INLEN |
@@ -372,7 +372,7 @@ get_4 (struct base64_decode_context *ctx, | |||
372 | *OUTLEN to reflect the number of bytes remaining in *OUT. */ | 372 | *OUTLEN to reflect the number of bytes remaining in *OUT. */ |
373 | static inline bool | 373 | static inline bool |
374 | decode_4 (char const *restrict in, size_t inlen, | 374 | decode_4 (char const *restrict in, size_t inlen, |
375 | char *restrict *outp, size_t *outleft) | 375 | char *restrict *outp, size_t *outleft) |
376 | { | 376 | { |
377 | char *out = *outp; | 377 | char *out = *outp; |
378 | if (inlen < 2) | 378 | if (inlen < 2) |
@@ -384,7 +384,7 @@ decode_4 (char const *restrict in, size_t inlen, | |||
384 | if (*outleft) | 384 | if (*outleft) |
385 | { | 385 | { |
386 | *out++ = ((b64[to_uchar (in[0])] << 2) | 386 | *out++ = ((b64[to_uchar (in[0])] << 2) |
387 | | (b64[to_uchar (in[1])] >> 4)); | 387 | | (b64[to_uchar (in[1])] >> 4)); |
388 | --*outleft; | 388 | --*outleft; |
389 | } | 389 | } |
390 | 390 | ||
@@ -394,43 +394,43 @@ decode_4 (char const *restrict in, size_t inlen, | |||
394 | if (in[2] == '=') | 394 | if (in[2] == '=') |
395 | { | 395 | { |
396 | if (inlen != 4) | 396 | if (inlen != 4) |
397 | return_false; | 397 | return_false; |
398 | 398 | ||
399 | if (in[3] != '=') | 399 | if (in[3] != '=') |
400 | return_false; | 400 | return_false; |
401 | } | 401 | } |
402 | else | 402 | else |
403 | { | 403 | { |
404 | if (!isbase64 (in[2])) | 404 | if (!isbase64 (in[2])) |
405 | return_false; | 405 | return_false; |
406 | 406 | ||
407 | if (*outleft) | 407 | if (*outleft) |
408 | { | 408 | { |
409 | *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) | 409 | *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) |
410 | | (b64[to_uchar (in[2])] >> 2)); | 410 | | (b64[to_uchar (in[2])] >> 2)); |
411 | --*outleft; | 411 | --*outleft; |
412 | } | 412 | } |
413 | 413 | ||
414 | if (inlen == 3) | 414 | if (inlen == 3) |
415 | return_false; | 415 | return_false; |
416 | 416 | ||
417 | if (in[3] == '=') | 417 | if (in[3] == '=') |
418 | { | 418 | { |
419 | if (inlen != 4) | 419 | if (inlen != 4) |
420 | return_false; | 420 | return_false; |
421 | } | 421 | } |
422 | else | 422 | else |
423 | { | 423 | { |
424 | if (!isbase64 (in[3])) | 424 | if (!isbase64 (in[3])) |
425 | return_false; | 425 | return_false; |
426 | 426 | ||
427 | if (*outleft) | 427 | if (*outleft) |
428 | { | 428 | { |
429 | *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) | 429 | *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) |
430 | | b64[to_uchar (in[3])]); | 430 | | b64[to_uchar (in[3])]); |
431 | --*outleft; | 431 | --*outleft; |
432 | } | 432 | } |
433 | } | 433 | } |
434 | } | 434 | } |
435 | 435 | ||
436 | *outp = out; | 436 | *outp = out; |
@@ -457,8 +457,8 @@ decode_4 (char const *restrict in, size_t inlen, | |||
457 | 457 | ||
458 | bool | 458 | bool |
459 | base64_decode_ctx (struct base64_decode_context *ctx, | 459 | base64_decode_ctx (struct base64_decode_context *ctx, |
460 | const char *restrict in, size_t inlen, | 460 | const char *restrict in, size_t inlen, |
461 | char *restrict out, size_t *outlen) | 461 | char *restrict out, size_t *outlen) |
462 | { | 462 | { |
463 | size_t outleft = *outlen; | 463 | size_t outleft = *outlen; |
464 | bool ignore_newlines = ctx != NULL; | 464 | bool ignore_newlines = ctx != NULL; |
@@ -476,57 +476,57 @@ base64_decode_ctx (struct base64_decode_context *ctx, | |||
476 | { | 476 | { |
477 | size_t outleft_save = outleft; | 477 | size_t outleft_save = outleft; |
478 | if (ctx_i == 0 && !flush_ctx) | 478 | if (ctx_i == 0 && !flush_ctx) |
479 | { | 479 | { |
480 | while (true) | 480 | while (true) |
481 | { | 481 | { |
482 | /* Save a copy of outleft, in case we need to re-parse this | 482 | /* Save a copy of outleft, in case we need to re-parse this |
483 | block of four bytes. */ | 483 | block of four bytes. */ |
484 | outleft_save = outleft; | 484 | outleft_save = outleft; |
485 | if (!decode_4 (in, inlen, &out, &outleft)) | 485 | if (!decode_4 (in, inlen, &out, &outleft)) |
486 | break; | 486 | break; |
487 | 487 | ||
488 | in += 4; | 488 | in += 4; |
489 | inlen -= 4; | 489 | inlen -= 4; |
490 | } | 490 | } |
491 | } | 491 | } |
492 | 492 | ||
493 | if (inlen == 0 && !flush_ctx) | 493 | if (inlen == 0 && !flush_ctx) |
494 | break; | 494 | break; |
495 | 495 | ||
496 | /* Handle the common case of 72-byte wrapped lines. | 496 | /* Handle the common case of 72-byte wrapped lines. |
497 | This also handles any other multiple-of-4-byte wrapping. */ | 497 | This also handles any other multiple-of-4-byte wrapping. */ |
498 | if (inlen && *in == '\n' && ignore_newlines) | 498 | if (inlen && *in == '\n' && ignore_newlines) |
499 | { | 499 | { |
500 | ++in; | 500 | ++in; |
501 | --inlen; | 501 | --inlen; |
502 | continue; | 502 | continue; |
503 | } | 503 | } |
504 | 504 | ||
505 | /* Restore OUT and OUTLEFT. */ | 505 | /* Restore OUT and OUTLEFT. */ |
506 | out -= outleft_save - outleft; | 506 | out -= outleft_save - outleft; |
507 | outleft = outleft_save; | 507 | outleft = outleft_save; |
508 | 508 | ||
509 | { | 509 | { |
510 | char const *in_end = in + inlen; | 510 | char const *in_end = in + inlen; |
511 | char const *non_nl; | 511 | char const *non_nl; |
512 | 512 | ||
513 | if (ignore_newlines) | 513 | if (ignore_newlines) |
514 | non_nl = get_4 (ctx, &in, in_end, &inlen); | 514 | non_nl = get_4 (ctx, &in, in_end, &inlen); |
515 | else | 515 | else |
516 | non_nl = in; /* Might have nl in this case. */ | 516 | non_nl = in; /* Might have nl in this case. */ |
517 | 517 | ||
518 | /* If the input is empty or consists solely of newlines (0 non-newlines), | 518 | /* If the input is empty or consists solely of newlines (0 non-newlines), |
519 | then we're done. Likewise if there are fewer than 4 bytes when not | 519 | then we're done. Likewise if there are fewer than 4 bytes when not |
520 | flushing context and not treating newlines as garbage. */ | 520 | flushing context and not treating newlines as garbage. */ |
521 | if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines)) | 521 | if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines)) |
522 | { | 522 | { |
523 | inlen = 0; | 523 | inlen = 0; |
524 | break; | 524 | break; |
525 | } | 525 | } |
526 | if (!decode_4 (non_nl, inlen, &out, &outleft)) | 526 | if (!decode_4 (non_nl, inlen, &out, &outleft)) |
527 | break; | 527 | break; |
528 | 528 | ||
529 | inlen = in_end - in; | 529 | inlen = in_end - in; |
530 | } | 530 | } |
531 | } | 531 | } |
532 | 532 | ||
@@ -548,8 +548,8 @@ base64_decode_ctx (struct base64_decode_context *ctx, | |||
548 | undefined. */ | 548 | undefined. */ |
549 | bool | 549 | bool |
550 | base64_decode_alloc_ctx (struct base64_decode_context *ctx, | 550 | base64_decode_alloc_ctx (struct base64_decode_context *ctx, |
551 | const char *in, size_t inlen, char **out, | 551 | const char *in, size_t inlen, char **out, |
552 | size_t *outlen) | 552 | size_t *outlen) |
553 | { | 553 | { |
554 | /* This may allocate a few bytes too many, depending on input, | 554 | /* This may allocate a few bytes too many, depending on input, |
555 | but it's not worth the extra CPU time to compute the exact size. | 555 | but it's not worth the extra CPU time to compute the exact size. |
diff --git a/gl/base64.h b/gl/base64.h index 63b6abcb..2be394bd 100644 --- a/gl/base64.h +++ b/gl/base64.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* base64.h -- Encode binary data using printable characters. | 1 | /* base64.h -- Encode binary data using printable characters. |
2 | Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. | 2 | Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc. |
3 | Written by Simon Josefsson. | 3 | Written by Simon Josefsson. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -38,24 +38,24 @@ struct base64_decode_context | |||
38 | extern bool isbase64 (char ch); | 38 | extern bool isbase64 (char ch); |
39 | 39 | ||
40 | extern void base64_encode (const char *restrict in, size_t inlen, | 40 | extern void base64_encode (const char *restrict in, size_t inlen, |
41 | char *restrict out, size_t outlen); | 41 | char *restrict out, size_t outlen); |
42 | 42 | ||
43 | extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); | 43 | extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); |
44 | 44 | ||
45 | extern void base64_decode_ctx_init (struct base64_decode_context *ctx); | 45 | extern void base64_decode_ctx_init (struct base64_decode_context *ctx); |
46 | 46 | ||
47 | extern bool base64_decode_ctx (struct base64_decode_context *ctx, | 47 | extern bool base64_decode_ctx (struct base64_decode_context *ctx, |
48 | const char *restrict in, size_t inlen, | 48 | const char *restrict in, size_t inlen, |
49 | char *restrict out, size_t *outlen); | 49 | char *restrict out, size_t *outlen); |
50 | 50 | ||
51 | extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx, | 51 | extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx, |
52 | const char *in, size_t inlen, | 52 | const char *in, size_t inlen, |
53 | char **out, size_t *outlen); | 53 | char **out, size_t *outlen); |
54 | 54 | ||
55 | #define base64_decode(in, inlen, out, outlen) \ | 55 | #define base64_decode(in, inlen, out, outlen) \ |
56 | base64_decode_ctx (NULL, in, inlen, out, outlen) | 56 | base64_decode_ctx (NULL, in, inlen, out, outlen) |
57 | 57 | ||
58 | #define base64_decode_alloc(in, inlen, out, outlen) \ | 58 | #define base64_decode_alloc(in, inlen, out, outlen) \ |
59 | base64_decode_alloc_ctx (NULL, in, inlen, out, outlen) | 59 | base64_decode_alloc_ctx (NULL, in, inlen, out, outlen) |
60 | 60 | ||
61 | #endif /* BASE64_H */ | 61 | #endif /* BASE64_H */ |
diff --git a/gl/basename-lgpl.c b/gl/basename-lgpl.c new file mode 100644 index 00000000..a35ff01c --- /dev/null +++ b/gl/basename-lgpl.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* basename.c -- return the last element in a file name | ||
2 | |||
3 | Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2010 Free Software | ||
4 | Foundation, Inc. | ||
5 | |||
6 | This program is free software: you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 3 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program 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 | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
18 | |||
19 | #include <config.h> | ||
20 | |||
21 | #include "dirname.h" | ||
22 | |||
23 | #include <string.h> | ||
24 | |||
25 | /* Return the address of the last file name component of NAME. If | ||
26 | NAME has no relative file name components because it is a file | ||
27 | system root, return the empty string. */ | ||
28 | |||
29 | char * | ||
30 | last_component (char const *name) | ||
31 | { | ||
32 | char const *base = name + FILE_SYSTEM_PREFIX_LEN (name); | ||
33 | char const *p; | ||
34 | bool saw_slash = false; | ||
35 | |||
36 | while (ISSLASH (*base)) | ||
37 | base++; | ||
38 | |||
39 | for (p = base; *p; p++) | ||
40 | { | ||
41 | if (ISSLASH (*p)) | ||
42 | saw_slash = true; | ||
43 | else if (saw_slash) | ||
44 | { | ||
45 | base = p; | ||
46 | saw_slash = false; | ||
47 | } | ||
48 | } | ||
49 | |||
50 | return (char *) base; | ||
51 | } | ||
52 | |||
53 | /* Return the length of the basename NAME. Typically NAME is the | ||
54 | value returned by base_name or last_component. Act like strlen | ||
55 | (NAME), except omit all trailing slashes. */ | ||
56 | |||
57 | size_t | ||
58 | base_len (char const *name) | ||
59 | { | ||
60 | size_t len; | ||
61 | size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name); | ||
62 | |||
63 | for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) | ||
64 | continue; | ||
65 | |||
66 | if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1 | ||
67 | && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2]) | ||
68 | return 2; | ||
69 | |||
70 | if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len | ||
71 | && len == prefix_len && ISSLASH (name[prefix_len])) | ||
72 | return prefix_len + 1; | ||
73 | |||
74 | return len; | ||
75 | } | ||
diff --git a/gl/basename.c b/gl/basename.c index 426ed40f..24da93ac 100644 --- a/gl/basename.c +++ b/gl/basename.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* basename.c -- return the last element in a file name | 1 | /* basename.c -- return the last element in a file name |
2 | 2 | ||
3 | Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006 Free | 3 | Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2010 Free Software |
4 | Software Foundation, Inc. | 4 | Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -24,52 +24,6 @@ | |||
24 | #include "xalloc.h" | 24 | #include "xalloc.h" |
25 | #include "xstrndup.h" | 25 | #include "xstrndup.h" |
26 | 26 | ||
27 | /* Return the address of the last file name component of NAME. If | ||
28 | NAME has no relative file name components because it is a file | ||
29 | system root, return the empty string. */ | ||
30 | |||
31 | char * | ||
32 | last_component (char const *name) | ||
33 | { | ||
34 | char const *base = name + FILE_SYSTEM_PREFIX_LEN (name); | ||
35 | char const *p; | ||
36 | bool saw_slash = false; | ||
37 | |||
38 | while (ISSLASH (*base)) | ||
39 | base++; | ||
40 | |||
41 | for (p = base; *p; p++) | ||
42 | { | ||
43 | if (ISSLASH (*p)) | ||
44 | saw_slash = true; | ||
45 | else if (saw_slash) | ||
46 | { | ||
47 | base = p; | ||
48 | saw_slash = false; | ||
49 | } | ||
50 | } | ||
51 | |||
52 | return (char *) base; | ||
53 | } | ||
54 | |||
55 | |||
56 | /* In general, we can't use the builtin `basename' function if available, | ||
57 | since it has different meanings in different environments. | ||
58 | In some environments the builtin `basename' modifies its argument. | ||
59 | |||
60 | Return the last file name component of NAME, allocated with | ||
61 | xmalloc. On systems with drive letters, a leading "./" | ||
62 | distinguishes relative names that would otherwise look like a drive | ||
63 | letter. Unlike POSIX basename(), NAME cannot be NULL, | ||
64 | base_name("") returns "", and the first trailing slash is not | ||
65 | stripped. | ||
66 | |||
67 | If lstat (NAME) would succeed, then { chdir (dir_name (NAME)); | ||
68 | lstat (base_name (NAME)); } will access the same file. Likewise, | ||
69 | if the sequence { chdir (dir_name (NAME)); | ||
70 | rename (base_name (NAME), "foo"); } succeeds, you have renamed NAME | ||
71 | to "foo" in the same directory NAME was in. */ | ||
72 | |||
73 | char * | 27 | char * |
74 | base_name (char const *name) | 28 | base_name (char const *name) |
75 | { | 29 | { |
@@ -102,27 +56,3 @@ base_name (char const *name) | |||
102 | /* Finally, copy the basename. */ | 56 | /* Finally, copy the basename. */ |
103 | return xstrndup (base, length); | 57 | return xstrndup (base, length); |
104 | } | 58 | } |
105 | |||
106 | /* Return the length of the basename NAME. Typically NAME is the | ||
107 | value returned by base_name or last_component. Act like strlen | ||
108 | (NAME), except omit all trailing slashes. */ | ||
109 | |||
110 | size_t | ||
111 | base_len (char const *name) | ||
112 | { | ||
113 | size_t len; | ||
114 | size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name); | ||
115 | |||
116 | for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) | ||
117 | continue; | ||
118 | |||
119 | if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1 | ||
120 | && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2]) | ||
121 | return 2; | ||
122 | |||
123 | if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len | ||
124 | && len == prefix_len && ISSLASH (name[prefix_len])) | ||
125 | return prefix_len + 1; | ||
126 | |||
127 | return len; | ||
128 | } | ||
@@ -1,5 +1,5 @@ | |||
1 | /* Convert unibyte character to wide character. | 1 | /* Convert unibyte character to wide character. |
2 | Copyright (C) 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2008, 2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2008. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
@@ -21,6 +21,7 @@ | |||
21 | #include <wchar.h> | 21 | #include <wchar.h> |
22 | 22 | ||
23 | #include <stdio.h> | 23 | #include <stdio.h> |
24 | #include <stdlib.h> | ||
24 | 25 | ||
25 | wint_t | 26 | wint_t |
26 | btowc (int c) | 27 | btowc (int c) |
@@ -32,7 +33,7 @@ btowc (int c) | |||
32 | 33 | ||
33 | buf[0] = c; | 34 | buf[0] = c; |
34 | if (mbtowc (&wc, buf, 1) >= 0) | 35 | if (mbtowc (&wc, buf, 1) >= 0) |
35 | return wc; | 36 | return wc; |
36 | } | 37 | } |
37 | return WEOF; | 38 | return WEOF; |
38 | } | 39 | } |
diff --git a/gl/c-strtod.c b/gl/c-strtod.c index 51e996e5..38d472bd 100644 --- a/gl/c-strtod.c +++ b/gl/c-strtod.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Convert string to double, using the C locale. | 1 | /* Convert string to double, using the C locale. |
2 | 2 | ||
3 | Copyright (C) 2003, 2004, 2006, 2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2003-2004, 2006, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -73,7 +73,7 @@ C_STRTOD (char const *nptr, char **endptr) | |||
73 | if (!locale) | 73 | if (!locale) |
74 | { | 74 | { |
75 | if (endptr) | 75 | if (endptr) |
76 | *endptr = (char *) nptr; | 76 | *endptr = (char *) nptr; |
77 | return 0; /* errno is set here */ | 77 | return 0; /* errno is set here */ |
78 | } | 78 | } |
79 | 79 | ||
@@ -87,11 +87,11 @@ C_STRTOD (char const *nptr, char **endptr) | |||
87 | { | 87 | { |
88 | saved_locale = strdup (saved_locale); | 88 | saved_locale = strdup (saved_locale); |
89 | if (saved_locale == NULL) | 89 | if (saved_locale == NULL) |
90 | { | 90 | { |
91 | if (endptr) | 91 | if (endptr) |
92 | *endptr = (char *) nptr; | 92 | *endptr = (char *) nptr; |
93 | return 0; /* errno is set here */ | 93 | return 0; /* errno is set here */ |
94 | } | 94 | } |
95 | setlocale (LC_NUMERIC, "C"); | 95 | setlocale (LC_NUMERIC, "C"); |
96 | } | 96 | } |
97 | 97 | ||
diff --git a/gl/c-strtod.h b/gl/c-strtod.h index 2b3f8473..c2adf1e4 100644 --- a/gl/c-strtod.h +++ b/gl/c-strtod.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Convert string to double, using the C locale. | 1 | /* Convert string to double, using the C locale. |
2 | 2 | ||
3 | Copyright (C) 2003-2004, 2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2003-2004, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/cloexec.c b/gl/cloexec.c index ff8105ba..2d12efef 100644 --- a/gl/cloexec.c +++ b/gl/cloexec.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* closexec.c - set or clear the close-on-exec descriptor flag | 1 | /* closexec.c - set or clear the close-on-exec descriptor flag |
2 | 2 | ||
3 | Copyright (C) 1991, 2004, 2005, 2006 Free Software Foundation, Inc. | 3 | Copyright (C) 1991, 2004-2006, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -21,21 +21,24 @@ | |||
21 | 21 | ||
22 | #include "cloexec.h" | 22 | #include "cloexec.h" |
23 | 23 | ||
24 | #include <unistd.h> | 24 | #include <errno.h> |
25 | #include <fcntl.h> | 25 | #include <fcntl.h> |
26 | 26 | #include <unistd.h> | |
27 | #ifndef FD_CLOEXEC | ||
28 | # define FD_CLOEXEC 1 | ||
29 | #endif | ||
30 | 27 | ||
31 | /* Set the `FD_CLOEXEC' flag of DESC if VALUE is true, | 28 | /* Set the `FD_CLOEXEC' flag of DESC if VALUE is true, |
32 | or clear the flag if VALUE is false. | 29 | or clear the flag if VALUE is false. |
33 | Return 0 on success, or -1 on error with `errno' set. */ | 30 | Return 0 on success, or -1 on error with `errno' set. |
31 | |||
32 | Note that on MingW, this function does NOT protect DESC from being | ||
33 | inherited into spawned children. Instead, either use dup_cloexec | ||
34 | followed by closing the original DESC, or use interfaces such as | ||
35 | open or pipe2 that accept flags like O_CLOEXEC to create DESC | ||
36 | non-inheritable in the first place. */ | ||
34 | 37 | ||
35 | int | 38 | int |
36 | set_cloexec_flag (int desc, bool value) | 39 | set_cloexec_flag (int desc, bool value) |
37 | { | 40 | { |
38 | #if defined F_GETFD && defined F_SETFD | 41 | #ifdef F_SETFD |
39 | 42 | ||
40 | int flags = fcntl (desc, F_GETFD, 0); | 43 | int flags = fcntl (desc, F_GETFD, 0); |
41 | 44 | ||
@@ -44,15 +47,37 @@ set_cloexec_flag (int desc, bool value) | |||
44 | int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC); | 47 | int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC); |
45 | 48 | ||
46 | if (flags == newflags | 49 | if (flags == newflags |
47 | || fcntl (desc, F_SETFD, newflags) != -1) | 50 | || fcntl (desc, F_SETFD, newflags) != -1) |
48 | return 0; | 51 | return 0; |
49 | } | 52 | } |
50 | 53 | ||
51 | return -1; | 54 | return -1; |
52 | 55 | ||
53 | #else | 56 | #else /* !F_SETFD */ |
57 | |||
58 | /* Use dup2 to reject invalid file descriptors; the cloexec flag | ||
59 | will be unaffected. */ | ||
60 | if (desc < 0) | ||
61 | { | ||
62 | errno = EBADF; | ||
63 | return -1; | ||
64 | } | ||
65 | if (dup2 (desc, desc) < 0) | ||
66 | /* errno is EBADF here. */ | ||
67 | return -1; | ||
54 | 68 | ||
69 | /* There is nothing we can do on this kind of platform. Punt. */ | ||
55 | return 0; | 70 | return 0; |
71 | #endif /* !F_SETFD */ | ||
72 | } | ||
73 | |||
56 | 74 | ||
57 | #endif | 75 | /* Duplicates a file handle FD, while marking the copy to be closed |
76 | prior to exec or spawn. Returns -1 and sets errno if FD could not | ||
77 | be duplicated. */ | ||
78 | |||
79 | int | ||
80 | dup_cloexec (int fd) | ||
81 | { | ||
82 | return fcntl (fd, F_DUPFD_CLOEXEC, 0); | ||
58 | } | 83 | } |
diff --git a/gl/cloexec.h b/gl/cloexec.h index c25921d6..e3a2cb85 100644 --- a/gl/cloexec.h +++ b/gl/cloexec.h | |||
@@ -1,2 +1,38 @@ | |||
1 | /* closexec.c - set or clear the close-on-exec descriptor flag | ||
2 | |||
3 | Copyright (C) 2004, 2009-2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | |||
18 | */ | ||
19 | |||
1 | #include <stdbool.h> | 20 | #include <stdbool.h> |
21 | |||
22 | /* Set the `FD_CLOEXEC' flag of DESC if VALUE is true, | ||
23 | or clear the flag if VALUE is false. | ||
24 | Return 0 on success, or -1 on error with `errno' set. | ||
25 | |||
26 | Note that on MingW, this function does NOT protect DESC from being | ||
27 | inherited into spawned children. Instead, either use dup_cloexec | ||
28 | followed by closing the original DESC, or use interfaces such as | ||
29 | open or pipe2 that accept flags like O_CLOEXEC to create DESC | ||
30 | non-inheritable in the first place. */ | ||
31 | |||
2 | int set_cloexec_flag (int desc, bool value); | 32 | int set_cloexec_flag (int desc, bool value); |
33 | |||
34 | /* Duplicates a file handle FD, while marking the copy to be closed | ||
35 | prior to exec or spawn. Returns -1 and sets errno if FD could not | ||
36 | be duplicated. */ | ||
37 | |||
38 | int dup_cloexec (int fd); | ||
diff --git a/gl/close-hook.c b/gl/close-hook.c new file mode 100644 index 00000000..0253c4dc --- /dev/null +++ b/gl/close-hook.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* Hook for making the close() function extensible. | ||
2 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | Written by Bruno Haible <bruno@clisp.org>, 2009. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify it | ||
6 | under the terms of the GNU General Public License as published | ||
7 | by the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | #include <config.h> | ||
19 | |||
20 | /* Specification. */ | ||
21 | #include "close-hook.h" | ||
22 | |||
23 | #include <stdlib.h> | ||
24 | #include <unistd.h> | ||
25 | |||
26 | #undef close | ||
27 | |||
28 | |||
29 | /* Currently, this entire code is only needed for the handling of sockets | ||
30 | on native Windows platforms. */ | ||
31 | #if WINDOWS_SOCKETS | ||
32 | |||
33 | /* The first and last link in the doubly linked list. | ||
34 | Initially the list is empty. */ | ||
35 | static struct close_hook anchor = { &anchor, &anchor, NULL }; | ||
36 | |||
37 | int | ||
38 | execute_close_hooks (int fd, const struct close_hook *remaining_list) | ||
39 | { | ||
40 | if (remaining_list == &anchor) | ||
41 | /* End of list reached. */ | ||
42 | return close (fd); | ||
43 | else | ||
44 | return remaining_list->private_fn (fd, remaining_list->private_next); | ||
45 | } | ||
46 | |||
47 | int | ||
48 | execute_all_close_hooks (int fd) | ||
49 | { | ||
50 | return execute_close_hooks (fd, anchor.private_next); | ||
51 | } | ||
52 | |||
53 | void | ||
54 | register_close_hook (close_hook_fn hook, struct close_hook *link) | ||
55 | { | ||
56 | if (link->private_next == NULL && link->private_prev == NULL) | ||
57 | { | ||
58 | /* Add the link to the doubly linked list. */ | ||
59 | link->private_next = anchor.private_next; | ||
60 | link->private_prev = &anchor; | ||
61 | link->private_fn = hook; | ||
62 | anchor.private_next->private_prev = link; | ||
63 | anchor.private_next = link; | ||
64 | } | ||
65 | else | ||
66 | { | ||
67 | /* The link is already in use. */ | ||
68 | if (link->private_fn != hook) | ||
69 | abort (); | ||
70 | } | ||
71 | } | ||
72 | |||
73 | void | ||
74 | unregister_close_hook (struct close_hook *link) | ||
75 | { | ||
76 | struct close_hook *next = link->private_next; | ||
77 | struct close_hook *prev = link->private_prev; | ||
78 | |||
79 | if (next != NULL && prev != NULL) | ||
80 | { | ||
81 | /* The link is in use. Remove it from the doubly linked list. */ | ||
82 | prev->private_next = next; | ||
83 | next->private_prev = prev; | ||
84 | /* Clear the link, to mark it unused. */ | ||
85 | link->private_next = NULL; | ||
86 | link->private_prev = NULL; | ||
87 | link->private_fn = NULL; | ||
88 | } | ||
89 | } | ||
90 | |||
91 | #endif | ||
diff --git a/gl/close-hook.h b/gl/close-hook.h new file mode 100644 index 00000000..1e115516 --- /dev/null +++ b/gl/close-hook.h | |||
@@ -0,0 +1,72 @@ | |||
1 | /* Hook for making the close() function extensible. | ||
2 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published | ||
6 | by the Free Software Foundation; either version 3 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | Lesser General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
16 | |||
17 | |||
18 | #ifndef CLOSE_HOOK_H | ||
19 | #define CLOSE_HOOK_H | ||
20 | |||
21 | #ifdef __cplusplus | ||
22 | extern "C" { | ||
23 | #endif | ||
24 | |||
25 | |||
26 | /* Currently, this entire code is only needed for the handling of sockets | ||
27 | on native Windows platforms. */ | ||
28 | #if WINDOWS_SOCKETS | ||
29 | |||
30 | |||
31 | /* An element of the list of close hooks. | ||
32 | The fields of this structure are considered private. */ | ||
33 | struct close_hook | ||
34 | { | ||
35 | /* Doubly linked list. */ | ||
36 | struct close_hook *private_next; | ||
37 | struct close_hook *private_prev; | ||
38 | /* Function that treats the types of FD that it knows about and calls | ||
39 | execute_close_hooks (FD, REMAINING_LIST) as a fallback. */ | ||
40 | int (*private_fn) (int fd, const struct close_hook *remaining_list); | ||
41 | }; | ||
42 | |||
43 | /* This type of function closes FD, applying special knowledge for the FD | ||
44 | types it knows about, and calls execute_close_hooks (FD, REMAINING_LIST) | ||
45 | for the other FD types. */ | ||
46 | typedef int (*close_hook_fn) (int fd, const struct close_hook *remaining_list); | ||
47 | |||
48 | /* Execute the close hooks in REMAINING_LIST. | ||
49 | Return 0 or -1, like close() would do. */ | ||
50 | extern int execute_close_hooks (int fd, const struct close_hook *remaining_list); | ||
51 | |||
52 | /* Execute all close hooks. | ||
53 | Return 0 or -1, like close() would do. */ | ||
54 | extern int execute_all_close_hooks (int fd); | ||
55 | |||
56 | /* Add a function to the list of close hooks. | ||
57 | The LINK variable points to a piece of memory which is guaranteed to be | ||
58 | accessible until the corresponding call to unregister_close_hook. */ | ||
59 | extern void register_close_hook (close_hook_fn hook, struct close_hook *link); | ||
60 | |||
61 | /* Removes a function from the list of close hooks. */ | ||
62 | extern void unregister_close_hook (struct close_hook *link); | ||
63 | |||
64 | |||
65 | #endif | ||
66 | |||
67 | |||
68 | #ifdef __cplusplus | ||
69 | } | ||
70 | #endif | ||
71 | |||
72 | #endif /* CLOSE_HOOK_H */ | ||
diff --git a/gl/config.charset b/gl/config.charset index 7f912120..2959df89 100755..100644 --- a/gl/config.charset +++ b/gl/config.charset | |||
@@ -1,7 +1,7 @@ | |||
1 | #! /bin/sh | 1 | #! /bin/sh |
2 | # Output a system dependent table of character encoding aliases. | 2 | # Output a system dependent table of character encoding aliases. |
3 | # | 3 | # |
4 | # Copyright (C) 2000-2004, 2006-2009 Free Software Foundation, Inc. | 4 | # Copyright (C) 2000-2004, 2006-2010 Free Software Foundation, Inc. |
5 | # | 5 | # |
6 | # This program is free software; you can redistribute it and/or modify | 6 | # This program is free software; you can redistribute it and/or modify |
7 | # it under the terms of the GNU General Public License as published by | 7 | # it under the terms of the GNU General Public License as published by |
@@ -123,561 +123,561 @@ echo "# It was automatically generated from config.charset." | |||
123 | # List of references, updated during installation: | 123 | # List of references, updated during installation: |
124 | echo "# Packages using this file: " | 124 | echo "# Packages using this file: " |
125 | case "$os" in | 125 | case "$os" in |
126 | linux-gnulibc1*) | 126 | linux-gnulibc1*) |
127 | # Linux libc5 doesn't have nl_langinfo(CODESET); therefore | 127 | # Linux libc5 doesn't have nl_langinfo(CODESET); therefore |
128 | # localcharset.c falls back to using the full locale name | 128 | # localcharset.c falls back to using the full locale name |
129 | # from the environment variables. | 129 | # from the environment variables. |
130 | echo "C ASCII" | 130 | echo "C ASCII" |
131 | echo "POSIX ASCII" | 131 | echo "POSIX ASCII" |
132 | for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ | 132 | for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ |
133 | en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ | 133 | en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ |
134 | en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ | 134 | en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ |
135 | es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ | 135 | es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ |
136 | et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ | 136 | et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ |
137 | fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ | 137 | fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ |
138 | it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ | 138 | it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ |
139 | sv_FI sv_SE; do | 139 | sv_FI sv_SE; do |
140 | echo "$l ISO-8859-1" | 140 | echo "$l ISO-8859-1" |
141 | echo "$l.iso-8859-1 ISO-8859-1" | 141 | echo "$l.iso-8859-1 ISO-8859-1" |
142 | echo "$l.iso-8859-15 ISO-8859-15" | 142 | echo "$l.iso-8859-15 ISO-8859-15" |
143 | echo "$l.iso-8859-15@euro ISO-8859-15" | 143 | echo "$l.iso-8859-15@euro ISO-8859-15" |
144 | echo "$l@euro ISO-8859-15" | 144 | echo "$l@euro ISO-8859-15" |
145 | echo "$l.cp-437 CP437" | 145 | echo "$l.cp-437 CP437" |
146 | echo "$l.cp-850 CP850" | 146 | echo "$l.cp-850 CP850" |
147 | echo "$l.cp-1252 CP1252" | 147 | echo "$l.cp-1252 CP1252" |
148 | echo "$l.cp-1252@euro CP1252" | 148 | echo "$l.cp-1252@euro CP1252" |
149 | #echo "$l.atari-st ATARI-ST" # not a commonly used encoding | 149 | #echo "$l.atari-st ATARI-ST" # not a commonly used encoding |
150 | echo "$l.utf-8 UTF-8" | 150 | echo "$l.utf-8 UTF-8" |
151 | echo "$l.utf-8@euro UTF-8" | 151 | echo "$l.utf-8@euro UTF-8" |
152 | done | 152 | done |
153 | for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ | 153 | for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ |
154 | sl_SI sr sr_CS sr_YU; do | 154 | sl_SI sr sr_CS sr_YU; do |
155 | echo "$l ISO-8859-2" | 155 | echo "$l ISO-8859-2" |
156 | echo "$l.iso-8859-2 ISO-8859-2" | 156 | echo "$l.iso-8859-2 ISO-8859-2" |
157 | echo "$l.cp-852 CP852" | 157 | echo "$l.cp-852 CP852" |
158 | echo "$l.cp-1250 CP1250" | 158 | echo "$l.cp-1250 CP1250" |
159 | echo "$l.utf-8 UTF-8" | 159 | echo "$l.utf-8 UTF-8" |
160 | done | 160 | done |
161 | for l in mk mk_MK ru ru_RU; do | 161 | for l in mk mk_MK ru ru_RU; do |
162 | echo "$l ISO-8859-5" | 162 | echo "$l ISO-8859-5" |
163 | echo "$l.iso-8859-5 ISO-8859-5" | 163 | echo "$l.iso-8859-5 ISO-8859-5" |
164 | echo "$l.koi8-r KOI8-R" | 164 | echo "$l.koi8-r KOI8-R" |
165 | echo "$l.cp-866 CP866" | 165 | echo "$l.cp-866 CP866" |
166 | echo "$l.cp-1251 CP1251" | 166 | echo "$l.cp-1251 CP1251" |
167 | echo "$l.utf-8 UTF-8" | 167 | echo "$l.utf-8 UTF-8" |
168 | done | 168 | done |
169 | for l in ar ar_SA; do | 169 | for l in ar ar_SA; do |
170 | echo "$l ISO-8859-6" | 170 | echo "$l ISO-8859-6" |
171 | echo "$l.iso-8859-6 ISO-8859-6" | 171 | echo "$l.iso-8859-6 ISO-8859-6" |
172 | echo "$l.cp-864 CP864" | 172 | echo "$l.cp-864 CP864" |
173 | #echo "$l.cp-868 CP868" # not a commonly used encoding | 173 | #echo "$l.cp-868 CP868" # not a commonly used encoding |
174 | echo "$l.cp-1256 CP1256" | 174 | echo "$l.cp-1256 CP1256" |
175 | echo "$l.utf-8 UTF-8" | 175 | echo "$l.utf-8 UTF-8" |
176 | done | 176 | done |
177 | for l in el el_GR gr gr_GR; do | 177 | for l in el el_GR gr gr_GR; do |
178 | echo "$l ISO-8859-7" | 178 | echo "$l ISO-8859-7" |
179 | echo "$l.iso-8859-7 ISO-8859-7" | 179 | echo "$l.iso-8859-7 ISO-8859-7" |
180 | echo "$l.cp-869 CP869" | 180 | echo "$l.cp-869 CP869" |
181 | echo "$l.cp-1253 CP1253" | 181 | echo "$l.cp-1253 CP1253" |
182 | echo "$l.cp-1253@euro CP1253" | 182 | echo "$l.cp-1253@euro CP1253" |
183 | echo "$l.utf-8 UTF-8" | 183 | echo "$l.utf-8 UTF-8" |
184 | echo "$l.utf-8@euro UTF-8" | 184 | echo "$l.utf-8@euro UTF-8" |
185 | done | 185 | done |
186 | for l in he he_IL iw iw_IL; do | 186 | for l in he he_IL iw iw_IL; do |
187 | echo "$l ISO-8859-8" | 187 | echo "$l ISO-8859-8" |
188 | echo "$l.iso-8859-8 ISO-8859-8" | 188 | echo "$l.iso-8859-8 ISO-8859-8" |
189 | echo "$l.cp-862 CP862" | 189 | echo "$l.cp-862 CP862" |
190 | echo "$l.cp-1255 CP1255" | 190 | echo "$l.cp-1255 CP1255" |
191 | echo "$l.utf-8 UTF-8" | 191 | echo "$l.utf-8 UTF-8" |
192 | done | 192 | done |
193 | for l in tr tr_TR; do | 193 | for l in tr tr_TR; do |
194 | echo "$l ISO-8859-9" | 194 | echo "$l ISO-8859-9" |
195 | echo "$l.iso-8859-9 ISO-8859-9" | 195 | echo "$l.iso-8859-9 ISO-8859-9" |
196 | echo "$l.cp-857 CP857" | 196 | echo "$l.cp-857 CP857" |
197 | echo "$l.cp-1254 CP1254" | 197 | echo "$l.cp-1254 CP1254" |
198 | echo "$l.utf-8 UTF-8" | 198 | echo "$l.utf-8 UTF-8" |
199 | done | 199 | done |
200 | for l in lt lt_LT lv lv_LV; do | 200 | for l in lt lt_LT lv lv_LV; do |
201 | #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name | 201 | #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name |
202 | echo "$l ISO-8859-13" | 202 | echo "$l ISO-8859-13" |
203 | done | 203 | done |
204 | for l in ru_UA uk uk_UA; do | 204 | for l in ru_UA uk uk_UA; do |
205 | echo "$l KOI8-U" | 205 | echo "$l KOI8-U" |
206 | done | 206 | done |
207 | for l in zh zh_CN; do | 207 | for l in zh zh_CN; do |
208 | #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name | 208 | #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name |
209 | echo "$l GB2312" | 209 | echo "$l GB2312" |
210 | done | 210 | done |
211 | for l in ja ja_JP ja_JP.EUC; do | 211 | for l in ja ja_JP ja_JP.EUC; do |
212 | echo "$l EUC-JP" | 212 | echo "$l EUC-JP" |
213 | done | 213 | done |
214 | for l in ko ko_KR; do | 214 | for l in ko ko_KR; do |
215 | echo "$l EUC-KR" | 215 | echo "$l EUC-KR" |
216 | done | 216 | done |
217 | for l in th th_TH; do | 217 | for l in th th_TH; do |
218 | echo "$l TIS-620" | 218 | echo "$l TIS-620" |
219 | done | 219 | done |
220 | for l in fa fa_IR; do | 220 | for l in fa fa_IR; do |
221 | #echo "$l ISIRI-3342" # a broken encoding | 221 | #echo "$l ISIRI-3342" # a broken encoding |
222 | echo "$l.utf-8 UTF-8" | 222 | echo "$l.utf-8 UTF-8" |
223 | done | 223 | done |
224 | ;; | 224 | ;; |
225 | linux* | *-gnu*) | 225 | linux* | *-gnu*) |
226 | # With glibc-2.1 or newer, we don't need any canonicalization, | 226 | # With glibc-2.1 or newer, we don't need any canonicalization, |
227 | # because glibc has iconv and both glibc and libiconv support all | 227 | # because glibc has iconv and both glibc and libiconv support all |
228 | # GNU canonical names directly. Therefore, the Makefile does not | 228 | # GNU canonical names directly. Therefore, the Makefile does not |
229 | # need to install the alias file at all. | 229 | # need to install the alias file at all. |
230 | # The following applies only to glibc-2.0.x and older libcs. | 230 | # The following applies only to glibc-2.0.x and older libcs. |
231 | echo "ISO_646.IRV:1983 ASCII" | 231 | echo "ISO_646.IRV:1983 ASCII" |
232 | ;; | 232 | ;; |
233 | aix*) | 233 | aix*) |
234 | echo "ISO8859-1 ISO-8859-1" | 234 | echo "ISO8859-1 ISO-8859-1" |
235 | echo "ISO8859-2 ISO-8859-2" | 235 | echo "ISO8859-2 ISO-8859-2" |
236 | echo "ISO8859-5 ISO-8859-5" | 236 | echo "ISO8859-5 ISO-8859-5" |
237 | echo "ISO8859-6 ISO-8859-6" | 237 | echo "ISO8859-6 ISO-8859-6" |
238 | echo "ISO8859-7 ISO-8859-7" | 238 | echo "ISO8859-7 ISO-8859-7" |
239 | echo "ISO8859-8 ISO-8859-8" | 239 | echo "ISO8859-8 ISO-8859-8" |
240 | echo "ISO8859-9 ISO-8859-9" | 240 | echo "ISO8859-9 ISO-8859-9" |
241 | echo "ISO8859-15 ISO-8859-15" | 241 | echo "ISO8859-15 ISO-8859-15" |
242 | echo "IBM-850 CP850" | 242 | echo "IBM-850 CP850" |
243 | echo "IBM-856 CP856" | 243 | echo "IBM-856 CP856" |
244 | echo "IBM-921 ISO-8859-13" | 244 | echo "IBM-921 ISO-8859-13" |
245 | echo "IBM-922 CP922" | 245 | echo "IBM-922 CP922" |
246 | echo "IBM-932 CP932" | 246 | echo "IBM-932 CP932" |
247 | echo "IBM-943 CP943" | 247 | echo "IBM-943 CP943" |
248 | echo "IBM-1046 CP1046" | 248 | echo "IBM-1046 CP1046" |
249 | echo "IBM-1124 CP1124" | 249 | echo "IBM-1124 CP1124" |
250 | echo "IBM-1129 CP1129" | 250 | echo "IBM-1129 CP1129" |
251 | echo "IBM-1252 CP1252" | 251 | echo "IBM-1252 CP1252" |
252 | echo "IBM-eucCN GB2312" | 252 | echo "IBM-eucCN GB2312" |
253 | echo "IBM-eucJP EUC-JP" | 253 | echo "IBM-eucJP EUC-JP" |
254 | echo "IBM-eucKR EUC-KR" | 254 | echo "IBM-eucKR EUC-KR" |
255 | echo "IBM-eucTW EUC-TW" | 255 | echo "IBM-eucTW EUC-TW" |
256 | echo "big5 BIG5" | 256 | echo "big5 BIG5" |
257 | echo "GBK GBK" | 257 | echo "GBK GBK" |
258 | echo "TIS-620 TIS-620" | 258 | echo "TIS-620 TIS-620" |
259 | echo "UTF-8 UTF-8" | 259 | echo "UTF-8 UTF-8" |
260 | ;; | 260 | ;; |
261 | hpux*) | 261 | hpux*) |
262 | echo "iso88591 ISO-8859-1" | 262 | echo "iso88591 ISO-8859-1" |
263 | echo "iso88592 ISO-8859-2" | 263 | echo "iso88592 ISO-8859-2" |
264 | echo "iso88595 ISO-8859-5" | 264 | echo "iso88595 ISO-8859-5" |
265 | echo "iso88596 ISO-8859-6" | 265 | echo "iso88596 ISO-8859-6" |
266 | echo "iso88597 ISO-8859-7" | 266 | echo "iso88597 ISO-8859-7" |
267 | echo "iso88598 ISO-8859-8" | 267 | echo "iso88598 ISO-8859-8" |
268 | echo "iso88599 ISO-8859-9" | 268 | echo "iso88599 ISO-8859-9" |
269 | echo "iso885915 ISO-8859-15" | 269 | echo "iso885915 ISO-8859-15" |
270 | echo "roman8 HP-ROMAN8" | 270 | echo "roman8 HP-ROMAN8" |
271 | echo "arabic8 HP-ARABIC8" | 271 | echo "arabic8 HP-ARABIC8" |
272 | echo "greek8 HP-GREEK8" | 272 | echo "greek8 HP-GREEK8" |
273 | echo "hebrew8 HP-HEBREW8" | 273 | echo "hebrew8 HP-HEBREW8" |
274 | echo "turkish8 HP-TURKISH8" | 274 | echo "turkish8 HP-TURKISH8" |
275 | echo "kana8 HP-KANA8" | 275 | echo "kana8 HP-KANA8" |
276 | echo "tis620 TIS-620" | 276 | echo "tis620 TIS-620" |
277 | echo "big5 BIG5" | 277 | echo "big5 BIG5" |
278 | echo "eucJP EUC-JP" | 278 | echo "eucJP EUC-JP" |
279 | echo "eucKR EUC-KR" | 279 | echo "eucKR EUC-KR" |
280 | echo "eucTW EUC-TW" | 280 | echo "eucTW EUC-TW" |
281 | echo "hp15CN GB2312" | 281 | echo "hp15CN GB2312" |
282 | #echo "ccdc ?" # what is this? | 282 | #echo "ccdc ?" # what is this? |
283 | echo "SJIS SHIFT_JIS" | 283 | echo "SJIS SHIFT_JIS" |
284 | echo "utf8 UTF-8" | 284 | echo "utf8 UTF-8" |
285 | ;; | 285 | ;; |
286 | irix*) | 286 | irix*) |
287 | echo "ISO8859-1 ISO-8859-1" | 287 | echo "ISO8859-1 ISO-8859-1" |
288 | echo "ISO8859-2 ISO-8859-2" | 288 | echo "ISO8859-2 ISO-8859-2" |
289 | echo "ISO8859-5 ISO-8859-5" | 289 | echo "ISO8859-5 ISO-8859-5" |
290 | echo "ISO8859-7 ISO-8859-7" | 290 | echo "ISO8859-7 ISO-8859-7" |
291 | echo "ISO8859-9 ISO-8859-9" | 291 | echo "ISO8859-9 ISO-8859-9" |
292 | echo "eucCN GB2312" | 292 | echo "eucCN GB2312" |
293 | echo "eucJP EUC-JP" | 293 | echo "eucJP EUC-JP" |
294 | echo "eucKR EUC-KR" | 294 | echo "eucKR EUC-KR" |
295 | echo "eucTW EUC-TW" | 295 | echo "eucTW EUC-TW" |
296 | ;; | 296 | ;; |
297 | osf*) | 297 | osf*) |
298 | echo "ISO8859-1 ISO-8859-1" | 298 | echo "ISO8859-1 ISO-8859-1" |
299 | echo "ISO8859-2 ISO-8859-2" | 299 | echo "ISO8859-2 ISO-8859-2" |
300 | echo "ISO8859-4 ISO-8859-4" | 300 | echo "ISO8859-4 ISO-8859-4" |
301 | echo "ISO8859-5 ISO-8859-5" | 301 | echo "ISO8859-5 ISO-8859-5" |
302 | echo "ISO8859-7 ISO-8859-7" | 302 | echo "ISO8859-7 ISO-8859-7" |
303 | echo "ISO8859-8 ISO-8859-8" | 303 | echo "ISO8859-8 ISO-8859-8" |
304 | echo "ISO8859-9 ISO-8859-9" | 304 | echo "ISO8859-9 ISO-8859-9" |
305 | echo "ISO8859-15 ISO-8859-15" | 305 | echo "ISO8859-15 ISO-8859-15" |
306 | echo "cp850 CP850" | 306 | echo "cp850 CP850" |
307 | echo "big5 BIG5" | 307 | echo "big5 BIG5" |
308 | echo "dechanyu DEC-HANYU" | 308 | echo "dechanyu DEC-HANYU" |
309 | echo "dechanzi GB2312" | 309 | echo "dechanzi GB2312" |
310 | echo "deckanji DEC-KANJI" | 310 | echo "deckanji DEC-KANJI" |
311 | echo "deckorean EUC-KR" | 311 | echo "deckorean EUC-KR" |
312 | echo "eucJP EUC-JP" | 312 | echo "eucJP EUC-JP" |
313 | echo "eucKR EUC-KR" | 313 | echo "eucKR EUC-KR" |
314 | echo "eucTW EUC-TW" | 314 | echo "eucTW EUC-TW" |
315 | echo "GBK GBK" | 315 | echo "GBK GBK" |
316 | echo "KSC5601 CP949" | 316 | echo "KSC5601 CP949" |
317 | echo "sdeckanji EUC-JP" | 317 | echo "sdeckanji EUC-JP" |
318 | echo "SJIS SHIFT_JIS" | 318 | echo "SJIS SHIFT_JIS" |
319 | echo "TACTIS TIS-620" | 319 | echo "TACTIS TIS-620" |
320 | echo "UTF-8 UTF-8" | 320 | echo "UTF-8 UTF-8" |
321 | ;; | 321 | ;; |
322 | solaris*) | 322 | solaris*) |
323 | echo "646 ASCII" | 323 | echo "646 ASCII" |
324 | echo "ISO8859-1 ISO-8859-1" | 324 | echo "ISO8859-1 ISO-8859-1" |
325 | echo "ISO8859-2 ISO-8859-2" | 325 | echo "ISO8859-2 ISO-8859-2" |
326 | echo "ISO8859-3 ISO-8859-3" | 326 | echo "ISO8859-3 ISO-8859-3" |
327 | echo "ISO8859-4 ISO-8859-4" | 327 | echo "ISO8859-4 ISO-8859-4" |
328 | echo "ISO8859-5 ISO-8859-5" | 328 | echo "ISO8859-5 ISO-8859-5" |
329 | echo "ISO8859-6 ISO-8859-6" | 329 | echo "ISO8859-6 ISO-8859-6" |
330 | echo "ISO8859-7 ISO-8859-7" | 330 | echo "ISO8859-7 ISO-8859-7" |
331 | echo "ISO8859-8 ISO-8859-8" | 331 | echo "ISO8859-8 ISO-8859-8" |
332 | echo "ISO8859-9 ISO-8859-9" | 332 | echo "ISO8859-9 ISO-8859-9" |
333 | echo "ISO8859-15 ISO-8859-15" | 333 | echo "ISO8859-15 ISO-8859-15" |
334 | echo "koi8-r KOI8-R" | 334 | echo "koi8-r KOI8-R" |
335 | echo "ansi-1251 CP1251" | 335 | echo "ansi-1251 CP1251" |
336 | echo "BIG5 BIG5" | 336 | echo "BIG5 BIG5" |
337 | echo "Big5-HKSCS BIG5-HKSCS" | 337 | echo "Big5-HKSCS BIG5-HKSCS" |
338 | echo "gb2312 GB2312" | 338 | echo "gb2312 GB2312" |
339 | echo "GBK GBK" | 339 | echo "GBK GBK" |
340 | echo "GB18030 GB18030" | 340 | echo "GB18030 GB18030" |
341 | echo "cns11643 EUC-TW" | 341 | echo "cns11643 EUC-TW" |
342 | echo "5601 EUC-KR" | 342 | echo "5601 EUC-KR" |
343 | echo "ko_KR.johap92 JOHAB" | 343 | echo "ko_KR.johap92 JOHAB" |
344 | echo "eucJP EUC-JP" | 344 | echo "eucJP EUC-JP" |
345 | echo "PCK SHIFT_JIS" | 345 | echo "PCK SHIFT_JIS" |
346 | echo "TIS620.2533 TIS-620" | 346 | echo "TIS620.2533 TIS-620" |
347 | #echo "sun_eu_greek ?" # what is this? | 347 | #echo "sun_eu_greek ?" # what is this? |
348 | echo "UTF-8 UTF-8" | 348 | echo "UTF-8 UTF-8" |
349 | ;; | 349 | ;; |
350 | freebsd* | os2*) | 350 | freebsd* | os2*) |
351 | # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore | 351 | # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore |
352 | # localcharset.c falls back to using the full locale name | 352 | # localcharset.c falls back to using the full locale name |
353 | # from the environment variables. | 353 | # from the environment variables. |
354 | # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just | 354 | # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just |
355 | # reuse FreeBSD's locale data for OS/2. | 355 | # reuse FreeBSD's locale data for OS/2. |
356 | echo "C ASCII" | 356 | echo "C ASCII" |
357 | echo "US-ASCII ASCII" | 357 | echo "US-ASCII ASCII" |
358 | for l in la_LN lt_LN; do | 358 | for l in la_LN lt_LN; do |
359 | echo "$l.ASCII ASCII" | 359 | echo "$l.ASCII ASCII" |
360 | done | 360 | done |
361 | for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | 361 | for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ |
362 | fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ | 362 | fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ |
363 | lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do | 363 | lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do |
364 | echo "$l.ISO_8859-1 ISO-8859-1" | 364 | echo "$l.ISO_8859-1 ISO-8859-1" |
365 | echo "$l.DIS_8859-15 ISO-8859-15" | 365 | echo "$l.DIS_8859-15 ISO-8859-15" |
366 | done | 366 | done |
367 | for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do | 367 | for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do |
368 | echo "$l.ISO_8859-2 ISO-8859-2" | 368 | echo "$l.ISO_8859-2 ISO-8859-2" |
369 | done | 369 | done |
370 | for l in la_LN lt_LT; do | 370 | for l in la_LN lt_LT; do |
371 | echo "$l.ISO_8859-4 ISO-8859-4" | 371 | echo "$l.ISO_8859-4 ISO-8859-4" |
372 | done | 372 | done |
373 | for l in ru_RU ru_SU; do | 373 | for l in ru_RU ru_SU; do |
374 | echo "$l.KOI8-R KOI8-R" | 374 | echo "$l.KOI8-R KOI8-R" |
375 | echo "$l.ISO_8859-5 ISO-8859-5" | 375 | echo "$l.ISO_8859-5 ISO-8859-5" |
376 | echo "$l.CP866 CP866" | 376 | echo "$l.CP866 CP866" |
377 | done | 377 | done |
378 | echo "uk_UA.KOI8-U KOI8-U" | 378 | echo "uk_UA.KOI8-U KOI8-U" |
379 | echo "zh_TW.BIG5 BIG5" | 379 | echo "zh_TW.BIG5 BIG5" |
380 | echo "zh_TW.Big5 BIG5" | 380 | echo "zh_TW.Big5 BIG5" |
381 | echo "zh_CN.EUC GB2312" | 381 | echo "zh_CN.EUC GB2312" |
382 | echo "ja_JP.EUC EUC-JP" | 382 | echo "ja_JP.EUC EUC-JP" |
383 | echo "ja_JP.SJIS SHIFT_JIS" | 383 | echo "ja_JP.SJIS SHIFT_JIS" |
384 | echo "ja_JP.Shift_JIS SHIFT_JIS" | 384 | echo "ja_JP.Shift_JIS SHIFT_JIS" |
385 | echo "ko_KR.EUC EUC-KR" | 385 | echo "ko_KR.EUC EUC-KR" |
386 | ;; | 386 | ;; |
387 | netbsd*) | 387 | netbsd*) |
388 | echo "646 ASCII" | 388 | echo "646 ASCII" |
389 | echo "ISO8859-1 ISO-8859-1" | 389 | echo "ISO8859-1 ISO-8859-1" |
390 | echo "ISO8859-2 ISO-8859-2" | 390 | echo "ISO8859-2 ISO-8859-2" |
391 | echo "ISO8859-4 ISO-8859-4" | 391 | echo "ISO8859-4 ISO-8859-4" |
392 | echo "ISO8859-5 ISO-8859-5" | 392 | echo "ISO8859-5 ISO-8859-5" |
393 | echo "ISO8859-7 ISO-8859-7" | 393 | echo "ISO8859-7 ISO-8859-7" |
394 | echo "ISO8859-13 ISO-8859-13" | 394 | echo "ISO8859-13 ISO-8859-13" |
395 | echo "ISO8859-15 ISO-8859-15" | 395 | echo "ISO8859-15 ISO-8859-15" |
396 | echo "eucCN GB2312" | 396 | echo "eucCN GB2312" |
397 | echo "eucJP EUC-JP" | 397 | echo "eucJP EUC-JP" |
398 | echo "eucKR EUC-KR" | 398 | echo "eucKR EUC-KR" |
399 | echo "eucTW EUC-TW" | 399 | echo "eucTW EUC-TW" |
400 | echo "BIG5 BIG5" | 400 | echo "BIG5 BIG5" |
401 | echo "SJIS SHIFT_JIS" | 401 | echo "SJIS SHIFT_JIS" |
402 | ;; | 402 | ;; |
403 | openbsd*) | 403 | openbsd*) |
404 | echo "646 ASCII" | 404 | echo "646 ASCII" |
405 | echo "ISO8859-1 ISO-8859-1" | 405 | echo "ISO8859-1 ISO-8859-1" |
406 | echo "ISO8859-2 ISO-8859-2" | 406 | echo "ISO8859-2 ISO-8859-2" |
407 | echo "ISO8859-4 ISO-8859-4" | 407 | echo "ISO8859-4 ISO-8859-4" |
408 | echo "ISO8859-5 ISO-8859-5" | 408 | echo "ISO8859-5 ISO-8859-5" |
409 | echo "ISO8859-7 ISO-8859-7" | 409 | echo "ISO8859-7 ISO-8859-7" |
410 | echo "ISO8859-13 ISO-8859-13" | 410 | echo "ISO8859-13 ISO-8859-13" |
411 | echo "ISO8859-15 ISO-8859-15" | 411 | echo "ISO8859-15 ISO-8859-15" |
412 | ;; | 412 | ;; |
413 | darwin[56]*) | 413 | darwin[56]*) |
414 | # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore | 414 | # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore |
415 | # localcharset.c falls back to using the full locale name | 415 | # localcharset.c falls back to using the full locale name |
416 | # from the environment variables. | 416 | # from the environment variables. |
417 | echo "C ASCII" | 417 | echo "C ASCII" |
418 | for l in en_AU en_CA en_GB en_US la_LN; do | 418 | for l in en_AU en_CA en_GB en_US la_LN; do |
419 | echo "$l.US-ASCII ASCII" | 419 | echo "$l.US-ASCII ASCII" |
420 | done | 420 | done |
421 | for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | 421 | for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ |
422 | fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ | 422 | fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ |
423 | nl_NL no_NO pt_PT sv_SE; do | 423 | nl_NL no_NO pt_PT sv_SE; do |
424 | echo "$l ISO-8859-1" | 424 | echo "$l ISO-8859-1" |
425 | echo "$l.ISO8859-1 ISO-8859-1" | 425 | echo "$l.ISO8859-1 ISO-8859-1" |
426 | echo "$l.ISO8859-15 ISO-8859-15" | 426 | echo "$l.ISO8859-15 ISO-8859-15" |
427 | done | 427 | done |
428 | for l in la_LN; do | 428 | for l in la_LN; do |
429 | echo "$l.ISO8859-1 ISO-8859-1" | 429 | echo "$l.ISO8859-1 ISO-8859-1" |
430 | echo "$l.ISO8859-15 ISO-8859-15" | 430 | echo "$l.ISO8859-15 ISO-8859-15" |
431 | done | 431 | done |
432 | for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do | 432 | for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do |
433 | echo "$l.ISO8859-2 ISO-8859-2" | 433 | echo "$l.ISO8859-2 ISO-8859-2" |
434 | done | 434 | done |
435 | for l in la_LN lt_LT; do | 435 | for l in la_LN lt_LT; do |
436 | echo "$l.ISO8859-4 ISO-8859-4" | 436 | echo "$l.ISO8859-4 ISO-8859-4" |
437 | done | 437 | done |
438 | for l in ru_RU; do | 438 | for l in ru_RU; do |
439 | echo "$l.KOI8-R KOI8-R" | 439 | echo "$l.KOI8-R KOI8-R" |
440 | echo "$l.ISO8859-5 ISO-8859-5" | 440 | echo "$l.ISO8859-5 ISO-8859-5" |
441 | echo "$l.CP866 CP866" | 441 | echo "$l.CP866 CP866" |
442 | done | 442 | done |
443 | for l in bg_BG; do | 443 | for l in bg_BG; do |
444 | echo "$l.CP1251 CP1251" | 444 | echo "$l.CP1251 CP1251" |
445 | done | 445 | done |
446 | echo "uk_UA.KOI8-U KOI8-U" | 446 | echo "uk_UA.KOI8-U KOI8-U" |
447 | echo "zh_TW.BIG5 BIG5" | 447 | echo "zh_TW.BIG5 BIG5" |
448 | echo "zh_TW.Big5 BIG5" | 448 | echo "zh_TW.Big5 BIG5" |
449 | echo "zh_CN.EUC GB2312" | 449 | echo "zh_CN.EUC GB2312" |
450 | echo "ja_JP.EUC EUC-JP" | 450 | echo "ja_JP.EUC EUC-JP" |
451 | echo "ja_JP.SJIS SHIFT_JIS" | 451 | echo "ja_JP.SJIS SHIFT_JIS" |
452 | echo "ko_KR.EUC EUC-KR" | 452 | echo "ko_KR.EUC EUC-KR" |
453 | ;; | 453 | ;; |
454 | darwin*) | 454 | darwin*) |
455 | # Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is | 455 | # Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is |
456 | # useless: | 456 | # useless: |
457 | # - It returns the empty string when LANG is set to a locale of the | 457 | # - It returns the empty string when LANG is set to a locale of the |
458 | # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 | 458 | # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 |
459 | # LC_CTYPE file. | 459 | # LC_CTYPE file. |
460 | # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by | 460 | # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by |
461 | # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. | 461 | # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. |
462 | # - The documentation says: | 462 | # - The documentation says: |
463 | # "... all code that calls BSD system routines should ensure | 463 | # "... all code that calls BSD system routines should ensure |
464 | # that the const *char parameters of these routines are in UTF-8 | 464 | # that the const *char parameters of these routines are in UTF-8 |
465 | # encoding. All BSD system functions expect their string | 465 | # encoding. All BSD system functions expect their string |
466 | # parameters to be in UTF-8 encoding and nothing else." | 466 | # parameters to be in UTF-8 encoding and nothing else." |
467 | # It also says | 467 | # It also says |
468 | # "An additional caveat is that string parameters for files, | 468 | # "An additional caveat is that string parameters for files, |
469 | # paths, and other file-system entities must be in canonical | 469 | # paths, and other file-system entities must be in canonical |
470 | # UTF-8. In a canonical UTF-8 Unicode string, all decomposable | 470 | # UTF-8. In a canonical UTF-8 Unicode string, all decomposable |
471 | # characters are decomposed ..." | 471 | # characters are decomposed ..." |
472 | # but this is not true: You can pass non-decomposed UTF-8 strings | 472 | # but this is not true: You can pass non-decomposed UTF-8 strings |
473 | # to file system functions, and it is the OS which will convert | 473 | # to file system functions, and it is the OS which will convert |
474 | # them to decomposed UTF-8 before accessing the file system. | 474 | # them to decomposed UTF-8 before accessing the file system. |
475 | # - The Apple Terminal application displays UTF-8 by default. | 475 | # - The Apple Terminal application displays UTF-8 by default. |
476 | # - However, other applications are free to use different encodings: | 476 | # - However, other applications are free to use different encodings: |
477 | # - xterm uses ISO-8859-1 by default. | 477 | # - xterm uses ISO-8859-1 by default. |
478 | # - TextEdit uses MacRoman by default. | 478 | # - TextEdit uses MacRoman by default. |
479 | # We prefer UTF-8 over decomposed UTF-8-MAC because one should | 479 | # We prefer UTF-8 over decomposed UTF-8-MAC because one should |
480 | # minimize the use of decomposed Unicode. Unfortunately, through the | 480 | # minimize the use of decomposed Unicode. Unfortunately, through the |
481 | # Darwin file system, decomposed UTF-8 strings are leaked into user | 481 | # Darwin file system, decomposed UTF-8 strings are leaked into user |
482 | # space nevertheless. | 482 | # space nevertheless. |
483 | # Then there are also the locales with encodings other than US-ASCII | 483 | # Then there are also the locales with encodings other than US-ASCII |
484 | # and UTF-8. These locales can be occasionally useful to users (e.g. | 484 | # and UTF-8. These locales can be occasionally useful to users (e.g. |
485 | # when grepping through ISO-8859-1 encoded text files), when all their | 485 | # when grepping through ISO-8859-1 encoded text files), when all their |
486 | # file names are in US-ASCII. | 486 | # file names are in US-ASCII. |
487 | echo "ISO8859-1 ISO-8859-1" | 487 | echo "ISO8859-1 ISO-8859-1" |
488 | echo "ISO8859-2 ISO-8859-2" | 488 | echo "ISO8859-2 ISO-8859-2" |
489 | echo "ISO8859-4 ISO-8859-4" | 489 | echo "ISO8859-4 ISO-8859-4" |
490 | echo "ISO8859-5 ISO-8859-5" | 490 | echo "ISO8859-5 ISO-8859-5" |
491 | echo "ISO8859-7 ISO-8859-7" | 491 | echo "ISO8859-7 ISO-8859-7" |
492 | echo "ISO8859-9 ISO-8859-9" | 492 | echo "ISO8859-9 ISO-8859-9" |
493 | echo "ISO8859-13 ISO-8859-13" | 493 | echo "ISO8859-13 ISO-8859-13" |
494 | echo "ISO8859-15 ISO-8859-15" | 494 | echo "ISO8859-15 ISO-8859-15" |
495 | echo "KOI8-R KOI8-R" | 495 | echo "KOI8-R KOI8-R" |
496 | echo "KOI8-U KOI8-U" | 496 | echo "KOI8-U KOI8-U" |
497 | echo "CP866 CP866" | 497 | echo "CP866 CP866" |
498 | echo "CP949 CP949" | 498 | echo "CP949 CP949" |
499 | echo "CP1131 CP1131" | 499 | echo "CP1131 CP1131" |
500 | echo "CP1251 CP1251" | 500 | echo "CP1251 CP1251" |
501 | echo "eucCN GB2312" | 501 | echo "eucCN GB2312" |
502 | echo "GB2312 GB2312" | 502 | echo "GB2312 GB2312" |
503 | echo "eucJP EUC-JP" | 503 | echo "eucJP EUC-JP" |
504 | echo "eucKR EUC-KR" | 504 | echo "eucKR EUC-KR" |
505 | echo "Big5 BIG5" | 505 | echo "Big5 BIG5" |
506 | echo "Big5HKSCS BIG5-HKSCS" | 506 | echo "Big5HKSCS BIG5-HKSCS" |
507 | echo "GBK GBK" | 507 | echo "GBK GBK" |
508 | echo "GB18030 GB18030" | 508 | echo "GB18030 GB18030" |
509 | echo "SJIS SHIFT_JIS" | 509 | echo "SJIS SHIFT_JIS" |
510 | echo "ARMSCII-8 ARMSCII-8" | 510 | echo "ARMSCII-8 ARMSCII-8" |
511 | echo "PT154 PT154" | 511 | echo "PT154 PT154" |
512 | #echo "ISCII-DEV ?" | 512 | #echo "ISCII-DEV ?" |
513 | echo "* UTF-8" | 513 | echo "* UTF-8" |
514 | ;; | 514 | ;; |
515 | beos* | haiku*) | 515 | beos* | haiku*) |
516 | # BeOS and Haiku have a single locale, and it has UTF-8 encoding. | 516 | # BeOS and Haiku have a single locale, and it has UTF-8 encoding. |
517 | echo "* UTF-8" | 517 | echo "* UTF-8" |
518 | ;; | 518 | ;; |
519 | msdosdjgpp*) | 519 | msdosdjgpp*) |
520 | # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore | 520 | # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore |
521 | # localcharset.c falls back to using the full locale name | 521 | # localcharset.c falls back to using the full locale name |
522 | # from the environment variables. | 522 | # from the environment variables. |
523 | echo "#" | 523 | echo "#" |
524 | echo "# The encodings given here may not all be correct." | 524 | echo "# The encodings given here may not all be correct." |
525 | echo "# If you find that the encoding given for your language and" | 525 | echo "# If you find that the encoding given for your language and" |
526 | echo "# country is not the one your DOS machine actually uses, just" | 526 | echo "# country is not the one your DOS machine actually uses, just" |
527 | echo "# correct it in this file, and send a mail to" | 527 | echo "# correct it in this file, and send a mail to" |
528 | echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>" | 528 | echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>" |
529 | echo "# and Bruno Haible <bruno@clisp.org>." | 529 | echo "# and Bruno Haible <bruno@clisp.org>." |
530 | echo "#" | 530 | echo "#" |
531 | echo "C ASCII" | 531 | echo "C ASCII" |
532 | # ISO-8859-1 languages | 532 | # ISO-8859-1 languages |
533 | echo "ca CP850" | 533 | echo "ca CP850" |
534 | echo "ca_ES CP850" | 534 | echo "ca_ES CP850" |
535 | echo "da CP865" # not CP850 ?? | 535 | echo "da CP865" # not CP850 ?? |
536 | echo "da_DK CP865" # not CP850 ?? | 536 | echo "da_DK CP865" # not CP850 ?? |
537 | echo "de CP850" | 537 | echo "de CP850" |
538 | echo "de_AT CP850" | 538 | echo "de_AT CP850" |
539 | echo "de_CH CP850" | 539 | echo "de_CH CP850" |
540 | echo "de_DE CP850" | 540 | echo "de_DE CP850" |
541 | echo "en CP850" | 541 | echo "en CP850" |
542 | echo "en_AU CP850" # not CP437 ?? | 542 | echo "en_AU CP850" # not CP437 ?? |
543 | echo "en_CA CP850" | 543 | echo "en_CA CP850" |
544 | echo "en_GB CP850" | 544 | echo "en_GB CP850" |
545 | echo "en_NZ CP437" | 545 | echo "en_NZ CP437" |
546 | echo "en_US CP437" | 546 | echo "en_US CP437" |
547 | echo "en_ZA CP850" # not CP437 ?? | 547 | echo "en_ZA CP850" # not CP437 ?? |
548 | echo "es CP850" | 548 | echo "es CP850" |
549 | echo "es_AR CP850" | 549 | echo "es_AR CP850" |
550 | echo "es_BO CP850" | 550 | echo "es_BO CP850" |
551 | echo "es_CL CP850" | 551 | echo "es_CL CP850" |
552 | echo "es_CO CP850" | 552 | echo "es_CO CP850" |
553 | echo "es_CR CP850" | 553 | echo "es_CR CP850" |
554 | echo "es_CU CP850" | 554 | echo "es_CU CP850" |
555 | echo "es_DO CP850" | 555 | echo "es_DO CP850" |
556 | echo "es_EC CP850" | 556 | echo "es_EC CP850" |
557 | echo "es_ES CP850" | 557 | echo "es_ES CP850" |
558 | echo "es_GT CP850" | 558 | echo "es_GT CP850" |
559 | echo "es_HN CP850" | 559 | echo "es_HN CP850" |
560 | echo "es_MX CP850" | 560 | echo "es_MX CP850" |
561 | echo "es_NI CP850" | 561 | echo "es_NI CP850" |
562 | echo "es_PA CP850" | 562 | echo "es_PA CP850" |
563 | echo "es_PY CP850" | 563 | echo "es_PY CP850" |
564 | echo "es_PE CP850" | 564 | echo "es_PE CP850" |
565 | echo "es_SV CP850" | 565 | echo "es_SV CP850" |
566 | echo "es_UY CP850" | 566 | echo "es_UY CP850" |
567 | echo "es_VE CP850" | 567 | echo "es_VE CP850" |
568 | echo "et CP850" | 568 | echo "et CP850" |
569 | echo "et_EE CP850" | 569 | echo "et_EE CP850" |
570 | echo "eu CP850" | 570 | echo "eu CP850" |
571 | echo "eu_ES CP850" | 571 | echo "eu_ES CP850" |
572 | echo "fi CP850" | 572 | echo "fi CP850" |
573 | echo "fi_FI CP850" | 573 | echo "fi_FI CP850" |
574 | echo "fr CP850" | 574 | echo "fr CP850" |
575 | echo "fr_BE CP850" | 575 | echo "fr_BE CP850" |
576 | echo "fr_CA CP850" | 576 | echo "fr_CA CP850" |
577 | echo "fr_CH CP850" | 577 | echo "fr_CH CP850" |
578 | echo "fr_FR CP850" | 578 | echo "fr_FR CP850" |
579 | echo "ga CP850" | 579 | echo "ga CP850" |
580 | echo "ga_IE CP850" | 580 | echo "ga_IE CP850" |
581 | echo "gd CP850" | 581 | echo "gd CP850" |
582 | echo "gd_GB CP850" | 582 | echo "gd_GB CP850" |
583 | echo "gl CP850" | 583 | echo "gl CP850" |
584 | echo "gl_ES CP850" | 584 | echo "gl_ES CP850" |
585 | echo "id CP850" # not CP437 ?? | 585 | echo "id CP850" # not CP437 ?? |
586 | echo "id_ID CP850" # not CP437 ?? | 586 | echo "id_ID CP850" # not CP437 ?? |
587 | echo "is CP861" # not CP850 ?? | 587 | echo "is CP861" # not CP850 ?? |
588 | echo "is_IS CP861" # not CP850 ?? | 588 | echo "is_IS CP861" # not CP850 ?? |
589 | echo "it CP850" | 589 | echo "it CP850" |
590 | echo "it_CH CP850" | 590 | echo "it_CH CP850" |
591 | echo "it_IT CP850" | 591 | echo "it_IT CP850" |
592 | echo "lt CP775" | 592 | echo "lt CP775" |
593 | echo "lt_LT CP775" | 593 | echo "lt_LT CP775" |
594 | echo "lv CP775" | 594 | echo "lv CP775" |
595 | echo "lv_LV CP775" | 595 | echo "lv_LV CP775" |
596 | echo "nb CP865" # not CP850 ?? | 596 | echo "nb CP865" # not CP850 ?? |
597 | echo "nb_NO CP865" # not CP850 ?? | 597 | echo "nb_NO CP865" # not CP850 ?? |
598 | echo "nl CP850" | 598 | echo "nl CP850" |
599 | echo "nl_BE CP850" | 599 | echo "nl_BE CP850" |
600 | echo "nl_NL CP850" | 600 | echo "nl_NL CP850" |
601 | echo "nn CP865" # not CP850 ?? | 601 | echo "nn CP865" # not CP850 ?? |
602 | echo "nn_NO CP865" # not CP850 ?? | 602 | echo "nn_NO CP865" # not CP850 ?? |
603 | echo "no CP865" # not CP850 ?? | 603 | echo "no CP865" # not CP850 ?? |
604 | echo "no_NO CP865" # not CP850 ?? | 604 | echo "no_NO CP865" # not CP850 ?? |
605 | echo "pt CP850" | 605 | echo "pt CP850" |
606 | echo "pt_BR CP850" | 606 | echo "pt_BR CP850" |
607 | echo "pt_PT CP850" | 607 | echo "pt_PT CP850" |
608 | echo "sv CP850" | 608 | echo "sv CP850" |
609 | echo "sv_SE CP850" | 609 | echo "sv_SE CP850" |
610 | # ISO-8859-2 languages | 610 | # ISO-8859-2 languages |
611 | echo "cs CP852" | 611 | echo "cs CP852" |
612 | echo "cs_CZ CP852" | 612 | echo "cs_CZ CP852" |
613 | echo "hr CP852" | 613 | echo "hr CP852" |
614 | echo "hr_HR CP852" | 614 | echo "hr_HR CP852" |
615 | echo "hu CP852" | 615 | echo "hu CP852" |
616 | echo "hu_HU CP852" | 616 | echo "hu_HU CP852" |
617 | echo "pl CP852" | 617 | echo "pl CP852" |
618 | echo "pl_PL CP852" | 618 | echo "pl_PL CP852" |
619 | echo "ro CP852" | 619 | echo "ro CP852" |
620 | echo "ro_RO CP852" | 620 | echo "ro_RO CP852" |
621 | echo "sk CP852" | 621 | echo "sk CP852" |
622 | echo "sk_SK CP852" | 622 | echo "sk_SK CP852" |
623 | echo "sl CP852" | 623 | echo "sl CP852" |
624 | echo "sl_SI CP852" | 624 | echo "sl_SI CP852" |
625 | echo "sq CP852" | 625 | echo "sq CP852" |
626 | echo "sq_AL CP852" | 626 | echo "sq_AL CP852" |
627 | echo "sr CP852" # CP852 or CP866 or CP855 ?? | 627 | echo "sr CP852" # CP852 or CP866 or CP855 ?? |
628 | echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? | 628 | echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? |
629 | echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? | 629 | echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? |
630 | # ISO-8859-3 languages | 630 | # ISO-8859-3 languages |
631 | echo "mt CP850" | 631 | echo "mt CP850" |
632 | echo "mt_MT CP850" | 632 | echo "mt_MT CP850" |
633 | # ISO-8859-5 languages | 633 | # ISO-8859-5 languages |
634 | echo "be CP866" | 634 | echo "be CP866" |
635 | echo "be_BE CP866" | 635 | echo "be_BE CP866" |
636 | echo "bg CP866" # not CP855 ?? | 636 | echo "bg CP866" # not CP855 ?? |
637 | echo "bg_BG CP866" # not CP855 ?? | 637 | echo "bg_BG CP866" # not CP855 ?? |
638 | echo "mk CP866" # not CP855 ?? | 638 | echo "mk CP866" # not CP855 ?? |
639 | echo "mk_MK CP866" # not CP855 ?? | 639 | echo "mk_MK CP866" # not CP855 ?? |
640 | echo "ru CP866" | 640 | echo "ru CP866" |
641 | echo "ru_RU CP866" | 641 | echo "ru_RU CP866" |
642 | echo "uk CP1125" | 642 | echo "uk CP1125" |
643 | echo "uk_UA CP1125" | 643 | echo "uk_UA CP1125" |
644 | # ISO-8859-6 languages | 644 | # ISO-8859-6 languages |
645 | echo "ar CP864" | 645 | echo "ar CP864" |
646 | echo "ar_AE CP864" | 646 | echo "ar_AE CP864" |
647 | echo "ar_DZ CP864" | 647 | echo "ar_DZ CP864" |
648 | echo "ar_EG CP864" | 648 | echo "ar_EG CP864" |
649 | echo "ar_IQ CP864" | 649 | echo "ar_IQ CP864" |
650 | echo "ar_IR CP864" | 650 | echo "ar_IR CP864" |
651 | echo "ar_JO CP864" | 651 | echo "ar_JO CP864" |
652 | echo "ar_KW CP864" | 652 | echo "ar_KW CP864" |
653 | echo "ar_MA CP864" | 653 | echo "ar_MA CP864" |
654 | echo "ar_OM CP864" | 654 | echo "ar_OM CP864" |
655 | echo "ar_QA CP864" | 655 | echo "ar_QA CP864" |
656 | echo "ar_SA CP864" | 656 | echo "ar_SA CP864" |
657 | echo "ar_SY CP864" | 657 | echo "ar_SY CP864" |
658 | # ISO-8859-7 languages | 658 | # ISO-8859-7 languages |
659 | echo "el CP869" | 659 | echo "el CP869" |
660 | echo "el_GR CP869" | 660 | echo "el_GR CP869" |
661 | # ISO-8859-8 languages | 661 | # ISO-8859-8 languages |
662 | echo "he CP862" | 662 | echo "he CP862" |
663 | echo "he_IL CP862" | 663 | echo "he_IL CP862" |
664 | # ISO-8859-9 languages | 664 | # ISO-8859-9 languages |
665 | echo "tr CP857" | 665 | echo "tr CP857" |
666 | echo "tr_TR CP857" | 666 | echo "tr_TR CP857" |
667 | # Japanese | 667 | # Japanese |
668 | echo "ja CP932" | 668 | echo "ja CP932" |
669 | echo "ja_JP CP932" | 669 | echo "ja_JP CP932" |
670 | # Chinese | 670 | # Chinese |
671 | echo "zh_CN GBK" | 671 | echo "zh_CN GBK" |
672 | echo "zh_TW CP950" # not CP938 ?? | 672 | echo "zh_TW CP950" # not CP938 ?? |
673 | # Korean | 673 | # Korean |
674 | echo "kr CP949" # not CP934 ?? | 674 | echo "kr CP949" # not CP934 ?? |
675 | echo "kr_KR CP949" # not CP934 ?? | 675 | echo "kr_KR CP949" # not CP934 ?? |
676 | # Thai | 676 | # Thai |
677 | echo "th CP874" | 677 | echo "th CP874" |
678 | echo "th_TH CP874" | 678 | echo "th_TH CP874" |
679 | # Other | 679 | # Other |
680 | echo "eo CP850" | 680 | echo "eo CP850" |
681 | echo "eo_EO CP850" | 681 | echo "eo_EO CP850" |
682 | ;; | 682 | ;; |
683 | esac | 683 | esac |
diff --git a/gl/creat-safer.c b/gl/creat-safer.c index fc314ba4..da0418df 100644 --- a/gl/creat-safer.c +++ b/gl/creat-safer.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Invoke creat, but avoid some glitches. | 1 | /* Invoke creat, but avoid some glitches. |
2 | 2 | ||
3 | Copyright (C) 2005, 2006 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/dirname-lgpl.c b/gl/dirname-lgpl.c new file mode 100644 index 00000000..d4506e06 --- /dev/null +++ b/gl/dirname-lgpl.c | |||
@@ -0,0 +1,86 @@ | |||
1 | /* dirname.c -- return all but the last element in a file name | ||
2 | |||
3 | Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2010 Free Software | ||
4 | Foundation, Inc. | ||
5 | |||
6 | This program is free software: you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 3 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program 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 | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
18 | |||
19 | #include <config.h> | ||
20 | |||
21 | #include "dirname.h" | ||
22 | |||
23 | #include <stdlib.h> | ||
24 | #include <string.h> | ||
25 | |||
26 | /* Return the length of the prefix of FILE that will be used by | ||
27 | dir_name. If FILE is in the working directory, this returns zero | ||
28 | even though `dir_name (FILE)' will return ".". Works properly even | ||
29 | if there are trailing slashes (by effectively ignoring them). */ | ||
30 | |||
31 | size_t | ||
32 | dir_len (char const *file) | ||
33 | { | ||
34 | size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file); | ||
35 | size_t length; | ||
36 | |||
37 | /* Advance prefix_length beyond important leading slashes. */ | ||
38 | prefix_length += (prefix_length != 0 | ||
39 | ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE | ||
40 | && ISSLASH (file[prefix_length])) | ||
41 | : (ISSLASH (file[0]) | ||
42 | ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT | ||
43 | && ISSLASH (file[1]) && ! ISSLASH (file[2]) | ||
44 | ? 2 : 1)) | ||
45 | : 0)); | ||
46 | |||
47 | /* Strip the basename and any redundant slashes before it. */ | ||
48 | for (length = last_component (file) - file; | ||
49 | prefix_length < length; length--) | ||
50 | if (! ISSLASH (file[length - 1])) | ||
51 | break; | ||
52 | return length; | ||
53 | } | ||
54 | |||
55 | |||
56 | /* In general, we can't use the builtin `dirname' function if available, | ||
57 | since it has different meanings in different environments. | ||
58 | In some environments the builtin `dirname' modifies its argument. | ||
59 | |||
60 | Return the leading directories part of FILE, allocated with malloc. | ||
61 | Works properly even if there are trailing slashes (by effectively | ||
62 | ignoring them). Return NULL on failure. | ||
63 | |||
64 | If lstat (FILE) would succeed, then { chdir (dir_name (FILE)); | ||
65 | lstat (base_name (FILE)); } will access the same file. Likewise, | ||
66 | if the sequence { chdir (dir_name (FILE)); | ||
67 | rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE | ||
68 | to "foo" in the same directory FILE was in. */ | ||
69 | |||
70 | char * | ||
71 | mdir_name (char const *file) | ||
72 | { | ||
73 | size_t length = dir_len (file); | ||
74 | bool append_dot = (length == 0 | ||
75 | || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE | ||
76 | && length == FILE_SYSTEM_PREFIX_LEN (file) | ||
77 | && file[2] != '\0' && ! ISSLASH (file[2]))); | ||
78 | char *dir = malloc (length + append_dot + 1); | ||
79 | if (!dir) | ||
80 | return NULL; | ||
81 | memcpy (dir, file, length); | ||
82 | if (append_dot) | ||
83 | dir[length++] = '.'; | ||
84 | dir[length] = '\0'; | ||
85 | return dir; | ||
86 | } | ||
diff --git a/gl/dirname.c b/gl/dirname.c index c27e5b5d..953a9acc 100644 --- a/gl/dirname.c +++ b/gl/dirname.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* dirname.c -- return all but the last element in a file name | 1 | /* dirname.c -- return all but the last element in a file name |
2 | 2 | ||
3 | Copyright (C) 1990, 1998, 2000, 2001, 2003, 2004, 2005, 2006 Free Software | 3 | Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2010 Free Software |
4 | Foundation, Inc. | 4 | Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
@@ -20,65 +20,19 @@ | |||
20 | 20 | ||
21 | #include "dirname.h" | 21 | #include "dirname.h" |
22 | 22 | ||
23 | #include <stdlib.h> | ||
23 | #include <string.h> | 24 | #include <string.h> |
24 | #include "xalloc.h" | 25 | #include "xalloc.h" |
25 | 26 | ||
26 | /* Return the length of the prefix of FILE that will be used by | 27 | /* Just like mdir_name (dirname-lgpl.c), except, rather than |
27 | dir_name. If FILE is in the working directory, this returns zero | 28 | returning NULL upon malloc failure, here, we report the |
28 | even though `dir_name (FILE)' will return ".". Works properly even | 29 | "memory exhausted" condition and exit. */ |
29 | if there are trailing slashes (by effectively ignoring them). */ | ||
30 | |||
31 | size_t | ||
32 | dir_len (char const *file) | ||
33 | { | ||
34 | size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file); | ||
35 | size_t length; | ||
36 | |||
37 | /* Advance prefix_length beyond important leading slashes. */ | ||
38 | prefix_length += (prefix_length != 0 | ||
39 | ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE | ||
40 | && ISSLASH (file[prefix_length])) | ||
41 | : (ISSLASH (file[0]) | ||
42 | ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT | ||
43 | && ISSLASH (file[1]) && ! ISSLASH (file[2]) | ||
44 | ? 2 : 1)) | ||
45 | : 0)); | ||
46 | |||
47 | /* Strip the basename and any redundant slashes before it. */ | ||
48 | for (length = last_component (file) - file; | ||
49 | prefix_length < length; length--) | ||
50 | if (! ISSLASH (file[length - 1])) | ||
51 | break; | ||
52 | return length; | ||
53 | } | ||
54 | |||
55 | |||
56 | /* In general, we can't use the builtin `dirname' function if available, | ||
57 | since it has different meanings in different environments. | ||
58 | In some environments the builtin `dirname' modifies its argument. | ||
59 | |||
60 | Return the leading directories part of FILE, allocated with xmalloc. | ||
61 | Works properly even if there are trailing slashes (by effectively | ||
62 | ignoring them). Unlike POSIX dirname(), FILE cannot be NULL. | ||
63 | |||
64 | If lstat (FILE) would succeed, then { chdir (dir_name (FILE)); | ||
65 | lstat (base_name (FILE)); } will access the same file. Likewise, | ||
66 | if the sequence { chdir (dir_name (FILE)); | ||
67 | rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE | ||
68 | to "foo" in the same directory FILE was in. */ | ||
69 | 30 | ||
70 | char * | 31 | char * |
71 | dir_name (char const *file) | 32 | dir_name (char const *file) |
72 | { | 33 | { |
73 | size_t length = dir_len (file); | 34 | char *result = mdir_name (file); |
74 | bool append_dot = (length == 0 | 35 | if (!result) |
75 | || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE | 36 | xalloc_die (); |
76 | && length == FILE_SYSTEM_PREFIX_LEN (file) | 37 | return result; |
77 | && file[2] != '\0' && ! ISSLASH (file[2]))); | ||
78 | char *dir = xmalloc (length + append_dot + 1); | ||
79 | memcpy (dir, file, length); | ||
80 | if (append_dot) | ||
81 | dir[length++] = '.'; | ||
82 | dir[length] = '\0'; | ||
83 | return dir; | ||
84 | } | 38 | } |
diff --git a/gl/dirname.h b/gl/dirname.h index f592350b..fb19508f 100644 --- a/gl/dirname.h +++ b/gl/dirname.h | |||
@@ -1,6 +1,7 @@ | |||
1 | /* Take file names apart into directory and base names. | 1 | /* Take file names apart into directory and base names. |
2 | 2 | ||
3 | Copyright (C) 1998, 2001, 2003-2006 Free Software Foundation, Inc. | 3 | Copyright (C) 1998, 2001, 2003-2006, 2009-2010 Free Software Foundation, |
4 | Inc. | ||
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -34,9 +35,9 @@ | |||
34 | /* This internal macro assumes ASCII, but all hosts that support drive | 35 | /* This internal macro assumes ASCII, but all hosts that support drive |
35 | letters use ASCII. */ | 36 | letters use ASCII. */ |
36 | # define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \ | 37 | # define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \ |
37 | <= 'z' - 'a') | 38 | <= 'z' - 'a') |
38 | # define FILE_SYSTEM_PREFIX_LEN(Filename) \ | 39 | # define FILE_SYSTEM_PREFIX_LEN(Filename) \ |
39 | (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0) | 40 | (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0) |
40 | # else | 41 | # else |
41 | # define FILE_SYSTEM_PREFIX_LEN(Filename) 0 | 42 | # define FILE_SYSTEM_PREFIX_LEN(Filename) 0 |
42 | # endif | 43 | # endif |
@@ -54,12 +55,16 @@ | |||
54 | # define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)]) | 55 | # define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)]) |
55 | # else | 56 | # else |
56 | # define IS_ABSOLUTE_FILE_NAME(F) \ | 57 | # define IS_ABSOLUTE_FILE_NAME(F) \ |
57 | (ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F)) | 58 | (ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F)) |
58 | # endif | 59 | # endif |
59 | # define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F)) | 60 | # define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F)) |
60 | 61 | ||
62 | # if GNULIB_DIRNAME | ||
61 | char *base_name (char const *file); | 63 | char *base_name (char const *file); |
62 | char *dir_name (char const *file); | 64 | char *dir_name (char const *file); |
65 | # endif | ||
66 | |||
67 | char *mdir_name (char const *file); | ||
63 | size_t base_len (char const *file); | 68 | size_t base_len (char const *file); |
64 | size_t dir_len (char const *file); | 69 | size_t dir_len (char const *file); |
65 | char *last_component (char const *file); | 70 | char *last_component (char const *file); |
diff --git a/gl/dup-safer.c b/gl/dup-safer.c index 7d9b2be3..33f599be 100644 --- a/gl/dup-safer.c +++ b/gl/dup-safer.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* Invoke dup, but avoid some glitches. | 1 | /* Invoke dup, but avoid some glitches. |
2 | 2 | ||
3 | Copyright (C) 2001, 2004, 2005, 2006, 2009 Free Software | 3 | Copyright (C) 2001, 2004-2006, 2009-2010 Free Software Foundation, Inc. |
4 | Foundation, Inc. | ||
5 | 4 | ||
6 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -23,7 +22,6 @@ | |||
23 | #include "unistd-safer.h" | 22 | #include "unistd-safer.h" |
24 | 23 | ||
25 | #include <fcntl.h> | 24 | #include <fcntl.h> |
26 | |||
27 | #include <unistd.h> | 25 | #include <unistd.h> |
28 | 26 | ||
29 | /* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or | 27 | /* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or |
@@ -32,11 +30,5 @@ | |||
32 | int | 30 | int |
33 | dup_safer (int fd) | 31 | dup_safer (int fd) |
34 | { | 32 | { |
35 | #if defined F_DUPFD && !defined FCHDIR_REPLACEMENT | ||
36 | return fcntl (fd, F_DUPFD, STDERR_FILENO + 1); | 33 | return fcntl (fd, F_DUPFD, STDERR_FILENO + 1); |
37 | #else | ||
38 | /* fd_safer calls us back, but eventually the recursion unwinds and | ||
39 | does the right thing. */ | ||
40 | return fd_safer (dup (fd)); | ||
41 | #endif | ||
42 | } | 34 | } |
diff --git a/gl/dup2.c b/gl/dup2.c new file mode 100644 index 00000000..a4422bf3 --- /dev/null +++ b/gl/dup2.c | |||
@@ -0,0 +1,128 @@ | |||
1 | /* Duplicate an open file descriptor to a specified file descriptor. | ||
2 | |||
3 | Copyright (C) 1999, 2004-2007, 2009-2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | /* written by Paul Eggert */ | ||
19 | |||
20 | #include <config.h> | ||
21 | |||
22 | /* Specification. */ | ||
23 | #include <unistd.h> | ||
24 | |||
25 | #include <errno.h> | ||
26 | #include <fcntl.h> | ||
27 | |||
28 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
29 | /* Get declarations of the Win32 API functions. */ | ||
30 | # define WIN32_LEAN_AND_MEAN | ||
31 | # include <windows.h> | ||
32 | #endif | ||
33 | |||
34 | #if HAVE_DUP2 | ||
35 | |||
36 | # undef dup2 | ||
37 | |||
38 | int | ||
39 | rpl_dup2 (int fd, int desired_fd) | ||
40 | { | ||
41 | int result; | ||
42 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
43 | /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open, | ||
44 | dup2 (fd, fd) returns 0, but all further attempts to use fd in | ||
45 | future dup2 calls will hang. */ | ||
46 | if (fd == desired_fd) | ||
47 | { | ||
48 | if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE) | ||
49 | { | ||
50 | errno = EBADF; | ||
51 | return -1; | ||
52 | } | ||
53 | return fd; | ||
54 | } | ||
55 | /* Wine 1.0.1 return 0 when desired_fd is negative but not -1: | ||
56 | http://bugs.winehq.org/show_bug.cgi?id=21289 */ | ||
57 | if (desired_fd < 0) | ||
58 | { | ||
59 | errno = EBADF; | ||
60 | return -1; | ||
61 | } | ||
62 | # endif | ||
63 | result = dup2 (fd, desired_fd); | ||
64 | # ifdef __linux__ | ||
65 | /* Correct a Linux return value. | ||
66 | <http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.30.y.git;a=commitdiff;h=2b79bc4f7ebbd5af3c8b867968f9f15602d5f802> | ||
67 | */ | ||
68 | if (fd == desired_fd && result == (unsigned int) -EBADF) | ||
69 | { | ||
70 | errno = EBADF; | ||
71 | result = -1; | ||
72 | } | ||
73 | # endif | ||
74 | if (result == 0) | ||
75 | result = desired_fd; | ||
76 | /* Correct a cygwin 1.5.x errno value. */ | ||
77 | else if (result == -1 && errno == EMFILE) | ||
78 | errno = EBADF; | ||
79 | # if REPLACE_FCHDIR | ||
80 | if (fd != desired_fd && result != -1) | ||
81 | result = _gl_register_dup (fd, result); | ||
82 | # endif | ||
83 | return result; | ||
84 | } | ||
85 | |||
86 | #else /* !HAVE_DUP2 */ | ||
87 | |||
88 | /* On older platforms, dup2 did not exist. */ | ||
89 | |||
90 | # ifndef F_DUPFD | ||
91 | static int | ||
92 | dupfd (int fd, int desired_fd) | ||
93 | { | ||
94 | int duplicated_fd = dup (fd); | ||
95 | if (duplicated_fd < 0 || duplicated_fd == desired_fd) | ||
96 | return duplicated_fd; | ||
97 | else | ||
98 | { | ||
99 | int r = dupfd (fd, desired_fd); | ||
100 | int e = errno; | ||
101 | close (duplicated_fd); | ||
102 | errno = e; | ||
103 | return r; | ||
104 | } | ||
105 | } | ||
106 | # endif | ||
107 | |||
108 | int | ||
109 | dup2 (int fd, int desired_fd) | ||
110 | { | ||
111 | int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd; | ||
112 | if (result == -1 || fd == desired_fd) | ||
113 | return result; | ||
114 | close (desired_fd); | ||
115 | # ifdef F_DUPFD | ||
116 | result = fcntl (fd, F_DUPFD, desired_fd); | ||
117 | # if REPLACE_FCHDIR | ||
118 | if (0 <= result) | ||
119 | result = _gl_register_dup (fd, result); | ||
120 | # endif | ||
121 | # else | ||
122 | result = dupfd (fd, desired_fd); | ||
123 | # endif | ||
124 | if (result == -1 && (errno == EMFILE || errno == EINVAL)) | ||
125 | errno = EBADF; | ||
126 | return result; | ||
127 | } | ||
128 | #endif /* !HAVE_DUP2 */ | ||
diff --git a/gl/errno.in.h b/gl/errno.in.h index 51ac6624..140e5d13 100644 --- a/gl/errno.in.h +++ b/gl/errno.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A POSIX-like <errno.h>. | 1 | /* A POSIX-like <errno.h>. |
2 | 2 | ||
3 | Copyright (C) 2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2008-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -145,6 +145,11 @@ | |||
145 | # define GNULIB_defined_ENOTSUP 1 | 145 | # define GNULIB_defined_ENOTSUP 1 |
146 | # endif | 146 | # endif |
147 | 147 | ||
148 | # ifndef ESTALE | ||
149 | # define ESTALE 2009 | ||
150 | # define GNULIB_defined_ESTALE 1 | ||
151 | # endif | ||
152 | |||
148 | # ifndef ECANCELED | 153 | # ifndef ECANCELED |
149 | # define ECANCELED 2008 | 154 | # define ECANCELED 2008 |
150 | # define GNULIB_defined_ECANCELED 1 | 155 | # define GNULIB_defined_ECANCELED 1 |
@@ -1,5 +1,5 @@ | |||
1 | /* Error handler for noninteractive utilities | 1 | /* Error handler for noninteractive utilities |
2 | Copyright (C) 1990-1998, 2000-2007 Free Software Foundation, Inc. | 2 | Copyright (C) 1990-1998, 2000-2007, 2009-2010 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. | 3 | This file is part of the GNU C Library. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
@@ -70,8 +70,8 @@ unsigned int error_message_count; | |||
70 | extern void __error (int status, int errnum, const char *message, ...) | 70 | extern void __error (int status, int errnum, const char *message, ...) |
71 | __attribute__ ((__format__ (__printf__, 3, 4))); | 71 | __attribute__ ((__format__ (__printf__, 3, 4))); |
72 | extern void __error_at_line (int status, int errnum, const char *file_name, | 72 | extern void __error_at_line (int status, int errnum, const char *file_name, |
73 | unsigned int line_number, const char *message, | 73 | unsigned int line_number, const char *message, |
74 | ...) | 74 | ...) |
75 | __attribute__ ((__format__ (__printf__, 5, 6)));; | 75 | __attribute__ ((__format__ (__printf__, 5, 6)));; |
76 | # define error __error | 76 | # define error __error |
77 | # define error_at_line __error_at_line | 77 | # define error_at_line __error_at_line |
@@ -85,6 +85,9 @@ extern void __error_at_line (int status, int errnum, const char *file_name, | |||
85 | 85 | ||
86 | #else /* not _LIBC */ | 86 | #else /* not _LIBC */ |
87 | 87 | ||
88 | # include <fcntl.h> | ||
89 | # include <unistd.h> | ||
90 | |||
88 | # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P | 91 | # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P |
89 | # ifndef HAVE_DECL_STRERROR_R | 92 | # ifndef HAVE_DECL_STRERROR_R |
90 | "this configure-time declaration test was not run" | 93 | "this configure-time declaration test was not run" |
@@ -98,8 +101,33 @@ extern char *program_name; | |||
98 | 101 | ||
99 | # if HAVE_STRERROR_R || defined strerror_r | 102 | # if HAVE_STRERROR_R || defined strerror_r |
100 | # define __strerror_r strerror_r | 103 | # define __strerror_r strerror_r |
101 | # endif /* HAVE_STRERROR_R || defined strerror_r */ | 104 | # endif /* HAVE_STRERROR_R || defined strerror_r */ |
102 | #endif /* not _LIBC */ | 105 | #endif /* not _LIBC */ |
106 | |||
107 | static inline void | ||
108 | flush_stdout (void) | ||
109 | { | ||
110 | #if !_LIBC && defined F_GETFL | ||
111 | int stdout_fd; | ||
112 | |||
113 | # if GNULIB_FREOPEN_SAFER | ||
114 | /* Use of gnulib's freopen-safer module normally ensures that | ||
115 | fileno (stdout) == 1 | ||
116 | whenever stdout is open. */ | ||
117 | stdout_fd = STDOUT_FILENO; | ||
118 | # else | ||
119 | /* POSIX states that fileno (stdout) after fclose is unspecified. But in | ||
120 | practice it is not a problem, because stdout is statically allocated and | ||
121 | the fd of a FILE stream is stored as a field in its allocated memory. */ | ||
122 | stdout_fd = fileno (stdout); | ||
123 | # endif | ||
124 | /* POSIX states that fflush (stdout) after fclose is unspecified; it | ||
125 | is safe in glibc, but not on all other platforms. fflush (NULL) | ||
126 | is always defined, but too draconian. */ | ||
127 | if (0 <= stdout_fd && 0 <= fcntl (stdout_fd, F_GETFL)) | ||
128 | #endif | ||
129 | fflush (stdout); | ||
130 | } | ||
103 | 131 | ||
104 | static void | 132 | static void |
105 | print_errno_message (int errnum) | 133 | print_errno_message (int errnum) |
@@ -147,58 +175,58 @@ error_tail (int status, int errnum, const char *message, va_list args) | |||
147 | bool use_malloc = false; | 175 | bool use_malloc = false; |
148 | 176 | ||
149 | while (1) | 177 | while (1) |
150 | { | 178 | { |
151 | if (__libc_use_alloca (len * sizeof (wchar_t))) | 179 | if (__libc_use_alloca (len * sizeof (wchar_t))) |
152 | wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); | 180 | wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); |
153 | else | 181 | else |
154 | { | 182 | { |
155 | if (!use_malloc) | 183 | if (!use_malloc) |
156 | wmessage = NULL; | 184 | wmessage = NULL; |
157 | 185 | ||
158 | wchar_t *p = (wchar_t *) realloc (wmessage, | 186 | wchar_t *p = (wchar_t *) realloc (wmessage, |
159 | len * sizeof (wchar_t)); | 187 | len * sizeof (wchar_t)); |
160 | if (p == NULL) | 188 | if (p == NULL) |
161 | { | 189 | { |
162 | free (wmessage); | 190 | free (wmessage); |
163 | fputws_unlocked (L"out of memory\n", stderr); | 191 | fputws_unlocked (L"out of memory\n", stderr); |
164 | return; | 192 | return; |
165 | } | 193 | } |
166 | wmessage = p; | 194 | wmessage = p; |
167 | use_malloc = true; | 195 | use_malloc = true; |
168 | } | 196 | } |
169 | 197 | ||
170 | memset (&st, '\0', sizeof (st)); | 198 | memset (&st, '\0', sizeof (st)); |
171 | tmp = message; | 199 | tmp = message; |
172 | 200 | ||
173 | res = mbsrtowcs (wmessage, &tmp, len, &st); | 201 | res = mbsrtowcs (wmessage, &tmp, len, &st); |
174 | if (res != len) | 202 | if (res != len) |
175 | break; | 203 | break; |
176 | 204 | ||
177 | if (__builtin_expect (len >= SIZE_MAX / 2, 0)) | 205 | if (__builtin_expect (len >= SIZE_MAX / 2, 0)) |
178 | { | 206 | { |
179 | /* This really should not happen if everything is fine. */ | 207 | /* This really should not happen if everything is fine. */ |
180 | res = (size_t) -1; | 208 | res = (size_t) -1; |
181 | break; | 209 | break; |
182 | } | 210 | } |
183 | 211 | ||
184 | len *= 2; | 212 | len *= 2; |
185 | } | 213 | } |
186 | 214 | ||
187 | if (res == (size_t) -1) | 215 | if (res == (size_t) -1) |
188 | { | 216 | { |
189 | /* The string cannot be converted. */ | 217 | /* The string cannot be converted. */ |
190 | if (use_malloc) | 218 | if (use_malloc) |
191 | { | 219 | { |
192 | free (wmessage); | 220 | free (wmessage); |
193 | use_malloc = false; | 221 | use_malloc = false; |
194 | } | 222 | } |
195 | wmessage = (wchar_t *) L"???"; | 223 | wmessage = (wchar_t *) L"???"; |
196 | } | 224 | } |
197 | 225 | ||
198 | __vfwprintf (stderr, wmessage, args); | 226 | __vfwprintf (stderr, wmessage, args); |
199 | 227 | ||
200 | if (use_malloc) | 228 | if (use_malloc) |
201 | free (wmessage); | 229 | free (wmessage); |
202 | } | 230 | } |
203 | else | 231 | else |
204 | #endif | 232 | #endif |
@@ -233,10 +261,10 @@ error (int status, int errnum, const char *message, ...) | |||
233 | cancellation. Therefore disable cancellation for now. */ | 261 | cancellation. Therefore disable cancellation for now. */ |
234 | int state = PTHREAD_CANCEL_ENABLE; | 262 | int state = PTHREAD_CANCEL_ENABLE; |
235 | __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), | 263 | __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), |
236 | 0); | 264 | 0); |
237 | #endif | 265 | #endif |
238 | 266 | ||
239 | fflush (stdout); | 267 | flush_stdout (); |
240 | #ifdef _LIBC | 268 | #ifdef _LIBC |
241 | _IO_flockfile (stderr); | 269 | _IO_flockfile (stderr); |
242 | #endif | 270 | #endif |
@@ -268,7 +296,7 @@ int error_one_per_line; | |||
268 | 296 | ||
269 | void | 297 | void |
270 | error_at_line (int status, int errnum, const char *file_name, | 298 | error_at_line (int status, int errnum, const char *file_name, |
271 | unsigned int line_number, const char *message, ...) | 299 | unsigned int line_number, const char *message, ...) |
272 | { | 300 | { |
273 | va_list args; | 301 | va_list args; |
274 | 302 | ||
@@ -278,10 +306,10 @@ error_at_line (int status, int errnum, const char *file_name, | |||
278 | static unsigned int old_line_number; | 306 | static unsigned int old_line_number; |
279 | 307 | ||
280 | if (old_line_number == line_number | 308 | if (old_line_number == line_number |
281 | && (file_name == old_file_name | 309 | && (file_name == old_file_name |
282 | || strcmp (old_file_name, file_name) == 0)) | 310 | || strcmp (old_file_name, file_name) == 0)) |
283 | /* Simply return and print nothing. */ | 311 | /* Simply return and print nothing. */ |
284 | return; | 312 | return; |
285 | 313 | ||
286 | old_file_name = file_name; | 314 | old_file_name = file_name; |
287 | old_line_number = line_number; | 315 | old_line_number = line_number; |
@@ -292,10 +320,10 @@ error_at_line (int status, int errnum, const char *file_name, | |||
292 | cancellation. Therefore disable cancellation for now. */ | 320 | cancellation. Therefore disable cancellation for now. */ |
293 | int state = PTHREAD_CANCEL_ENABLE; | 321 | int state = PTHREAD_CANCEL_ENABLE; |
294 | __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), | 322 | __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), |
295 | 0); | 323 | 0); |
296 | #endif | 324 | #endif |
297 | 325 | ||
298 | fflush (stdout); | 326 | flush_stdout (); |
299 | #ifdef _LIBC | 327 | #ifdef _LIBC |
300 | _IO_flockfile (stderr); | 328 | _IO_flockfile (stderr); |
301 | #endif | 329 | #endif |
@@ -312,10 +340,10 @@ error_at_line (int status, int errnum, const char *file_name, | |||
312 | 340 | ||
313 | #if _LIBC | 341 | #if _LIBC |
314 | __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ", | 342 | __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ", |
315 | file_name, line_number); | 343 | file_name, line_number); |
316 | #else | 344 | #else |
317 | fprintf (stderr, file_name != NULL ? "%s:%d: " : " ", | 345 | fprintf (stderr, file_name != NULL ? "%s:%d: " : " ", |
318 | file_name, line_number); | 346 | file_name, line_number); |
319 | #endif | 347 | #endif |
320 | 348 | ||
321 | va_start (args, message); | 349 | va_start (args, message); |
@@ -1,5 +1,6 @@ | |||
1 | /* Declaration for error-reporting function | 1 | /* Declaration for error-reporting function |
2 | Copyright (C) 1995, 1996, 1997, 2003, 2006, 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 1995, 1996, 1997, 2003, 2006, 2008, 2009, 2010 Free Software |
3 | Foundation, Inc. | ||
3 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
@@ -19,19 +20,18 @@ | |||
19 | #define _ERROR_H 1 | 20 | #define _ERROR_H 1 |
20 | 21 | ||
21 | #ifndef __attribute__ | 22 | #ifndef __attribute__ |
22 | /* This feature is available in gcc versions 2.5 and later. */ | 23 | /* The __attribute__ feature is available in gcc versions 2.5 and later. |
23 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) | 24 | The __-protected variants of the attributes 'format' and 'printf' are |
24 | # define __attribute__(Spec) /* empty */ | 25 | accepted by gcc versions 2.6.4 (effectively 2.7) and later. |
25 | # endif | 26 | We enable __attribute__ only if these are supported too, because |
26 | /* The __-protected variants of `format' and `printf' attributes | 27 | gnulib and libintl do '#define printf __printf__' when they override |
27 | are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ | 28 | the 'printf' function. */ |
28 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) | 29 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) |
29 | # define __format__ format | 30 | # define __attribute__(Spec) /* empty */ |
30 | # define __printf__ printf | ||
31 | # endif | 31 | # endif |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #ifdef __cplusplus | 34 | #ifdef __cplusplus |
35 | extern "C" { | 35 | extern "C" { |
36 | #endif | 36 | #endif |
37 | 37 | ||
@@ -43,7 +43,7 @@ extern void error (int __status, int __errnum, const char *__format, ...) | |||
43 | __attribute__ ((__format__ (__printf__, 3, 4))); | 43 | __attribute__ ((__format__ (__printf__, 3, 4))); |
44 | 44 | ||
45 | extern void error_at_line (int __status, int __errnum, const char *__fname, | 45 | extern void error_at_line (int __status, int __errnum, const char *__fname, |
46 | unsigned int __lineno, const char *__format, ...) | 46 | unsigned int __lineno, const char *__format, ...) |
47 | __attribute__ ((__format__ (__printf__, 5, 6))); | 47 | __attribute__ ((__format__ (__printf__, 5, 6))); |
48 | 48 | ||
49 | /* If NULL, error will flush stdout, then print on stderr the program | 49 | /* If NULL, error will flush stdout, then print on stderr the program |
@@ -58,7 +58,7 @@ extern unsigned int error_message_count; | |||
58 | variable controls whether this mode is selected or not. */ | 58 | variable controls whether this mode is selected or not. */ |
59 | extern int error_one_per_line; | 59 | extern int error_one_per_line; |
60 | 60 | ||
61 | #ifdef __cplusplus | 61 | #ifdef __cplusplus |
62 | } | 62 | } |
63 | #endif | 63 | #endif |
64 | 64 | ||
diff --git a/gl/exitfail.c b/gl/exitfail.c index 6d1fe4ae..3b63f8a1 100644 --- a/gl/exitfail.c +++ b/gl/exitfail.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* Failure exit status | 1 | /* Failure exit status |
2 | 2 | ||
3 | Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. | 3 | Copyright (C) 2002, 2003, 2005, 2006, 2007, 2009, 2010 Free Software |
4 | Foundation, Inc. | ||
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/exitfail.h b/gl/exitfail.h index 713f2591..7ffffe5c 100644 --- a/gl/exitfail.h +++ b/gl/exitfail.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Failure exit status | 1 | /* Failure exit status |
2 | 2 | ||
3 | Copyright (C) 2002 Free Software Foundation, Inc. | 3 | Copyright (C) 2002, 2009, 2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/fcntl--.h b/gl/fcntl--.h index 5a6a8792..7baa2cbc 100644 --- a/gl/fcntl--.h +++ b/gl/fcntl--.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Like fcntl.h, but redefine some names to avoid glitches. | 1 | /* Like fcntl.h, but redefine some names to avoid glitches. |
2 | 2 | ||
3 | Copyright (C) 2005 Free Software Foundation, Inc. | 3 | Copyright (C) 2005, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -25,3 +25,8 @@ | |||
25 | 25 | ||
26 | #undef creat | 26 | #undef creat |
27 | #define creat creat_safer | 27 | #define creat creat_safer |
28 | |||
29 | #if GNULIB_OPENAT_SAFER | ||
30 | # undef openat | ||
31 | # define openat openat_safer | ||
32 | #endif | ||
diff --git a/gl/fcntl-safer.h b/gl/fcntl-safer.h index 99f38656..5c76b4bc 100644 --- a/gl/fcntl-safer.h +++ b/gl/fcntl-safer.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Invoke fcntl-like functions, but avoid some glitches. | 1 | /* Invoke fcntl-like functions, but avoid some glitches. |
2 | 2 | ||
3 | Copyright (C) 2005 Free Software Foundation, Inc. | 3 | Copyright (C) 2005, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -21,3 +21,7 @@ | |||
21 | 21 | ||
22 | int open_safer (char const *, int, ...); | 22 | int open_safer (char const *, int, ...); |
23 | int creat_safer (char const *, mode_t); | 23 | int creat_safer (char const *, mode_t); |
24 | |||
25 | #if GNULIB_OPENAT_SAFER | ||
26 | int openat_safer (int, char const *, int, ...); | ||
27 | #endif | ||
diff --git a/gl/fcntl.c b/gl/fcntl.c new file mode 100644 index 00000000..c51e8ded --- /dev/null +++ b/gl/fcntl.c | |||
@@ -0,0 +1,294 @@ | |||
1 | /* Provide file descriptor control. | ||
2 | |||
3 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | /* Written by Eric Blake <ebb9@byu.net>. */ | ||
19 | |||
20 | #include <config.h> | ||
21 | |||
22 | /* Specification. */ | ||
23 | #include <fcntl.h> | ||
24 | |||
25 | #include <errno.h> | ||
26 | #include <limits.h> | ||
27 | #include <stdarg.h> | ||
28 | #include <unistd.h> | ||
29 | |||
30 | #if !HAVE_FCNTL | ||
31 | # define rpl_fcntl fcntl | ||
32 | #endif | ||
33 | #undef fcntl | ||
34 | |||
35 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
36 | /* Get declarations of the Win32 API functions. */ | ||
37 | # define WIN32_LEAN_AND_MEAN | ||
38 | # include <windows.h> | ||
39 | |||
40 | /* Upper bound on getdtablesize(). See lib/getdtablesize.c. */ | ||
41 | # define OPEN_MAX_MAX 0x10000 | ||
42 | |||
43 | /* Duplicate OLDFD into the first available slot of at least NEWFD, | ||
44 | which must be positive, with FLAGS determining whether the duplicate | ||
45 | will be inheritable. */ | ||
46 | static int | ||
47 | dupfd (int oldfd, int newfd, int flags) | ||
48 | { | ||
49 | /* Mingw has no way to create an arbitrary fd. Iterate until all | ||
50 | file descriptors less than newfd are filled up. */ | ||
51 | HANDLE curr_process = GetCurrentProcess (); | ||
52 | HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd); | ||
53 | unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT]; | ||
54 | unsigned int fds_to_close_bound = 0; | ||
55 | int result; | ||
56 | BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE; | ||
57 | int mode; | ||
58 | |||
59 | if (newfd < 0 || getdtablesize () <= newfd) | ||
60 | { | ||
61 | errno = EINVAL; | ||
62 | return -1; | ||
63 | } | ||
64 | if (old_handle == INVALID_HANDLE_VALUE | ||
65 | || (mode = setmode (oldfd, O_BINARY)) == -1) | ||
66 | { | ||
67 | /* oldfd is not open, or is an unassigned standard file | ||
68 | descriptor. */ | ||
69 | errno = EBADF; | ||
70 | return -1; | ||
71 | } | ||
72 | setmode (oldfd, mode); | ||
73 | flags |= mode; | ||
74 | |||
75 | for (;;) | ||
76 | { | ||
77 | HANDLE new_handle; | ||
78 | int duplicated_fd; | ||
79 | unsigned int index; | ||
80 | |||
81 | if (!DuplicateHandle (curr_process, /* SourceProcessHandle */ | ||
82 | old_handle, /* SourceHandle */ | ||
83 | curr_process, /* TargetProcessHandle */ | ||
84 | (PHANDLE) &new_handle, /* TargetHandle */ | ||
85 | (DWORD) 0, /* DesiredAccess */ | ||
86 | inherit, /* InheritHandle */ | ||
87 | DUPLICATE_SAME_ACCESS)) /* Options */ | ||
88 | { | ||
89 | /* TODO: Translate GetLastError () into errno. */ | ||
90 | errno = EMFILE; | ||
91 | result = -1; | ||
92 | break; | ||
93 | } | ||
94 | duplicated_fd = _open_osfhandle ((long) new_handle, flags); | ||
95 | if (duplicated_fd < 0) | ||
96 | { | ||
97 | CloseHandle (new_handle); | ||
98 | errno = EMFILE; | ||
99 | result = -1; | ||
100 | break; | ||
101 | } | ||
102 | if (newfd <= duplicated_fd) | ||
103 | { | ||
104 | result = duplicated_fd; | ||
105 | break; | ||
106 | } | ||
107 | |||
108 | /* Set the bit duplicated_fd in fds_to_close[]. */ | ||
109 | index = (unsigned int) duplicated_fd / CHAR_BIT; | ||
110 | if (fds_to_close_bound <= index) | ||
111 | { | ||
112 | if (sizeof fds_to_close <= index) | ||
113 | /* Need to increase OPEN_MAX_MAX. */ | ||
114 | abort (); | ||
115 | memset (fds_to_close + fds_to_close_bound, '\0', | ||
116 | index + 1 - fds_to_close_bound); | ||
117 | fds_to_close_bound = index + 1; | ||
118 | } | ||
119 | fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT); | ||
120 | } | ||
121 | |||
122 | /* Close the previous fds that turned out to be too small. */ | ||
123 | { | ||
124 | int saved_errno = errno; | ||
125 | unsigned int duplicated_fd; | ||
126 | |||
127 | for (duplicated_fd = 0; | ||
128 | duplicated_fd < fds_to_close_bound * CHAR_BIT; | ||
129 | duplicated_fd++) | ||
130 | if ((fds_to_close[duplicated_fd / CHAR_BIT] | ||
131 | >> (duplicated_fd % CHAR_BIT)) | ||
132 | & 1) | ||
133 | close (duplicated_fd); | ||
134 | |||
135 | errno = saved_errno; | ||
136 | } | ||
137 | |||
138 | # if REPLACE_FCHDIR | ||
139 | if (0 <= result) | ||
140 | result = _gl_register_dup (oldfd, result); | ||
141 | # endif | ||
142 | return result; | ||
143 | } | ||
144 | #endif /* W32 */ | ||
145 | |||
146 | /* Perform the specified ACTION on the file descriptor FD, possibly | ||
147 | using the argument ARG further described below. This replacement | ||
148 | handles the following actions, and forwards all others on to the | ||
149 | native fcntl. An unrecognized ACTION returns -1 with errno set to | ||
150 | EINVAL. | ||
151 | |||
152 | F_DUPFD - duplicate FD, with int ARG being the minimum target fd. | ||
153 | If successful, return the duplicate, which will be inheritable; | ||
154 | otherwise return -1 and set errno. | ||
155 | |||
156 | F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum | ||
157 | target fd. If successful, return the duplicate, which will not be | ||
158 | inheritable; otherwise return -1 and set errno. | ||
159 | |||
160 | F_GETFD - ARG need not be present. If successful, return a | ||
161 | non-negative value containing the descriptor flags of FD (only | ||
162 | FD_CLOEXEC is portable, but other flags may be present); otherwise | ||
163 | return -1 and set errno. */ | ||
164 | |||
165 | int | ||
166 | rpl_fcntl (int fd, int action, /* arg */...) | ||
167 | { | ||
168 | va_list arg; | ||
169 | int result = -1; | ||
170 | va_start (arg, action); | ||
171 | switch (action) | ||
172 | { | ||
173 | |||
174 | #if !HAVE_FCNTL | ||
175 | case F_DUPFD: | ||
176 | { | ||
177 | int target = va_arg (arg, int); | ||
178 | result = dupfd (fd, target, 0); | ||
179 | break; | ||
180 | } | ||
181 | #elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR | ||
182 | case F_DUPFD: | ||
183 | { | ||
184 | int target = va_arg (arg, int); | ||
185 | /* Detect invalid target; needed for cygwin 1.5.x. */ | ||
186 | if (target < 0 || getdtablesize () <= target) | ||
187 | errno = EINVAL; | ||
188 | else | ||
189 | { | ||
190 | result = fcntl (fd, action, target); | ||
191 | # if REPLACE_FCHDIR | ||
192 | if (0 <= result) | ||
193 | result = _gl_register_dup (fd, result); | ||
194 | # endif | ||
195 | } | ||
196 | break; | ||
197 | } /* F_DUPFD */ | ||
198 | #endif /* FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR */ | ||
199 | |||
200 | case F_DUPFD_CLOEXEC: | ||
201 | { | ||
202 | int target = va_arg (arg, int); | ||
203 | |||
204 | #if !HAVE_FCNTL | ||
205 | result = dupfd (fd, target, O_CLOEXEC); | ||
206 | break; | ||
207 | #else /* HAVE_FCNTL */ | ||
208 | /* Try the system call first, if the headers claim it exists | ||
209 | (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we | ||
210 | may be running with a glibc that has the macro but with an | ||
211 | older kernel that does not support it. Cache the | ||
212 | information on whether the system call really works, but | ||
213 | avoid caching failure if the corresponding F_DUPFD fails | ||
214 | for any reason. 0 = unknown, 1 = yes, -1 = no. */ | ||
215 | static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0; | ||
216 | if (0 <= have_dupfd_cloexec) | ||
217 | { | ||
218 | result = fcntl (fd, action, target); | ||
219 | if (0 <= result || errno != EINVAL) | ||
220 | { | ||
221 | have_dupfd_cloexec = 1; | ||
222 | # if REPLACE_FCHDIR | ||
223 | if (0 <= result) | ||
224 | result = _gl_register_dup (fd, result); | ||
225 | # endif | ||
226 | } | ||
227 | else | ||
228 | { | ||
229 | result = rpl_fcntl (fd, F_DUPFD, target); | ||
230 | if (result < 0) | ||
231 | break; | ||
232 | have_dupfd_cloexec = -1; | ||
233 | } | ||
234 | } | ||
235 | else | ||
236 | result = rpl_fcntl (fd, F_DUPFD, target); | ||
237 | if (0 <= result && have_dupfd_cloexec == -1) | ||
238 | { | ||
239 | int flags = fcntl (result, F_GETFD); | ||
240 | if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1) | ||
241 | { | ||
242 | int saved_errno = errno; | ||
243 | close (result); | ||
244 | errno = saved_errno; | ||
245 | result = -1; | ||
246 | } | ||
247 | } | ||
248 | break; | ||
249 | #endif /* HAVE_FCNTL */ | ||
250 | } /* F_DUPFD_CLOEXEC */ | ||
251 | |||
252 | #if !HAVE_FCNTL | ||
253 | case F_GETFD: | ||
254 | { | ||
255 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
256 | HANDLE handle = (HANDLE) _get_osfhandle (fd); | ||
257 | DWORD flags; | ||
258 | if (handle == INVALID_HANDLE_VALUE | ||
259 | || GetHandleInformation (handle, &flags) == 0) | ||
260 | errno = EBADF; | ||
261 | else | ||
262 | result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC; | ||
263 | # else /* !W32 */ | ||
264 | /* Use dup2 to reject invalid file descriptors. No way to | ||
265 | access this information, so punt. */ | ||
266 | if (0 <= dup2 (fd, fd)) | ||
267 | result = 0; | ||
268 | # endif /* !W32 */ | ||
269 | break; | ||
270 | } /* F_GETFD */ | ||
271 | #endif /* !HAVE_FCNTL */ | ||
272 | |||
273 | /* Implementing F_SETFD on mingw is not trivial - there is no | ||
274 | API for changing the O_NOINHERIT bit on an fd, and merely | ||
275 | changing the HANDLE_FLAG_INHERIT bit on the underlying handle | ||
276 | can lead to odd state. It may be possible by duplicating the | ||
277 | handle, using _open_osfhandle with the right flags, then | ||
278 | using dup2 to move the duplicate onto the original, but that | ||
279 | is not supported for now. */ | ||
280 | |||
281 | default: | ||
282 | { | ||
283 | #if HAVE_FCNTL | ||
284 | void *p = va_arg (arg, void *); | ||
285 | result = fcntl (fd, action, p); | ||
286 | #else | ||
287 | errno = EINVAL; | ||
288 | #endif | ||
289 | break; | ||
290 | } | ||
291 | } | ||
292 | va_end (arg); | ||
293 | return result; | ||
294 | } | ||
diff --git a/gl/fcntl.in.h b/gl/fcntl.in.h index fd7520e8..8fb78522 100644 --- a/gl/fcntl.in.h +++ b/gl/fcntl.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Like <fcntl.h>, but with non-working flags defined to 0. | 1 | /* Like <fcntl.h>, but with non-working flags defined to 0. |
2 | 2 | ||
3 | Copyright (C) 2006-2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2006-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -25,8 +25,9 @@ | |||
25 | /* Special invocation convention. */ | 25 | /* Special invocation convention. */ |
26 | 26 | ||
27 | #include <sys/types.h> | 27 | #include <sys/types.h> |
28 | #include <sys/stat.h> | 28 | #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ |
29 | #include <unistd.h> | 29 | # include <sys/stat.h> |
30 | #endif | ||
30 | #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ | 31 | #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ |
31 | 32 | ||
32 | #else | 33 | #else |
@@ -35,38 +36,126 @@ | |||
35 | #ifndef _GL_FCNTL_H | 36 | #ifndef _GL_FCNTL_H |
36 | 37 | ||
37 | #include <sys/types.h> | 38 | #include <sys/types.h> |
38 | #include <sys/stat.h> | 39 | #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ |
39 | #include <unistd.h> | 40 | # include <sys/stat.h> |
41 | #endif | ||
40 | /* The include_next requires a split double-inclusion guard. */ | 42 | /* The include_next requires a split double-inclusion guard. */ |
41 | #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ | 43 | #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ |
42 | 44 | ||
43 | #ifndef _GL_FCNTL_H | 45 | #ifndef _GL_FCNTL_H |
44 | #define _GL_FCNTL_H | 46 | #define _GL_FCNTL_H |
45 | 47 | ||
48 | #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ | ||
49 | # include <unistd.h> | ||
50 | #endif | ||
51 | |||
52 | |||
53 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
54 | |||
55 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
56 | |||
57 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
58 | |||
46 | 59 | ||
47 | /* Declare overridden functions. */ | 60 | /* Declare overridden functions. */ |
48 | 61 | ||
49 | #ifdef __cplusplus | 62 | #if @GNULIB_FCNTL@ |
50 | extern "C" { | 63 | # if @REPLACE_FCNTL@ |
64 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
65 | # undef fcntl | ||
66 | # define fcntl rpl_fcntl | ||
67 | # endif | ||
68 | _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...)); | ||
69 | _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...)); | ||
70 | # else | ||
71 | # if !@HAVE_FCNTL@ | ||
72 | _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...)); | ||
73 | # endif | ||
74 | _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...)); | ||
75 | # endif | ||
76 | _GL_CXXALIASWARN (fcntl); | ||
77 | #elif defined GNULIB_POSIXCHECK | ||
78 | # undef fcntl | ||
79 | # if HAVE_RAW_DECL_FCNTL | ||
80 | _GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - " | ||
81 | "use gnulib module fcntl for portability"); | ||
82 | # endif | ||
51 | #endif | 83 | #endif |
52 | 84 | ||
53 | #if @GNULIB_OPEN@ | 85 | #if @GNULIB_OPEN@ |
54 | # if @REPLACE_OPEN@ | 86 | # if @REPLACE_OPEN@ |
55 | # undef open | 87 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
56 | # define open rpl_open | 88 | # undef open |
57 | extern int open (const char *filename, int flags, ...); | 89 | # define open rpl_open |
90 | # endif | ||
91 | _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) | ||
92 | _GL_ARG_NONNULL ((1))); | ||
93 | _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); | ||
94 | # else | ||
95 | _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); | ||
58 | # endif | 96 | # endif |
97 | _GL_CXXALIASWARN (open); | ||
98 | #elif defined GNULIB_POSIXCHECK | ||
99 | # undef open | ||
100 | /* Assume open is always declared. */ | ||
101 | _GL_WARN_ON_USE (open, "open is not always POSIX compliant - " | ||
102 | "use gnulib module open for portability"); | ||
59 | #endif | 103 | #endif |
60 | 104 | ||
61 | #ifdef FCHDIR_REPLACEMENT | 105 | #if @GNULIB_OPENAT@ |
62 | /* gnulib internal function. */ | 106 | # if @REPLACE_OPENAT@ |
63 | extern void _gl_register_fd (int fd, const char *filename); | 107 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
108 | # undef openat | ||
109 | # define openat rpl_openat | ||
110 | # endif | ||
111 | _GL_FUNCDECL_RPL (openat, int, | ||
112 | (int fd, char const *file, int flags, /* mode_t mode */ ...) | ||
113 | _GL_ARG_NONNULL ((2))); | ||
114 | _GL_CXXALIAS_RPL (openat, int, | ||
115 | (int fd, char const *file, int flags, /* mode_t mode */ ...)); | ||
116 | # else | ||
117 | # if !@HAVE_OPENAT@ | ||
118 | _GL_FUNCDECL_SYS (openat, int, | ||
119 | (int fd, char const *file, int flags, /* mode_t mode */ ...) | ||
120 | _GL_ARG_NONNULL ((2))); | ||
121 | # endif | ||
122 | _GL_CXXALIAS_SYS (openat, int, | ||
123 | (int fd, char const *file, int flags, /* mode_t mode */ ...)); | ||
124 | # endif | ||
125 | _GL_CXXALIASWARN (openat); | ||
126 | #elif defined GNULIB_POSIXCHECK | ||
127 | # undef openat | ||
128 | # if HAVE_RAW_DECL_OPENAT | ||
129 | _GL_WARN_ON_USE (openat, "openat is not portable - " | ||
130 | "use gnulib module openat for portability"); | ||
131 | # endif | ||
132 | #endif | ||
133 | |||
134 | |||
135 | /* Fix up the FD_* macros, only known to be missing on mingw. */ | ||
136 | |||
137 | #ifndef FD_CLOEXEC | ||
138 | # define FD_CLOEXEC 1 | ||
139 | #endif | ||
140 | |||
141 | /* Fix up the supported F_* macros. Intentionally leave other F_* | ||
142 | macros undefined. Only known to be missing on mingw. */ | ||
143 | |||
144 | #ifndef F_DUPFD_CLOEXEC | ||
145 | # define F_DUPFD_CLOEXEC 0x40000000 | ||
146 | /* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */ | ||
147 | # define GNULIB_defined_F_DUPFD_CLOEXEC 1 | ||
148 | #else | ||
149 | # define GNULIB_defined_F_DUPFD_CLOEXEC 0 | ||
64 | #endif | 150 | #endif |
65 | 151 | ||
66 | #ifdef __cplusplus | 152 | #ifndef F_DUPFD |
67 | } | 153 | # define F_DUPFD 1 |
68 | #endif | 154 | #endif |
69 | 155 | ||
156 | #ifndef F_GETFD | ||
157 | # define F_GETFD 2 | ||
158 | #endif | ||
70 | 159 | ||
71 | /* Fix up the O_* macros. */ | 160 | /* Fix up the O_* macros. */ |
72 | 161 | ||
@@ -75,6 +164,12 @@ extern void _gl_register_fd (int fd, const char *filename); | |||
75 | # define O_DIRECT O_DIRECTIO | 164 | # define O_DIRECT O_DIRECTIO |
76 | #endif | 165 | #endif |
77 | 166 | ||
167 | #if !defined O_CLOEXEC && defined O_NOINHERIT | ||
168 | /* Mingw spells it `O_NOINHERIT'. Intentionally leave it | ||
169 | undefined if not available. */ | ||
170 | # define O_CLOEXEC O_NOINHERIT | ||
171 | #endif | ||
172 | |||
78 | #ifndef O_DIRECT | 173 | #ifndef O_DIRECT |
79 | # define O_DIRECT 0 | 174 | # define O_DIRECT 0 |
80 | #endif | 175 | #endif |
@@ -119,6 +214,10 @@ extern void _gl_register_fd (int fd, const char *filename); | |||
119 | # define O_SYNC 0 | 214 | # define O_SYNC 0 |
120 | #endif | 215 | #endif |
121 | 216 | ||
217 | #ifndef O_TTY_INIT | ||
218 | # define O_TTY_INIT 0 | ||
219 | #endif | ||
220 | |||
122 | /* For systems that distinguish between text and binary I/O. | 221 | /* For systems that distinguish between text and binary I/O. |
123 | O_BINARY is usually declared in fcntl.h */ | 222 | O_BINARY is usually declared in fcntl.h */ |
124 | #if !defined O_BINARY && defined _O_BINARY | 223 | #if !defined O_BINARY && defined _O_BINARY |
@@ -138,6 +237,42 @@ extern void _gl_register_fd (int fd, const char *filename); | |||
138 | # define O_TEXT 0 | 237 | # define O_TEXT 0 |
139 | #endif | 238 | #endif |
140 | 239 | ||
240 | /* Fix up the AT_* macros. */ | ||
241 | |||
242 | /* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its | ||
243 | value exceeds INT_MAX, so its use as an int doesn't conform to the | ||
244 | C standard, and GCC and Sun C complain in some cases. If the bug | ||
245 | is present, undef AT_FDCWD here, so it can be redefined below. */ | ||
246 | #if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553 | ||
247 | # undef AT_FDCWD | ||
248 | #endif | ||
249 | |||
250 | /* Use the same bit pattern as Solaris 9, but with the proper | ||
251 | signedness. The bit pattern is important, in case this actually is | ||
252 | Solaris with the above workaround. */ | ||
253 | #ifndef AT_FDCWD | ||
254 | # define AT_FDCWD (-3041965) | ||
255 | #endif | ||
256 | |||
257 | /* Use the same values as Solaris 9. This shouldn't matter, but | ||
258 | there's no real reason to differ. */ | ||
259 | #ifndef AT_SYMLINK_NOFOLLOW | ||
260 | # define AT_SYMLINK_NOFOLLOW 4096 | ||
261 | #endif | ||
262 | |||
263 | #ifndef AT_REMOVEDIR | ||
264 | # define AT_REMOVEDIR 1 | ||
265 | #endif | ||
266 | |||
267 | /* Solaris 9 lacks these two, so just pick unique values. */ | ||
268 | #ifndef AT_SYMLINK_FOLLOW | ||
269 | # define AT_SYMLINK_FOLLOW 2 | ||
270 | #endif | ||
271 | |||
272 | #ifndef AT_EACCESS | ||
273 | # define AT_EACCESS 4 | ||
274 | #endif | ||
275 | |||
141 | 276 | ||
142 | #endif /* _GL_FCNTL_H */ | 277 | #endif /* _GL_FCNTL_H */ |
143 | #endif /* _GL_FCNTL_H */ | 278 | #endif /* _GL_FCNTL_H */ |
diff --git a/gl/fd-safer.c b/gl/fd-safer.c index fb990018..c1c60005 100644 --- a/gl/fd-safer.c +++ b/gl/fd-safer.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Return a safer copy of a file descriptor. | 1 | /* Return a safer copy of a file descriptor. |
2 | 2 | ||
3 | Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -22,7 +22,6 @@ | |||
22 | #include "unistd-safer.h" | 22 | #include "unistd-safer.h" |
23 | 23 | ||
24 | #include <errno.h> | 24 | #include <errno.h> |
25 | |||
26 | #include <unistd.h> | 25 | #include <unistd.h> |
27 | 26 | ||
28 | /* Return FD, unless FD would be a copy of standard input, output, or | 27 | /* Return FD, unless FD would be a copy of standard input, output, or |
diff --git a/gl/float+.h b/gl/float+.h index 240fe365..b55e5e6d 100644 --- a/gl/float+.h +++ b/gl/float+.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Supplemental information about the floating-point formats. | 1 | /* Supplemental information about the floating-point formats. |
2 | Copyright (C) 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2007. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2007. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
diff --git a/gl/float.in.h b/gl/float.in.h index 9ba2bce4..caf822f1 100644 --- a/gl/float.in.h +++ b/gl/float.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A correct <float.h>. | 1 | /* A correct <float.h>. |
2 | 2 | ||
3 | Copyright (C) 2007-2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2007-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -1,5 +1,5 @@ | |||
1 | /* Round towards negative infinity. | 1 | /* Round towards negative infinity. |
2 | Copyright (C) 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -67,27 +67,27 @@ FUNC (DOUBLE x) | |||
67 | { | 67 | { |
68 | /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ | 68 | /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ |
69 | if (z < TWO_MANT_DIG) | 69 | if (z < TWO_MANT_DIG) |
70 | { | 70 | { |
71 | /* Round to the next integer (nearest or up or down, doesn't matter). */ | 71 | /* Round to the next integer (nearest or up or down, doesn't matter). */ |
72 | z += TWO_MANT_DIG; | 72 | z += TWO_MANT_DIG; |
73 | z -= TWO_MANT_DIG; | 73 | z -= TWO_MANT_DIG; |
74 | /* Enforce rounding down. */ | 74 | /* Enforce rounding down. */ |
75 | if (z > y) | 75 | if (z > y) |
76 | z -= L_(1.0); | 76 | z -= L_(1.0); |
77 | } | 77 | } |
78 | } | 78 | } |
79 | else if (z < L_(0.0)) | 79 | else if (z < L_(0.0)) |
80 | { | 80 | { |
81 | /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ | 81 | /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ |
82 | if (z > - TWO_MANT_DIG) | 82 | if (z > - TWO_MANT_DIG) |
83 | { | 83 | { |
84 | /* Round to the next integer (nearest or up or down, doesn't matter). */ | 84 | /* Round to the next integer (nearest or up or down, doesn't matter). */ |
85 | z -= TWO_MANT_DIG; | 85 | z -= TWO_MANT_DIG; |
86 | z += TWO_MANT_DIG; | 86 | z += TWO_MANT_DIG; |
87 | /* Enforce rounding down. */ | 87 | /* Enforce rounding down. */ |
88 | if (z > y) | 88 | if (z > y) |
89 | z -= L_(1.0); | 89 | z -= L_(1.0); |
90 | } | 90 | } |
91 | } | 91 | } |
92 | return z; | 92 | return z; |
93 | } | 93 | } |
diff --git a/gl/floorf.c b/gl/floorf.c index f0aff338..eae57934 100644 --- a/gl/floorf.c +++ b/gl/floorf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Round towards negative infinity. | 1 | /* Round towards negative infinity. |
2 | Copyright (C) 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/fsusage.c b/gl/fsusage.c index db0d3bc5..10db467d 100644 --- a/gl/fsusage.c +++ b/gl/fsusage.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* fsusage.c -- return space usage of mounted file systems | 1 | /* fsusage.c -- return space usage of mounted file systems |
2 | 2 | ||
3 | Copyright (C) 1991-1992, 1996, 1998-1999, 2002-2006, 2009 | 3 | Copyright (C) 1991-1992, 1996, 1998-1999, 2002-2006, 2009-2010 Free Software |
4 | Free Software Foundation, Inc. | 4 | Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -23,7 +23,7 @@ | |||
23 | #include <limits.h> | 23 | #include <limits.h> |
24 | #include <sys/types.h> | 24 | #include <sys/types.h> |
25 | 25 | ||
26 | #if STAT_STATVFS /* POSIX 1003.1-2001 (and later) with XSI */ | 26 | #if STAT_STATVFS /* POSIX 1003.1-2001 (and later) with XSI */ |
27 | # include <sys/statvfs.h> | 27 | # include <sys/statvfs.h> |
28 | #else | 28 | #else |
29 | /* Don't include backward-compatibility files unless they're needed. | 29 | /* Don't include backward-compatibility files unless they're needed. |
@@ -40,16 +40,16 @@ | |||
40 | # if HAVE_SYS_VFS_H | 40 | # if HAVE_SYS_VFS_H |
41 | # include <sys/vfs.h> | 41 | # include <sys/vfs.h> |
42 | # endif | 42 | # endif |
43 | # if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */ | 43 | # if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */ |
44 | # include <sys/fs/s5param.h> | 44 | # include <sys/fs/s5param.h> |
45 | # endif | 45 | # endif |
46 | # if defined HAVE_SYS_FILSYS_H && !defined _CRAY | 46 | # if defined HAVE_SYS_FILSYS_H && !defined _CRAY |
47 | # include <sys/filsys.h> /* SVR2 */ | 47 | # include <sys/filsys.h> /* SVR2 */ |
48 | # endif | 48 | # endif |
49 | # if HAVE_SYS_STATFS_H | 49 | # if HAVE_SYS_STATFS_H |
50 | # include <sys/statfs.h> | 50 | # include <sys/statfs.h> |
51 | # endif | 51 | # endif |
52 | # if HAVE_DUSTAT_H /* AIX PS/2 */ | 52 | # if HAVE_DUSTAT_H /* AIX PS/2 */ |
53 | # include <sys/dustat.h> | 53 | # include <sys/dustat.h> |
54 | # endif | 54 | # endif |
55 | # include "full-read.h" | 55 | # include "full-read.h" |
@@ -67,13 +67,13 @@ | |||
67 | #define PROPAGATE_ALL_ONES(x) \ | 67 | #define PROPAGATE_ALL_ONES(x) \ |
68 | ((sizeof (x) < sizeof (uintmax_t) \ | 68 | ((sizeof (x) < sizeof (uintmax_t) \ |
69 | && (~ (x) == (sizeof (x) < sizeof (int) \ | 69 | && (~ (x) == (sizeof (x) < sizeof (int) \ |
70 | ? - (1 << (sizeof (x) * CHAR_BIT)) \ | 70 | ? - (1 << (sizeof (x) * CHAR_BIT)) \ |
71 | : 0))) \ | 71 | : 0))) \ |
72 | ? UINTMAX_MAX : (uintmax_t) (x)) | 72 | ? UINTMAX_MAX : (uintmax_t) (x)) |
73 | 73 | ||
74 | /* Extract the top bit of X as an uintmax_t value. */ | 74 | /* Extract the top bit of X as an uintmax_t value. */ |
75 | #define EXTRACT_TOP_BIT(x) ((x) \ | 75 | #define EXTRACT_TOP_BIT(x) ((x) \ |
76 | & ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1))) | 76 | & ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1))) |
77 | 77 | ||
78 | /* If a value is negative, many space usage primitives store it into an | 78 | /* If a value is negative, many space usage primitives store it into an |
79 | integer variable by assignment, even if the variable's type is unsigned. | 79 | integer variable by assignment, even if the variable's type is unsigned. |
@@ -94,7 +94,7 @@ | |||
94 | int | 94 | int |
95 | get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | 95 | get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) |
96 | { | 96 | { |
97 | #if defined STAT_STATVFS /* POSIX */ | 97 | #if defined STAT_STATVFS /* POSIX */ |
98 | 98 | ||
99 | struct statvfs fsd; | 99 | struct statvfs fsd; |
100 | 100 | ||
@@ -103,10 +103,10 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | |||
103 | 103 | ||
104 | /* f_frsize isn't guaranteed to be supported. */ | 104 | /* f_frsize isn't guaranteed to be supported. */ |
105 | fsp->fsu_blocksize = (fsd.f_frsize | 105 | fsp->fsu_blocksize = (fsd.f_frsize |
106 | ? PROPAGATE_ALL_ONES (fsd.f_frsize) | 106 | ? PROPAGATE_ALL_ONES (fsd.f_frsize) |
107 | : PROPAGATE_ALL_ONES (fsd.f_bsize)); | 107 | : PROPAGATE_ALL_ONES (fsd.f_bsize)); |
108 | 108 | ||
109 | #elif defined STAT_STATFS2_FS_DATA /* Ultrix */ | 109 | #elif defined STAT_STATFS2_FS_DATA /* Ultrix */ |
110 | 110 | ||
111 | struct fs_data fsd; | 111 | struct fs_data fsd; |
112 | 112 | ||
@@ -121,7 +121,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | |||
121 | fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot); | 121 | fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot); |
122 | fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree); | 122 | fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree); |
123 | 123 | ||
124 | #elif defined STAT_READ_FILSYS /* SVR2 */ | 124 | #elif defined STAT_READ_FILSYS /* SVR2 */ |
125 | # ifndef SUPERBOFF | 125 | # ifndef SUPERBOFF |
126 | # define SUPERBOFF (SUPERB * 512) | 126 | # define SUPERBOFF (SUPERB * 512) |
127 | # endif | 127 | # endif |
@@ -152,8 +152,8 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | |||
152 | fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.s_tfree); | 152 | fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.s_tfree); |
153 | fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.s_tfree) != 0; | 153 | fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.s_tfree) != 0; |
154 | fsp->fsu_files = (fsd.s_isize == -1 | 154 | fsp->fsu_files = (fsd.s_isize == -1 |
155 | ? UINTMAX_MAX | 155 | ? UINTMAX_MAX |
156 | : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1)); | 156 | : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1)); |
157 | fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode); | 157 | fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode); |
158 | 158 | ||
159 | #elif defined STAT_STATFS3_OSF1 | 159 | #elif defined STAT_STATFS3_OSF1 |
@@ -165,7 +165,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | |||
165 | 165 | ||
166 | fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); | 166 | fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); |
167 | 167 | ||
168 | #elif defined STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */ | 168 | #elif defined STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */ |
169 | 169 | ||
170 | struct statfs fsd; | 170 | struct statfs fsd; |
171 | 171 | ||
@@ -189,7 +189,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | |||
189 | } | 189 | } |
190 | # endif /* STATFS_TRUNCATES_BLOCK_COUNTS */ | 190 | # endif /* STATFS_TRUNCATES_BLOCK_COUNTS */ |
191 | 191 | ||
192 | #elif defined STAT_STATFS2_FSIZE /* 4.4BSD */ | 192 | #elif defined STAT_STATFS2_FSIZE /* 4.4BSD */ |
193 | 193 | ||
194 | struct statfs fsd; | 194 | struct statfs fsd; |
195 | 195 | ||
@@ -198,7 +198,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | |||
198 | 198 | ||
199 | fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); | 199 | fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); |
200 | 200 | ||
201 | #elif defined STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */ | 201 | #elif defined STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */ |
202 | 202 | ||
203 | # if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN | 203 | # if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN |
204 | # define f_bavail f_bfree | 204 | # define f_bavail f_bfree |
diff --git a/gl/fsusage.h b/gl/fsusage.h index b32abe18..bb2d86f1 100644 --- a/gl/fsusage.h +++ b/gl/fsusage.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* fsusage.h -- declarations for file system space usage info | 1 | /* fsusage.h -- declarations for file system space usage info |
2 | 2 | ||
3 | Copyright (C) 1991, 1992, 1997, 2003, 2004, 2005, 2006 Free Software | 3 | Copyright (C) 1991-1992, 1997, 2003-2006, 2009-2010 Free Software |
4 | Foundation, Inc. | 4 | Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
@@ -26,13 +26,13 @@ | |||
26 | 26 | ||
27 | struct fs_usage | 27 | struct fs_usage |
28 | { | 28 | { |
29 | uintmax_t fsu_blocksize; /* Size of a block. */ | 29 | uintmax_t fsu_blocksize; /* Size of a block. */ |
30 | uintmax_t fsu_blocks; /* Total blocks. */ | 30 | uintmax_t fsu_blocks; /* Total blocks. */ |
31 | uintmax_t fsu_bfree; /* Free blocks available to superuser. */ | 31 | uintmax_t fsu_bfree; /* Free blocks available to superuser. */ |
32 | uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */ | 32 | uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */ |
33 | bool fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */ | 33 | bool fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */ |
34 | uintmax_t fsu_files; /* Total file nodes. */ | 34 | uintmax_t fsu_files; /* Total file nodes. */ |
35 | uintmax_t fsu_ffree; /* Free file nodes. */ | 35 | uintmax_t fsu_ffree; /* Free file nodes. */ |
36 | }; | 36 | }; |
37 | 37 | ||
38 | int get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp); | 38 | int get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp); |
diff --git a/gl/full-read.c b/gl/full-read.c index fb7212bb..e5de3760 100644 --- a/gl/full-read.c +++ b/gl/full-read.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* An interface to read that retries after partial reads and interrupts. | 1 | /* An interface to read that retries after partial reads and interrupts. |
2 | Copyright (C) 2002, 2003 Free Software Foundation, Inc. | 2 | Copyright (C) 2002-2003, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/full-read.h b/gl/full-read.h index a341ee00..a41f617c 100644 --- a/gl/full-read.h +++ b/gl/full-read.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* An interface to read() that reads all it is asked to read. | 1 | /* An interface to read() that reads all it is asked to read. |
2 | 2 | ||
3 | Copyright (C) 2002 Free Software Foundation, Inc. | 3 | Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/full-write.c b/gl/full-write.c index 51f2d381..5d9b7c33 100644 --- a/gl/full-write.c +++ b/gl/full-write.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* An interface to read and write that retries (if necessary) until complete. | 1 | /* An interface to read and write that retries (if necessary) until complete. |
2 | 2 | ||
3 | Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003, | 3 | Copyright (C) 1993-1994, 1997-2006, 2009-2010 Free Software Foundation, Inc. |
4 | 2004, 2005, 2006 Free Software Foundation, Inc. | ||
5 | 4 | ||
6 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -65,12 +64,12 @@ full_rw (int fd, const void *buf, size_t count) | |||
65 | { | 64 | { |
66 | size_t n_rw = safe_rw (fd, ptr, count); | 65 | size_t n_rw = safe_rw (fd, ptr, count); |
67 | if (n_rw == (size_t) -1) | 66 | if (n_rw == (size_t) -1) |
68 | break; | 67 | break; |
69 | if (n_rw == 0) | 68 | if (n_rw == 0) |
70 | { | 69 | { |
71 | errno = ZERO_BYTE_TRANSFER_ERRNO; | 70 | errno = ZERO_BYTE_TRANSFER_ERRNO; |
72 | break; | 71 | break; |
73 | } | 72 | } |
74 | total += n_rw; | 73 | total += n_rw; |
75 | ptr += n_rw; | 74 | ptr += n_rw; |
76 | count -= n_rw; | 75 | count -= n_rw; |
diff --git a/gl/full-write.h b/gl/full-write.h index 9a801464..15d61808 100644 --- a/gl/full-write.h +++ b/gl/full-write.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* An interface to write() that writes all it is asked to write. | 1 | /* An interface to write() that writes all it is asked to write. |
2 | 2 | ||
3 | Copyright (C) 2002-2003 Free Software Foundation, Inc. | 3 | Copyright (C) 2002-2003, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/gai_strerror.c b/gl/gai_strerror.c index afbcdbb4..c05b5c47 100644 --- a/gl/gai_strerror.c +++ b/gl/gai_strerror.c | |||
@@ -1,4 +1,5 @@ | |||
1 | /* Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. | 1 | /* Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 Free |
2 | Software Foundation, Inc. | ||
2 | This file is part of the GNU C Library. | 3 | This file is part of the GNU C Library. |
3 | Contributed by Philip Blundell <pjb27@cam.ac.uk>, 1997. | 4 | Contributed by Philip Blundell <pjb27@cam.ac.uk>, 1997. |
4 | 5 | ||
diff --git a/gl/getaddrinfo.c b/gl/getaddrinfo.c index f09cf9ee..6aa676c8 100644 --- a/gl/getaddrinfo.c +++ b/gl/getaddrinfo.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* Get address information (partial implementation). | 1 | /* Get address information (partial implementation). |
2 | Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006, 2007, 2008 Free Software | 2 | Copyright (C) 1997, 2001-2002, 2004-2010 Free Software Foundation, Inc. |
3 | Foundation, Inc. | ||
4 | Contributed by Simon Josefsson <simon@josefsson.org>. | 3 | Contributed by Simon Josefsson <simon@josefsson.org>. |
5 | 4 | ||
6 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -19,6 +18,10 @@ | |||
19 | 18 | ||
20 | #include <config.h> | 19 | #include <config.h> |
21 | 20 | ||
21 | /* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc | ||
22 | optimizes away the sa == NULL test below. */ | ||
23 | #define _GL_ARG_NONNULL(params) | ||
24 | |||
22 | #include <netdb.h> | 25 | #include <netdb.h> |
23 | 26 | ||
24 | #if HAVE_NETINET_IN_H | 27 | #if HAVE_NETINET_IN_H |
@@ -58,12 +61,12 @@ | |||
58 | 61 | ||
59 | #ifdef WIN32_NATIVE | 62 | #ifdef WIN32_NATIVE |
60 | typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*, | 63 | typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*, |
61 | const struct addrinfo*, | 64 | const struct addrinfo*, |
62 | struct addrinfo**); | 65 | struct addrinfo**); |
63 | typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*); | 66 | typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*); |
64 | typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*, | 67 | typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*, |
65 | socklen_t, char*, DWORD, | 68 | socklen_t, char*, DWORD, |
66 | char*, DWORD, int); | 69 | char*, DWORD, int); |
67 | 70 | ||
68 | static getaddrinfo_func getaddrinfo_ptr = NULL; | 71 | static getaddrinfo_func getaddrinfo_ptr = NULL; |
69 | static freeaddrinfo_func freeaddrinfo_ptr = NULL; | 72 | static freeaddrinfo_func freeaddrinfo_ptr = NULL; |
@@ -123,9 +126,9 @@ validate_family (int family) | |||
123 | socket addresses. */ | 126 | socket addresses. */ |
124 | int | 127 | int |
125 | getaddrinfo (const char *restrict nodename, | 128 | getaddrinfo (const char *restrict nodename, |
126 | const char *restrict servname, | 129 | const char *restrict servname, |
127 | const struct addrinfo *restrict hints, | 130 | const struct addrinfo *restrict hints, |
128 | struct addrinfo **restrict res) | 131 | struct addrinfo **restrict res) |
129 | { | 132 | { |
130 | struct addrinfo *tmp; | 133 | struct addrinfo *tmp; |
131 | int port = 0; | 134 | int port = 0; |
@@ -165,7 +168,7 @@ getaddrinfo (const char *restrict nodename, | |||
165 | if (!nodename) | 168 | if (!nodename) |
166 | { | 169 | { |
167 | if (!(hints->ai_flags & AI_PASSIVE)) | 170 | if (!(hints->ai_flags & AI_PASSIVE)) |
168 | return EAI_NONAME; | 171 | return EAI_NONAME; |
169 | 172 | ||
170 | #ifdef HAVE_IPV6 | 173 | #ifdef HAVE_IPV6 |
171 | nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0"; | 174 | nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0"; |
@@ -178,24 +181,24 @@ getaddrinfo (const char *restrict nodename, | |||
178 | { | 181 | { |
179 | struct servent *se = NULL; | 182 | struct servent *se = NULL; |
180 | const char *proto = | 183 | const char *proto = |
181 | (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp"; | 184 | (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp"; |
182 | 185 | ||
183 | if (hints == NULL || !(hints->ai_flags & AI_NUMERICSERV)) | 186 | if (hints == NULL || !(hints->ai_flags & AI_NUMERICSERV)) |
184 | /* FIXME: Use getservbyname_r if available. */ | 187 | /* FIXME: Use getservbyname_r if available. */ |
185 | se = getservbyname (servname, proto); | 188 | se = getservbyname (servname, proto); |
186 | 189 | ||
187 | if (!se) | 190 | if (!se) |
188 | { | 191 | { |
189 | char *c; | 192 | char *c; |
190 | if (!(*servname >= '0' && *servname <= '9')) | 193 | if (!(*servname >= '0' && *servname <= '9')) |
191 | return EAI_NONAME; | 194 | return EAI_NONAME; |
192 | port = strtoul (servname, &c, 10); | 195 | port = strtoul (servname, &c, 10); |
193 | if (*c || port > 0xffff) | 196 | if (*c || port > 0xffff) |
194 | return EAI_NONAME; | 197 | return EAI_NONAME; |
195 | port = htons (port); | 198 | port = htons (port); |
196 | } | 199 | } |
197 | else | 200 | else |
198 | port = se->s_port; | 201 | port = se->s_port; |
199 | } | 202 | } |
200 | 203 | ||
201 | /* FIXME: Use gethostbyname_r if available. */ | 204 | /* FIXME: Use gethostbyname_r if available. */ |
@@ -230,23 +233,23 @@ getaddrinfo (const char *restrict nodename, | |||
230 | #if HAVE_IPV6 | 233 | #if HAVE_IPV6 |
231 | case PF_INET6: | 234 | case PF_INET6: |
232 | { | 235 | { |
233 | struct v6_pair *p = storage; | 236 | struct v6_pair *p = storage; |
234 | struct sockaddr_in6 *sinp = &p->sockaddr_in6; | 237 | struct sockaddr_in6 *sinp = &p->sockaddr_in6; |
235 | tmp = &p->addrinfo; | 238 | tmp = &p->addrinfo; |
236 | 239 | ||
237 | if (port) | 240 | if (port) |
238 | sinp->sin6_port = port; | 241 | sinp->sin6_port = port; |
239 | 242 | ||
240 | if (he->h_length != sizeof (sinp->sin6_addr)) | 243 | if (he->h_length != sizeof (sinp->sin6_addr)) |
241 | { | 244 | { |
242 | free (storage); | 245 | free (storage); |
243 | return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ | 246 | return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ |
244 | } | 247 | } |
245 | 248 | ||
246 | memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr); | 249 | memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr); |
247 | 250 | ||
248 | tmp->ai_addr = (struct sockaddr *) sinp; | 251 | tmp->ai_addr = (struct sockaddr *) sinp; |
249 | tmp->ai_addrlen = sizeof *sinp; | 252 | tmp->ai_addrlen = sizeof *sinp; |
250 | } | 253 | } |
251 | break; | 254 | break; |
252 | #endif | 255 | #endif |
@@ -254,23 +257,23 @@ getaddrinfo (const char *restrict nodename, | |||
254 | #if HAVE_IPV4 | 257 | #if HAVE_IPV4 |
255 | case PF_INET: | 258 | case PF_INET: |
256 | { | 259 | { |
257 | struct v4_pair *p = storage; | 260 | struct v4_pair *p = storage; |
258 | struct sockaddr_in *sinp = &p->sockaddr_in; | 261 | struct sockaddr_in *sinp = &p->sockaddr_in; |
259 | tmp = &p->addrinfo; | 262 | tmp = &p->addrinfo; |
260 | 263 | ||
261 | if (port) | 264 | if (port) |
262 | sinp->sin_port = port; | 265 | sinp->sin_port = port; |
263 | 266 | ||
264 | if (he->h_length != sizeof (sinp->sin_addr)) | 267 | if (he->h_length != sizeof (sinp->sin_addr)) |
265 | { | 268 | { |
266 | free (storage); | 269 | free (storage); |
267 | return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ | 270 | return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ |
268 | } | 271 | } |
269 | 272 | ||
270 | memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr); | 273 | memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr); |
271 | 274 | ||
272 | tmp->ai_addr = (struct sockaddr *) sinp; | 275 | tmp->ai_addr = (struct sockaddr *) sinp; |
273 | tmp->ai_addrlen = sizeof *sinp; | 276 | tmp->ai_addrlen = sizeof *sinp; |
274 | } | 277 | } |
275 | break; | 278 | break; |
276 | #endif | 279 | #endif |
@@ -284,16 +287,16 @@ getaddrinfo (const char *restrict nodename, | |||
284 | { | 287 | { |
285 | const char *cn; | 288 | const char *cn; |
286 | if (he->h_name) | 289 | if (he->h_name) |
287 | cn = he->h_name; | 290 | cn = he->h_name; |
288 | else | 291 | else |
289 | cn = nodename; | 292 | cn = nodename; |
290 | 293 | ||
291 | tmp->ai_canonname = strdup (cn); | 294 | tmp->ai_canonname = strdup (cn); |
292 | if (!tmp->ai_canonname) | 295 | if (!tmp->ai_canonname) |
293 | { | 296 | { |
294 | free (storage); | 297 | free (storage); |
295 | return EAI_MEMORY; | 298 | return EAI_MEMORY; |
296 | } | 299 | } |
297 | } | 300 | } |
298 | 301 | ||
299 | tmp->ai_protocol = (hints) ? hints->ai_protocol : 0; | 302 | tmp->ai_protocol = (hints) ? hints->ai_protocol : 0; |
@@ -348,15 +351,16 @@ freeaddrinfo (struct addrinfo *ai) | |||
348 | } | 351 | } |
349 | } | 352 | } |
350 | 353 | ||
351 | int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, | 354 | int |
352 | char *restrict node, socklen_t nodelen, | 355 | getnameinfo (const struct sockaddr *restrict sa, socklen_t salen, |
353 | char *restrict service, socklen_t servicelen, | 356 | char *restrict node, socklen_t nodelen, |
354 | int flags) | 357 | char *restrict service, socklen_t servicelen, |
358 | int flags) | ||
355 | { | 359 | { |
356 | #ifdef WIN32_NATIVE | 360 | #ifdef WIN32_NATIVE |
357 | if (use_win32_p ()) | 361 | if (use_win32_p ()) |
358 | return getnameinfo_ptr (sa, salen, node, nodelen, | 362 | return getnameinfo_ptr (sa, salen, node, nodelen, |
359 | service, servicelen, flags); | 363 | service, servicelen, flags); |
360 | #endif | 364 | #endif |
361 | 365 | ||
362 | /* FIXME: Support other flags. */ | 366 | /* FIXME: Support other flags. */ |
@@ -373,13 +377,13 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, | |||
373 | #if HAVE_IPV4 | 377 | #if HAVE_IPV4 |
374 | case AF_INET: | 378 | case AF_INET: |
375 | if (salen < sizeof (struct sockaddr_in)) | 379 | if (salen < sizeof (struct sockaddr_in)) |
376 | return EAI_FAMILY; | 380 | return EAI_FAMILY; |
377 | break; | 381 | break; |
378 | #endif | 382 | #endif |
379 | #if HAVE_IPV6 | 383 | #if HAVE_IPV6 |
380 | case AF_INET6: | 384 | case AF_INET6: |
381 | if (salen < sizeof (struct sockaddr_in6)) | 385 | if (salen < sizeof (struct sockaddr_in6)) |
382 | return EAI_FAMILY; | 386 | return EAI_FAMILY; |
383 | break; | 387 | break; |
384 | #endif | 388 | #endif |
385 | default: | 389 | default: |
@@ -389,28 +393,28 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, | |||
389 | if (node && nodelen > 0 && flags & NI_NUMERICHOST) | 393 | if (node && nodelen > 0 && flags & NI_NUMERICHOST) |
390 | { | 394 | { |
391 | switch (sa->sa_family) | 395 | switch (sa->sa_family) |
392 | { | 396 | { |
393 | #if HAVE_IPV4 | 397 | #if HAVE_IPV4 |
394 | case AF_INET: | 398 | case AF_INET: |
395 | if (!inet_ntop (AF_INET, | 399 | if (!inet_ntop (AF_INET, |
396 | &(((const struct sockaddr_in *) sa)->sin_addr), | 400 | &(((const struct sockaddr_in *) sa)->sin_addr), |
397 | node, nodelen)) | 401 | node, nodelen)) |
398 | return EAI_SYSTEM; | 402 | return EAI_SYSTEM; |
399 | break; | 403 | break; |
400 | #endif | 404 | #endif |
401 | 405 | ||
402 | #if HAVE_IPV6 | 406 | #if HAVE_IPV6 |
403 | case AF_INET6: | 407 | case AF_INET6: |
404 | if (!inet_ntop (AF_INET6, | 408 | if (!inet_ntop (AF_INET6, |
405 | &(((const struct sockaddr_in6 *) sa)->sin6_addr), | 409 | &(((const struct sockaddr_in6 *) sa)->sin6_addr), |
406 | node, nodelen)) | 410 | node, nodelen)) |
407 | return EAI_SYSTEM; | 411 | return EAI_SYSTEM; |
408 | break; | 412 | break; |
409 | #endif | 413 | #endif |
410 | 414 | ||
411 | default: | 415 | default: |
412 | return EAI_FAMILY; | 416 | return EAI_FAMILY; |
413 | } | 417 | } |
414 | } | 418 | } |
415 | 419 | ||
416 | if (service && servicelen > 0 && flags & NI_NUMERICSERV) | 420 | if (service && servicelen > 0 && flags & NI_NUMERICSERV) |
@@ -422,13 +426,13 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, | |||
422 | #if HAVE_IPV6 | 426 | #if HAVE_IPV6 |
423 | case AF_INET6: | 427 | case AF_INET6: |
424 | #endif | 428 | #endif |
425 | { | 429 | { |
426 | unsigned short int port | 430 | unsigned short int port |
427 | = ntohs (((const struct sockaddr_in *) sa)->sin_port); | 431 | = ntohs (((const struct sockaddr_in *) sa)->sin_port); |
428 | if (servicelen <= snprintf (service, servicelen, "%u", port)) | 432 | if (servicelen <= snprintf (service, servicelen, "%u", port)) |
429 | return EAI_OVERFLOW; | 433 | return EAI_OVERFLOW; |
430 | } | 434 | } |
431 | break; | 435 | break; |
432 | } | 436 | } |
433 | 437 | ||
434 | return 0; | 438 | return 0; |
diff --git a/gl/getdtablesize.c b/gl/getdtablesize.c new file mode 100644 index 00000000..a565a2de --- /dev/null +++ b/gl/getdtablesize.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* getdtablesize() function for platforms that don't have it. | ||
2 | Copyright (C) 2008-2010 Free Software Foundation, Inc. | ||
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | #include <config.h> | ||
19 | |||
20 | /* Specification. */ | ||
21 | #include <unistd.h> | ||
22 | |||
23 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
24 | |||
25 | #include <stdio.h> | ||
26 | |||
27 | /* Cache for the previous getdtablesize () result. */ | ||
28 | static int dtablesize; | ||
29 | |||
30 | int | ||
31 | getdtablesize (void) | ||
32 | { | ||
33 | if (dtablesize == 0) | ||
34 | { | ||
35 | /* We are looking for the number N such that the valid file descriptors | ||
36 | are 0..N-1. It can be obtained through a loop as follows: | ||
37 | { | ||
38 | int fd; | ||
39 | for (fd = 3; fd < 65536; fd++) | ||
40 | if (dup2 (0, fd) == -1) | ||
41 | break; | ||
42 | return fd; | ||
43 | } | ||
44 | On Windows XP, the result is 2048. | ||
45 | The drawback of this loop is that it allocates memory for a libc | ||
46 | internal array that is never freed. | ||
47 | |||
48 | The number N can also be obtained as the upper bound for | ||
49 | _getmaxstdio (). _getmaxstdio () returns the maximum number of open | ||
50 | FILE objects. The sanity check in _setmaxstdio reveals the maximum | ||
51 | number of file descriptors. This too allocates memory, but it is | ||
52 | freed when we call _setmaxstdio with the original value. */ | ||
53 | int orig_max_stdio = _getmaxstdio (); | ||
54 | unsigned int bound; | ||
55 | for (bound = 0x10000; _setmaxstdio (bound) < 0; bound = bound / 2) | ||
56 | ; | ||
57 | _setmaxstdio (orig_max_stdio); | ||
58 | dtablesize = bound; | ||
59 | } | ||
60 | return dtablesize; | ||
61 | } | ||
62 | |||
63 | #endif | ||
diff --git a/gl/gethostname.c b/gl/gethostname.c index acff351d..b0da748f 100644 --- a/gl/gethostname.c +++ b/gl/gethostname.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* gethostname emulation for SysV and POSIX.1. | 1 | /* gethostname emulation for SysV and POSIX.1. |
2 | 2 | ||
3 | Copyright (C) 1992, 2003, 2006, 2008 Free Software Foundation, Inc. | 3 | Copyright (C) 1992, 2003, 2006, 2008, 2009, 2010 Free Software Foundation, |
4 | Inc. | ||
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -15,10 +16,14 @@ | |||
15 | You should have received a copy of the GNU General Public License | 16 | You should have received a copy of the GNU General Public License |
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
17 | 18 | ||
18 | /* David MacKenzie <djm@gnu.ai.mit.edu> */ | 19 | /* David MacKenzie <djm@gnu.ai.mit.edu> |
20 | Windows port by Simon Josefsson <simon@josefsson.org> */ | ||
19 | 21 | ||
20 | #include <config.h> | 22 | #include <config.h> |
21 | 23 | ||
24 | #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) | ||
25 | /* Unix API. */ | ||
26 | |||
22 | /* Specification. */ | 27 | /* Specification. */ |
23 | #include <unistd.h> | 28 | #include <unistd.h> |
24 | 29 | ||
@@ -50,7 +55,51 @@ gethostname (char *name, size_t len) | |||
50 | } | 55 | } |
51 | strncpy (name, uts.nodename, len); | 56 | strncpy (name, uts.nodename, len); |
52 | #else | 57 | #else |
53 | strcpy (name, ""); /* Hardcode your system name if you want. */ | 58 | strcpy (name, ""); /* Hardcode your system name if you want. */ |
54 | #endif | 59 | #endif |
55 | return 0; | 60 | return 0; |
56 | } | 61 | } |
62 | |||
63 | #else | ||
64 | /* Native Windows API. Which primitive to choose? | ||
65 | - gethostname() requires linking with -lws2_32. | ||
66 | - GetComputerName() does not return the right kind of hostname. | ||
67 | - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname, | ||
68 | but it is hard to use portably: | ||
69 | - It requires defining _WIN32_WINNT to at least 0x0500. | ||
70 | - With mingw, it also requires | ||
71 | "#define GetComputerNameEx GetComputerNameExA". | ||
72 | - With older versions of mingw, none of the declarations are present at | ||
73 | all, not even of the enum value ComputerNameDnsHostname. | ||
74 | So we use gethostname(). Linking with -lws2_32 is the least evil. */ | ||
75 | |||
76 | #define WIN32_LEAN_AND_MEAN | ||
77 | /* Get winsock2.h. */ | ||
78 | #include <unistd.h> | ||
79 | |||
80 | /* Get INT_MAX. */ | ||
81 | #include <limits.h> | ||
82 | |||
83 | /* Get set_winsock_errno. */ | ||
84 | #include "w32sock.h" | ||
85 | |||
86 | #include "sockets.h" | ||
87 | |||
88 | #undef gethostname | ||
89 | |||
90 | int | ||
91 | rpl_gethostname (char *name, size_t len) | ||
92 | { | ||
93 | int r; | ||
94 | |||
95 | if (len > INT_MAX) | ||
96 | len = INT_MAX; | ||
97 | gl_sockets_startup (SOCKETS_1_1); | ||
98 | r = gethostname (name, (int) len); | ||
99 | if (r < 0) | ||
100 | set_winsock_errno (); | ||
101 | |||
102 | return r; | ||
103 | } | ||
104 | |||
105 | #endif | ||
diff --git a/gl/getloadavg.c b/gl/getloadavg.c index 5a4005ce..c6d782b4 100644 --- a/gl/getloadavg.c +++ b/gl/getloadavg.c | |||
@@ -1,8 +1,7 @@ | |||
1 | /* Get the system load averages. | 1 | /* Get the system load averages. |
2 | 2 | ||
3 | Copyright (C) 1985, 1986, 1987, 1988, 1989, 1991, 1992, 1993, 1994, | 3 | Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2010 Free Software |
4 | 1995, 1997, 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free | 4 | Foundation, Inc. |
5 | Software Foundation, Inc. | ||
6 | 5 | ||
7 | NOTE: The canonical source of this file is maintained with gnulib. | 6 | NOTE: The canonical source of this file is maintained with gnulib. |
8 | Bugs can be reported to bug-gnulib@gnu.org. | 7 | Bugs can be reported to bug-gnulib@gnu.org. |
@@ -22,58 +21,58 @@ | |||
22 | 21 | ||
23 | /* Compile-time symbols that this file uses: | 22 | /* Compile-time symbols that this file uses: |
24 | 23 | ||
25 | HAVE_PSTAT_GETDYNAMIC Define this if your system has the | 24 | HAVE_PSTAT_GETDYNAMIC Define this if your system has the |
26 | pstat_getdynamic function. I think it | 25 | pstat_getdynamic function. I think it |
27 | is unique to HPUX9. The best way to get the | 26 | is unique to HPUX9. The best way to get the |
28 | definition is through the AC_FUNC_GETLOADAVG | 27 | definition is through the AC_FUNC_GETLOADAVG |
29 | macro that comes with autoconf 2.13 or newer. | 28 | macro that comes with autoconf 2.13 or newer. |
30 | If that isn't an option, then just put | 29 | If that isn't an option, then just put |
31 | AC_CHECK_FUNCS(pstat_getdynamic) in your | 30 | AC_CHECK_FUNCS(pstat_getdynamic) in your |
32 | configure.in file. | 31 | configure.in file. |
33 | HAVE_LIBPERFSTAT Define this if your system has the | 32 | HAVE_LIBPERFSTAT Define this if your system has the |
34 | perfstat_cpu_total function in libperfstat (AIX). | 33 | perfstat_cpu_total function in libperfstat (AIX). |
35 | FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. | 34 | FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. |
36 | KERNEL_FILE Name of the kernel file to nlist. | 35 | KERNEL_FILE Name of the kernel file to nlist. |
37 | LDAV_CVT() Scale the load average from the kernel. | 36 | LDAV_CVT() Scale the load average from the kernel. |
38 | Returns a double. | 37 | Returns a double. |
39 | LDAV_SYMBOL Name of kernel symbol giving load average. | 38 | LDAV_SYMBOL Name of kernel symbol giving load average. |
40 | LOAD_AVE_TYPE Type of the load average array in the kernel. | 39 | LOAD_AVE_TYPE Type of the load average array in the kernel. |
41 | Must be defined unless one of | 40 | Must be defined unless one of |
42 | apollo, DGUX, NeXT, or UMAX is defined; | 41 | apollo, DGUX, NeXT, or UMAX is defined; |
43 | or we have libkstat; | 42 | or we have libkstat; |
44 | otherwise, no load average is available. | 43 | otherwise, no load average is available. |
45 | HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults | 44 | HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults |
46 | to this. | 45 | to this. |
47 | NLIST_STRUCT Include nlist.h, not a.out.h, and | 46 | NLIST_STRUCT Include nlist.h, not a.out.h. |
48 | the nlist n_name element is a pointer, | 47 | N_NAME_POINTER The nlist n_name element is a pointer, |
49 | not an array. | 48 | not an array. |
50 | HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'. | 49 | HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'. |
51 | LINUX_LDAV_FILE [__linux__, __CYGWIN__]: File containing | 50 | LINUX_LDAV_FILE [__linux__, __CYGWIN__]: File containing |
52 | load averages. | 51 | load averages. |
53 | 52 | ||
54 | Specific system predefines this file uses, aside from setting | 53 | Specific system predefines this file uses, aside from setting |
55 | default values if not emacs: | 54 | default values if not emacs: |
56 | 55 | ||
57 | apollo | 56 | apollo |
58 | BSD Real BSD, not just BSD-like. | 57 | BSD Real BSD, not just BSD-like. |
59 | convex | 58 | convex |
60 | DGUX | 59 | DGUX |
61 | eunice UNIX emulator under VMS. | 60 | eunice UNIX emulator under VMS. |
62 | hpux | 61 | hpux |
63 | __MSDOS__ No-op for MSDOS. | 62 | __MSDOS__ No-op for MSDOS. |
64 | NeXT | 63 | NeXT |
65 | sgi | 64 | sgi |
66 | sequent Sequent Dynix 3.x.x (BSD) | 65 | sequent Sequent Dynix 3.x.x (BSD) |
67 | _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) | 66 | _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) |
68 | sony_news NEWS-OS (works at least for 4.1C) | 67 | sony_news NEWS-OS (works at least for 4.1C) |
69 | UMAX | 68 | UMAX |
70 | UMAX4_3 | 69 | UMAX4_3 |
71 | VMS | 70 | VMS |
72 | WINDOWS32 No-op for Windows95/NT. | 71 | WINDOWS32 No-op for Windows95/NT. |
73 | __linux__ Linux: assumes /proc file system mounted. | 72 | __linux__ Linux: assumes /proc file system mounted. |
74 | Support from Michael K. Johnson. | 73 | Support from Michael K. Johnson. |
75 | __CYGWIN__ Cygwin emulates linux /proc/loadavg. | 74 | __CYGWIN__ Cygwin emulates linux /proc/loadavg. |
76 | __NetBSD__ NetBSD: assumes /kern file system mounted. | 75 | __NetBSD__ NetBSD: assumes /kern file system mounted. |
77 | 76 | ||
78 | In addition, to avoid nesting many #ifdefs, we internally set | 77 | In addition, to avoid nesting many #ifdefs, we internally set |
79 | LDAV_DONE to indicate that the load average has been computed. | 78 | LDAV_DONE to indicate that the load average has been computed. |
@@ -112,7 +111,6 @@ | |||
112 | # include "c-strtod.h" | 111 | # include "c-strtod.h" |
113 | # include "cloexec.h" | 112 | # include "cloexec.h" |
114 | # include "intprops.h" | 113 | # include "intprops.h" |
115 | # include "xalloc.h" | ||
116 | 114 | ||
117 | /* The existing Emacs configuration files define a macro called | 115 | /* The existing Emacs configuration files define a macro called |
118 | LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and | 116 | LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and |
@@ -203,7 +201,7 @@ | |||
203 | default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine | 201 | default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine |
204 | that with a couple of other things and we'll have a unique match. */ | 202 | that with a couple of other things and we'll have a unique match. */ |
205 | # if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) | 203 | # if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) |
206 | # define tek4300 /* Define by emacs, but not by other users. */ | 204 | # define tek4300 /* Define by emacs, but not by other users. */ |
207 | # endif | 205 | # endif |
208 | 206 | ||
209 | 207 | ||
@@ -317,7 +315,7 @@ | |||
317 | # define FSCALE 65536.0 | 315 | # define FSCALE 65536.0 |
318 | # endif | 316 | # endif |
319 | 317 | ||
320 | # endif /* Not FSCALE. */ | 318 | # endif /* Not FSCALE. */ |
321 | 319 | ||
322 | # if !defined (LDAV_CVT) && defined (FSCALE) | 320 | # if !defined (LDAV_CVT) && defined (FSCALE) |
323 | # define LDAV_CVT(n) (((double) (n)) / FSCALE) | 321 | # define LDAV_CVT(n) (((double) (n)) / FSCALE) |
@@ -478,7 +476,7 @@ static unsigned int samples; | |||
478 | # endif /* UMAX */ | 476 | # endif /* UMAX */ |
479 | 477 | ||
480 | # ifdef DGUX | 478 | # ifdef DGUX |
481 | static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ | 479 | static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ |
482 | # endif /* DGUX */ | 480 | # endif /* DGUX */ |
483 | 481 | ||
484 | # if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE) | 482 | # if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE) |
@@ -507,7 +505,7 @@ static kvm_t *kd; | |||
507 | int | 505 | int |
508 | getloadavg (double loadavg[], int nelem) | 506 | getloadavg (double loadavg[], int nelem) |
509 | { | 507 | { |
510 | int elem = 0; /* Return value. */ | 508 | int elem = 0; /* Return value. */ |
511 | 509 | ||
512 | # ifdef NO_GET_LOAD_AVG | 510 | # ifdef NO_GET_LOAD_AVG |
513 | # define LDAV_DONE | 511 | # define LDAV_DONE |
@@ -549,16 +547,16 @@ getloadavg (double loadavg[], int nelem) | |||
549 | { | 547 | { |
550 | kn = kstat_data_lookup (ksp, "avenrun_5min"); | 548 | kn = kstat_data_lookup (ksp, "avenrun_5min"); |
551 | if (kn != 0) | 549 | if (kn != 0) |
552 | { | 550 | { |
553 | loadavg[elem++] = (double) kn->value.ul / FSCALE; | 551 | loadavg[elem++] = (double) kn->value.ul / FSCALE; |
554 | 552 | ||
555 | if (nelem >= 3) | 553 | if (nelem >= 3) |
556 | { | 554 | { |
557 | kn = kstat_data_lookup (ksp, "avenrun_15min"); | 555 | kn = kstat_data_lookup (ksp, "avenrun_15min"); |
558 | if (kn != 0) | 556 | if (kn != 0) |
559 | loadavg[elem++] = (double) kn->value.ul / FSCALE; | 557 | loadavg[elem++] = (double) kn->value.ul / FSCALE; |
560 | } | 558 | } |
561 | } | 559 | } |
562 | } | 560 | } |
563 | 561 | ||
564 | kstat_close (kc); | 562 | kstat_close (kc); |
@@ -626,11 +624,11 @@ getloadavg (double loadavg[], int nelem) | |||
626 | errno = 0; | 624 | errno = 0; |
627 | d = c_strtod (ptr, &endptr); | 625 | d = c_strtod (ptr, &endptr); |
628 | if (ptr == endptr || (d == 0 && errno != 0)) | 626 | if (ptr == endptr || (d == 0 && errno != 0)) |
629 | { | 627 | { |
630 | if (elem == 0) | 628 | if (elem == 0) |
631 | return -1; | 629 | return -1; |
632 | break; | 630 | break; |
633 | } | 631 | } |
634 | loadavg[elem] = d; | 632 | loadavg[elem] = d; |
635 | ptr = endptr; | 633 | ptr = endptr; |
636 | } | 634 | } |
@@ -655,8 +653,8 @@ getloadavg (double loadavg[], int nelem) | |||
655 | if (fp == NULL) | 653 | if (fp == NULL) |
656 | return -1; | 654 | return -1; |
657 | count = fscanf (fp, "%lu %lu %lu %lu\n", | 655 | count = fscanf (fp, "%lu %lu %lu %lu\n", |
658 | &load_ave[0], &load_ave[1], &load_ave[2], | 656 | &load_ave[0], &load_ave[1], &load_ave[2], |
659 | &scale); | 657 | &scale); |
660 | (void) fclose (fp); | 658 | (void) fclose (fp); |
661 | if (count != 4) | 659 | if (count != 4) |
662 | return -1; | 660 | return -1; |
@@ -682,21 +680,21 @@ getloadavg (double loadavg[], int nelem) | |||
682 | if (!getloadavg_initialized) | 680 | if (!getloadavg_initialized) |
683 | { | 681 | { |
684 | if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) | 682 | if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) |
685 | getloadavg_initialized = true; | 683 | getloadavg_initialized = true; |
686 | } | 684 | } |
687 | 685 | ||
688 | if (getloadavg_initialized) | 686 | if (getloadavg_initialized) |
689 | { | 687 | { |
690 | info_count = PROCESSOR_SET_BASIC_INFO_COUNT; | 688 | info_count = PROCESSOR_SET_BASIC_INFO_COUNT; |
691 | if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, | 689 | if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, |
692 | (processor_set_info_t) &info, &info_count) | 690 | (processor_set_info_t) &info, &info_count) |
693 | != KERN_SUCCESS) | 691 | != KERN_SUCCESS) |
694 | getloadavg_initialized = false; | 692 | getloadavg_initialized = false; |
695 | else | 693 | else |
696 | { | 694 | { |
697 | if (nelem > 0) | 695 | if (nelem > 0) |
698 | loadavg[elem++] = (double) info.load_average / LOAD_SCALE; | 696 | loadavg[elem++] = (double) info.load_average / LOAD_SCALE; |
699 | } | 697 | } |
700 | } | 698 | } |
701 | 699 | ||
702 | if (!getloadavg_initialized) | 700 | if (!getloadavg_initialized) |
@@ -728,24 +726,24 @@ getloadavg (double loadavg[], int nelem) | |||
728 | desc.sd_size = sizeof conf; | 726 | desc.sd_size = sizeof conf; |
729 | 727 | ||
730 | if (inq_stats (1, &desc)) | 728 | if (inq_stats (1, &desc)) |
731 | return -1; | 729 | return -1; |
732 | 730 | ||
733 | c = 0; | 731 | c = 0; |
734 | for (i = 0; i < conf.config_maxclass; ++i) | 732 | for (i = 0; i < conf.config_maxclass; ++i) |
735 | { | 733 | { |
736 | struct class_stats stats; | 734 | struct class_stats stats; |
737 | bzero ((char *) &stats, sizeof stats); | 735 | bzero ((char *) &stats, sizeof stats); |
738 | 736 | ||
739 | desc.sd_type = CPUTYPE_CLASS; | 737 | desc.sd_type = CPUTYPE_CLASS; |
740 | desc.sd_objid = i; | 738 | desc.sd_objid = i; |
741 | desc.sd_addr = (char *) &stats; | 739 | desc.sd_addr = (char *) &stats; |
742 | desc.sd_size = sizeof stats; | 740 | desc.sd_size = sizeof stats; |
743 | 741 | ||
744 | if (inq_stats (1, &desc)) | 742 | if (inq_stats (1, &desc)) |
745 | return -1; | 743 | return -1; |
746 | 744 | ||
747 | c += stats.class_numcpus; | 745 | c += stats.class_numcpus; |
748 | } | 746 | } |
749 | cpus = c; | 747 | cpus = c; |
750 | samples = cpus < 2 ? 3 : (2 * cpus / 3); | 748 | samples = cpus < 2 ? 3 : (2 * cpus / 3); |
751 | } | 749 | } |
@@ -766,7 +764,7 @@ getloadavg (double loadavg[], int nelem) | |||
766 | { | 764 | { |
767 | load += proc_sum_data.ps_nrun[j]; | 765 | load += proc_sum_data.ps_nrun[j]; |
768 | if (j++ == PS_NRUNSIZE) | 766 | if (j++ == PS_NRUNSIZE) |
769 | j = 0; | 767 | j = 0; |
770 | } | 768 | } |
771 | 769 | ||
772 | if (nelem > 0) | 770 | if (nelem > 0) |
@@ -779,8 +777,8 @@ getloadavg (double loadavg[], int nelem) | |||
779 | it's not supposed to fail. The first argument is for no | 777 | it's not supposed to fail. The first argument is for no |
780 | apparent reason of type `long int *'. */ | 778 | apparent reason of type `long int *'. */ |
781 | dg_sys_info ((long int *) &load_info, | 779 | dg_sys_info ((long int *) &load_info, |
782 | DG_SYS_INFO_LOAD_INFO_TYPE, | 780 | DG_SYS_INFO_LOAD_INFO_TYPE, |
783 | DG_SYS_INFO_LOAD_VERSION_0); | 781 | DG_SYS_INFO_LOAD_VERSION_0); |
784 | 782 | ||
785 | if (nelem > 0) | 783 | if (nelem > 0) |
786 | loadavg[elem++] = load_info.one_minute; | 784 | loadavg[elem++] = load_info.one_minute; |
@@ -824,7 +822,7 @@ getloadavg (double loadavg[], int nelem) | |||
824 | = (load_ave.tl_lscale == 0 | 822 | = (load_ave.tl_lscale == 0 |
825 | ? load_ave.tl_avenrun.d[0] | 823 | ? load_ave.tl_avenrun.d[0] |
826 | : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); | 824 | : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); |
827 | # endif /* OSF_MIPS */ | 825 | # endif /* OSF_MIPS */ |
828 | 826 | ||
829 | # if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32)) | 827 | # if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32)) |
830 | # define LDAV_DONE | 828 | # define LDAV_DONE |
@@ -844,8 +842,8 @@ getloadavg (double loadavg[], int nelem) | |||
844 | for (elem = 0; elem < nelem; elem++) | 842 | for (elem = 0; elem < nelem; elem++) |
845 | loadavg[elem] | 843 | loadavg[elem] |
846 | = (load_ave.tl_lscale == 0 | 844 | = (load_ave.tl_lscale == 0 |
847 | ? load_ave.tl_avenrun.d[elem] | 845 | ? load_ave.tl_avenrun.d[elem] |
848 | : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); | 846 | : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); |
849 | # endif /* OSF_ALPHA */ | 847 | # endif /* OSF_ALPHA */ |
850 | 848 | ||
851 | # if ! defined LDAV_DONE && defined __VMS | 849 | # if ! defined LDAV_DONE && defined __VMS |
@@ -872,13 +870,13 @@ getloadavg (double loadavg[], int nelem) | |||
872 | $DESCRIPTOR (descriptor, "LAV0:"); | 870 | $DESCRIPTOR (descriptor, "LAV0:"); |
873 | # endif | 871 | # endif |
874 | if (sys$assign (&descriptor, &channel, 0, 0) & 1) | 872 | if (sys$assign (&descriptor, &channel, 0, 0) & 1) |
875 | getloadavg_initialized = true; | 873 | getloadavg_initialized = true; |
876 | } | 874 | } |
877 | 875 | ||
878 | /* Read the load average vector. */ | 876 | /* Read the load average vector. */ |
879 | if (getloadavg_initialized | 877 | if (getloadavg_initialized |
880 | && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, | 878 | && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, |
881 | load_ave, 12, 0, 0, 0, 0) & 1)) | 879 | load_ave, 12, 0, 0, 0, 0) & 1)) |
882 | { | 880 | { |
883 | sys$dassgn (channel); | 881 | sys$dassgn (channel); |
884 | getloadavg_initialized = false; | 882 | getloadavg_initialized = false; |
@@ -892,7 +890,7 @@ getloadavg (double loadavg[], int nelem) | |||
892 | 890 | ||
893 | /* UNIX-specific code -- read the average from /dev/kmem. */ | 891 | /* UNIX-specific code -- read the average from /dev/kmem. */ |
894 | 892 | ||
895 | # define LDAV_PRIVILEGED /* This code requires special installation. */ | 893 | # define LDAV_PRIVILEGED /* This code requires special installation. */ |
896 | 894 | ||
897 | LOAD_AVE_TYPE load_ave[3]; | 895 | LOAD_AVE_TYPE load_ave[3]; |
898 | 896 | ||
@@ -900,7 +898,7 @@ getloadavg (double loadavg[], int nelem) | |||
900 | if (offset == 0) | 898 | if (offset == 0) |
901 | { | 899 | { |
902 | # ifndef sgi | 900 | # ifndef sgi |
903 | # ifndef NLIST_STRUCT | 901 | # if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER |
904 | strcpy (nl[0].n_name, LDAV_SYMBOL); | 902 | strcpy (nl[0].n_name, LDAV_SYMBOL); |
905 | strcpy (nl[1].n_name, ""); | 903 | strcpy (nl[1].n_name, ""); |
906 | # else /* NLIST_STRUCT */ | 904 | # else /* NLIST_STRUCT */ |
@@ -916,25 +914,25 @@ getloadavg (double loadavg[], int nelem) | |||
916 | # ifndef SUNOS_5 | 914 | # ifndef SUNOS_5 |
917 | if ( | 915 | if ( |
918 | # if !(defined (_AIX) && !defined (ps2)) | 916 | # if !(defined (_AIX) && !defined (ps2)) |
919 | nlist (KERNEL_FILE, nl) | 917 | nlist (KERNEL_FILE, nl) |
920 | # else /* _AIX */ | 918 | # else /* _AIX */ |
921 | knlist (nl, 1, sizeof (nl[0])) | 919 | knlist (nl, 1, sizeof (nl[0])) |
922 | # endif | 920 | # endif |
923 | >= 0) | 921 | >= 0) |
924 | /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ | 922 | /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ |
925 | { | 923 | { |
926 | # ifdef FIXUP_KERNEL_SYMBOL_ADDR | 924 | # ifdef FIXUP_KERNEL_SYMBOL_ADDR |
927 | FIXUP_KERNEL_SYMBOL_ADDR (nl); | 925 | FIXUP_KERNEL_SYMBOL_ADDR (nl); |
928 | # endif | 926 | # endif |
929 | offset = nl[0].n_value; | 927 | offset = nl[0].n_value; |
930 | } | 928 | } |
931 | # endif /* !SUNOS_5 */ | 929 | # endif /* !SUNOS_5 */ |
932 | # else /* sgi */ | 930 | # else /* sgi */ |
933 | int ldav_off; | 931 | int ldav_off; |
934 | 932 | ||
935 | ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); | 933 | ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); |
936 | if (ldav_off != -1) | 934 | if (ldav_off != -1) |
937 | offset = (long int) ldav_off & 0x7fffffff; | 935 | offset = (long int) ldav_off & 0x7fffffff; |
938 | # endif /* sgi */ | 936 | # endif /* sgi */ |
939 | } | 937 | } |
940 | 938 | ||
@@ -944,23 +942,23 @@ getloadavg (double loadavg[], int nelem) | |||
944 | # ifndef SUNOS_5 | 942 | # ifndef SUNOS_5 |
945 | channel = open ("/dev/kmem", O_RDONLY); | 943 | channel = open ("/dev/kmem", O_RDONLY); |
946 | if (channel >= 0) | 944 | if (channel >= 0) |
947 | { | 945 | { |
948 | /* Set the channel to close on exec, so it does not | 946 | /* Set the channel to close on exec, so it does not |
949 | litter any child's descriptor table. */ | 947 | litter any child's descriptor table. */ |
950 | set_cloexec_flag (channel, true); | 948 | set_cloexec_flag (channel, true); |
951 | getloadavg_initialized = true; | 949 | getloadavg_initialized = true; |
952 | } | 950 | } |
953 | # else /* SUNOS_5 */ | 951 | # else /* SUNOS_5 */ |
954 | /* We pass 0 for the kernel, corefile, and swapfile names | 952 | /* We pass 0 for the kernel, corefile, and swapfile names |
955 | to use the currently running kernel. */ | 953 | to use the currently running kernel. */ |
956 | kd = kvm_open (0, 0, 0, O_RDONLY, 0); | 954 | kd = kvm_open (0, 0, 0, O_RDONLY, 0); |
957 | if (kd != 0) | 955 | if (kd != 0) |
958 | { | 956 | { |
959 | /* nlist the currently running kernel. */ | 957 | /* nlist the currently running kernel. */ |
960 | kvm_nlist (kd, nl); | 958 | kvm_nlist (kd, nl); |
961 | offset = nl[0].n_value; | 959 | offset = nl[0].n_value; |
962 | getloadavg_initialized = true; | 960 | getloadavg_initialized = true; |
963 | } | 961 | } |
964 | # endif /* SUNOS_5 */ | 962 | # endif /* SUNOS_5 */ |
965 | } | 963 | } |
966 | 964 | ||
@@ -970,19 +968,19 @@ getloadavg (double loadavg[], int nelem) | |||
970 | /* Try to read the load. */ | 968 | /* Try to read the load. */ |
971 | # ifndef SUNOS_5 | 969 | # ifndef SUNOS_5 |
972 | if (lseek (channel, offset, 0) == -1L | 970 | if (lseek (channel, offset, 0) == -1L |
973 | || read (channel, (char *) load_ave, sizeof (load_ave)) | 971 | || read (channel, (char *) load_ave, sizeof (load_ave)) |
974 | != sizeof (load_ave)) | 972 | != sizeof (load_ave)) |
975 | { | 973 | { |
976 | close (channel); | 974 | close (channel); |
977 | getloadavg_initialized = false; | 975 | getloadavg_initialized = false; |
978 | } | 976 | } |
979 | # else /* SUNOS_5 */ | 977 | # else /* SUNOS_5 */ |
980 | if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) | 978 | if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) |
981 | != sizeof (load_ave)) | 979 | != sizeof (load_ave)) |
982 | { | 980 | { |
983 | kvm_close (kd); | 981 | kvm_close (kd); |
984 | getloadavg_initialized = false; | 982 | getloadavg_initialized = false; |
985 | } | 983 | } |
986 | # endif /* SUNOS_5 */ | 984 | # endif /* SUNOS_5 */ |
987 | } | 985 | } |
988 | 986 | ||
@@ -1026,24 +1024,24 @@ main (int argc, char **argv) | |||
1026 | double avg[3]; | 1024 | double avg[3]; |
1027 | int loads; | 1025 | int loads; |
1028 | 1026 | ||
1029 | errno = 0; /* Don't be misled if it doesn't set errno. */ | 1027 | errno = 0; /* Don't be misled if it doesn't set errno. */ |
1030 | loads = getloadavg (avg, 3); | 1028 | loads = getloadavg (avg, 3); |
1031 | if (loads == -1) | 1029 | if (loads == -1) |
1032 | { | 1030 | { |
1033 | perror ("Error getting load average"); | 1031 | perror ("Error getting load average"); |
1034 | return EXIT_FAILURE; | 1032 | return EXIT_FAILURE; |
1035 | } | 1033 | } |
1036 | if (loads > 0) | 1034 | if (loads > 0) |
1037 | printf ("1-minute: %f ", avg[0]); | 1035 | printf ("1-minute: %f ", avg[0]); |
1038 | if (loads > 1) | 1036 | if (loads > 1) |
1039 | printf ("5-minute: %f ", avg[1]); | 1037 | printf ("5-minute: %f ", avg[1]); |
1040 | if (loads > 2) | 1038 | if (loads > 2) |
1041 | printf ("15-minute: %f ", avg[2]); | 1039 | printf ("15-minute: %f ", avg[2]); |
1042 | if (loads > 0) | 1040 | if (loads > 0) |
1043 | putchar ('\n'); | 1041 | putchar ('\n'); |
1044 | 1042 | ||
1045 | if (naptime == 0) | 1043 | if (naptime == 0) |
1046 | break; | 1044 | break; |
1047 | sleep (naptime); | 1045 | sleep (naptime); |
1048 | } | 1046 | } |
1049 | 1047 | ||
diff --git a/gl/getopt.c b/gl/getopt.c index f1e6d1f7..aaabc8d1 100644 --- a/gl/getopt.c +++ b/gl/getopt.c | |||
@@ -1,9 +1,9 @@ | |||
1 | /* Getopt for GNU. | 1 | /* Getopt for GNU. |
2 | NOTE: getopt is now part of the C library, so if you don't know what | 2 | NOTE: getopt is 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 | 3 | "Keep this file name-space clean" means, talk to drepper@gnu.org |
4 | before changing it! | 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,2008 | 5 | Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2010 Free Software |
6 | Free Software Foundation, Inc. | 6 | Foundation, Inc. |
7 | This file is part of the GNU C Library. | 7 | This file is part of the GNU C Library. |
8 | 8 | ||
9 | This program is free software: you can redistribute it and/or modify | 9 | This program is free software: you can redistribute it and/or modify |
@@ -41,12 +41,9 @@ | |||
41 | # include <wchar.h> | 41 | # include <wchar.h> |
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #ifndef attribute_hidden | 44 | /* This version of `getopt' appears to the caller like standard Unix `getopt' |
45 | # define attribute_hidden | 45 | but it behaves differently for the user, since it allows the user |
46 | #endif | 46 | to intersperse the options with the other arguments. |
47 | |||
48 | /* Unlike standard Unix `getopt', functions like `getopt_long' | ||
49 | let the user intersperse the options with the other arguments. | ||
50 | 47 | ||
51 | As `getopt_long' works, it permutes the elements of ARGV so that, | 48 | As `getopt_long' works, it permutes the elements of ARGV so that, |
52 | when it is done, all the options precede everything else. Thus | 49 | when it is done, all the options precede everything else. Thus |
@@ -54,7 +51,7 @@ | |||
54 | 51 | ||
55 | Using `getopt' or setting the environment variable POSIXLY_CORRECT | 52 | Using `getopt' or setting the environment variable POSIXLY_CORRECT |
56 | disables permutation. | 53 | disables permutation. |
57 | Then the application's behavior is completely standard. | 54 | Then the behavior is completely standard. |
58 | 55 | ||
59 | GNU application programs can use a third alternative mode in which | 56 | GNU application programs can use a third alternative mode in which |
60 | they can distinguish the relative order of options and other arguments. */ | 57 | they can distinguish the relative order of options and other arguments. */ |
@@ -121,18 +118,18 @@ extern char *__getopt_nonoption_flags; | |||
121 | 118 | ||
122 | # ifdef USE_NONOPTION_FLAGS | 119 | # ifdef USE_NONOPTION_FLAGS |
123 | # define SWAP_FLAGS(ch1, ch2) \ | 120 | # define SWAP_FLAGS(ch1, ch2) \ |
124 | if (d->__nonoption_flags_len > 0) \ | 121 | if (d->__nonoption_flags_len > 0) \ |
125 | { \ | 122 | { \ |
126 | char __tmp = __getopt_nonoption_flags[ch1]; \ | 123 | char __tmp = __getopt_nonoption_flags[ch1]; \ |
127 | __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ | 124 | __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ |
128 | __getopt_nonoption_flags[ch2] = __tmp; \ | 125 | __getopt_nonoption_flags[ch2] = __tmp; \ |
129 | } | 126 | } |
130 | # else | 127 | # else |
131 | # define SWAP_FLAGS(ch1, ch2) | 128 | # define SWAP_FLAGS(ch1, ch2) |
132 | # endif | 129 | # endif |
133 | #else /* !_LIBC */ | 130 | #else /* !_LIBC */ |
134 | # define SWAP_FLAGS(ch1, ch2) | 131 | # define SWAP_FLAGS(ch1, ch2) |
135 | #endif /* _LIBC */ | 132 | #endif /* _LIBC */ |
136 | 133 | ||
137 | /* Exchange two adjacent subsequences of ARGV. | 134 | /* Exchange two adjacent subsequences of ARGV. |
138 | One subsequence is elements [first_nonopt,last_nonopt) | 135 | One subsequence is elements [first_nonopt,last_nonopt) |
@@ -163,57 +160,57 @@ exchange (char **argv, struct _getopt_data *d) | |||
163 | if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) | 160 | if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) |
164 | { | 161 | { |
165 | /* We must extend the array. The user plays games with us and | 162 | /* We must extend the array. The user plays games with us and |
166 | presents new arguments. */ | 163 | presents new arguments. */ |
167 | char *new_str = malloc (top + 1); | 164 | char *new_str = malloc (top + 1); |
168 | if (new_str == NULL) | 165 | if (new_str == NULL) |
169 | d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; | 166 | d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; |
170 | else | 167 | else |
171 | { | 168 | { |
172 | memset (__mempcpy (new_str, __getopt_nonoption_flags, | 169 | memset (__mempcpy (new_str, __getopt_nonoption_flags, |
173 | d->__nonoption_flags_max_len), | 170 | d->__nonoption_flags_max_len), |
174 | '\0', top + 1 - d->__nonoption_flags_max_len); | 171 | '\0', top + 1 - d->__nonoption_flags_max_len); |
175 | d->__nonoption_flags_max_len = top + 1; | 172 | d->__nonoption_flags_max_len = top + 1; |
176 | __getopt_nonoption_flags = new_str; | 173 | __getopt_nonoption_flags = new_str; |
177 | } | 174 | } |
178 | } | 175 | } |
179 | #endif | 176 | #endif |
180 | 177 | ||
181 | while (top > middle && middle > bottom) | 178 | while (top > middle && middle > bottom) |
182 | { | 179 | { |
183 | if (top - middle > middle - bottom) | 180 | if (top - middle > middle - bottom) |
184 | { | 181 | { |
185 | /* Bottom segment is the short one. */ | 182 | /* Bottom segment is the short one. */ |
186 | int len = middle - bottom; | 183 | int len = middle - bottom; |
187 | register int i; | 184 | register int i; |
188 | 185 | ||
189 | /* Swap it with the top part of the top segment. */ | 186 | /* Swap it with the top part of the top segment. */ |
190 | for (i = 0; i < len; i++) | 187 | for (i = 0; i < len; i++) |
191 | { | 188 | { |
192 | tem = argv[bottom + i]; | 189 | tem = argv[bottom + i]; |
193 | argv[bottom + i] = argv[top - (middle - bottom) + i]; | 190 | argv[bottom + i] = argv[top - (middle - bottom) + i]; |
194 | argv[top - (middle - bottom) + i] = tem; | 191 | argv[top - (middle - bottom) + i] = tem; |
195 | SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); | 192 | SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); |
196 | } | 193 | } |
197 | /* Exclude the moved bottom segment from further swapping. */ | 194 | /* Exclude the moved bottom segment from further swapping. */ |
198 | top -= len; | 195 | top -= len; |
199 | } | 196 | } |
200 | else | 197 | else |
201 | { | 198 | { |
202 | /* Top segment is the short one. */ | 199 | /* Top segment is the short one. */ |
203 | int len = top - middle; | 200 | int len = top - middle; |
204 | register int i; | 201 | register int i; |
205 | 202 | ||
206 | /* Swap it with the bottom part of the bottom segment. */ | 203 | /* Swap it with the bottom part of the bottom segment. */ |
207 | for (i = 0; i < len; i++) | 204 | for (i = 0; i < len; i++) |
208 | { | 205 | { |
209 | tem = argv[bottom + i]; | 206 | tem = argv[bottom + i]; |
210 | argv[bottom + i] = argv[middle + i]; | 207 | argv[bottom + i] = argv[middle + i]; |
211 | argv[middle + i] = tem; | 208 | argv[middle + i] = tem; |
212 | SWAP_FLAGS (bottom + i, middle + i); | 209 | SWAP_FLAGS (bottom + i, middle + i); |
213 | } | 210 | } |
214 | /* Exclude the moved top segment from further swapping. */ | 211 | /* Exclude the moved top segment from further swapping. */ |
215 | bottom += len; | 212 | bottom += len; |
216 | } | 213 | } |
217 | } | 214 | } |
218 | 215 | ||
219 | /* Update records for the slots the non-options now occupy. */ | 216 | /* Update records for the slots the non-options now occupy. */ |
@@ -225,8 +222,9 @@ exchange (char **argv, struct _getopt_data *d) | |||
225 | /* Initialize the internal data when the first call is made. */ | 222 | /* Initialize the internal data when the first call is made. */ |
226 | 223 | ||
227 | static const char * | 224 | static const char * |
228 | _getopt_initialize (int argc, char **argv, const char *optstring, | 225 | _getopt_initialize (int argc _GL_UNUSED, |
229 | int posixly_correct, struct _getopt_data *d) | 226 | char **argv _GL_UNUSED, const char *optstring, |
227 | struct _getopt_data *d, int posixly_correct) | ||
230 | { | 228 | { |
231 | /* Start processing options with ARGV-element 1 (since ARGV-element 0 | 229 | /* Start processing options with ARGV-element 1 (since ARGV-element 0 |
232 | is the program name); the sequence of previously skipped | 230 | is the program name); the sequence of previously skipped |
@@ -260,25 +258,25 @@ _getopt_initialize (int argc, char **argv, const char *optstring, | |||
260 | && argc == __libc_argc && argv == __libc_argv) | 258 | && argc == __libc_argc && argv == __libc_argv) |
261 | { | 259 | { |
262 | if (d->__nonoption_flags_max_len == 0) | 260 | if (d->__nonoption_flags_max_len == 0) |
263 | { | 261 | { |
264 | if (__getopt_nonoption_flags == NULL | 262 | if (__getopt_nonoption_flags == NULL |
265 | || __getopt_nonoption_flags[0] == '\0') | 263 | || __getopt_nonoption_flags[0] == '\0') |
266 | d->__nonoption_flags_max_len = -1; | 264 | d->__nonoption_flags_max_len = -1; |
267 | else | 265 | else |
268 | { | 266 | { |
269 | const char *orig_str = __getopt_nonoption_flags; | 267 | const char *orig_str = __getopt_nonoption_flags; |
270 | int len = d->__nonoption_flags_max_len = strlen (orig_str); | 268 | int len = d->__nonoption_flags_max_len = strlen (orig_str); |
271 | if (d->__nonoption_flags_max_len < argc) | 269 | if (d->__nonoption_flags_max_len < argc) |
272 | d->__nonoption_flags_max_len = argc; | 270 | d->__nonoption_flags_max_len = argc; |
273 | __getopt_nonoption_flags = | 271 | __getopt_nonoption_flags = |
274 | (char *) malloc (d->__nonoption_flags_max_len); | 272 | (char *) malloc (d->__nonoption_flags_max_len); |
275 | if (__getopt_nonoption_flags == NULL) | 273 | if (__getopt_nonoption_flags == NULL) |
276 | d->__nonoption_flags_max_len = -1; | 274 | d->__nonoption_flags_max_len = -1; |
277 | else | 275 | else |
278 | memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), | 276 | memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), |
279 | '\0', d->__nonoption_flags_max_len - len); | 277 | '\0', d->__nonoption_flags_max_len - len); |
280 | } | 278 | } |
281 | } | 279 | } |
282 | d->__nonoption_flags_len = d->__nonoption_flags_max_len; | 280 | d->__nonoption_flags_len = d->__nonoption_flags_max_len; |
283 | } | 281 | } |
284 | else | 282 | else |
@@ -330,6 +328,10 @@ _getopt_initialize (int argc, char **argv, const char *optstring, | |||
330 | `flag' field is nonzero, the value of the option's `val' field | 328 | `flag' field is nonzero, the value of the option's `val' field |
331 | if the `flag' field is zero. | 329 | if the `flag' field is zero. |
332 | 330 | ||
331 | The elements of ARGV aren't really const, because we permute them. | ||
332 | But we pretend they're const in the prototype to be compatible | ||
333 | with other systems. | ||
334 | |||
333 | LONGOPTS is a vector of `struct option' terminated by an | 335 | LONGOPTS is a vector of `struct option' terminated by an |
334 | element containing a name which is zero. | 336 | element containing a name which is zero. |
335 | 337 | ||
@@ -338,15 +340,12 @@ _getopt_initialize (int argc, char **argv, const char *optstring, | |||
338 | recent call. | 340 | recent call. |
339 | 341 | ||
340 | If LONG_ONLY is nonzero, '-' as well as '--' can introduce | 342 | If LONG_ONLY is nonzero, '-' as well as '--' can introduce |
341 | long-named options. | 343 | long-named options. */ |
342 | |||
343 | If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT | ||
344 | environment variable were set. */ | ||
345 | 344 | ||
346 | int | 345 | int |
347 | _getopt_internal_r (int argc, char **argv, const char *optstring, | 346 | _getopt_internal_r (int argc, char **argv, const char *optstring, |
348 | const struct option *longopts, int *longind, | 347 | const struct option *longopts, int *longind, |
349 | int long_only, int posixly_correct, struct _getopt_data *d) | 348 | int long_only, struct _getopt_data *d, int posixly_correct) |
350 | { | 349 | { |
351 | int print_errors = d->opterr; | 350 | int print_errors = d->opterr; |
352 | if (optstring[0] == ':') | 351 | if (optstring[0] == ':') |
@@ -360,9 +359,9 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
360 | if (d->optind == 0 || !d->__initialized) | 359 | if (d->optind == 0 || !d->__initialized) |
361 | { | 360 | { |
362 | if (d->optind == 0) | 361 | if (d->optind == 0) |
363 | d->optind = 1; /* Don't scan ARGV[0], the program name. */ | 362 | d->optind = 1; /* Don't scan ARGV[0], the program name. */ |
364 | optstring = _getopt_initialize (argc, argv, optstring, | 363 | optstring = _getopt_initialize (argc, argv, optstring, d, |
365 | posixly_correct, d); | 364 | posixly_correct); |
366 | d->__initialized = 1; | 365 | d->__initialized = 1; |
367 | } | 366 | } |
368 | 367 | ||
@@ -372,8 +371,8 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
372 | is only used when the used in the GNU libc. */ | 371 | is only used when the used in the GNU libc. */ |
373 | #if defined _LIBC && defined USE_NONOPTION_FLAGS | 372 | #if defined _LIBC && defined USE_NONOPTION_FLAGS |
374 | # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ | 373 | # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ |
375 | || (d->optind < d->__nonoption_flags_len \ | 374 | || (d->optind < d->__nonoption_flags_len \ |
376 | && __getopt_nonoption_flags[d->optind] == '1')) | 375 | && __getopt_nonoption_flags[d->optind] == '1')) |
377 | #else | 376 | #else |
378 | # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') | 377 | # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') |
379 | #endif | 378 | #endif |
@@ -383,78 +382,78 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
383 | /* Advance to the next ARGV-element. */ | 382 | /* Advance to the next ARGV-element. */ |
384 | 383 | ||
385 | /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been | 384 | /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been |
386 | moved back by the user (who may also have changed the arguments). */ | 385 | moved back by the user (who may also have changed the arguments). */ |
387 | if (d->__last_nonopt > d->optind) | 386 | if (d->__last_nonopt > d->optind) |
388 | d->__last_nonopt = d->optind; | 387 | d->__last_nonopt = d->optind; |
389 | if (d->__first_nonopt > d->optind) | 388 | if (d->__first_nonopt > d->optind) |
390 | d->__first_nonopt = d->optind; | 389 | d->__first_nonopt = d->optind; |
391 | 390 | ||
392 | if (d->__ordering == PERMUTE) | 391 | if (d->__ordering == PERMUTE) |
393 | { | 392 | { |
394 | /* If we have just processed some options following some non-options, | 393 | /* If we have just processed some options following some non-options, |
395 | exchange them so that the options come first. */ | 394 | exchange them so that the options come first. */ |
396 | 395 | ||
397 | if (d->__first_nonopt != d->__last_nonopt | 396 | if (d->__first_nonopt != d->__last_nonopt |
398 | && d->__last_nonopt != d->optind) | 397 | && d->__last_nonopt != d->optind) |
399 | exchange ((char **) argv, d); | 398 | exchange ((char **) argv, d); |
400 | else if (d->__last_nonopt != d->optind) | 399 | else if (d->__last_nonopt != d->optind) |
401 | d->__first_nonopt = d->optind; | 400 | d->__first_nonopt = d->optind; |
402 | 401 | ||
403 | /* Skip any additional non-options | 402 | /* Skip any additional non-options |
404 | and extend the range of non-options previously skipped. */ | 403 | and extend the range of non-options previously skipped. */ |
405 | 404 | ||
406 | while (d->optind < argc && NONOPTION_P) | 405 | while (d->optind < argc && NONOPTION_P) |
407 | d->optind++; | 406 | d->optind++; |
408 | d->__last_nonopt = d->optind; | 407 | d->__last_nonopt = d->optind; |
409 | } | 408 | } |
410 | 409 | ||
411 | /* The special ARGV-element `--' means premature end of options. | 410 | /* The special ARGV-element `--' means premature end of options. |
412 | Skip it like a null option, | 411 | Skip it like a null option, |
413 | then exchange with previous non-options as if it were an option, | 412 | then exchange with previous non-options as if it were an option, |
414 | then skip everything else like a non-option. */ | 413 | then skip everything else like a non-option. */ |
415 | 414 | ||
416 | if (d->optind != argc && !strcmp (argv[d->optind], "--")) | 415 | if (d->optind != argc && !strcmp (argv[d->optind], "--")) |
417 | { | 416 | { |
418 | d->optind++; | 417 | d->optind++; |
419 | 418 | ||
420 | if (d->__first_nonopt != d->__last_nonopt | 419 | if (d->__first_nonopt != d->__last_nonopt |
421 | && d->__last_nonopt != d->optind) | 420 | && d->__last_nonopt != d->optind) |
422 | exchange ((char **) argv, d); | 421 | exchange ((char **) argv, d); |
423 | else if (d->__first_nonopt == d->__last_nonopt) | 422 | else if (d->__first_nonopt == d->__last_nonopt) |
424 | d->__first_nonopt = d->optind; | 423 | d->__first_nonopt = d->optind; |
425 | d->__last_nonopt = argc; | 424 | d->__last_nonopt = argc; |
426 | 425 | ||
427 | d->optind = argc; | 426 | d->optind = argc; |
428 | } | 427 | } |
429 | 428 | ||
430 | /* If we have done all the ARGV-elements, stop the scan | 429 | /* If we have done all the ARGV-elements, stop the scan |
431 | and back over any non-options that we skipped and permuted. */ | 430 | and back over any non-options that we skipped and permuted. */ |
432 | 431 | ||
433 | if (d->optind == argc) | 432 | if (d->optind == argc) |
434 | { | 433 | { |
435 | /* Set the next-arg-index to point at the non-options | 434 | /* Set the next-arg-index to point at the non-options |
436 | that we previously skipped, so the caller will digest them. */ | 435 | that we previously skipped, so the caller will digest them. */ |
437 | if (d->__first_nonopt != d->__last_nonopt) | 436 | if (d->__first_nonopt != d->__last_nonopt) |
438 | d->optind = d->__first_nonopt; | 437 | d->optind = d->__first_nonopt; |
439 | return -1; | 438 | return -1; |
440 | } | 439 | } |
441 | 440 | ||
442 | /* If we have come to a non-option and did not permute it, | 441 | /* If we have come to a non-option and did not permute it, |
443 | either stop the scan or describe it to the caller and pass it by. */ | 442 | either stop the scan or describe it to the caller and pass it by. */ |
444 | 443 | ||
445 | if (NONOPTION_P) | 444 | if (NONOPTION_P) |
446 | { | 445 | { |
447 | if (d->__ordering == REQUIRE_ORDER) | 446 | if (d->__ordering == REQUIRE_ORDER) |
448 | return -1; | 447 | return -1; |
449 | d->optarg = argv[d->optind++]; | 448 | d->optarg = argv[d->optind++]; |
450 | return 1; | 449 | return 1; |
451 | } | 450 | } |
452 | 451 | ||
453 | /* We have found another option-ARGV-element. | 452 | /* We have found another option-ARGV-element. |
454 | Skip the initial punctuation. */ | 453 | Skip the initial punctuation. */ |
455 | 454 | ||
456 | d->__nextchar = (argv[d->optind] + 1 | 455 | d->__nextchar = (argv[d->optind] + 1 |
457 | + (longopts != NULL && argv[d->optind][1] == '-')); | 456 | + (longopts != NULL && argv[d->optind][1] == '-')); |
458 | } | 457 | } |
459 | 458 | ||
460 | /* Decode the current option-ARGV-element. */ | 459 | /* Decode the current option-ARGV-element. */ |
@@ -474,8 +473,8 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
474 | 473 | ||
475 | if (longopts != NULL | 474 | if (longopts != NULL |
476 | && (argv[d->optind][1] == '-' | 475 | && (argv[d->optind][1] == '-' |
477 | || (long_only && (argv[d->optind][2] | 476 | || (long_only && (argv[d->optind][2] |
478 | || !strchr (optstring, argv[d->optind][1]))))) | 477 | || !strchr (optstring, argv[d->optind][1]))))) |
479 | { | 478 | { |
480 | char *nameend; | 479 | char *nameend; |
481 | const struct option *p; | 480 | const struct option *p; |
@@ -486,251 +485,251 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
486 | int option_index; | 485 | int option_index; |
487 | 486 | ||
488 | for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) | 487 | for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) |
489 | /* Do nothing. */ ; | 488 | /* Do nothing. */ ; |
490 | 489 | ||
491 | /* Test all long options for either exact match | 490 | /* Test all long options for either exact match |
492 | or abbreviated matches. */ | 491 | or abbreviated matches. */ |
493 | for (p = longopts, option_index = 0; p->name; p++, option_index++) | 492 | for (p = longopts, option_index = 0; p->name; p++, option_index++) |
494 | if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) | 493 | if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) |
495 | { | 494 | { |
496 | if ((unsigned int) (nameend - d->__nextchar) | 495 | if ((unsigned int) (nameend - d->__nextchar) |
497 | == (unsigned int) strlen (p->name)) | 496 | == (unsigned int) strlen (p->name)) |
498 | { | 497 | { |
499 | /* Exact match found. */ | 498 | /* Exact match found. */ |
500 | pfound = p; | 499 | pfound = p; |
501 | indfound = option_index; | 500 | indfound = option_index; |
502 | exact = 1; | 501 | exact = 1; |
503 | break; | 502 | break; |
504 | } | 503 | } |
505 | else if (pfound == NULL) | 504 | else if (pfound == NULL) |
506 | { | 505 | { |
507 | /* First nonexact match found. */ | 506 | /* First nonexact match found. */ |
508 | pfound = p; | 507 | pfound = p; |
509 | indfound = option_index; | 508 | indfound = option_index; |
510 | } | 509 | } |
511 | else if (long_only | 510 | else if (long_only |
512 | || pfound->has_arg != p->has_arg | 511 | || pfound->has_arg != p->has_arg |
513 | || pfound->flag != p->flag | 512 | || pfound->flag != p->flag |
514 | || pfound->val != p->val) | 513 | || pfound->val != p->val) |
515 | /* Second or later nonexact match found. */ | 514 | /* Second or later nonexact match found. */ |
516 | ambig = 1; | 515 | ambig = 1; |
517 | } | 516 | } |
518 | 517 | ||
519 | if (ambig && !exact) | 518 | if (ambig && !exact) |
520 | { | 519 | { |
521 | if (print_errors) | 520 | if (print_errors) |
522 | { | 521 | { |
523 | #if defined _LIBC && defined USE_IN_LIBIO | 522 | #if defined _LIBC && defined USE_IN_LIBIO |
524 | char *buf; | 523 | char *buf; |
525 | 524 | ||
526 | if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), | 525 | if (__asprintf (&buf, _("%s: option '%s' is ambiguous\n"), |
527 | argv[0], argv[d->optind]) >= 0) | 526 | argv[0], argv[d->optind]) >= 0) |
528 | { | 527 | { |
529 | _IO_flockfile (stderr); | 528 | _IO_flockfile (stderr); |
530 | 529 | ||
531 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 530 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
532 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; | 531 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; |
533 | 532 | ||
534 | __fxprintf (NULL, "%s", buf); | 533 | __fxprintf (NULL, "%s", buf); |
535 | 534 | ||
536 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 535 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
537 | _IO_funlockfile (stderr); | 536 | _IO_funlockfile (stderr); |
538 | 537 | ||
539 | free (buf); | 538 | free (buf); |
540 | } | 539 | } |
541 | #else | 540 | #else |
542 | fprintf (stderr, _("%s: option `%s' is ambiguous\n"), | 541 | fprintf (stderr, _("%s: option '%s' is ambiguous\n"), |
543 | argv[0], argv[d->optind]); | 542 | argv[0], argv[d->optind]); |
544 | #endif | 543 | #endif |
545 | } | 544 | } |
546 | d->__nextchar += strlen (d->__nextchar); | 545 | d->__nextchar += strlen (d->__nextchar); |
547 | d->optind++; | 546 | d->optind++; |
548 | d->optopt = 0; | 547 | d->optopt = 0; |
549 | return '?'; | 548 | return '?'; |
550 | } | 549 | } |
551 | 550 | ||
552 | if (pfound != NULL) | 551 | if (pfound != NULL) |
553 | { | 552 | { |
554 | option_index = indfound; | 553 | option_index = indfound; |
555 | d->optind++; | 554 | d->optind++; |
556 | if (*nameend) | 555 | if (*nameend) |
557 | { | 556 | { |
558 | /* Don't test has_arg with >, because some C compilers don't | 557 | /* Don't test has_arg with >, because some C compilers don't |
559 | allow it to be used on enums. */ | 558 | allow it to be used on enums. */ |
560 | if (pfound->has_arg) | 559 | if (pfound->has_arg) |
561 | d->optarg = nameend + 1; | 560 | d->optarg = nameend + 1; |
562 | else | 561 | else |
563 | { | 562 | { |
564 | if (print_errors) | 563 | if (print_errors) |
565 | { | 564 | { |
566 | #if defined _LIBC && defined USE_IN_LIBIO | 565 | #if defined _LIBC && defined USE_IN_LIBIO |
567 | char *buf; | 566 | char *buf; |
568 | int n; | 567 | int n; |
569 | #endif | 568 | #endif |
570 | 569 | ||
571 | if (argv[d->optind - 1][1] == '-') | 570 | if (argv[d->optind - 1][1] == '-') |
572 | { | 571 | { |
573 | /* --option */ | 572 | /* --option */ |
574 | #if defined _LIBC && defined USE_IN_LIBIO | 573 | #if defined _LIBC && defined USE_IN_LIBIO |
575 | n = __asprintf (&buf, _("\ | 574 | n = __asprintf (&buf, _("\ |
576 | %s: option `--%s' doesn't allow an argument\n"), | 575 | %s: option '--%s' doesn't allow an argument\n"), |
577 | argv[0], pfound->name); | 576 | argv[0], pfound->name); |
578 | #else | 577 | #else |
579 | fprintf (stderr, _("\ | 578 | fprintf (stderr, _("\ |
580 | %s: option `--%s' doesn't allow an argument\n"), | 579 | %s: option '--%s' doesn't allow an argument\n"), |
581 | argv[0], pfound->name); | 580 | argv[0], pfound->name); |
582 | #endif | 581 | #endif |
583 | } | 582 | } |
584 | else | 583 | else |
585 | { | 584 | { |
586 | /* +option or -option */ | 585 | /* +option or -option */ |
587 | #if defined _LIBC && defined USE_IN_LIBIO | 586 | #if defined _LIBC && defined USE_IN_LIBIO |
588 | n = __asprintf (&buf, _("\ | 587 | n = __asprintf (&buf, _("\ |
589 | %s: option `%c%s' doesn't allow an argument\n"), | 588 | %s: option '%c%s' doesn't allow an argument\n"), |
590 | argv[0], argv[d->optind - 1][0], | 589 | argv[0], argv[d->optind - 1][0], |
591 | pfound->name); | 590 | pfound->name); |
592 | #else | 591 | #else |
593 | fprintf (stderr, _("\ | 592 | fprintf (stderr, _("\ |
594 | %s: option `%c%s' doesn't allow an argument\n"), | 593 | %s: option '%c%s' doesn't allow an argument\n"), |
595 | argv[0], argv[d->optind - 1][0], | 594 | argv[0], argv[d->optind - 1][0], |
596 | pfound->name); | 595 | pfound->name); |
597 | #endif | 596 | #endif |
598 | } | 597 | } |
599 | 598 | ||
600 | #if defined _LIBC && defined USE_IN_LIBIO | 599 | #if defined _LIBC && defined USE_IN_LIBIO |
601 | if (n >= 0) | 600 | if (n >= 0) |
602 | { | 601 | { |
603 | _IO_flockfile (stderr); | 602 | _IO_flockfile (stderr); |
604 | 603 | ||
605 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 604 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
606 | ((_IO_FILE *) stderr)->_flags2 | 605 | ((_IO_FILE *) stderr)->_flags2 |
607 | |= _IO_FLAGS2_NOTCANCEL; | 606 | |= _IO_FLAGS2_NOTCANCEL; |
608 | 607 | ||
609 | __fxprintf (NULL, "%s", buf); | 608 | __fxprintf (NULL, "%s", buf); |
610 | 609 | ||
611 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 610 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
612 | _IO_funlockfile (stderr); | 611 | _IO_funlockfile (stderr); |
613 | 612 | ||
614 | free (buf); | 613 | free (buf); |
615 | } | 614 | } |
616 | #endif | 615 | #endif |
617 | } | 616 | } |
618 | 617 | ||
619 | d->__nextchar += strlen (d->__nextchar); | 618 | d->__nextchar += strlen (d->__nextchar); |
620 | 619 | ||
621 | d->optopt = pfound->val; | 620 | d->optopt = pfound->val; |
622 | return '?'; | 621 | return '?'; |
623 | } | 622 | } |
624 | } | 623 | } |
625 | else if (pfound->has_arg == 1) | 624 | else if (pfound->has_arg == 1) |
626 | { | 625 | { |
627 | if (d->optind < argc) | 626 | if (d->optind < argc) |
628 | d->optarg = argv[d->optind++]; | 627 | d->optarg = argv[d->optind++]; |
629 | else | 628 | else |
630 | { | 629 | { |
631 | if (print_errors) | 630 | if (print_errors) |
632 | { | 631 | { |
633 | #if defined _LIBC && defined USE_IN_LIBIO | 632 | #if defined _LIBC && defined USE_IN_LIBIO |
634 | char *buf; | 633 | char *buf; |
635 | 634 | ||
636 | if (__asprintf (&buf, _("\ | 635 | if (__asprintf (&buf, _("\ |
637 | %s: option `%s' requires an argument\n"), | 636 | %s: option '%s' requires an argument\n"), |
638 | argv[0], argv[d->optind - 1]) >= 0) | 637 | argv[0], argv[d->optind - 1]) >= 0) |
639 | { | 638 | { |
640 | _IO_flockfile (stderr); | 639 | _IO_flockfile (stderr); |
641 | 640 | ||
642 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 641 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
643 | ((_IO_FILE *) stderr)->_flags2 | 642 | ((_IO_FILE *) stderr)->_flags2 |
644 | |= _IO_FLAGS2_NOTCANCEL; | 643 | |= _IO_FLAGS2_NOTCANCEL; |
645 | 644 | ||
646 | __fxprintf (NULL, "%s", buf); | 645 | __fxprintf (NULL, "%s", buf); |
647 | 646 | ||
648 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 647 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
649 | _IO_funlockfile (stderr); | 648 | _IO_funlockfile (stderr); |
650 | 649 | ||
651 | free (buf); | 650 | free (buf); |
652 | } | 651 | } |
653 | #else | 652 | #else |
654 | fprintf (stderr, | 653 | fprintf (stderr, |
655 | _("%s: option `%s' requires an argument\n"), | 654 | _("%s: option '%s' requires an argument\n"), |
656 | argv[0], argv[d->optind - 1]); | 655 | argv[0], argv[d->optind - 1]); |
657 | #endif | 656 | #endif |
658 | } | 657 | } |
659 | d->__nextchar += strlen (d->__nextchar); | 658 | d->__nextchar += strlen (d->__nextchar); |
660 | d->optopt = pfound->val; | 659 | d->optopt = pfound->val; |
661 | return optstring[0] == ':' ? ':' : '?'; | 660 | return optstring[0] == ':' ? ':' : '?'; |
662 | } | 661 | } |
663 | } | 662 | } |
664 | d->__nextchar += strlen (d->__nextchar); | 663 | d->__nextchar += strlen (d->__nextchar); |
665 | if (longind != NULL) | 664 | if (longind != NULL) |
666 | *longind = option_index; | 665 | *longind = option_index; |
667 | if (pfound->flag) | 666 | if (pfound->flag) |
668 | { | 667 | { |
669 | *(pfound->flag) = pfound->val; | 668 | *(pfound->flag) = pfound->val; |
670 | return 0; | 669 | return 0; |
671 | } | 670 | } |
672 | return pfound->val; | 671 | return pfound->val; |
673 | } | 672 | } |
674 | 673 | ||
675 | /* Can't find it as a long option. If this is not getopt_long_only, | 674 | /* Can't find it as a long option. If this is not getopt_long_only, |
676 | or the option starts with '--' or is not a valid short | 675 | or the option starts with '--' or is not a valid short |
677 | option, then it's an error. | 676 | option, then it's an error. |
678 | Otherwise interpret it as a short option. */ | 677 | Otherwise interpret it as a short option. */ |
679 | if (!long_only || argv[d->optind][1] == '-' | 678 | if (!long_only || argv[d->optind][1] == '-' |
680 | || strchr (optstring, *d->__nextchar) == NULL) | 679 | || strchr (optstring, *d->__nextchar) == NULL) |
681 | { | 680 | { |
682 | if (print_errors) | 681 | if (print_errors) |
683 | { | 682 | { |
684 | #if defined _LIBC && defined USE_IN_LIBIO | 683 | #if defined _LIBC && defined USE_IN_LIBIO |
685 | char *buf; | 684 | char *buf; |
686 | int n; | 685 | int n; |
687 | #endif | 686 | #endif |
688 | 687 | ||
689 | if (argv[d->optind][1] == '-') | 688 | if (argv[d->optind][1] == '-') |
690 | { | 689 | { |
691 | /* --option */ | 690 | /* --option */ |
692 | #if defined _LIBC && defined USE_IN_LIBIO | 691 | #if defined _LIBC && defined USE_IN_LIBIO |
693 | n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), | 692 | n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"), |
694 | argv[0], d->__nextchar); | 693 | argv[0], d->__nextchar); |
695 | #else | 694 | #else |
696 | fprintf (stderr, _("%s: unrecognized option `--%s'\n"), | 695 | fprintf (stderr, _("%s: unrecognized option '--%s'\n"), |
697 | argv[0], d->__nextchar); | 696 | argv[0], d->__nextchar); |
698 | #endif | 697 | #endif |
699 | } | 698 | } |
700 | else | 699 | else |
701 | { | 700 | { |
702 | /* +option or -option */ | 701 | /* +option or -option */ |
703 | #if defined _LIBC && defined USE_IN_LIBIO | 702 | #if defined _LIBC && defined USE_IN_LIBIO |
704 | n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), | 703 | n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"), |
705 | argv[0], argv[d->optind][0], d->__nextchar); | 704 | argv[0], argv[d->optind][0], d->__nextchar); |
706 | #else | 705 | #else |
707 | fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), | 706 | fprintf (stderr, _("%s: unrecognized option '%c%s'\n"), |
708 | argv[0], argv[d->optind][0], d->__nextchar); | 707 | argv[0], argv[d->optind][0], d->__nextchar); |
709 | #endif | 708 | #endif |
710 | } | 709 | } |
711 | 710 | ||
712 | #if defined _LIBC && defined USE_IN_LIBIO | 711 | #if defined _LIBC && defined USE_IN_LIBIO |
713 | if (n >= 0) | 712 | if (n >= 0) |
714 | { | 713 | { |
715 | _IO_flockfile (stderr); | 714 | _IO_flockfile (stderr); |
716 | 715 | ||
717 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 716 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
718 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; | 717 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; |
719 | 718 | ||
720 | __fxprintf (NULL, "%s", buf); | 719 | __fxprintf (NULL, "%s", buf); |
721 | 720 | ||
722 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 721 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
723 | _IO_funlockfile (stderr); | 722 | _IO_funlockfile (stderr); |
724 | 723 | ||
725 | free (buf); | 724 | free (buf); |
726 | } | 725 | } |
727 | #endif | 726 | #endif |
728 | } | 727 | } |
729 | d->__nextchar = (char *) ""; | 728 | d->__nextchar = (char *) ""; |
730 | d->optind++; | 729 | d->optind++; |
731 | d->optopt = 0; | 730 | d->optopt = 0; |
732 | return '?'; | 731 | return '?'; |
733 | } | 732 | } |
734 | } | 733 | } |
735 | 734 | ||
736 | /* Look at and handle the next short option-character. */ | 735 | /* Look at and handle the next short option-character. */ |
@@ -745,335 +744,321 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
745 | 744 | ||
746 | if (temp == NULL || c == ':') | 745 | if (temp == NULL || c == ':') |
747 | { | 746 | { |
748 | if (print_errors) | 747 | if (print_errors) |
749 | { | 748 | { |
750 | #if defined _LIBC && defined USE_IN_LIBIO | 749 | #if defined _LIBC && defined USE_IN_LIBIO |
751 | char *buf; | 750 | char *buf; |
752 | int n; | 751 | int n; |
753 | #endif | 752 | #endif |
754 | 753 | ||
755 | if (d->__posixly_correct) | ||
756 | { | ||
757 | /* 1003.2 specifies the format of this message. */ | ||
758 | #if defined _LIBC && defined USE_IN_LIBIO | ||
759 | n = __asprintf (&buf, _("%s: illegal option -- %c\n"), | ||
760 | argv[0], c); | ||
761 | #else | ||
762 | fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); | ||
763 | #endif | ||
764 | } | ||
765 | else | ||
766 | { | ||
767 | #if defined _LIBC && defined USE_IN_LIBIO | 754 | #if defined _LIBC && defined USE_IN_LIBIO |
768 | n = __asprintf (&buf, _("%s: invalid option -- %c\n"), | 755 | n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"), |
769 | argv[0], c); | 756 | argv[0], c); |
770 | #else | 757 | #else |
771 | fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); | 758 | fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c); |
772 | #endif | 759 | #endif |
773 | } | ||
774 | 760 | ||
775 | #if defined _LIBC && defined USE_IN_LIBIO | 761 | #if defined _LIBC && defined USE_IN_LIBIO |
776 | if (n >= 0) | 762 | if (n >= 0) |
777 | { | 763 | { |
778 | _IO_flockfile (stderr); | 764 | _IO_flockfile (stderr); |
779 | 765 | ||
780 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 766 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
781 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; | 767 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; |
782 | 768 | ||
783 | __fxprintf (NULL, "%s", buf); | 769 | __fxprintf (NULL, "%s", buf); |
784 | 770 | ||
785 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 771 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
786 | _IO_funlockfile (stderr); | 772 | _IO_funlockfile (stderr); |
787 | 773 | ||
788 | free (buf); | 774 | free (buf); |
789 | } | 775 | } |
790 | #endif | 776 | #endif |
791 | } | 777 | } |
792 | d->optopt = c; | 778 | d->optopt = c; |
793 | return '?'; | 779 | return '?'; |
794 | } | 780 | } |
795 | /* Convenience. Treat POSIX -W foo same as long option --foo */ | 781 | /* Convenience. Treat POSIX -W foo same as long option --foo */ |
796 | if (temp[0] == 'W' && temp[1] == ';') | 782 | if (temp[0] == 'W' && temp[1] == ';') |
797 | { | 783 | { |
798 | char *nameend; | 784 | char *nameend; |
799 | const struct option *p; | 785 | const struct option *p; |
800 | const struct option *pfound = NULL; | 786 | const struct option *pfound = NULL; |
801 | int exact = 0; | 787 | int exact = 0; |
802 | int ambig = 0; | 788 | int ambig = 0; |
803 | int indfound = 0; | 789 | int indfound = 0; |
804 | int option_index; | 790 | int option_index; |
805 | 791 | ||
806 | /* This is an option that requires an argument. */ | 792 | /* This is an option that requires an argument. */ |
807 | if (*d->__nextchar != '\0') | 793 | if (*d->__nextchar != '\0') |
808 | { | 794 | { |
809 | d->optarg = d->__nextchar; | 795 | d->optarg = d->__nextchar; |
810 | /* If we end this ARGV-element by taking the rest as an arg, | 796 | /* If we end this ARGV-element by taking the rest as an arg, |
811 | we must advance to the next element now. */ | 797 | we must advance to the next element now. */ |
812 | d->optind++; | 798 | d->optind++; |
813 | } | 799 | } |
814 | else if (d->optind == argc) | 800 | else if (d->optind == argc) |
815 | { | 801 | { |
816 | if (print_errors) | 802 | if (print_errors) |
817 | { | 803 | { |
818 | /* 1003.2 specifies the format of this message. */ | ||
819 | #if defined _LIBC && defined USE_IN_LIBIO | 804 | #if defined _LIBC && defined USE_IN_LIBIO |
820 | char *buf; | 805 | char *buf; |
821 | 806 | ||
822 | if (__asprintf (&buf, | 807 | if (__asprintf (&buf, |
823 | _("%s: option requires an argument -- %c\n"), | 808 | _("%s: option requires an argument -- '%c'\n"), |
824 | argv[0], c) >= 0) | 809 | argv[0], c) >= 0) |
825 | { | 810 | { |
826 | _IO_flockfile (stderr); | 811 | _IO_flockfile (stderr); |
827 | 812 | ||
828 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 813 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
829 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; | 814 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; |
830 | 815 | ||
831 | __fxprintf (NULL, "%s", buf); | 816 | __fxprintf (NULL, "%s", buf); |
832 | 817 | ||
833 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 818 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
834 | _IO_funlockfile (stderr); | 819 | _IO_funlockfile (stderr); |
835 | 820 | ||
836 | free (buf); | 821 | free (buf); |
837 | } | 822 | } |
838 | #else | 823 | #else |
839 | fprintf (stderr, _("%s: option requires an argument -- %c\n"), | 824 | fprintf (stderr, |
840 | argv[0], c); | 825 | _("%s: option requires an argument -- '%c'\n"), |
826 | argv[0], c); | ||
841 | #endif | 827 | #endif |
842 | } | 828 | } |
843 | d->optopt = c; | 829 | d->optopt = c; |
844 | if (optstring[0] == ':') | 830 | if (optstring[0] == ':') |
845 | c = ':'; | 831 | c = ':'; |
846 | else | 832 | else |
847 | c = '?'; | 833 | c = '?'; |
848 | return c; | 834 | return c; |
849 | } | 835 | } |
850 | else | 836 | else |
851 | /* We already incremented `d->optind' once; | 837 | /* We already incremented `d->optind' once; |
852 | increment it again when taking next ARGV-elt as argument. */ | 838 | increment it again when taking next ARGV-elt as argument. */ |
853 | d->optarg = argv[d->optind++]; | 839 | d->optarg = argv[d->optind++]; |
854 | 840 | ||
855 | /* optarg is now the argument, see if it's in the | 841 | /* optarg is now the argument, see if it's in the |
856 | table of longopts. */ | 842 | table of longopts. */ |
857 | 843 | ||
858 | for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; | 844 | for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; |
859 | nameend++) | 845 | nameend++) |
860 | /* Do nothing. */ ; | 846 | /* Do nothing. */ ; |
861 | 847 | ||
862 | /* Test all long options for either exact match | 848 | /* Test all long options for either exact match |
863 | or abbreviated matches. */ | 849 | or abbreviated matches. */ |
864 | for (p = longopts, option_index = 0; p->name; p++, option_index++) | 850 | for (p = longopts, option_index = 0; p->name; p++, option_index++) |
865 | if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) | 851 | if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) |
866 | { | 852 | { |
867 | if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) | 853 | if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) |
868 | { | 854 | { |
869 | /* Exact match found. */ | 855 | /* Exact match found. */ |
870 | pfound = p; | 856 | pfound = p; |
871 | indfound = option_index; | 857 | indfound = option_index; |
872 | exact = 1; | 858 | exact = 1; |
873 | break; | 859 | break; |
874 | } | 860 | } |
875 | else if (pfound == NULL) | 861 | else if (pfound == NULL) |
876 | { | 862 | { |
877 | /* First nonexact match found. */ | 863 | /* First nonexact match found. */ |
878 | pfound = p; | 864 | pfound = p; |
879 | indfound = option_index; | 865 | indfound = option_index; |
880 | } | 866 | } |
881 | else | 867 | else |
882 | /* Second or later nonexact match found. */ | 868 | /* Second or later nonexact match found. */ |
883 | ambig = 1; | 869 | ambig = 1; |
884 | } | 870 | } |
885 | if (ambig && !exact) | 871 | if (ambig && !exact) |
886 | { | 872 | { |
887 | if (print_errors) | 873 | if (print_errors) |
888 | { | 874 | { |
889 | #if defined _LIBC && defined USE_IN_LIBIO | 875 | #if defined _LIBC && defined USE_IN_LIBIO |
890 | char *buf; | 876 | char *buf; |
891 | 877 | ||
892 | if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), | 878 | if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"), |
893 | argv[0], argv[d->optind]) >= 0) | 879 | argv[0], argv[d->optind]) >= 0) |
894 | { | 880 | { |
895 | _IO_flockfile (stderr); | 881 | _IO_flockfile (stderr); |
896 | 882 | ||
897 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 883 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
898 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; | 884 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; |
899 | 885 | ||
900 | __fxprintf (NULL, "%s", buf); | 886 | __fxprintf (NULL, "%s", buf); |
901 | 887 | ||
902 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 888 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
903 | _IO_funlockfile (stderr); | 889 | _IO_funlockfile (stderr); |
904 | 890 | ||
905 | free (buf); | 891 | free (buf); |
906 | } | 892 | } |
907 | #else | 893 | #else |
908 | fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), | 894 | fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"), |
909 | argv[0], argv[d->optind]); | 895 | argv[0], argv[d->optind]); |
910 | #endif | 896 | #endif |
911 | } | 897 | } |
912 | d->__nextchar += strlen (d->__nextchar); | 898 | d->__nextchar += strlen (d->__nextchar); |
913 | d->optind++; | 899 | d->optind++; |
914 | return '?'; | 900 | return '?'; |
915 | } | 901 | } |
916 | if (pfound != NULL) | 902 | if (pfound != NULL) |
917 | { | 903 | { |
918 | option_index = indfound; | 904 | option_index = indfound; |
919 | if (*nameend) | 905 | if (*nameend) |
920 | { | 906 | { |
921 | /* Don't test has_arg with >, because some C compilers don't | 907 | /* Don't test has_arg with >, because some C compilers don't |
922 | allow it to be used on enums. */ | 908 | allow it to be used on enums. */ |
923 | if (pfound->has_arg) | 909 | if (pfound->has_arg) |
924 | d->optarg = nameend + 1; | 910 | d->optarg = nameend + 1; |
925 | else | 911 | else |
926 | { | 912 | { |
927 | if (print_errors) | 913 | if (print_errors) |
928 | { | 914 | { |
929 | #if defined _LIBC && defined USE_IN_LIBIO | 915 | #if defined _LIBC && defined USE_IN_LIBIO |
930 | char *buf; | 916 | char *buf; |
931 | 917 | ||
932 | if (__asprintf (&buf, _("\ | 918 | if (__asprintf (&buf, _("\ |
933 | %s: option `-W %s' doesn't allow an argument\n"), | 919 | %s: option '-W %s' doesn't allow an argument\n"), |
934 | argv[0], pfound->name) >= 0) | 920 | argv[0], pfound->name) >= 0) |
935 | { | 921 | { |
936 | _IO_flockfile (stderr); | 922 | _IO_flockfile (stderr); |
937 | 923 | ||
938 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 924 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
939 | ((_IO_FILE *) stderr)->_flags2 | 925 | ((_IO_FILE *) stderr)->_flags2 |
940 | |= _IO_FLAGS2_NOTCANCEL; | 926 | |= _IO_FLAGS2_NOTCANCEL; |
941 | 927 | ||
942 | __fxprintf (NULL, "%s", buf); | 928 | __fxprintf (NULL, "%s", buf); |
943 | 929 | ||
944 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 930 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
945 | _IO_funlockfile (stderr); | 931 | _IO_funlockfile (stderr); |
946 | 932 | ||
947 | free (buf); | 933 | free (buf); |
948 | } | 934 | } |
949 | #else | 935 | #else |
950 | fprintf (stderr, _("\ | 936 | fprintf (stderr, _("\ |
951 | %s: option `-W %s' doesn't allow an argument\n"), | 937 | %s: option '-W %s' doesn't allow an argument\n"), |
952 | argv[0], pfound->name); | 938 | argv[0], pfound->name); |
953 | #endif | 939 | #endif |
954 | } | 940 | } |
955 | 941 | ||
956 | d->__nextchar += strlen (d->__nextchar); | 942 | d->__nextchar += strlen (d->__nextchar); |
957 | return '?'; | 943 | return '?'; |
958 | } | 944 | } |
959 | } | 945 | } |
960 | else if (pfound->has_arg == 1) | 946 | else if (pfound->has_arg == 1) |
961 | { | 947 | { |
962 | if (d->optind < argc) | 948 | if (d->optind < argc) |
963 | d->optarg = argv[d->optind++]; | 949 | d->optarg = argv[d->optind++]; |
964 | else | 950 | else |
965 | { | 951 | { |
966 | if (print_errors) | 952 | if (print_errors) |
967 | { | 953 | { |
968 | #if defined _LIBC && defined USE_IN_LIBIO | 954 | #if defined _LIBC && defined USE_IN_LIBIO |
969 | char *buf; | 955 | char *buf; |
970 | 956 | ||
971 | if (__asprintf (&buf, _("\ | 957 | if (__asprintf (&buf, _("\ |
972 | %s: option `%s' requires an argument\n"), | 958 | %s: option '%s' requires an argument\n"), |
973 | argv[0], argv[d->optind - 1]) >= 0) | 959 | argv[0], argv[d->optind - 1]) >= 0) |
974 | { | 960 | { |
975 | _IO_flockfile (stderr); | 961 | _IO_flockfile (stderr); |
976 | 962 | ||
977 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 963 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
978 | ((_IO_FILE *) stderr)->_flags2 | 964 | ((_IO_FILE *) stderr)->_flags2 |
979 | |= _IO_FLAGS2_NOTCANCEL; | 965 | |= _IO_FLAGS2_NOTCANCEL; |
980 | 966 | ||
981 | __fxprintf (NULL, "%s", buf); | 967 | __fxprintf (NULL, "%s", buf); |
982 | 968 | ||
983 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 969 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
984 | _IO_funlockfile (stderr); | 970 | _IO_funlockfile (stderr); |
985 | 971 | ||
986 | free (buf); | 972 | free (buf); |
987 | } | 973 | } |
988 | #else | 974 | #else |
989 | fprintf (stderr, | 975 | fprintf (stderr, |
990 | _("%s: option `%s' requires an argument\n"), | 976 | _("%s: option '%s' requires an argument\n"), |
991 | argv[0], argv[d->optind - 1]); | 977 | argv[0], argv[d->optind - 1]); |
992 | #endif | 978 | #endif |
993 | } | 979 | } |
994 | d->__nextchar += strlen (d->__nextchar); | 980 | d->__nextchar += strlen (d->__nextchar); |
995 | return optstring[0] == ':' ? ':' : '?'; | 981 | return optstring[0] == ':' ? ':' : '?'; |
996 | } | 982 | } |
997 | } | 983 | } |
998 | d->__nextchar += strlen (d->__nextchar); | 984 | d->__nextchar += strlen (d->__nextchar); |
999 | if (longind != NULL) | 985 | if (longind != NULL) |
1000 | *longind = option_index; | 986 | *longind = option_index; |
1001 | if (pfound->flag) | 987 | if (pfound->flag) |
1002 | { | 988 | { |
1003 | *(pfound->flag) = pfound->val; | 989 | *(pfound->flag) = pfound->val; |
1004 | return 0; | 990 | return 0; |
1005 | } | 991 | } |
1006 | return pfound->val; | 992 | return pfound->val; |
1007 | } | 993 | } |
1008 | d->__nextchar = NULL; | 994 | d->__nextchar = NULL; |
1009 | return 'W'; /* Let the application handle it. */ | 995 | return 'W'; /* Let the application handle it. */ |
1010 | } | 996 | } |
1011 | if (temp[1] == ':') | 997 | if (temp[1] == ':') |
1012 | { | 998 | { |
1013 | if (temp[2] == ':') | 999 | if (temp[2] == ':') |
1014 | { | 1000 | { |
1015 | /* This is an option that accepts an argument optionally. */ | 1001 | /* This is an option that accepts an argument optionally. */ |
1016 | if (*d->__nextchar != '\0') | 1002 | if (*d->__nextchar != '\0') |
1017 | { | 1003 | { |
1018 | d->optarg = d->__nextchar; | 1004 | d->optarg = d->__nextchar; |
1019 | d->optind++; | 1005 | d->optind++; |
1020 | } | 1006 | } |
1021 | else | 1007 | else |
1022 | d->optarg = NULL; | 1008 | d->optarg = NULL; |
1023 | d->__nextchar = NULL; | 1009 | d->__nextchar = NULL; |
1024 | } | 1010 | } |
1025 | else | 1011 | else |
1026 | { | 1012 | { |
1027 | /* This is an option that requires an argument. */ | 1013 | /* This is an option that requires an argument. */ |
1028 | if (*d->__nextchar != '\0') | 1014 | if (*d->__nextchar != '\0') |
1029 | { | 1015 | { |
1030 | d->optarg = d->__nextchar; | 1016 | d->optarg = d->__nextchar; |
1031 | /* If we end this ARGV-element by taking the rest as an arg, | 1017 | /* If we end this ARGV-element by taking the rest as an arg, |
1032 | we must advance to the next element now. */ | 1018 | we must advance to the next element now. */ |
1033 | d->optind++; | 1019 | d->optind++; |
1034 | } | 1020 | } |
1035 | else if (d->optind == argc) | 1021 | else if (d->optind == argc) |
1036 | { | 1022 | { |
1037 | if (print_errors) | 1023 | if (print_errors) |
1038 | { | 1024 | { |
1039 | /* 1003.2 specifies the format of this message. */ | ||
1040 | #if defined _LIBC && defined USE_IN_LIBIO | 1025 | #if defined _LIBC && defined USE_IN_LIBIO |
1041 | char *buf; | 1026 | char *buf; |
1042 | 1027 | ||
1043 | if (__asprintf (&buf, _("\ | 1028 | if (__asprintf (&buf, _("\ |
1044 | %s: option requires an argument -- %c\n"), | 1029 | %s: option requires an argument -- '%c'\n"), |
1045 | argv[0], c) >= 0) | 1030 | argv[0], c) >= 0) |
1046 | { | 1031 | { |
1047 | _IO_flockfile (stderr); | 1032 | _IO_flockfile (stderr); |
1048 | 1033 | ||
1049 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; | 1034 | int old_flags2 = ((_IO_FILE *) stderr)->_flags2; |
1050 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; | 1035 | ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; |
1051 | 1036 | ||
1052 | __fxprintf (NULL, "%s", buf); | 1037 | __fxprintf (NULL, "%s", buf); |
1053 | 1038 | ||
1054 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; | 1039 | ((_IO_FILE *) stderr)->_flags2 = old_flags2; |
1055 | _IO_funlockfile (stderr); | 1040 | _IO_funlockfile (stderr); |
1056 | 1041 | ||
1057 | free (buf); | 1042 | free (buf); |
1058 | } | 1043 | } |
1059 | #else | 1044 | #else |
1060 | fprintf (stderr, | 1045 | fprintf (stderr, |
1061 | _("%s: option requires an argument -- %c\n"), | 1046 | _("%s: option requires an argument -- '%c'\n"), |
1062 | argv[0], c); | 1047 | argv[0], c); |
1063 | #endif | 1048 | #endif |
1064 | } | 1049 | } |
1065 | d->optopt = c; | 1050 | d->optopt = c; |
1066 | if (optstring[0] == ':') | 1051 | if (optstring[0] == ':') |
1067 | c = ':'; | 1052 | c = ':'; |
1068 | else | 1053 | else |
1069 | c = '?'; | 1054 | c = '?'; |
1070 | } | 1055 | } |
1071 | else | 1056 | else |
1072 | /* We already incremented `optind' once; | 1057 | /* We already incremented `optind' once; |
1073 | increment it again when taking next ARGV-elt as argument. */ | 1058 | increment it again when taking next ARGV-elt as argument. */ |
1074 | d->optarg = argv[d->optind++]; | 1059 | d->optarg = argv[d->optind++]; |
1075 | d->__nextchar = NULL; | 1060 | d->__nextchar = NULL; |
1076 | } | 1061 | } |
1077 | } | 1062 | } |
1078 | return c; | 1063 | return c; |
1079 | } | 1064 | } |
@@ -1081,16 +1066,17 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
1081 | 1066 | ||
1082 | int | 1067 | int |
1083 | _getopt_internal (int argc, char **argv, const char *optstring, | 1068 | _getopt_internal (int argc, char **argv, const char *optstring, |
1084 | const struct option *longopts, int *longind, | 1069 | const struct option *longopts, int *longind, int long_only, |
1085 | int long_only, int posixly_correct) | 1070 | int posixly_correct) |
1086 | { | 1071 | { |
1087 | int result; | 1072 | int result; |
1088 | 1073 | ||
1089 | getopt_data.optind = optind; | 1074 | getopt_data.optind = optind; |
1090 | getopt_data.opterr = opterr; | 1075 | getopt_data.opterr = opterr; |
1091 | 1076 | ||
1092 | result = _getopt_internal_r (argc, argv, optstring, longopts, longind, | 1077 | result = _getopt_internal_r (argc, argv, optstring, longopts, |
1093 | long_only, posixly_correct, &getopt_data); | 1078 | longind, long_only, &getopt_data, |
1079 | posixly_correct); | ||
1094 | 1080 | ||
1095 | optind = getopt_data.optind; | 1081 | optind = getopt_data.optind; |
1096 | optarg = getopt_data.optarg; | 1082 | optarg = getopt_data.optarg; |
@@ -1110,10 +1096,23 @@ enum { POSIXLY_CORRECT = 1 }; | |||
1110 | int | 1096 | int |
1111 | getopt (int argc, char *const *argv, const char *optstring) | 1097 | getopt (int argc, char *const *argv, const char *optstring) |
1112 | { | 1098 | { |
1113 | return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0, | 1099 | return _getopt_internal (argc, (char **) argv, optstring, |
1114 | POSIXLY_CORRECT); | 1100 | (const struct option *) 0, |
1101 | (int *) 0, | ||
1102 | 0, POSIXLY_CORRECT); | ||
1115 | } | 1103 | } |
1116 | 1104 | ||
1105 | #ifdef _LIBC | ||
1106 | int | ||
1107 | __posix_getopt (int argc, char *const *argv, const char *optstring) | ||
1108 | { | ||
1109 | return _getopt_internal (argc, argv, optstring, | ||
1110 | (const struct option *) 0, | ||
1111 | (int *) 0, | ||
1112 | 0, 1); | ||
1113 | } | ||
1114 | #endif | ||
1115 | |||
1117 | 1116 | ||
1118 | #ifdef TEST | 1117 | #ifdef TEST |
1119 | 1118 | ||
@@ -1132,51 +1131,51 @@ main (int argc, char **argv) | |||
1132 | 1131 | ||
1133 | c = getopt (argc, argv, "abc:d:0123456789"); | 1132 | c = getopt (argc, argv, "abc:d:0123456789"); |
1134 | if (c == -1) | 1133 | if (c == -1) |
1135 | break; | 1134 | break; |
1136 | 1135 | ||
1137 | switch (c) | 1136 | switch (c) |
1138 | { | 1137 | { |
1139 | case '0': | 1138 | case '0': |
1140 | case '1': | 1139 | case '1': |
1141 | case '2': | 1140 | case '2': |
1142 | case '3': | 1141 | case '3': |
1143 | case '4': | 1142 | case '4': |
1144 | case '5': | 1143 | case '5': |
1145 | case '6': | 1144 | case '6': |
1146 | case '7': | 1145 | case '7': |
1147 | case '8': | 1146 | case '8': |
1148 | case '9': | 1147 | case '9': |
1149 | if (digit_optind != 0 && digit_optind != this_option_optind) | 1148 | if (digit_optind != 0 && digit_optind != this_option_optind) |
1150 | printf ("digits occur in two different argv-elements.\n"); | 1149 | printf ("digits occur in two different argv-elements.\n"); |
1151 | digit_optind = this_option_optind; | 1150 | digit_optind = this_option_optind; |
1152 | printf ("option %c\n", c); | 1151 | printf ("option %c\n", c); |
1153 | break; | 1152 | break; |
1154 | 1153 | ||
1155 | case 'a': | 1154 | case 'a': |
1156 | printf ("option a\n"); | 1155 | printf ("option a\n"); |
1157 | break; | 1156 | break; |
1158 | 1157 | ||
1159 | case 'b': | 1158 | case 'b': |
1160 | printf ("option b\n"); | 1159 | printf ("option b\n"); |
1161 | break; | 1160 | break; |
1162 | 1161 | ||
1163 | case 'c': | 1162 | case 'c': |
1164 | printf ("option c with value `%s'\n", optarg); | 1163 | printf ("option c with value '%s'\n", optarg); |
1165 | break; | 1164 | break; |
1166 | 1165 | ||
1167 | case '?': | 1166 | case '?': |
1168 | break; | 1167 | break; |
1169 | 1168 | ||
1170 | default: | 1169 | default: |
1171 | printf ("?? getopt returned character code 0%o ??\n", c); | 1170 | printf ("?? getopt returned character code 0%o ??\n", c); |
1172 | } | 1171 | } |
1173 | } | 1172 | } |
1174 | 1173 | ||
1175 | if (optind < argc) | 1174 | if (optind < argc) |
1176 | { | 1175 | { |
1177 | printf ("non-option ARGV-elements: "); | 1176 | printf ("non-option ARGV-elements: "); |
1178 | while (optind < argc) | 1177 | while (optind < argc) |
1179 | printf ("%s ", argv[optind++]); | 1178 | printf ("%s ", argv[optind++]); |
1180 | printf ("\n"); | 1179 | printf ("\n"); |
1181 | } | 1180 | } |
1182 | 1181 | ||
diff --git a/gl/getopt.in.h b/gl/getopt.in.h index d2d3e6e6..57a8e899 100644 --- a/gl/getopt.in.h +++ b/gl/getopt.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Declarations for getopt. | 1 | /* Declarations for getopt. |
2 | Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005,2006,2007 | 2 | Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2010 Free Software |
3 | Free Software Foundation, Inc. | 3 | Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
@@ -16,24 +16,42 @@ | |||
16 | You should have received a copy of the GNU General Public License | 16 | You should have received a copy of the GNU General Public License |
17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
18 | 18 | ||
19 | #ifndef _GETOPT_H | 19 | #ifndef _GL_GETOPT_H |
20 | |||
21 | #if __GNUC__ >= 3 | ||
22 | @PRAGMA_SYSTEM_HEADER@ | ||
23 | #endif | ||
24 | |||
25 | /* The include_next requires a split double-inclusion guard. We must | ||
26 | also inform the replacement unistd.h to not recursively use | ||
27 | <getopt.h>; our definitions will be present soon enough. */ | ||
28 | #if @HAVE_GETOPT_H@ | ||
29 | # define _GL_SYSTEM_GETOPT | ||
30 | # @INCLUDE_NEXT@ @NEXT_GETOPT_H@ | ||
31 | # undef _GL_SYSTEM_GETOPT | ||
32 | #endif | ||
33 | |||
34 | #ifndef _GL_GETOPT_H | ||
20 | 35 | ||
21 | #ifndef __need_getopt | 36 | #ifndef __need_getopt |
22 | # define _GETOPT_H 1 | 37 | # define _GL_GETOPT_H 1 |
23 | #endif | 38 | #endif |
24 | 39 | ||
25 | /* Standalone applications should #define __GETOPT_PREFIX to an | 40 | /* Standalone applications should #define __GETOPT_PREFIX to an |
26 | identifier that prefixes the external functions and variables | 41 | identifier that prefixes the external functions and variables |
27 | defined in this header. When this happens, include the | 42 | defined in this header. When this happens, include the |
28 | headers that might declare getopt so that they will not cause | 43 | headers that might declare getopt so that they will not cause |
29 | confusion if included after this file. Then systematically rename | 44 | confusion if included after this file (if the system had <getopt.h>, |
45 | we have already included it). Then systematically rename | ||
30 | identifiers so that they do not collide with the system functions | 46 | identifiers so that they do not collide with the system functions |
31 | and variables. Renaming avoids problems with some compilers and | 47 | and variables. Renaming avoids problems with some compilers and |
32 | linkers. */ | 48 | linkers. */ |
33 | #if defined __GETOPT_PREFIX && !defined __need_getopt | 49 | #if defined __GETOPT_PREFIX && !defined __need_getopt |
34 | # include <stdlib.h> | 50 | # if !@HAVE_GETOPT_H@ |
35 | # include <stdio.h> | 51 | # include <stdlib.h> |
36 | # include <unistd.h> | 52 | # include <stdio.h> |
53 | # include <unistd.h> | ||
54 | # endif | ||
37 | # undef __need_getopt | 55 | # undef __need_getopt |
38 | # undef getopt | 56 | # undef getopt |
39 | # undef getopt_long | 57 | # undef getopt_long |
@@ -42,6 +60,7 @@ | |||
42 | # undef opterr | 60 | # undef opterr |
43 | # undef optind | 61 | # undef optind |
44 | # undef optopt | 62 | # undef optopt |
63 | # undef option | ||
45 | # define __GETOPT_CONCAT(x, y) x ## y | 64 | # define __GETOPT_CONCAT(x, y) x ## y |
46 | # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) | 65 | # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) |
47 | # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) | 66 | # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) |
@@ -52,6 +71,8 @@ | |||
52 | # define opterr __GETOPT_ID (opterr) | 71 | # define opterr __GETOPT_ID (opterr) |
53 | # define optind __GETOPT_ID (optind) | 72 | # define optind __GETOPT_ID (optind) |
54 | # define optopt __GETOPT_ID (optopt) | 73 | # define optopt __GETOPT_ID (optopt) |
74 | # define option __GETOPT_ID (option) | ||
75 | # define _getopt_internal __GETOPT_ID (getopt_internal) | ||
55 | #endif | 76 | #endif |
56 | 77 | ||
57 | /* Standalone applications get correct prototypes for getopt_long and | 78 | /* Standalone applications get correct prototypes for getopt_long and |
@@ -94,12 +115,14 @@ | |||
94 | # define __GNUC_PREREQ(maj, min) (0) | 115 | # define __GNUC_PREREQ(maj, min) (0) |
95 | # endif | 116 | # endif |
96 | # if defined __cplusplus && __GNUC_PREREQ (2,8) | 117 | # if defined __cplusplus && __GNUC_PREREQ (2,8) |
97 | # define __THROW throw () | 118 | # define __THROW throw () |
98 | # else | 119 | # else |
99 | # define __THROW | 120 | # define __THROW |
100 | # endif | 121 | # endif |
101 | #endif | 122 | #endif |
102 | 123 | ||
124 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
125 | |||
103 | #ifdef __cplusplus | 126 | #ifdef __cplusplus |
104 | extern "C" { | 127 | extern "C" { |
105 | #endif | 128 | #endif |
@@ -142,9 +165,9 @@ extern int optopt; | |||
142 | zero. | 165 | zero. |
143 | 166 | ||
144 | The field `has_arg' is: | 167 | The field `has_arg' is: |
145 | no_argument (or 0) if the option does not take an argument, | 168 | no_argument (or 0) if the option does not take an argument, |
146 | required_argument (or 1) if the option requires an argument, | 169 | required_argument (or 1) if the option requires an argument, |
147 | optional_argument (or 2) if the option takes an optional argument. | 170 | optional_argument (or 2) if the option takes an optional argument. |
148 | 171 | ||
149 | If the field `flag' is not NULL, it points to a variable that is set | 172 | If the field `flag' is not NULL, it points to a variable that is set |
150 | to the value given in the field `val' when the option is found, but | 173 | to the value given in the field `val' when the option is found, but |
@@ -169,10 +192,10 @@ struct option | |||
169 | 192 | ||
170 | /* Names for the values of the `has_arg' field of `struct option'. */ | 193 | /* Names for the values of the `has_arg' field of `struct option'. */ |
171 | 194 | ||
172 | # define no_argument 0 | 195 | # define no_argument 0 |
173 | # define required_argument 1 | 196 | # define required_argument 1 |
174 | # define optional_argument 2 | 197 | # define optional_argument 2 |
175 | #endif /* need getopt */ | 198 | #endif /* need getopt */ |
176 | 199 | ||
177 | 200 | ||
178 | /* Get definitions and prototypes for functions to process the | 201 | /* Get definitions and prototypes for functions to process the |
@@ -201,17 +224,17 @@ struct option | |||
201 | the environment, then do not permute arguments. */ | 224 | the environment, then do not permute arguments. */ |
202 | 225 | ||
203 | extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) | 226 | extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) |
204 | __THROW; | 227 | __THROW _GL_ARG_NONNULL ((2, 3)); |
205 | 228 | ||
206 | #ifndef __need_getopt | 229 | #ifndef __need_getopt |
207 | extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, | 230 | extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, |
208 | const char *__shortopts, | 231 | const char *__shortopts, |
209 | const struct option *__longopts, int *__longind) | 232 | const struct option *__longopts, int *__longind) |
210 | __THROW; | 233 | __THROW _GL_ARG_NONNULL ((2, 3)); |
211 | extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, | 234 | extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, |
212 | const char *__shortopts, | 235 | const char *__shortopts, |
213 | const struct option *__longopts, int *__longind) | 236 | const struct option *__longopts, int *__longind) |
214 | __THROW; | 237 | __THROW _GL_ARG_NONNULL ((2, 3)); |
215 | 238 | ||
216 | #endif | 239 | #endif |
217 | 240 | ||
@@ -223,3 +246,4 @@ extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, | |||
223 | #undef __need_getopt | 246 | #undef __need_getopt |
224 | 247 | ||
225 | #endif /* getopt.h */ | 248 | #endif /* getopt.h */ |
249 | #endif /* getopt.h */ | ||
diff --git a/gl/getopt1.c b/gl/getopt1.c index ba115c47..046d69f9 100644 --- a/gl/getopt1.c +++ b/gl/getopt1.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* getopt_long and getopt_long_only entry points for GNU getopt. | 1 | /* getopt_long and getopt_long_only entry points for GNU getopt. |
2 | Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004,2006,2009 | 2 | Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, |
3 | Free Software Foundation, Inc. | 3 | 1998, 2004, 2006, 2009, 2010 Free Software Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
@@ -32,25 +32,25 @@ | |||
32 | #include <stdlib.h> | 32 | #include <stdlib.h> |
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | #ifndef NULL | 35 | #ifndef NULL |
36 | #define NULL 0 | 36 | #define NULL 0 |
37 | #endif | 37 | #endif |
38 | 38 | ||
39 | int | 39 | int |
40 | getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, | 40 | getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, |
41 | const struct option *long_options, int *opt_index) | 41 | const struct option *long_options, int *opt_index) |
42 | { | 42 | { |
43 | return _getopt_internal (argc, (char **) argv, options, long_options, | 43 | return _getopt_internal (argc, (char **) argv, options, long_options, |
44 | opt_index, 0, 0); | 44 | opt_index, 0, 0); |
45 | } | 45 | } |
46 | 46 | ||
47 | int | 47 | int |
48 | _getopt_long_r (int argc, char **argv, const char *options, | 48 | _getopt_long_r (int argc, char **argv, const char *options, |
49 | const struct option *long_options, int *opt_index, | 49 | const struct option *long_options, int *opt_index, |
50 | struct _getopt_data *d) | 50 | struct _getopt_data *d) |
51 | { | 51 | { |
52 | return _getopt_internal_r (argc, argv, options, long_options, opt_index, | 52 | return _getopt_internal_r (argc, argv, options, long_options, opt_index, |
53 | 0, 0, d); | 53 | 0, d, 0); |
54 | } | 54 | } |
55 | 55 | ||
56 | /* Like getopt_long, but '-' as well as '--' can indicate a long option. | 56 | /* Like getopt_long, but '-' as well as '--' can indicate a long option. |
@@ -60,20 +60,20 @@ _getopt_long_r (int argc, char **argv, const char *options, | |||
60 | 60 | ||
61 | int | 61 | int |
62 | getopt_long_only (int argc, char *__getopt_argv_const *argv, | 62 | getopt_long_only (int argc, char *__getopt_argv_const *argv, |
63 | const char *options, | 63 | const char *options, |
64 | const struct option *long_options, int *opt_index) | 64 | const struct option *long_options, int *opt_index) |
65 | { | 65 | { |
66 | return _getopt_internal (argc, (char **) argv, options, long_options, | 66 | return _getopt_internal (argc, (char **) argv, options, long_options, |
67 | opt_index, 1, 0); | 67 | opt_index, 1, 0); |
68 | } | 68 | } |
69 | 69 | ||
70 | int | 70 | int |
71 | _getopt_long_only_r (int argc, char **argv, const char *options, | 71 | _getopt_long_only_r (int argc, char **argv, const char *options, |
72 | const struct option *long_options, int *opt_index, | 72 | const struct option *long_options, int *opt_index, |
73 | struct _getopt_data *d) | 73 | struct _getopt_data *d) |
74 | { | 74 | { |
75 | return _getopt_internal_r (argc, argv, options, long_options, opt_index, | 75 | return _getopt_internal_r (argc, argv, options, long_options, opt_index, |
76 | 1, 0, d); | 76 | 1, d, 0); |
77 | } | 77 | } |
78 | 78 | ||
79 | 79 | ||
@@ -93,74 +93,74 @@ main (int argc, char **argv) | |||
93 | int option_index = 0; | 93 | int option_index = 0; |
94 | static const struct option long_options[] = | 94 | static const struct option long_options[] = |
95 | { | 95 | { |
96 | {"add", 1, 0, 0}, | 96 | {"add", 1, 0, 0}, |
97 | {"append", 0, 0, 0}, | 97 | {"append", 0, 0, 0}, |
98 | {"delete", 1, 0, 0}, | 98 | {"delete", 1, 0, 0}, |
99 | {"verbose", 0, 0, 0}, | 99 | {"verbose", 0, 0, 0}, |
100 | {"create", 0, 0, 0}, | 100 | {"create", 0, 0, 0}, |
101 | {"file", 1, 0, 0}, | 101 | {"file", 1, 0, 0}, |
102 | {0, 0, 0, 0} | 102 | {0, 0, 0, 0} |
103 | }; | 103 | }; |
104 | 104 | ||
105 | c = getopt_long (argc, argv, "abc:d:0123456789", | 105 | c = getopt_long (argc, argv, "abc:d:0123456789", |
106 | long_options, &option_index); | 106 | long_options, &option_index); |
107 | if (c == -1) | 107 | if (c == -1) |
108 | break; | 108 | break; |
109 | 109 | ||
110 | switch (c) | 110 | switch (c) |
111 | { | 111 | { |
112 | case 0: | 112 | case 0: |
113 | printf ("option %s", long_options[option_index].name); | 113 | printf ("option %s", long_options[option_index].name); |
114 | if (optarg) | 114 | if (optarg) |
115 | printf (" with arg %s", optarg); | 115 | printf (" with arg %s", optarg); |
116 | printf ("\n"); | 116 | printf ("\n"); |
117 | break; | 117 | break; |
118 | 118 | ||
119 | case '0': | 119 | case '0': |
120 | case '1': | 120 | case '1': |
121 | case '2': | 121 | case '2': |
122 | case '3': | 122 | case '3': |
123 | case '4': | 123 | case '4': |
124 | case '5': | 124 | case '5': |
125 | case '6': | 125 | case '6': |
126 | case '7': | 126 | case '7': |
127 | case '8': | 127 | case '8': |
128 | case '9': | 128 | case '9': |
129 | if (digit_optind != 0 && digit_optind != this_option_optind) | 129 | if (digit_optind != 0 && digit_optind != this_option_optind) |
130 | printf ("digits occur in two different argv-elements.\n"); | 130 | printf ("digits occur in two different argv-elements.\n"); |
131 | digit_optind = this_option_optind; | 131 | digit_optind = this_option_optind; |
132 | printf ("option %c\n", c); | 132 | printf ("option %c\n", c); |
133 | break; | 133 | break; |
134 | 134 | ||
135 | case 'a': | 135 | case 'a': |
136 | printf ("option a\n"); | 136 | printf ("option a\n"); |
137 | break; | 137 | break; |
138 | 138 | ||
139 | case 'b': | 139 | case 'b': |
140 | printf ("option b\n"); | 140 | printf ("option b\n"); |
141 | break; | 141 | break; |
142 | 142 | ||
143 | case 'c': | 143 | case 'c': |
144 | printf ("option c with value `%s'\n", optarg); | 144 | printf ("option c with value `%s'\n", optarg); |
145 | break; | 145 | break; |
146 | 146 | ||
147 | case 'd': | 147 | case 'd': |
148 | printf ("option d with value `%s'\n", optarg); | 148 | printf ("option d with value `%s'\n", optarg); |
149 | break; | 149 | break; |
150 | 150 | ||
151 | case '?': | 151 | case '?': |
152 | break; | 152 | break; |
153 | 153 | ||
154 | default: | 154 | default: |
155 | printf ("?? getopt returned character code 0%o ??\n", c); | 155 | printf ("?? getopt returned character code 0%o ??\n", c); |
156 | } | 156 | } |
157 | } | 157 | } |
158 | 158 | ||
159 | if (optind < argc) | 159 | if (optind < argc) |
160 | { | 160 | { |
161 | printf ("non-option ARGV-elements: "); | 161 | printf ("non-option ARGV-elements: "); |
162 | while (optind < argc) | 162 | while (optind < argc) |
163 | printf ("%s ", argv[optind++]); | 163 | printf ("%s ", argv[optind++]); |
164 | printf ("\n"); | 164 | printf ("\n"); |
165 | } | 165 | } |
166 | 166 | ||
diff --git a/gl/getopt_int.h b/gl/getopt_int.h index 3c6628bb..169def5b 100644 --- a/gl/getopt_int.h +++ b/gl/getopt_int.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Internal declarations for getopt. | 1 | /* Internal declarations for getopt. |
2 | Copyright (C) 1989-1994,1996-1999,2001,2003,2004 | 2 | Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2010 Free Software |
3 | Free Software Foundation, Inc. | 3 | Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
@@ -17,12 +17,14 @@ | |||
17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
18 | 18 | ||
19 | #ifndef _GETOPT_INT_H | 19 | #ifndef _GETOPT_INT_H |
20 | #define _GETOPT_INT_H 1 | 20 | #define _GETOPT_INT_H 1 |
21 | |||
22 | #include <getopt.h> | ||
21 | 23 | ||
22 | extern int _getopt_internal (int ___argc, char **___argv, | 24 | extern int _getopt_internal (int ___argc, char **___argv, |
23 | const char *__shortopts, | 25 | const char *__shortopts, |
24 | const struct option *__longopts, int *__longind, | 26 | const struct option *__longopts, int *__longind, |
25 | int __long_only, int __posixly_correct); | 27 | int __long_only, int __posixly_correct); |
26 | 28 | ||
27 | 29 | ||
28 | /* Reentrant versions which can handle parsing multiple argument | 30 | /* Reentrant versions which can handle parsing multiple argument |
@@ -108,23 +110,23 @@ struct _getopt_data | |||
108 | 110 | ||
109 | /* The initializer is necessary to set OPTIND and OPTERR to their | 111 | /* The initializer is necessary to set OPTIND and OPTERR to their |
110 | default values and to clear the initialization flag. */ | 112 | default values and to clear the initialization flag. */ |
111 | #define _GETOPT_DATA_INITIALIZER { 1, 1 } | 113 | #define _GETOPT_DATA_INITIALIZER { 1, 1 } |
112 | 114 | ||
113 | extern int _getopt_internal_r (int ___argc, char **___argv, | 115 | extern int _getopt_internal_r (int ___argc, char **___argv, |
114 | const char *__shortopts, | 116 | const char *__shortopts, |
115 | const struct option *__longopts, int *__longind, | 117 | const struct option *__longopts, int *__longind, |
116 | int __long_only, int __posixly_correct, | 118 | int __long_only, struct _getopt_data *__data, |
117 | struct _getopt_data *__data); | 119 | int __posixly_correct); |
118 | 120 | ||
119 | extern int _getopt_long_r (int ___argc, char **___argv, | 121 | extern int _getopt_long_r (int ___argc, char **___argv, |
120 | const char *__shortopts, | 122 | const char *__shortopts, |
121 | const struct option *__longopts, int *__longind, | 123 | const struct option *__longopts, int *__longind, |
122 | struct _getopt_data *__data); | 124 | struct _getopt_data *__data); |
123 | 125 | ||
124 | extern int _getopt_long_only_r (int ___argc, char **___argv, | 126 | extern int _getopt_long_only_r (int ___argc, char **___argv, |
125 | const char *__shortopts, | 127 | const char *__shortopts, |
126 | const struct option *__longopts, | 128 | const struct option *__longopts, |
127 | int *__longind, | 129 | int *__longind, |
128 | struct _getopt_data *__data); | 130 | struct _getopt_data *__data); |
129 | 131 | ||
130 | #endif /* getopt_int.h */ | 132 | #endif /* getopt_int.h */ |
diff --git a/gl/gettext.h b/gl/gettext.h index 8cf2dca0..881ae330 100644 --- a/gl/gettext.h +++ b/gl/gettext.h | |||
@@ -1,5 +1,6 @@ | |||
1 | /* Convenience header for conditional use of GNU <libintl.h>. | 1 | /* Convenience header for conditional use of GNU <libintl.h>. |
2 | Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009 Free Software Foundation, Inc. | 2 | Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2010 Free Software |
3 | Foundation, Inc. | ||
3 | 4 | ||
4 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -80,7 +81,7 @@ | |||
80 | ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) | 81 | ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) |
81 | # undef dcngettext | 82 | # undef dcngettext |
82 | # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ | 83 | # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ |
83 | ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) | 84 | ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) |
84 | # undef textdomain | 85 | # undef textdomain |
85 | # define textdomain(Domainname) ((const char *) (Domainname)) | 86 | # define textdomain(Domainname) ((const char *) (Domainname)) |
86 | # undef bindtextdomain | 87 | # undef bindtextdomain |
@@ -140,8 +141,8 @@ inline | |||
140 | #endif | 141 | #endif |
141 | static const char * | 142 | static const char * |
142 | pgettext_aux (const char *domain, | 143 | pgettext_aux (const char *domain, |
143 | const char *msg_ctxt_id, const char *msgid, | 144 | const char *msg_ctxt_id, const char *msgid, |
144 | int category) | 145 | int category) |
145 | { | 146 | { |
146 | const char *translation = dcgettext (domain, msg_ctxt_id, category); | 147 | const char *translation = dcgettext (domain, msg_ctxt_id, category); |
147 | if (translation == msg_ctxt_id) | 148 | if (translation == msg_ctxt_id) |
@@ -159,9 +160,9 @@ inline | |||
159 | #endif | 160 | #endif |
160 | static const char * | 161 | static const char * |
161 | npgettext_aux (const char *domain, | 162 | npgettext_aux (const char *domain, |
162 | const char *msg_ctxt_id, const char *msgid, | 163 | const char *msg_ctxt_id, const char *msgid, |
163 | const char *msgid_plural, unsigned long int n, | 164 | const char *msgid_plural, unsigned long int n, |
164 | int category) | 165 | int category) |
165 | { | 166 | { |
166 | const char *translation = | 167 | const char *translation = |
167 | dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); | 168 | dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); |
@@ -199,8 +200,8 @@ inline | |||
199 | #endif | 200 | #endif |
200 | static const char * | 201 | static const char * |
201 | dcpgettext_expr (const char *domain, | 202 | dcpgettext_expr (const char *domain, |
202 | const char *msgctxt, const char *msgid, | 203 | const char *msgctxt, const char *msgid, |
203 | int category) | 204 | int category) |
204 | { | 205 | { |
205 | size_t msgctxt_len = strlen (msgctxt) + 1; | 206 | size_t msgctxt_len = strlen (msgctxt) + 1; |
206 | size_t msgid_len = strlen (msgid) + 1; | 207 | size_t msgid_len = strlen (msgid) + 1; |
@@ -222,10 +223,10 @@ dcpgettext_expr (const char *domain, | |||
222 | translation = dcgettext (domain, msg_ctxt_id, category); | 223 | translation = dcgettext (domain, msg_ctxt_id, category); |
223 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 224 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS |
224 | if (msg_ctxt_id != buf) | 225 | if (msg_ctxt_id != buf) |
225 | free (msg_ctxt_id); | 226 | free (msg_ctxt_id); |
226 | #endif | 227 | #endif |
227 | if (translation != msg_ctxt_id) | 228 | if (translation != msg_ctxt_id) |
228 | return translation; | 229 | return translation; |
229 | } | 230 | } |
230 | return msgid; | 231 | return msgid; |
231 | } | 232 | } |
@@ -244,9 +245,9 @@ inline | |||
244 | #endif | 245 | #endif |
245 | static const char * | 246 | static const char * |
246 | dcnpgettext_expr (const char *domain, | 247 | dcnpgettext_expr (const char *domain, |
247 | const char *msgctxt, const char *msgid, | 248 | const char *msgctxt, const char *msgid, |
248 | const char *msgid_plural, unsigned long int n, | 249 | const char *msgid_plural, unsigned long int n, |
249 | int category) | 250 | int category) |
250 | { | 251 | { |
251 | size_t msgctxt_len = strlen (msgctxt) + 1; | 252 | size_t msgctxt_len = strlen (msgctxt) + 1; |
252 | size_t msgid_len = strlen (msgid) + 1; | 253 | size_t msgid_len = strlen (msgid) + 1; |
@@ -268,10 +269,10 @@ dcnpgettext_expr (const char *domain, | |||
268 | translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); | 269 | translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); |
269 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 270 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS |
270 | if (msg_ctxt_id != buf) | 271 | if (msg_ctxt_id != buf) |
271 | free (msg_ctxt_id); | 272 | free (msg_ctxt_id); |
272 | #endif | 273 | #endif |
273 | if (!(translation == msg_ctxt_id || translation == msgid_plural)) | 274 | if (!(translation == msg_ctxt_id || translation == msgid_plural)) |
274 | return translation; | 275 | return translation; |
275 | } | 276 | } |
276 | return (n == 1 ? msgid : msgid_plural); | 277 | return (n == 1 ? msgid : msgid_plural); |
277 | } | 278 | } |
diff --git a/gl/inet_ntop.c b/gl/inet_ntop.c index be091ff9..baaa23f8 100644 --- a/gl/inet_ntop.c +++ b/gl/inet_ntop.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form | 1 | /* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form |
2 | 2 | ||
3 | Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2008-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -42,10 +42,6 @@ | |||
42 | #include <string.h> | 42 | #include <string.h> |
43 | #include <errno.h> | 43 | #include <errno.h> |
44 | 44 | ||
45 | #ifndef EAFNOSUPPORT | ||
46 | # define EAFNOSUPPORT EINVAL | ||
47 | #endif | ||
48 | |||
49 | #define NS_IN6ADDRSZ 16 | 45 | #define NS_IN6ADDRSZ 16 |
50 | #define NS_INT16SZ 2 | 46 | #define NS_INT16SZ 2 |
51 | 47 | ||
@@ -63,15 +59,15 @@ static const char *inet_ntop6 (const unsigned char *src, char *dst, socklen_t si | |||
63 | 59 | ||
64 | /* char * | 60 | /* char * |
65 | * inet_ntop(af, src, dst, size) | 61 | * inet_ntop(af, src, dst, size) |
66 | * convert a network format address to presentation format. | 62 | * convert a network format address to presentation format. |
67 | * return: | 63 | * return: |
68 | * pointer to presentation format address (`dst'), or NULL (see errno). | 64 | * pointer to presentation format address (`dst'), or NULL (see errno). |
69 | * author: | 65 | * author: |
70 | * Paul Vixie, 1996. | 66 | * Paul Vixie, 1996. |
71 | */ | 67 | */ |
72 | const char * | 68 | const char * |
73 | inet_ntop (int af, const void *restrict src, | 69 | inet_ntop (int af, const void *restrict src, |
74 | char *restrict dst, socklen_t cnt) | 70 | char *restrict dst, socklen_t cnt) |
75 | { | 71 | { |
76 | switch (af) | 72 | switch (af) |
77 | { | 73 | { |
@@ -94,14 +90,14 @@ inet_ntop (int af, const void *restrict src, | |||
94 | 90 | ||
95 | /* const char * | 91 | /* const char * |
96 | * inet_ntop4(src, dst, size) | 92 | * inet_ntop4(src, dst, size) |
97 | * format an IPv4 address | 93 | * format an IPv4 address |
98 | * return: | 94 | * return: |
99 | * `dst' (as a const) | 95 | * `dst' (as a const) |
100 | * notes: | 96 | * notes: |
101 | * (1) uses no statics | 97 | * (1) uses no statics |
102 | * (2) takes a u_char* not an in_addr as input | 98 | * (2) takes a u_char* not an in_addr as input |
103 | * author: | 99 | * author: |
104 | * Paul Vixie, 1996. | 100 | * Paul Vixie, 1996. |
105 | */ | 101 | */ |
106 | static const char * | 102 | static const char * |
107 | inet_ntop4 (const unsigned char *src, char *dst, socklen_t size) | 103 | inet_ntop4 (const unsigned char *src, char *dst, socklen_t size) |
@@ -126,9 +122,9 @@ inet_ntop4 (const unsigned char *src, char *dst, socklen_t size) | |||
126 | 122 | ||
127 | /* const char * | 123 | /* const char * |
128 | * inet_ntop6(src, dst, size) | 124 | * inet_ntop6(src, dst, size) |
129 | * convert IPv6 binary address into presentation (printable) format | 125 | * convert IPv6 binary address into presentation (printable) format |
130 | * author: | 126 | * author: |
131 | * Paul Vixie, 1996. | 127 | * Paul Vixie, 1996. |
132 | */ | 128 | */ |
133 | static const char * | 129 | static const char * |
134 | inet_ntop6 (const unsigned char *src, char *dst, socklen_t size) | 130 | inet_ntop6 (const unsigned char *src, char *dst, socklen_t size) |
@@ -161,26 +157,26 @@ inet_ntop6 (const unsigned char *src, char *dst, socklen_t size) | |||
161 | for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | 157 | for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) |
162 | { | 158 | { |
163 | if (words[i] == 0) | 159 | if (words[i] == 0) |
164 | { | 160 | { |
165 | if (cur.base == -1) | 161 | if (cur.base == -1) |
166 | cur.base = i, cur.len = 1; | 162 | cur.base = i, cur.len = 1; |
167 | else | 163 | else |
168 | cur.len++; | 164 | cur.len++; |
169 | } | 165 | } |
170 | else | 166 | else |
171 | { | 167 | { |
172 | if (cur.base != -1) | 168 | if (cur.base != -1) |
173 | { | 169 | { |
174 | if (best.base == -1 || cur.len > best.len) | 170 | if (best.base == -1 || cur.len > best.len) |
175 | best = cur; | 171 | best = cur; |
176 | cur.base = -1; | 172 | cur.base = -1; |
177 | } | 173 | } |
178 | } | 174 | } |
179 | } | 175 | } |
180 | if (cur.base != -1) | 176 | if (cur.base != -1) |
181 | { | 177 | { |
182 | if (best.base == -1 || cur.len > best.len) | 178 | if (best.base == -1 || cur.len > best.len) |
183 | best = cur; | 179 | best = cur; |
184 | } | 180 | } |
185 | if (best.base != -1 && best.len < 2) | 181 | if (best.base != -1 && best.len < 2) |
186 | best.base = -1; | 182 | best.base = -1; |
@@ -193,28 +189,28 @@ inet_ntop6 (const unsigned char *src, char *dst, socklen_t size) | |||
193 | { | 189 | { |
194 | /* Are we inside the best run of 0x00's? */ | 190 | /* Are we inside the best run of 0x00's? */ |
195 | if (best.base != -1 && i >= best.base && i < (best.base + best.len)) | 191 | if (best.base != -1 && i >= best.base && i < (best.base + best.len)) |
196 | { | 192 | { |
197 | if (i == best.base) | 193 | if (i == best.base) |
198 | *tp++ = ':'; | 194 | *tp++ = ':'; |
199 | continue; | 195 | continue; |
200 | } | 196 | } |
201 | /* Are we following an initial run of 0x00s or any real hex? */ | 197 | /* Are we following an initial run of 0x00s or any real hex? */ |
202 | if (i != 0) | 198 | if (i != 0) |
203 | *tp++ = ':'; | 199 | *tp++ = ':'; |
204 | /* Is this address an encapsulated IPv4? */ | 200 | /* Is this address an encapsulated IPv4? */ |
205 | if (i == 6 && best.base == 0 && | 201 | if (i == 6 && best.base == 0 && |
206 | (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) | 202 | (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) |
207 | { | 203 | { |
208 | if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp))) | 204 | if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp))) |
209 | return (NULL); | 205 | return (NULL); |
210 | tp += strlen (tp); | 206 | tp += strlen (tp); |
211 | break; | 207 | break; |
212 | } | 208 | } |
213 | { | 209 | { |
214 | int len = sprintf (tp, "%x", words[i]); | 210 | int len = sprintf (tp, "%x", words[i]); |
215 | if (len < 0) | 211 | if (len < 0) |
216 | return NULL; | 212 | return NULL; |
217 | tp += len; | 213 | tp += len; |
218 | } | 214 | } |
219 | } | 215 | } |
220 | /* Was it a trailing run of 0x00's? */ | 216 | /* Was it a trailing run of 0x00's? */ |
diff --git a/gl/intprops.h b/gl/intprops.h index 002161ee..46f4d47d 100644 --- a/gl/intprops.h +++ b/gl/intprops.h | |||
@@ -1,6 +1,7 @@ | |||
1 | /* intprops.h -- properties of integer types | 1 | /* intprops.h -- properties of integer types |
2 | 2 | ||
3 | Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | 3 | Copyright (C) 2001, 2002, 2003, 2004, 2005, 2009, 2010 Free Software |
4 | Foundation, Inc. | ||
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -17,40 +18,43 @@ | |||
17 | 18 | ||
18 | /* Written by Paul Eggert. */ | 19 | /* Written by Paul Eggert. */ |
19 | 20 | ||
20 | #include <limits.h> | 21 | #ifndef GL_INTPROPS_H |
22 | # define GL_INTPROPS_H | ||
23 | |||
24 | # include <limits.h> | ||
21 | 25 | ||
22 | /* The extra casts in the following macros work around compiler bugs, | 26 | /* The extra casts in the following macros work around compiler bugs, |
23 | e.g., in Cray C 5.0.3.0. */ | 27 | e.g., in Cray C 5.0.3.0. */ |
24 | 28 | ||
25 | /* True if the arithmetic type T is an integer type. bool counts as | 29 | /* True if the arithmetic type T is an integer type. bool counts as |
26 | an integer. */ | 30 | an integer. */ |
27 | #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) | 31 | # define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) |
28 | 32 | ||
29 | /* True if negative values of the signed integer type T use two's | 33 | /* True if negative values of the signed integer type T use two's |
30 | complement, ones' complement, or signed magnitude representation, | 34 | complement, ones' complement, or signed magnitude representation, |
31 | respectively. Much GNU code assumes two's complement, but some | 35 | respectively. Much GNU code assumes two's complement, but some |
32 | people like to be portable to all possible C hosts. */ | 36 | people like to be portable to all possible C hosts. */ |
33 | #define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) | 37 | # define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) |
34 | #define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) | 38 | # define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) |
35 | #define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) | 39 | # define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) |
36 | 40 | ||
37 | /* True if the arithmetic type T is signed. */ | 41 | /* True if the arithmetic type T is signed. */ |
38 | #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) | 42 | # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) |
39 | 43 | ||
40 | /* The maximum and minimum values for the integer type T. These | 44 | /* The maximum and minimum values for the integer type T. These |
41 | macros have undefined behavior if T is signed and has padding bits. | 45 | macros have undefined behavior if T is signed and has padding bits. |
42 | If this is a problem for you, please let us know how to fix it for | 46 | If this is a problem for you, please let us know how to fix it for |
43 | your host. */ | 47 | your host. */ |
44 | #define TYPE_MINIMUM(t) \ | 48 | # define TYPE_MINIMUM(t) \ |
45 | ((t) (! TYPE_SIGNED (t) \ | 49 | ((t) (! TYPE_SIGNED (t) \ |
46 | ? (t) 0 \ | 50 | ? (t) 0 \ |
47 | : TYPE_SIGNED_MAGNITUDE (t) \ | 51 | : TYPE_SIGNED_MAGNITUDE (t) \ |
48 | ? ~ (t) 0 \ | 52 | ? ~ (t) 0 \ |
49 | : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) | 53 | : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) |
50 | #define TYPE_MAXIMUM(t) \ | 54 | # define TYPE_MAXIMUM(t) \ |
51 | ((t) (! TYPE_SIGNED (t) \ | 55 | ((t) (! TYPE_SIGNED (t) \ |
52 | ? (t) -1 \ | 56 | ? (t) -1 \ |
53 | : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) | 57 | : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) |
54 | 58 | ||
55 | /* Return zero if T can be determined to be an unsigned type. | 59 | /* Return zero if T can be determined to be an unsigned type. |
56 | Otherwise, return 1. | 60 | Otherwise, return 1. |
@@ -58,20 +62,22 @@ | |||
58 | tighter bound. Otherwise, it overestimates the true bound by one byte | 62 | tighter bound. Otherwise, it overestimates the true bound by one byte |
59 | when applied to unsigned types of size 2, 4, 16, ... bytes. | 63 | when applied to unsigned types of size 2, 4, 16, ... bytes. |
60 | The symbol signed_type_or_expr__ is private to this header file. */ | 64 | The symbol signed_type_or_expr__ is private to this header file. */ |
61 | #if __GNUC__ >= 2 | 65 | # if __GNUC__ >= 2 |
62 | # define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t)) | 66 | # define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t)) |
63 | #else | 67 | # else |
64 | # define signed_type_or_expr__(t) 1 | 68 | # define signed_type_or_expr__(t) 1 |
65 | #endif | 69 | # endif |
66 | 70 | ||
67 | /* Bound on length of the string representing an integer type or expression T. | 71 | /* Bound on length of the string representing an integer type or expression T. |
68 | Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485; | 72 | Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485; |
69 | add 1 for integer division truncation; add 1 more for a minus sign | 73 | add 1 for integer division truncation; add 1 more for a minus sign |
70 | if needed. */ | 74 | if needed. */ |
71 | #define INT_STRLEN_BOUND(t) \ | 75 | # define INT_STRLEN_BOUND(t) \ |
72 | ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \ | 76 | ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \ |
73 | + signed_type_or_expr__ (t) + 1) | 77 | + signed_type_or_expr__ (t) + 1) |
74 | 78 | ||
75 | /* Bound on buffer size needed to represent an integer type or expression T, | 79 | /* Bound on buffer size needed to represent an integer type or expression T, |
76 | including the terminating null. */ | 80 | including the terminating null. */ |
77 | #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) | 81 | # define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) |
82 | |||
83 | #endif /* GL_INTPROPS_H */ | ||
diff --git a/gl/langinfo.in.h b/gl/langinfo.in.h new file mode 100644 index 00000000..0865d96c --- /dev/null +++ b/gl/langinfo.in.h | |||
@@ -0,0 +1,162 @@ | |||
1 | /* Substitute for and wrapper around <langinfo.h>. | ||
2 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 3, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program; if not, write to the Free Software Foundation, | ||
16 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
17 | |||
18 | /* | ||
19 | * POSIX <langinfo.h> for platforms that lack it or have an incomplete one. | ||
20 | * <http://www.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html> | ||
21 | */ | ||
22 | |||
23 | #ifndef _GL_LANGINFO_H | ||
24 | |||
25 | #if __GNUC__ >= 3 | ||
26 | @PRAGMA_SYSTEM_HEADER@ | ||
27 | #endif | ||
28 | |||
29 | /* The include_next requires a split double-inclusion guard. */ | ||
30 | #if @HAVE_LANGINFO_H@ | ||
31 | # @INCLUDE_NEXT@ @NEXT_LANGINFO_H@ | ||
32 | #endif | ||
33 | |||
34 | #ifndef _GL_LANGINFO_H | ||
35 | #define _GL_LANGINFO_H | ||
36 | |||
37 | |||
38 | #if !@HAVE_LANGINFO_H@ | ||
39 | |||
40 | /* A platform that lacks <langinfo.h>. */ | ||
41 | |||
42 | /* Assume that it also lacks <nl_types.h> and the nl_item type. */ | ||
43 | typedef int nl_item; | ||
44 | |||
45 | /* nl_langinfo items of the LC_CTYPE category */ | ||
46 | # define CODESET 10000 | ||
47 | /* nl_langinfo items of the LC_NUMERIC category */ | ||
48 | # define RADIXCHAR 10001 | ||
49 | # define THOUSEP 10002 | ||
50 | /* nl_langinfo items of the LC_TIME category */ | ||
51 | # define D_T_FMT 10003 | ||
52 | # define D_FMT 10004 | ||
53 | # define T_FMT 10005 | ||
54 | # define T_FMT_AMPM 10006 | ||
55 | # define AM_STR 10007 | ||
56 | # define PM_STR 10008 | ||
57 | # define DAY_1 10009 | ||
58 | # define DAY_2 (DAY_1 + 1) | ||
59 | # define DAY_3 (DAY_1 + 2) | ||
60 | # define DAY_4 (DAY_1 + 3) | ||
61 | # define DAY_5 (DAY_1 + 4) | ||
62 | # define DAY_6 (DAY_1 + 5) | ||
63 | # define DAY_7 (DAY_1 + 6) | ||
64 | # define ABDAY_1 10016 | ||
65 | # define ABDAY_2 (ABDAY_1 + 1) | ||
66 | # define ABDAY_3 (ABDAY_1 + 2) | ||
67 | # define ABDAY_4 (ABDAY_1 + 3) | ||
68 | # define ABDAY_5 (ABDAY_1 + 4) | ||
69 | # define ABDAY_6 (ABDAY_1 + 5) | ||
70 | # define ABDAY_7 (ABDAY_1 + 6) | ||
71 | # define MON_1 10023 | ||
72 | # define MON_2 (MON_1 + 1) | ||
73 | # define MON_3 (MON_1 + 2) | ||
74 | # define MON_4 (MON_1 + 3) | ||
75 | # define MON_5 (MON_1 + 4) | ||
76 | # define MON_6 (MON_1 + 5) | ||
77 | # define MON_7 (MON_1 + 6) | ||
78 | # define MON_8 (MON_1 + 7) | ||
79 | # define MON_9 (MON_1 + 8) | ||
80 | # define MON_10 (MON_1 + 9) | ||
81 | # define MON_11 (MON_1 + 10) | ||
82 | # define MON_12 (MON_1 + 11) | ||
83 | # define ABMON_1 10035 | ||
84 | # define ABMON_2 (ABMON_1 + 1) | ||
85 | # define ABMON_3 (ABMON_1 + 2) | ||
86 | # define ABMON_4 (ABMON_1 + 3) | ||
87 | # define ABMON_5 (ABMON_1 + 4) | ||
88 | # define ABMON_6 (ABMON_1 + 5) | ||
89 | # define ABMON_7 (ABMON_1 + 6) | ||
90 | # define ABMON_8 (ABMON_1 + 7) | ||
91 | # define ABMON_9 (ABMON_1 + 8) | ||
92 | # define ABMON_10 (ABMON_1 + 9) | ||
93 | # define ABMON_11 (ABMON_1 + 10) | ||
94 | # define ABMON_12 (ABMON_1 + 11) | ||
95 | # define ERA 10047 | ||
96 | # define ERA_D_FMT 10048 | ||
97 | # define ERA_D_T_FMT 10049 | ||
98 | # define ERA_T_FMT 10050 | ||
99 | # define ALT_DIGITS 10051 | ||
100 | /* nl_langinfo items of the LC_MONETARY category */ | ||
101 | # define CRNCYSTR 10052 | ||
102 | /* nl_langinfo items of the LC_MESSAGES category */ | ||
103 | # define YESEXPR 10053 | ||
104 | # define NOEXPR 10054 | ||
105 | |||
106 | #else | ||
107 | |||
108 | /* A platform that has <langinfo.h>. */ | ||
109 | |||
110 | # if !@HAVE_LANGINFO_CODESET@ | ||
111 | # define CODESET 10000 | ||
112 | # define GNULIB_defined_CODESET 1 | ||
113 | # endif | ||
114 | |||
115 | # if !@HAVE_LANGINFO_ERA@ | ||
116 | # define ERA 10047 | ||
117 | # define ERA_D_FMT 10048 | ||
118 | # define ERA_D_T_FMT 10049 | ||
119 | # define ERA_T_FMT 10050 | ||
120 | # define ALT_DIGITS 10051 | ||
121 | # define GNULIB_defined_ERA 1 | ||
122 | # endif | ||
123 | |||
124 | #endif | ||
125 | |||
126 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
127 | |||
128 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
129 | |||
130 | /* Declare overridden functions. */ | ||
131 | |||
132 | |||
133 | /* Return a piece of locale dependent information. | ||
134 | Note: The difference between nl_langinfo (CODESET) and locale_charset () | ||
135 | is that the latter normalizes the encoding names to GNU conventions. */ | ||
136 | |||
137 | #if @GNULIB_NL_LANGINFO@ | ||
138 | # if @REPLACE_NL_LANGINFO@ | ||
139 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
140 | # undef nl_langinfo | ||
141 | # define nl_langinfo rpl_nl_langinfo | ||
142 | # endif | ||
143 | _GL_FUNCDECL_RPL (nl_langinfo, char *, (nl_item item)); | ||
144 | _GL_CXXALIAS_RPL (nl_langinfo, char *, (nl_item item)); | ||
145 | # else | ||
146 | # if !@HAVE_NL_LANGINFO@ | ||
147 | _GL_FUNCDECL_SYS (nl_langinfo, char *, (nl_item item)); | ||
148 | # endif | ||
149 | _GL_CXXALIAS_SYS (nl_langinfo, char *, (nl_item item)); | ||
150 | # endif | ||
151 | _GL_CXXALIASWARN (nl_langinfo); | ||
152 | #elif defined GNULIB_POSIXCHECK | ||
153 | # undef nl_langinfo | ||
154 | # if HAVE_RAW_DECL_NL_LANGINFO | ||
155 | _GL_WARN_ON_USE (nl_langinfo, "nl_langinfo is not portable - " | ||
156 | "use gnulib module nl_langinfo for portability"); | ||
157 | # endif | ||
158 | #endif | ||
159 | |||
160 | |||
161 | #endif /* _GL_LANGINFO_H */ | ||
162 | #endif /* _GL_LANGINFO_H */ | ||
diff --git a/gl/localcharset.c b/gl/localcharset.c index a7ca94c1..a04dc446 100644 --- a/gl/localcharset.c +++ b/gl/localcharset.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Determine a canonical name for the current locale's character encoding. | 1 | /* Determine a canonical name for the current locale's character encoding. |
2 | 2 | ||
3 | Copyright (C) 2000-2006, 2008-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -23,6 +23,7 @@ | |||
23 | /* Specification. */ | 23 | /* Specification. */ |
24 | #include "localcharset.h" | 24 | #include "localcharset.h" |
25 | 25 | ||
26 | #include <fcntl.h> | ||
26 | #include <stddef.h> | 27 | #include <stddef.h> |
27 | #include <stdio.h> | 28 | #include <stdio.h> |
28 | #include <string.h> | 29 | #include <string.h> |
@@ -44,6 +45,7 @@ | |||
44 | #endif | 45 | #endif |
45 | 46 | ||
46 | #if !defined WIN32_NATIVE | 47 | #if !defined WIN32_NATIVE |
48 | # include <unistd.h> | ||
47 | # if HAVE_LANGINFO_CODESET | 49 | # if HAVE_LANGINFO_CODESET |
48 | # include <langinfo.h> | 50 | # include <langinfo.h> |
49 | # else | 51 | # else |
@@ -75,6 +77,11 @@ | |||
75 | # include "configmake.h" | 77 | # include "configmake.h" |
76 | #endif | 78 | #endif |
77 | 79 | ||
80 | /* Define O_NOFOLLOW to 0 on platforms where it does not exist. */ | ||
81 | #ifndef O_NOFOLLOW | ||
82 | # define O_NOFOLLOW 0 | ||
83 | #endif | ||
84 | |||
78 | #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ | 85 | #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ |
79 | /* Win32, Cygwin, OS/2, DOS */ | 86 | /* Win32, Cygwin, OS/2, DOS */ |
80 | # define ISSLASH(C) ((C) == '/' || (C) == '\\') | 87 | # define ISSLASH(C) ((C) == '/' || (C) == '\\') |
@@ -117,192 +124,219 @@ get_charset_aliases (void) | |||
117 | if (cp == NULL) | 124 | if (cp == NULL) |
118 | { | 125 | { |
119 | #if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) | 126 | #if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) |
120 | FILE *fp; | ||
121 | const char *dir; | 127 | const char *dir; |
122 | const char *base = "charset.alias"; | 128 | const char *base = "charset.alias"; |
123 | char *file_name; | 129 | char *file_name; |
124 | 130 | ||
125 | /* Make it possible to override the charset.alias location. This is | 131 | /* Make it possible to override the charset.alias location. This is |
126 | necessary for running the testsuite before "make install". */ | 132 | necessary for running the testsuite before "make install". */ |
127 | dir = getenv ("CHARSETALIASDIR"); | 133 | dir = getenv ("CHARSETALIASDIR"); |
128 | if (dir == NULL || dir[0] == '\0') | 134 | if (dir == NULL || dir[0] == '\0') |
129 | dir = relocate (LIBDIR); | 135 | dir = relocate (LIBDIR); |
130 | 136 | ||
131 | /* Concatenate dir and base into freshly allocated file_name. */ | 137 | /* Concatenate dir and base into freshly allocated file_name. */ |
132 | { | 138 | { |
133 | size_t dir_len = strlen (dir); | 139 | size_t dir_len = strlen (dir); |
134 | size_t base_len = strlen (base); | 140 | size_t base_len = strlen (base); |
135 | int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); | 141 | int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); |
136 | file_name = (char *) malloc (dir_len + add_slash + base_len + 1); | 142 | file_name = (char *) malloc (dir_len + add_slash + base_len + 1); |
137 | if (file_name != NULL) | 143 | if (file_name != NULL) |
138 | { | 144 | { |
139 | memcpy (file_name, dir, dir_len); | 145 | memcpy (file_name, dir, dir_len); |
140 | if (add_slash) | 146 | if (add_slash) |
141 | file_name[dir_len] = DIRECTORY_SEPARATOR; | 147 | file_name[dir_len] = DIRECTORY_SEPARATOR; |
142 | memcpy (file_name + dir_len + add_slash, base, base_len + 1); | 148 | memcpy (file_name + dir_len + add_slash, base, base_len + 1); |
143 | } | 149 | } |
144 | } | 150 | } |
145 | 151 | ||
146 | if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) | 152 | if (file_name == NULL) |
147 | /* Out of memory or file not found, treat it as empty. */ | 153 | /* Out of memory. Treat the file as empty. */ |
148 | cp = ""; | 154 | cp = ""; |
149 | else | 155 | else |
150 | { | 156 | { |
151 | /* Parse the file's contents. */ | 157 | int fd; |
152 | char *res_ptr = NULL; | 158 | |
153 | size_t res_size = 0; | 159 | /* Open the file. Reject symbolic links on platforms that support |
154 | 160 | O_NOFOLLOW. This is a security feature. Without it, an attacker | |
155 | for (;;) | 161 | could retrieve parts of the contents (namely, the tail of the |
156 | { | 162 | first line that starts with "* ") of an arbitrary file by placing |
157 | int c; | 163 | a symbolic link to that file under the name "charset.alias" in |
158 | char buf1[50+1]; | 164 | some writable directory and defining the environment variable |
159 | char buf2[50+1]; | 165 | CHARSETALIASDIR to point to that directory. */ |
160 | size_t l1, l2; | 166 | fd = open (file_name, |
161 | char *old_res_ptr; | 167 | O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0)); |
162 | 168 | if (fd < 0) | |
163 | c = getc (fp); | 169 | /* File not found. Treat it as empty. */ |
164 | if (c == EOF) | 170 | cp = ""; |
165 | break; | 171 | else |
166 | if (c == '\n' || c == ' ' || c == '\t') | 172 | { |
167 | continue; | 173 | FILE *fp; |
168 | if (c == '#') | 174 | |
169 | { | 175 | fp = fdopen (fd, "r"); |
170 | /* Skip comment, to end of line. */ | 176 | if (fp == NULL) |
171 | do | 177 | { |
172 | c = getc (fp); | 178 | /* Out of memory. Treat the file as empty. */ |
173 | while (!(c == EOF || c == '\n')); | 179 | close (fd); |
174 | if (c == EOF) | 180 | cp = ""; |
175 | break; | 181 | } |
176 | continue; | 182 | else |
177 | } | 183 | { |
178 | ungetc (c, fp); | 184 | /* Parse the file's contents. */ |
179 | if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) | 185 | char *res_ptr = NULL; |
180 | break; | 186 | size_t res_size = 0; |
181 | l1 = strlen (buf1); | 187 | |
182 | l2 = strlen (buf2); | 188 | for (;;) |
183 | old_res_ptr = res_ptr; | 189 | { |
184 | if (res_size == 0) | 190 | int c; |
185 | { | 191 | char buf1[50+1]; |
186 | res_size = l1 + 1 + l2 + 1; | 192 | char buf2[50+1]; |
187 | res_ptr = (char *) malloc (res_size + 1); | 193 | size_t l1, l2; |
188 | } | 194 | char *old_res_ptr; |
189 | else | 195 | |
190 | { | 196 | c = getc (fp); |
191 | res_size += l1 + 1 + l2 + 1; | 197 | if (c == EOF) |
192 | res_ptr = (char *) realloc (res_ptr, res_size + 1); | 198 | break; |
193 | } | 199 | if (c == '\n' || c == ' ' || c == '\t') |
194 | if (res_ptr == NULL) | 200 | continue; |
195 | { | 201 | if (c == '#') |
196 | /* Out of memory. */ | 202 | { |
197 | res_size = 0; | 203 | /* Skip comment, to end of line. */ |
198 | if (old_res_ptr != NULL) | 204 | do |
199 | free (old_res_ptr); | 205 | c = getc (fp); |
200 | break; | 206 | while (!(c == EOF || c == '\n')); |
201 | } | 207 | if (c == EOF) |
202 | strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); | 208 | break; |
203 | strcpy (res_ptr + res_size - (l2 + 1), buf2); | 209 | continue; |
204 | } | 210 | } |
205 | fclose (fp); | 211 | ungetc (c, fp); |
206 | if (res_size == 0) | 212 | if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) |
207 | cp = ""; | 213 | break; |
208 | else | 214 | l1 = strlen (buf1); |
209 | { | 215 | l2 = strlen (buf2); |
210 | *(res_ptr + res_size) = '\0'; | 216 | old_res_ptr = res_ptr; |
211 | cp = res_ptr; | 217 | if (res_size == 0) |
212 | } | 218 | { |
213 | } | 219 | res_size = l1 + 1 + l2 + 1; |
214 | 220 | res_ptr = (char *) malloc (res_size + 1); | |
215 | if (file_name != NULL) | 221 | } |
216 | free (file_name); | 222 | else |
223 | { | ||
224 | res_size += l1 + 1 + l2 + 1; | ||
225 | res_ptr = (char *) realloc (res_ptr, res_size + 1); | ||
226 | } | ||
227 | if (res_ptr == NULL) | ||
228 | { | ||
229 | /* Out of memory. */ | ||
230 | res_size = 0; | ||
231 | if (old_res_ptr != NULL) | ||
232 | free (old_res_ptr); | ||
233 | break; | ||
234 | } | ||
235 | strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); | ||
236 | strcpy (res_ptr + res_size - (l2 + 1), buf2); | ||
237 | } | ||
238 | fclose (fp); | ||
239 | if (res_size == 0) | ||
240 | cp = ""; | ||
241 | else | ||
242 | { | ||
243 | *(res_ptr + res_size) = '\0'; | ||
244 | cp = res_ptr; | ||
245 | } | ||
246 | } | ||
247 | } | ||
248 | |||
249 | free (file_name); | ||
250 | } | ||
217 | 251 | ||
218 | #else | 252 | #else |
219 | 253 | ||
220 | # if defined DARWIN7 | 254 | # if defined DARWIN7 |
221 | /* To avoid the trouble of installing a file that is shared by many | 255 | /* To avoid the trouble of installing a file that is shared by many |
222 | GNU packages -- many packaging systems have problems with this --, | 256 | GNU packages -- many packaging systems have problems with this --, |
223 | simply inline the aliases here. */ | 257 | simply inline the aliases here. */ |
224 | cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" | 258 | cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" |
225 | "ISO8859-2" "\0" "ISO-8859-2" "\0" | 259 | "ISO8859-2" "\0" "ISO-8859-2" "\0" |
226 | "ISO8859-4" "\0" "ISO-8859-4" "\0" | 260 | "ISO8859-4" "\0" "ISO-8859-4" "\0" |
227 | "ISO8859-5" "\0" "ISO-8859-5" "\0" | 261 | "ISO8859-5" "\0" "ISO-8859-5" "\0" |
228 | "ISO8859-7" "\0" "ISO-8859-7" "\0" | 262 | "ISO8859-7" "\0" "ISO-8859-7" "\0" |
229 | "ISO8859-9" "\0" "ISO-8859-9" "\0" | 263 | "ISO8859-9" "\0" "ISO-8859-9" "\0" |
230 | "ISO8859-13" "\0" "ISO-8859-13" "\0" | 264 | "ISO8859-13" "\0" "ISO-8859-13" "\0" |
231 | "ISO8859-15" "\0" "ISO-8859-15" "\0" | 265 | "ISO8859-15" "\0" "ISO-8859-15" "\0" |
232 | "KOI8-R" "\0" "KOI8-R" "\0" | 266 | "KOI8-R" "\0" "KOI8-R" "\0" |
233 | "KOI8-U" "\0" "KOI8-U" "\0" | 267 | "KOI8-U" "\0" "KOI8-U" "\0" |
234 | "CP866" "\0" "CP866" "\0" | 268 | "CP866" "\0" "CP866" "\0" |
235 | "CP949" "\0" "CP949" "\0" | 269 | "CP949" "\0" "CP949" "\0" |
236 | "CP1131" "\0" "CP1131" "\0" | 270 | "CP1131" "\0" "CP1131" "\0" |
237 | "CP1251" "\0" "CP1251" "\0" | 271 | "CP1251" "\0" "CP1251" "\0" |
238 | "eucCN" "\0" "GB2312" "\0" | 272 | "eucCN" "\0" "GB2312" "\0" |
239 | "GB2312" "\0" "GB2312" "\0" | 273 | "GB2312" "\0" "GB2312" "\0" |
240 | "eucJP" "\0" "EUC-JP" "\0" | 274 | "eucJP" "\0" "EUC-JP" "\0" |
241 | "eucKR" "\0" "EUC-KR" "\0" | 275 | "eucKR" "\0" "EUC-KR" "\0" |
242 | "Big5" "\0" "BIG5" "\0" | 276 | "Big5" "\0" "BIG5" "\0" |
243 | "Big5HKSCS" "\0" "BIG5-HKSCS" "\0" | 277 | "Big5HKSCS" "\0" "BIG5-HKSCS" "\0" |
244 | "GBK" "\0" "GBK" "\0" | 278 | "GBK" "\0" "GBK" "\0" |
245 | "GB18030" "\0" "GB18030" "\0" | 279 | "GB18030" "\0" "GB18030" "\0" |
246 | "SJIS" "\0" "SHIFT_JIS" "\0" | 280 | "SJIS" "\0" "SHIFT_JIS" "\0" |
247 | "ARMSCII-8" "\0" "ARMSCII-8" "\0" | 281 | "ARMSCII-8" "\0" "ARMSCII-8" "\0" |
248 | "PT154" "\0" "PT154" "\0" | 282 | "PT154" "\0" "PT154" "\0" |
249 | /*"ISCII-DEV" "\0" "?" "\0"*/ | 283 | /*"ISCII-DEV" "\0" "?" "\0"*/ |
250 | "*" "\0" "UTF-8" "\0"; | 284 | "*" "\0" "UTF-8" "\0"; |
251 | # endif | 285 | # endif |
252 | 286 | ||
253 | # if defined VMS | 287 | # if defined VMS |
254 | /* To avoid the troubles of an extra file charset.alias_vms in the | 288 | /* To avoid the troubles of an extra file charset.alias_vms in the |
255 | sources of many GNU packages, simply inline the aliases here. */ | 289 | sources of many GNU packages, simply inline the aliases here. */ |
256 | /* The list of encodings is taken from the OpenVMS 7.3-1 documentation | 290 | /* The list of encodings is taken from the OpenVMS 7.3-1 documentation |
257 | "Compaq C Run-Time Library Reference Manual for OpenVMS systems" | 291 | "Compaq C Run-Time Library Reference Manual for OpenVMS systems" |
258 | section 10.7 "Handling Different Character Sets". */ | 292 | section 10.7 "Handling Different Character Sets". */ |
259 | cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" | 293 | cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" |
260 | "ISO8859-2" "\0" "ISO-8859-2" "\0" | 294 | "ISO8859-2" "\0" "ISO-8859-2" "\0" |
261 | "ISO8859-5" "\0" "ISO-8859-5" "\0" | 295 | "ISO8859-5" "\0" "ISO-8859-5" "\0" |
262 | "ISO8859-7" "\0" "ISO-8859-7" "\0" | 296 | "ISO8859-7" "\0" "ISO-8859-7" "\0" |
263 | "ISO8859-8" "\0" "ISO-8859-8" "\0" | 297 | "ISO8859-8" "\0" "ISO-8859-8" "\0" |
264 | "ISO8859-9" "\0" "ISO-8859-9" "\0" | 298 | "ISO8859-9" "\0" "ISO-8859-9" "\0" |
265 | /* Japanese */ | 299 | /* Japanese */ |
266 | "eucJP" "\0" "EUC-JP" "\0" | 300 | "eucJP" "\0" "EUC-JP" "\0" |
267 | "SJIS" "\0" "SHIFT_JIS" "\0" | 301 | "SJIS" "\0" "SHIFT_JIS" "\0" |
268 | "DECKANJI" "\0" "DEC-KANJI" "\0" | 302 | "DECKANJI" "\0" "DEC-KANJI" "\0" |
269 | "SDECKANJI" "\0" "EUC-JP" "\0" | 303 | "SDECKANJI" "\0" "EUC-JP" "\0" |
270 | /* Chinese */ | 304 | /* Chinese */ |
271 | "eucTW" "\0" "EUC-TW" "\0" | 305 | "eucTW" "\0" "EUC-TW" "\0" |
272 | "DECHANYU" "\0" "DEC-HANYU" "\0" | 306 | "DECHANYU" "\0" "DEC-HANYU" "\0" |
273 | "DECHANZI" "\0" "GB2312" "\0" | 307 | "DECHANZI" "\0" "GB2312" "\0" |
274 | /* Korean */ | 308 | /* Korean */ |
275 | "DECKOREAN" "\0" "EUC-KR" "\0"; | 309 | "DECKOREAN" "\0" "EUC-KR" "\0"; |
276 | # endif | 310 | # endif |
277 | 311 | ||
278 | # if defined WIN32_NATIVE || defined __CYGWIN__ | 312 | # if defined WIN32_NATIVE || defined __CYGWIN__ |
279 | /* To avoid the troubles of installing a separate file in the same | 313 | /* To avoid the troubles of installing a separate file in the same |
280 | directory as the DLL and of retrieving the DLL's directory at | 314 | directory as the DLL and of retrieving the DLL's directory at |
281 | runtime, simply inline the aliases here. */ | 315 | runtime, simply inline the aliases here. */ |
282 | 316 | ||
283 | cp = "CP936" "\0" "GBK" "\0" | 317 | cp = "CP936" "\0" "GBK" "\0" |
284 | "CP1361" "\0" "JOHAB" "\0" | 318 | "CP1361" "\0" "JOHAB" "\0" |
285 | "CP20127" "\0" "ASCII" "\0" | 319 | "CP20127" "\0" "ASCII" "\0" |
286 | "CP20866" "\0" "KOI8-R" "\0" | 320 | "CP20866" "\0" "KOI8-R" "\0" |
287 | "CP20936" "\0" "GB2312" "\0" | 321 | "CP20936" "\0" "GB2312" "\0" |
288 | "CP21866" "\0" "KOI8-RU" "\0" | 322 | "CP21866" "\0" "KOI8-RU" "\0" |
289 | "CP28591" "\0" "ISO-8859-1" "\0" | 323 | "CP28591" "\0" "ISO-8859-1" "\0" |
290 | "CP28592" "\0" "ISO-8859-2" "\0" | 324 | "CP28592" "\0" "ISO-8859-2" "\0" |
291 | "CP28593" "\0" "ISO-8859-3" "\0" | 325 | "CP28593" "\0" "ISO-8859-3" "\0" |
292 | "CP28594" "\0" "ISO-8859-4" "\0" | 326 | "CP28594" "\0" "ISO-8859-4" "\0" |
293 | "CP28595" "\0" "ISO-8859-5" "\0" | 327 | "CP28595" "\0" "ISO-8859-5" "\0" |
294 | "CP28596" "\0" "ISO-8859-6" "\0" | 328 | "CP28596" "\0" "ISO-8859-6" "\0" |
295 | "CP28597" "\0" "ISO-8859-7" "\0" | 329 | "CP28597" "\0" "ISO-8859-7" "\0" |
296 | "CP28598" "\0" "ISO-8859-8" "\0" | 330 | "CP28598" "\0" "ISO-8859-8" "\0" |
297 | "CP28599" "\0" "ISO-8859-9" "\0" | 331 | "CP28599" "\0" "ISO-8859-9" "\0" |
298 | "CP28605" "\0" "ISO-8859-15" "\0" | 332 | "CP28605" "\0" "ISO-8859-15" "\0" |
299 | "CP38598" "\0" "ISO-8859-8" "\0" | 333 | "CP38598" "\0" "ISO-8859-8" "\0" |
300 | "CP51932" "\0" "EUC-JP" "\0" | 334 | "CP51932" "\0" "EUC-JP" "\0" |
301 | "CP51936" "\0" "GB2312" "\0" | 335 | "CP51936" "\0" "GB2312" "\0" |
302 | "CP51949" "\0" "EUC-KR" "\0" | 336 | "CP51949" "\0" "EUC-KR" "\0" |
303 | "CP51950" "\0" "EUC-TW" "\0" | 337 | "CP51950" "\0" "EUC-TW" "\0" |
304 | "CP54936" "\0" "GB18030" "\0" | 338 | "CP54936" "\0" "GB18030" "\0" |
305 | "CP65001" "\0" "UTF-8" "\0"; | 339 | "CP65001" "\0" "UTF-8" "\0"; |
306 | # endif | 340 | # endif |
307 | #endif | 341 | #endif |
308 | 342 | ||
@@ -335,7 +369,7 @@ locale_charset (void) | |||
335 | codeset = nl_langinfo (CODESET); | 369 | codeset = nl_langinfo (CODESET); |
336 | 370 | ||
337 | # ifdef __CYGWIN__ | 371 | # ifdef __CYGWIN__ |
338 | /* Cygwin 2006 does not have locales. nl_langinfo (CODESET) always | 372 | /* Cygwin 1.5.x does not have locales. nl_langinfo (CODESET) always |
339 | returns "US-ASCII". As long as this is not fixed, return the suffix | 373 | returns "US-ASCII". As long as this is not fixed, return the suffix |
340 | of the locale name from the environment variables (if present) or | 374 | of the locale name from the environment variables (if present) or |
341 | the codepage as a number. */ | 375 | the codepage as a number. */ |
@@ -346,36 +380,46 @@ locale_charset (void) | |||
346 | 380 | ||
347 | locale = getenv ("LC_ALL"); | 381 | locale = getenv ("LC_ALL"); |
348 | if (locale == NULL || locale[0] == '\0') | 382 | if (locale == NULL || locale[0] == '\0') |
349 | { | 383 | { |
350 | locale = getenv ("LC_CTYPE"); | 384 | locale = getenv ("LC_CTYPE"); |
351 | if (locale == NULL || locale[0] == '\0') | 385 | if (locale == NULL || locale[0] == '\0') |
352 | locale = getenv ("LANG"); | 386 | locale = getenv ("LANG"); |
353 | } | 387 | } |
354 | if (locale != NULL && locale[0] != '\0') | 388 | if (locale != NULL && locale[0] != '\0') |
355 | { | 389 | { |
356 | /* If the locale name contains an encoding after the dot, return | 390 | /* If the locale name contains an encoding after the dot, return |
357 | it. */ | 391 | it. */ |
358 | const char *dot = strchr (locale, '.'); | 392 | const char *dot = strchr (locale, '.'); |
359 | 393 | ||
360 | if (dot != NULL) | 394 | if (dot != NULL) |
361 | { | 395 | { |
362 | const char *modifier; | 396 | const char *modifier; |
363 | 397 | ||
364 | dot++; | 398 | dot++; |
365 | /* Look for the possible @... trailer and remove it, if any. */ | 399 | /* Look for the possible @... trailer and remove it, if any. */ |
366 | modifier = strchr (dot, '@'); | 400 | modifier = strchr (dot, '@'); |
367 | if (modifier == NULL) | 401 | if (modifier == NULL) |
368 | return dot; | 402 | return dot; |
369 | if (modifier - dot < sizeof (buf)) | 403 | if (modifier - dot < sizeof (buf)) |
370 | { | 404 | { |
371 | memcpy (buf, dot, modifier - dot); | 405 | memcpy (buf, dot, modifier - dot); |
372 | buf [modifier - dot] = '\0'; | 406 | buf [modifier - dot] = '\0'; |
373 | return buf; | 407 | return buf; |
374 | } | 408 | } |
375 | } | 409 | } |
376 | } | 410 | } |
377 | 411 | ||
378 | /* Woe32 has a function returning the locale's codepage as a number. */ | 412 | /* Woe32 has a function returning the locale's codepage as a number: |
413 | GetACP(). This encoding is used by Cygwin, unless the user has set | ||
414 | the environment variable CYGWIN=codepage:oem (which very few people | ||
415 | do). | ||
416 | Output directed to console windows needs to be converted (to | ||
417 | GetOEMCP() if the console is using a raster font, or to | ||
418 | GetConsoleOutputCP() if it is using a TrueType font). Cygwin does | ||
419 | this conversion transparently (see winsup/cygwin/fhandler_console.cc), | ||
420 | converting to GetConsoleOutputCP(). This leads to correct results, | ||
421 | except when SetConsoleOutputCP has been called and a raster font is | ||
422 | in use. */ | ||
379 | sprintf (buf, "CP%u", GetACP ()); | 423 | sprintf (buf, "CP%u", GetACP ()); |
380 | codeset = buf; | 424 | codeset = buf; |
381 | } | 425 | } |
@@ -397,11 +441,11 @@ locale_charset (void) | |||
397 | { | 441 | { |
398 | locale = getenv ("LC_ALL"); | 442 | locale = getenv ("LC_ALL"); |
399 | if (locale == NULL || locale[0] == '\0') | 443 | if (locale == NULL || locale[0] == '\0') |
400 | { | 444 | { |
401 | locale = getenv ("LC_CTYPE"); | 445 | locale = getenv ("LC_CTYPE"); |
402 | if (locale == NULL || locale[0] == '\0') | 446 | if (locale == NULL || locale[0] == '\0') |
403 | locale = getenv ("LANG"); | 447 | locale = getenv ("LANG"); |
404 | } | 448 | } |
405 | } | 449 | } |
406 | 450 | ||
407 | /* On some old systems, one used to set locale = "iso8859_1". On others, | 451 | /* On some old systems, one used to set locale = "iso8859_1". On others, |
@@ -415,7 +459,13 @@ locale_charset (void) | |||
415 | 459 | ||
416 | static char buf[2 + 10 + 1]; | 460 | static char buf[2 + 10 + 1]; |
417 | 461 | ||
418 | /* Woe32 has a function returning the locale's codepage as a number. */ | 462 | /* Woe32 has a function returning the locale's codepage as a number: |
463 | GetACP(). | ||
464 | When the output goes to a console window, it needs to be provided in | ||
465 | GetOEMCP() encoding if the console is using a raster font, or in | ||
466 | GetConsoleOutputCP() encoding if it is using a TrueType font. | ||
467 | But in GUI programs and for output sent to files and pipes, GetACP() | ||
468 | encoding is the best bet. */ | ||
419 | sprintf (buf, "CP%u", GetACP ()); | 469 | sprintf (buf, "CP%u", GetACP ()); |
420 | codeset = buf; | 470 | codeset = buf; |
421 | 471 | ||
@@ -433,7 +483,7 @@ locale_charset (void) | |||
433 | { | 483 | { |
434 | locale = getenv ("LC_CTYPE"); | 484 | locale = getenv ("LC_CTYPE"); |
435 | if (locale == NULL || locale[0] == '\0') | 485 | if (locale == NULL || locale[0] == '\0') |
436 | locale = getenv ("LANG"); | 486 | locale = getenv ("LANG"); |
437 | } | 487 | } |
438 | if (locale != NULL && locale[0] != '\0') | 488 | if (locale != NULL && locale[0] != '\0') |
439 | { | 489 | { |
@@ -441,21 +491,21 @@ locale_charset (void) | |||
441 | const char *dot = strchr (locale, '.'); | 491 | const char *dot = strchr (locale, '.'); |
442 | 492 | ||
443 | if (dot != NULL) | 493 | if (dot != NULL) |
444 | { | 494 | { |
445 | const char *modifier; | 495 | const char *modifier; |
446 | 496 | ||
447 | dot++; | 497 | dot++; |
448 | /* Look for the possible @... trailer and remove it, if any. */ | 498 | /* Look for the possible @... trailer and remove it, if any. */ |
449 | modifier = strchr (dot, '@'); | 499 | modifier = strchr (dot, '@'); |
450 | if (modifier == NULL) | 500 | if (modifier == NULL) |
451 | return dot; | 501 | return dot; |
452 | if (modifier - dot < sizeof (buf)) | 502 | if (modifier - dot < sizeof (buf)) |
453 | { | 503 | { |
454 | memcpy (buf, dot, modifier - dot); | 504 | memcpy (buf, dot, modifier - dot); |
455 | buf [modifier - dot] = '\0'; | 505 | buf [modifier - dot] = '\0'; |
456 | return buf; | 506 | return buf; |
457 | } | 507 | } |
458 | } | 508 | } |
459 | 509 | ||
460 | /* Resolve through the charset.alias file. */ | 510 | /* Resolve through the charset.alias file. */ |
461 | codeset = locale; | 511 | codeset = locale; |
@@ -464,12 +514,12 @@ locale_charset (void) | |||
464 | { | 514 | { |
465 | /* OS/2 has a function returning the locale's codepage as a number. */ | 515 | /* OS/2 has a function returning the locale's codepage as a number. */ |
466 | if (DosQueryCp (sizeof (cp), cp, &cplen)) | 516 | if (DosQueryCp (sizeof (cp), cp, &cplen)) |
467 | codeset = ""; | 517 | codeset = ""; |
468 | else | 518 | else |
469 | { | 519 | { |
470 | sprintf (buf, "CP%u", cp[0]); | 520 | sprintf (buf, "CP%u", cp[0]); |
471 | codeset = buf; | 521 | codeset = buf; |
472 | } | 522 | } |
473 | } | 523 | } |
474 | 524 | ||
475 | #endif | 525 | #endif |
@@ -483,10 +533,10 @@ locale_charset (void) | |||
483 | *aliases != '\0'; | 533 | *aliases != '\0'; |
484 | aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) | 534 | aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) |
485 | if (strcmp (codeset, aliases) == 0 | 535 | if (strcmp (codeset, aliases) == 0 |
486 | || (aliases[0] == '*' && aliases[1] == '\0')) | 536 | || (aliases[0] == '*' && aliases[1] == '\0')) |
487 | { | 537 | { |
488 | codeset = aliases + strlen (aliases) + 1; | 538 | codeset = aliases + strlen (aliases) + 1; |
489 | break; | 539 | break; |
490 | } | 540 | } |
491 | 541 | ||
492 | /* Don't return an empty string. GNU libc and GNU libiconv interpret | 542 | /* Don't return an empty string. GNU libc and GNU libiconv interpret |
diff --git a/gl/localcharset.h b/gl/localcharset.h index b9a3013a..899b3bae 100644 --- a/gl/localcharset.h +++ b/gl/localcharset.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Determine a canonical name for the current locale's character encoding. | 1 | /* Determine a canonical name for the current locale's character encoding. |
2 | Copyright (C) 2000-2003 Free Software Foundation, Inc. | 2 | Copyright (C) 2000-2003, 2009-2010 Free Software Foundation, Inc. |
3 | This file is part of the GNU CHARSET Library. | 3 | This file is part of the GNU CHARSET Library. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
diff --git a/gl/locale.in.h b/gl/locale.in.h new file mode 100644 index 00000000..75b52993 --- /dev/null +++ b/gl/locale.in.h | |||
@@ -0,0 +1,74 @@ | |||
1 | /* A POSIX <locale.h>. | ||
2 | Copyright (C) 2007-2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 3 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
16 | |||
17 | #ifndef _GL_LOCALE_H | ||
18 | |||
19 | #if __GNUC__ >= 3 | ||
20 | @PRAGMA_SYSTEM_HEADER@ | ||
21 | #endif | ||
22 | |||
23 | /* The include_next requires a split double-inclusion guard. */ | ||
24 | #@INCLUDE_NEXT@ @NEXT_LOCALE_H@ | ||
25 | |||
26 | #ifndef _GL_LOCALE_H | ||
27 | #define _GL_LOCALE_H | ||
28 | |||
29 | /* NetBSD 5.0 mis-defines NULL. */ | ||
30 | #include <stddef.h> | ||
31 | |||
32 | /* MacOS X 10.5 defines the locale_t type in <xlocale.h>. */ | ||
33 | #if @HAVE_XLOCALE_H@ | ||
34 | # include <xlocale.h> | ||
35 | #endif | ||
36 | |||
37 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
38 | |||
39 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
40 | |||
41 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
42 | |||
43 | /* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C. | ||
44 | On systems that don't define it, use the same value as GNU libintl. */ | ||
45 | #if !defined LC_MESSAGES | ||
46 | # define LC_MESSAGES 1729 | ||
47 | #endif | ||
48 | |||
49 | #if @GNULIB_DUPLOCALE@ | ||
50 | # if @REPLACE_DUPLOCALE@ | ||
51 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
52 | # undef duplocale | ||
53 | # define duplocale rpl_duplocale | ||
54 | # endif | ||
55 | _GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1))); | ||
56 | _GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale)); | ||
57 | # else | ||
58 | # if @HAVE_DUPLOCALE@ | ||
59 | _GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale)); | ||
60 | # endif | ||
61 | # endif | ||
62 | # if @HAVE_DUPLOCALE@ | ||
63 | _GL_CXXALIASWARN (duplocale); | ||
64 | # endif | ||
65 | #elif defined GNULIB_POSIXCHECK | ||
66 | # undef duplocale | ||
67 | # if HAVE_RAW_DECL_DUPLOCALE | ||
68 | _GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - " | ||
69 | "use gnulib module duplocale for portability"); | ||
70 | # endif | ||
71 | #endif | ||
72 | |||
73 | #endif /* _GL_LOCALE_H */ | ||
74 | #endif /* _GL_LOCALE_H */ | ||
diff --git a/gl/m4/00gnulib.m4 b/gl/m4/00gnulib.m4 index d4d04d15..301469b3 100644 --- a/gl/m4/00gnulib.m4 +++ b/gl/m4/00gnulib.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # 00gnulib.m4 serial 2 | 1 | # 00gnulib.m4 serial 2 |
2 | dnl Copyright (C) 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/alloca.m4 b/gl/m4/alloca.m4 index 4b978e13..f3ee3438 100644 --- a/gl/m4/alloca.m4 +++ b/gl/m4/alloca.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # alloca.m4 serial 9 | 1 | # alloca.m4 serial 9 |
2 | dnl Copyright (C) 2002-2004, 2006, 2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2004, 2006-2007, 2009-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/arpa_inet_h.m4 b/gl/m4/arpa_inet_h.m4 index a6e63df0..15a30e2b 100644 --- a/gl/m4/arpa_inet_h.m4 +++ b/gl/m4/arpa_inet_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # arpa_inet_h.m4 serial 5 | 1 | # arpa_inet_h.m4 serial 8 |
2 | dnl Copyright (C) 2006, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006, 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -16,27 +16,35 @@ AC_DEFUN([gl_HEADER_ARPA_INET], | |||
16 | if test $ac_cv_header_arpa_inet_h = yes; then | 16 | if test $ac_cv_header_arpa_inet_h = yes; then |
17 | HAVE_ARPA_INET_H=1 | 17 | HAVE_ARPA_INET_H=1 |
18 | else | 18 | else |
19 | ARPA_INET_H='arpa/inet.h' | ||
20 | HAVE_ARPA_INET_H=0 | 19 | HAVE_ARPA_INET_H=0 |
21 | fi | 20 | fi |
22 | AC_SUBST([HAVE_ARPA_INET_H]) | 21 | AC_SUBST([HAVE_ARPA_INET_H]) |
23 | dnl Execute this unconditionally, because ARPA_INET_H may be set by other | 22 | dnl <arpa/inet.h> is always overridden, because of GNULIB_POSIXCHECK. |
24 | dnl modules, after this code is executed. | ||
25 | gl_CHECK_NEXT_HEADERS([arpa/inet.h]) | 23 | gl_CHECK_NEXT_HEADERS([arpa/inet.h]) |
24 | |||
25 | dnl Check for declarations of anything we want to poison if the | ||
26 | dnl corresponding gnulib module is not in use. | ||
27 | gl_WARN_ON_USE_PREPARE([[ | ||
28 | /* On some systems, this header is not self-consistent. */ | ||
29 | #ifndef __GLIBC__ | ||
30 | # include <sys/socket.h> | ||
31 | #endif | ||
32 | #include <arpa/inet.h> | ||
33 | ]], [inet_ntop inet_pton]) | ||
26 | ]) | 34 | ]) |
27 | 35 | ||
28 | dnl Unconditionally enables the replacement of <arpa/inet.h>. | 36 | dnl Unconditionally enables the replacement of <arpa/inet.h>. |
29 | AC_DEFUN([gl_REPLACE_ARPA_INET_H], | 37 | AC_DEFUN([gl_REPLACE_ARPA_INET_H], |
30 | [ | 38 | [ |
31 | AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS]) | 39 | dnl This is a no-op, because <arpa/inet.h> is always overridden. |
32 | ARPA_INET_H='arpa/inet.h' | 40 | : |
33 | ]) | 41 | ]) |
34 | 42 | ||
35 | AC_DEFUN([gl_ARPA_INET_MODULE_INDICATOR], | 43 | AC_DEFUN([gl_ARPA_INET_MODULE_INDICATOR], |
36 | [ | 44 | [ |
37 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 45 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
38 | AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS]) | 46 | AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS]) |
39 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 47 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
40 | ]) | 48 | ]) |
41 | 49 | ||
42 | AC_DEFUN([gl_ARPA_INET_H_DEFAULTS], | 50 | AC_DEFUN([gl_ARPA_INET_H_DEFAULTS], |
@@ -46,5 +54,4 @@ AC_DEFUN([gl_ARPA_INET_H_DEFAULTS], | |||
46 | dnl Assume proper GNU behavior unless another module says otherwise. | 54 | dnl Assume proper GNU behavior unless another module says otherwise. |
47 | HAVE_DECL_INET_NTOP=1; AC_SUBST([HAVE_DECL_INET_NTOP]) | 55 | HAVE_DECL_INET_NTOP=1; AC_SUBST([HAVE_DECL_INET_NTOP]) |
48 | HAVE_DECL_INET_PTON=1; AC_SUBST([HAVE_DECL_INET_PTON]) | 56 | HAVE_DECL_INET_PTON=1; AC_SUBST([HAVE_DECL_INET_PTON]) |
49 | ARPA_INET_H=''; AC_SUBST([ARPA_INET_H]) | ||
50 | ]) | 57 | ]) |
diff --git a/gl/m4/base64.m4 b/gl/m4/base64.m4 index 24801efa..d1e13522 100644 --- a/gl/m4/base64.m4 +++ b/gl/m4/base64.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # base64.m4 serial 3 | 1 | # base64.m4 serial 3 |
2 | dnl Copyright (C) 2004, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004, 2006, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/btowc.m4 b/gl/m4/btowc.m4 index b46f74fb..c4ee4e41 100644 --- a/gl/m4/btowc.m4 +++ b/gl/m4/btowc.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # btowc.m4 serial 4 | 1 | # btowc.m4 serial 6 |
2 | dnl Copyright (C) 2008-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -8,15 +8,49 @@ AC_DEFUN([gl_FUNC_BTOWC], | |||
8 | [ | 8 | [ |
9 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) | 9 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) |
10 | 10 | ||
11 | dnl Check whether <wchar.h> is usable at all, first. Otherwise the test | ||
12 | dnl program below may lead to an endless loop. See | ||
13 | dnl <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. | ||
14 | AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) | ||
15 | |||
11 | AC_CHECK_FUNCS_ONCE([btowc]) | 16 | AC_CHECK_FUNCS_ONCE([btowc]) |
12 | if test $ac_cv_func_btowc = no; then | 17 | if test $ac_cv_func_btowc = no; then |
13 | HAVE_BTOWC=0 | 18 | HAVE_BTOWC=0 |
14 | else | 19 | else |
15 | 20 | ||
16 | dnl IRIX 6.5 btowc(EOF) is 0xFF, not WEOF. | ||
17 | AC_REQUIRE([AC_PROG_CC]) | 21 | AC_REQUIRE([AC_PROG_CC]) |
18 | AC_REQUIRE([gt_LOCALE_FR]) | 22 | AC_REQUIRE([gt_LOCALE_FR]) |
19 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | 23 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles |
24 | |||
25 | dnl Cygwin 1.7.2 btowc('\0') is WEOF, not 0. | ||
26 | AC_CACHE_CHECK([whether btowc(0) is correct], | ||
27 | [gl_cv_func_btowc_nul], | ||
28 | [ | ||
29 | AC_TRY_RUN([ | ||
30 | #include <stdio.h> | ||
31 | #include <string.h> | ||
32 | #include <wchar.h> | ||
33 | int main () | ||
34 | { | ||
35 | if (btowc ('\0') != 0) | ||
36 | return 1; | ||
37 | return 0; | ||
38 | }], | ||
39 | [gl_cv_func_btowc_nul=yes], | ||
40 | [gl_cv_func_btowc_nul=no], | ||
41 | [ | ||
42 | changequote(,)dnl | ||
43 | case "$host_os" in | ||
44 | # Guess no on Cygwin. | ||
45 | cygwin*) gl_cv_func_btowc_nul="guessing no" ;; | ||
46 | # Guess yes otherwise. | ||
47 | *) gl_cv_func_btowc_nul="guessing yes" ;; | ||
48 | esac | ||
49 | changequote([,])dnl | ||
50 | ]) | ||
51 | ]) | ||
52 | |||
53 | dnl IRIX 6.5 btowc(EOF) is 0xFF, not WEOF. | ||
20 | AC_CACHE_CHECK([whether btowc(EOF) is correct], | 54 | AC_CACHE_CHECK([whether btowc(EOF) is correct], |
21 | [gl_cv_func_btowc_eof], | 55 | [gl_cv_func_btowc_eof], |
22 | [ | 56 | [ |
@@ -50,6 +84,11 @@ int main () | |||
50 | [:]) | 84 | [:]) |
51 | fi | 85 | fi |
52 | ]) | 86 | ]) |
87 | |||
88 | case "$gl_cv_func_btowc_nul" in | ||
89 | *yes) ;; | ||
90 | *) REPLACE_BTOWC=1 ;; | ||
91 | esac | ||
53 | case "$gl_cv_func_btowc_eof" in | 92 | case "$gl_cv_func_btowc_eof" in |
54 | *yes) ;; | 93 | *yes) ;; |
55 | *) REPLACE_BTOWC=1 ;; | 94 | *) REPLACE_BTOWC=1 ;; |
diff --git a/gl/m4/c-strtod.m4 b/gl/m4/c-strtod.m4 index ba954354..41cf18e9 100644 --- a/gl/m4/c-strtod.m4 +++ b/gl/m4/c-strtod.m4 | |||
@@ -1,6 +1,6 @@ | |||
1 | # c-strtod.m4 serial 11 | 1 | # c-strtod.m4 serial 11 |
2 | 2 | ||
3 | # Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation, Inc. | 3 | # Copyright (C) 2004-2006, 2009-2010 Free Software Foundation, Inc. |
4 | # This file is free software; the Free Software Foundation | 4 | # This file is free software; the Free Software Foundation |
5 | # gives unlimited permission to copy and/or distribute it, | 5 | # gives unlimited permission to copy and/or distribute it, |
6 | # with or without modifications, as long as this notice is preserved. | 6 | # with or without modifications, as long as this notice is preserved. |
@@ -14,17 +14,17 @@ AC_DEFUN([gl_C99_STRTOLD], | |||
14 | [AC_LINK_IFELSE( | 14 | [AC_LINK_IFELSE( |
15 | [AC_LANG_PROGRAM( | 15 | [AC_LANG_PROGRAM( |
16 | [[/* On HP-UX before 11.23, strtold returns a struct instead of | 16 | [[/* On HP-UX before 11.23, strtold returns a struct instead of |
17 | long double. Reject implementations like that, by requiring | 17 | long double. Reject implementations like that, by requiring |
18 | compatibility with the C99 prototype. */ | 18 | compatibility with the C99 prototype. */ |
19 | #include <stdlib.h> | 19 | #include <stdlib.h> |
20 | static long double (*p) (char const *, char **) = strtold; | 20 | static long double (*p) (char const *, char **) = strtold; |
21 | static long double | 21 | static long double |
22 | test (char const *nptr, char **endptr) | 22 | test (char const *nptr, char **endptr) |
23 | { | 23 | { |
24 | long double r; | 24 | long double r; |
25 | r = strtold (nptr, endptr); | 25 | r = strtold (nptr, endptr); |
26 | return r; | 26 | return r; |
27 | }]], | 27 | }]], |
28 | [[return test ("1.0", NULL) != 1 || p ("1.0", NULL) != 1;]])], | 28 | [[return test ("1.0", NULL) != 1 || p ("1.0", NULL) != 1;]])], |
29 | [gl_cv_func_c99_strtold=yes], | 29 | [gl_cv_func_c99_strtold=yes], |
30 | [gl_cv_func_c99_strtold=no])]) | 30 | [gl_cv_func_c99_strtold=no])]) |
diff --git a/gl/m4/cloexec.m4 b/gl/m4/cloexec.m4 index 4c4e26a1..c75595ca 100644 --- a/gl/m4/cloexec.m4 +++ b/gl/m4/cloexec.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | #serial 6 | 1 | #serial 6 |
2 | dnl Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004-2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/codeset.m4 b/gl/m4/codeset.m4 index 413217bd..a53c0426 100644 --- a/gl/m4/codeset.m4 +++ b/gl/m4/codeset.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # codeset.m4 serial 4 (gettext-0.18) | 1 | # codeset.m4 serial 4 (gettext-0.18) |
2 | dnl Copyright (C) 2000-2002, 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2000-2002, 2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/dirname.m4 b/gl/m4/dirname.m4 index e35da965..576b5bea 100644 --- a/gl/m4/dirname.m4 +++ b/gl/m4/dirname.m4 | |||
@@ -1,18 +1,26 @@ | |||
1 | #serial 7 -*- autoconf -*- | 1 | #serial 8 -*- autoconf -*- |
2 | dnl Copyright (C) 2002-2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
6 | 6 | ||
7 | AC_DEFUN([gl_DIRNAME], | 7 | AC_DEFUN([gl_DIRNAME], |
8 | [ | 8 | [ |
9 | AC_REQUIRE([gl_DIRNAME_LGPL]) | ||
9 | AC_LIBOBJ([basename]) | 10 | AC_LIBOBJ([basename]) |
10 | AC_LIBOBJ([dirname]) | 11 | AC_LIBOBJ([dirname]) |
12 | ]) | ||
13 | |||
14 | AC_DEFUN([gl_DIRNAME_LGPL], | ||
15 | [ | ||
16 | AC_LIBOBJ([basename-lgpl]) | ||
17 | AC_LIBOBJ([dirname-lgpl]) | ||
11 | AC_LIBOBJ([stripslash]) | 18 | AC_LIBOBJ([stripslash]) |
12 | 19 | ||
13 | dnl Prerequisites of lib/dirname.h. | 20 | dnl Prerequisites of lib/dirname.h. |
14 | AC_REQUIRE([gl_AC_DOS]) | 21 | AC_REQUIRE([gl_AC_DOS]) |
15 | AC_REQUIRE([gl_DOUBLE_SLASH_ROOT]) | 22 | AC_REQUIRE([gl_DOUBLE_SLASH_ROOT]) |
16 | 23 | ||
17 | dnl No prerequisites of lib/basename.c, lib/dirname.c, lib/stripslash.c. | 24 | dnl No prerequisites of lib/basename-lgpl.c, lib/dirname-lgpl.c, |
25 | dnl lib/stripslash.c. | ||
18 | ]) | 26 | ]) |
diff --git a/gl/m4/dos.m4 b/gl/m4/dos.m4 index dd59571c..5660542b 100644 --- a/gl/m4/dos.m4 +++ b/gl/m4/dos.m4 | |||
@@ -1,9 +1,9 @@ | |||
1 | #serial 10 -*- autoconf -*- | 1 | #serial 11 -*- autoconf -*- |
2 | 2 | ||
3 | # Define some macros required for proper operation of code in lib/*.c | 3 | # Define some macros required for proper operation of code in lib/*.c |
4 | # on MSDOS/Windows systems. | 4 | # on MSDOS/Windows systems. |
5 | 5 | ||
6 | # Copyright (C) 2000, 2001, 2004, 2005, 2006 Free Software Foundation, Inc. | 6 | # Copyright (C) 2000-2001, 2004-2006, 2009-2010 Free Software Foundation, Inc. |
7 | # This file is free software; the Free Software Foundation | 7 | # This file is free software; the Free Software Foundation |
8 | # gives unlimited permission to copy and/or distribute it, | 8 | # gives unlimited permission to copy and/or distribute it, |
9 | # with or without modifications, as long as this notice is preserved. | 9 | # with or without modifications, as long as this notice is preserved. |
@@ -14,31 +14,31 @@ AC_DEFUN([gl_AC_DOS], | |||
14 | [ | 14 | [ |
15 | AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos], | 15 | AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos], |
16 | [ | 16 | [ |
17 | AC_TRY_COMPILE([], | 17 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ |
18 | [#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__ | 18 | #if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__ |
19 | neither MSDOS nor Windows | 19 | neither MSDOS nor Windows |
20 | #endif], | 20 | #endif]])], |
21 | [ac_cv_win_or_dos=yes], | 21 | [ac_cv_win_or_dos=yes], |
22 | [ac_cv_win_or_dos=no]) | 22 | [ac_cv_win_or_dos=no]) |
23 | ]) | 23 | ]) |
24 | 24 | ||
25 | if test x"$ac_cv_win_or_dos" = xyes; then | 25 | if test x"$ac_cv_win_or_dos" = xyes; then |
26 | ac_fs_accepts_drive_letter_prefix=1 | 26 | ac_fs_accepts_drive_letter_prefix=1 |
27 | ac_fs_backslash_is_file_name_separator=1 | 27 | ac_fs_backslash_is_file_name_separator=1 |
28 | AC_CACHE_CHECK([whether drive letter can start relative path], | 28 | AC_CACHE_CHECK([whether drive letter can start relative path], |
29 | [ac_cv_drive_letter_can_be_relative], | 29 | [ac_cv_drive_letter_can_be_relative], |
30 | [ | 30 | [ |
31 | AC_TRY_COMPILE([], | 31 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ |
32 | [#if defined __CYGWIN__ | 32 | #if defined __CYGWIN__ |
33 | drive letters are always absolute | 33 | drive letters are always absolute |
34 | #endif], | 34 | #endif]])], |
35 | [ac_cv_drive_letter_can_be_relative=yes], | 35 | [ac_cv_drive_letter_can_be_relative=yes], |
36 | [ac_cv_drive_letter_can_be_relative=no]) | 36 | [ac_cv_drive_letter_can_be_relative=no]) |
37 | ]) | 37 | ]) |
38 | if test x"$ac_cv_drive_letter_can_be_relative" = xyes; then | 38 | if test x"$ac_cv_drive_letter_can_be_relative" = xyes; then |
39 | ac_fs_drive_letter_can_be_relative=1 | 39 | ac_fs_drive_letter_can_be_relative=1 |
40 | else | 40 | else |
41 | ac_fs_drive_letter_can_be_relative=0 | 41 | ac_fs_drive_letter_can_be_relative=0 |
42 | fi | 42 | fi |
43 | else | 43 | else |
44 | ac_fs_accepts_drive_letter_prefix=0 | 44 | ac_fs_accepts_drive_letter_prefix=0 |
diff --git a/gl/m4/double-slash-root.m4 b/gl/m4/double-slash-root.m4 index 8c6841bc..66a79c0f 100644 --- a/gl/m4/double-slash-root.m4 +++ b/gl/m4/double-slash-root.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # double-slash-root.m4 serial 4 -*- Autoconf -*- | 1 | # double-slash-root.m4 serial 4 -*- Autoconf -*- |
2 | dnl Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -9,27 +9,27 @@ AC_DEFUN([gl_DOUBLE_SLASH_ROOT], | |||
9 | AC_REQUIRE([AC_CANONICAL_HOST]) | 9 | AC_REQUIRE([AC_CANONICAL_HOST]) |
10 | AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root], | 10 | AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root], |
11 | [ if test x"$cross_compiling" = xyes ; then | 11 | [ if test x"$cross_compiling" = xyes ; then |
12 | # When cross-compiling, there is no way to tell whether // is special | 12 | # When cross-compiling, there is no way to tell whether // is special |
13 | # short of a list of hosts. However, the only known hosts to date | 13 | # short of a list of hosts. However, the only known hosts to date |
14 | # that have a distinct // are Apollo DomainOS (too old to port to), | 14 | # that have a distinct // are Apollo DomainOS (too old to port to), |
15 | # Cygwin, and z/OS. If anyone knows of another system for which // has | 15 | # Cygwin, and z/OS. If anyone knows of another system for which // has |
16 | # special semantics and is distinct from /, please report it to | 16 | # special semantics and is distinct from /, please report it to |
17 | # <bug-gnulib@gnu.org>. | 17 | # <bug-gnulib@gnu.org>. |
18 | case $host in | 18 | case $host in |
19 | *-cygwin | i370-ibm-openedition) | 19 | *-cygwin | i370-ibm-openedition) |
20 | gl_cv_double_slash_root=yes ;; | 20 | gl_cv_double_slash_root=yes ;; |
21 | *) | 21 | *) |
22 | # Be optimistic and assume that / and // are the same when we | 22 | # Be optimistic and assume that / and // are the same when we |
23 | # don't know. | 23 | # don't know. |
24 | gl_cv_double_slash_root='unknown, assuming no' ;; | 24 | gl_cv_double_slash_root='unknown, assuming no' ;; |
25 | esac | 25 | esac |
26 | else | 26 | else |
27 | set x `ls -di / // 2>/dev/null` | 27 | set x `ls -di / // 2>/dev/null` |
28 | if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then | 28 | if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then |
29 | gl_cv_double_slash_root=no | 29 | gl_cv_double_slash_root=no |
30 | else | 30 | else |
31 | gl_cv_double_slash_root=yes | 31 | gl_cv_double_slash_root=yes |
32 | fi | 32 | fi |
33 | fi]) | 33 | fi]) |
34 | if test "$gl_cv_double_slash_root" = yes; then | 34 | if test "$gl_cv_double_slash_root" = yes; then |
35 | AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1], | 35 | AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1], |
diff --git a/gl/m4/dup2.m4 b/gl/m4/dup2.m4 new file mode 100644 index 00000000..998d66f8 --- /dev/null +++ b/gl/m4/dup2.m4 | |||
@@ -0,0 +1,58 @@ | |||
1 | #serial 10 | ||
2 | dnl Copyright (C) 2002, 2005, 2007, 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_FUNC_DUP2], | ||
8 | [ | ||
9 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | ||
10 | AC_REQUIRE([AC_CANONICAL_HOST]) | ||
11 | AC_CHECK_FUNCS_ONCE([dup2]) | ||
12 | if test $ac_cv_func_dup2 = no; then | ||
13 | HAVE_DUP2=0 | ||
14 | AC_LIBOBJ([dup2]) | ||
15 | else | ||
16 | AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works], | ||
17 | [AC_RUN_IFELSE([ | ||
18 | AC_LANG_PROGRAM([[#include <unistd.h> | ||
19 | #include <errno.h>]], | ||
20 | [if (dup2 (1, 1) == 0) | ||
21 | return 1; | ||
22 | close (0); | ||
23 | if (dup2 (0, 0) != -1) | ||
24 | return 2; | ||
25 | /* Many gnulib modules require POSIX conformance of EBADF. */ | ||
26 | if (dup2 (1, 1000000) == -1 && errno != EBADF) | ||
27 | return 3; | ||
28 | return 0; | ||
29 | ]) | ||
30 | ], | ||
31 | [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no], | ||
32 | [case "$host_os" in | ||
33 | mingw*) # on this platform, dup2 always returns 0 for success | ||
34 | gl_cv_func_dup2_works=no;; | ||
35 | cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 | ||
36 | gl_cv_func_dup2_works=no;; | ||
37 | linux*) # On linux between 2008-07-27 and 2009-05-11, dup2 of a | ||
38 | # closed fd may yield -EBADF instead of -1 / errno=EBADF. | ||
39 | gl_cv_func_dup2_works=no;; | ||
40 | freebsd*) # on FreeBSD 6.1, dup2(1,1000000) gives EMFILE, not EBADF. | ||
41 | gl_cv_func_dup2_works=no;; | ||
42 | *) gl_cv_func_dup2_works=yes;; | ||
43 | esac]) | ||
44 | ]) | ||
45 | if test "$gl_cv_func_dup2_works" = no; then | ||
46 | gl_REPLACE_DUP2 | ||
47 | fi | ||
48 | fi | ||
49 | ]) | ||
50 | |||
51 | AC_DEFUN([gl_REPLACE_DUP2], | ||
52 | [ | ||
53 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | ||
54 | if test $ac_cv_func_dup2 = yes; then | ||
55 | REPLACE_DUP2=1 | ||
56 | fi | ||
57 | AC_LIBOBJ([dup2]) | ||
58 | ]) | ||
diff --git a/gl/m4/errno_h.m4 b/gl/m4/errno_h.m4 index 16188d9b..d02a0393 100644 --- a/gl/m4/errno_h.m4 +++ b/gl/m4/errno_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # errno_h.m4 serial 5 | 1 | # errno_h.m4 serial 6 |
2 | dnl Copyright (C) 2004, 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -34,6 +34,9 @@ booboo | |||
34 | #if !defined ENOTSUP | 34 | #if !defined ENOTSUP |
35 | booboo | 35 | booboo |
36 | #endif | 36 | #endif |
37 | #if !defined ESTALE | ||
38 | booboo | ||
39 | #endif | ||
37 | #if !defined ECANCELED | 40 | #if !defined ECANCELED |
38 | booboo | 41 | booboo |
39 | #endif | 42 | #endif |
diff --git a/gl/m4/error.m4 b/gl/m4/error.m4 index 7c7746e2..9f1307a4 100644 --- a/gl/m4/error.m4 +++ b/gl/m4/error.m4 | |||
@@ -1,7 +1,6 @@ | |||
1 | #serial 11 | 1 | #serial 12 |
2 | 2 | ||
3 | # Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004 Free Software | 3 | # Copyright (C) 1996-1998, 2001-2004, 2009-2010 Free Software Foundation, Inc. |
4 | # Foundation, Inc. | ||
5 | # | 4 | # |
6 | # This file is free software; the Free Software Foundation | 5 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 6 | # gives unlimited permission to copy and/or distribute it, |
@@ -18,5 +17,6 @@ AC_DEFUN([gl_ERROR], | |||
18 | AC_DEFUN([gl_PREREQ_ERROR], | 17 | AC_DEFUN([gl_PREREQ_ERROR], |
19 | [ | 18 | [ |
20 | AC_REQUIRE([AC_FUNC_STRERROR_R]) | 19 | AC_REQUIRE([AC_FUNC_STRERROR_R]) |
20 | AC_REQUIRE([AC_C_INLINE]) | ||
21 | : | 21 | : |
22 | ]) | 22 | ]) |
diff --git a/gl/m4/exitfail.m4 b/gl/m4/exitfail.m4 deleted file mode 100644 index b7a691e5..00000000 --- a/gl/m4/exitfail.m4 +++ /dev/null | |||
@@ -1,13 +0,0 @@ | |||
1 | # exitfail.m4 serial 6 | ||
2 | dnl Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_EXITFAIL], | ||
8 | [ | ||
9 | AC_LIBOBJ([exitfail]) | ||
10 | |||
11 | dnl No prerequisites of lib/exitfail.c. | ||
12 | : | ||
13 | ]) | ||
diff --git a/gl/m4/extensions.m4 b/gl/m4/extensions.m4 index ba6d5e19..7d9458a8 100644 --- a/gl/m4/extensions.m4 +++ b/gl/m4/extensions.m4 | |||
@@ -1,7 +1,7 @@ | |||
1 | # serial 8 -*- Autoconf -*- | 1 | # serial 9 -*- Autoconf -*- |
2 | # Enable extensions on systems that normally disable them. | 2 | # Enable extensions on systems that normally disable them. |
3 | 3 | ||
4 | # Copyright (C) 2003, 2006-2009 Free Software Foundation, Inc. | 4 | # Copyright (C) 2003, 2006-2010 Free Software Foundation, Inc. |
5 | # This file is free software; the Free Software Foundation | 5 | # This file is free software; the Free Software Foundation |
6 | # gives unlimited permission to copy and/or distribute it, | 6 | # gives unlimited permission to copy and/or distribute it, |
7 | # with or without modifications, as long as this notice is preserved. | 7 | # with or without modifications, as long as this notice is preserved. |
@@ -12,6 +12,20 @@ | |||
12 | # enough in this area it's likely we'll need to redefine | 12 | # enough in this area it's likely we'll need to redefine |
13 | # AC_USE_SYSTEM_EXTENSIONS for quite some time. | 13 | # AC_USE_SYSTEM_EXTENSIONS for quite some time. |
14 | 14 | ||
15 | # If autoconf reports a warning | ||
16 | # warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS | ||
17 | # or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS | ||
18 | # the fix is | ||
19 | # 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked | ||
20 | # but always AC_REQUIREd, | ||
21 | # 2) to ensure that for each occurrence of | ||
22 | # AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | ||
23 | # or | ||
24 | # AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | ||
25 | # the corresponding gnulib module description has 'extensions' among | ||
26 | # its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS | ||
27 | # invocation occurs in gl_EARLY, not in gl_INIT. | ||
28 | |||
15 | # AC_USE_SYSTEM_EXTENSIONS | 29 | # AC_USE_SYSTEM_EXTENSIONS |
16 | # ------------------------ | 30 | # ------------------------ |
17 | # Enable extensions on systems that normally disable them, | 31 | # Enable extensions on systems that normally disable them, |
@@ -74,8 +88,8 @@ AC_BEFORE([$0], [AC_RUN_IFELSE])dnl | |||
74 | [ac_cv_safe_to_define___extensions__], | 88 | [ac_cv_safe_to_define___extensions__], |
75 | [AC_COMPILE_IFELSE( | 89 | [AC_COMPILE_IFELSE( |
76 | [AC_LANG_PROGRAM([[ | 90 | [AC_LANG_PROGRAM([[ |
77 | # define __EXTENSIONS__ 1 | 91 | # define __EXTENSIONS__ 1 |
78 | ]AC_INCLUDES_DEFAULT])], | 92 | ]AC_INCLUDES_DEFAULT])], |
79 | [ac_cv_safe_to_define___extensions__=yes], | 93 | [ac_cv_safe_to_define___extensions__=yes], |
80 | [ac_cv_safe_to_define___extensions__=no])]) | 94 | [ac_cv_safe_to_define___extensions__=no])]) |
81 | test $ac_cv_safe_to_define___extensions__ = yes && | 95 | test $ac_cv_safe_to_define___extensions__ = yes && |
diff --git a/gl/m4/fcntl-o.m4 b/gl/m4/fcntl-o.m4 new file mode 100644 index 00000000..d416a61c --- /dev/null +++ b/gl/m4/fcntl-o.m4 | |||
@@ -0,0 +1,81 @@ | |||
1 | # fcntl-o.m4 serial 1 | ||
2 | dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | dnl Written by Paul Eggert. | ||
8 | |||
9 | # Test whether the flags O_NOATIME and O_NOFOLLOW actually work. | ||
10 | # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. | ||
11 | # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. | ||
12 | AC_DEFUN([gl_FCNTL_O_FLAGS], | ||
13 | [ | ||
14 | dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW. | ||
15 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | ||
16 | AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], | ||
17 | [AC_RUN_IFELSE( | ||
18 | [AC_LANG_PROGRAM( | ||
19 | [[#include <sys/types.h> | ||
20 | #include <sys/stat.h> | ||
21 | #include <unistd.h> | ||
22 | #include <fcntl.h> | ||
23 | #ifndef O_NOATIME | ||
24 | #define O_NOATIME 0 | ||
25 | #endif | ||
26 | #ifndef O_NOFOLLOW | ||
27 | #define O_NOFOLLOW 0 | ||
28 | #endif | ||
29 | static int const constants[] = | ||
30 | { | ||
31 | O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, | ||
32 | O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY | ||
33 | }; | ||
34 | ]], | ||
35 | [[ | ||
36 | int status = !constants; | ||
37 | { | ||
38 | static char const sym[] = "conftest.sym"; | ||
39 | if (symlink (".", sym) != 0 | ||
40 | || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0) | ||
41 | status |= 32; | ||
42 | unlink (sym); | ||
43 | } | ||
44 | { | ||
45 | static char const file[] = "confdefs.h"; | ||
46 | int fd = open (file, O_RDONLY | O_NOATIME); | ||
47 | char c; | ||
48 | struct stat st0, st1; | ||
49 | if (fd < 0 | ||
50 | || fstat (fd, &st0) != 0 | ||
51 | || sleep (1) != 0 | ||
52 | || read (fd, &c, 1) != 1 | ||
53 | || close (fd) != 0 | ||
54 | || stat (file, &st1) != 0 | ||
55 | || st0.st_atime != st1.st_atime) | ||
56 | status |= 64; | ||
57 | } | ||
58 | return status;]])], | ||
59 | [gl_cv_header_working_fcntl_h=yes], | ||
60 | [case $? in #( | ||
61 | 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( | ||
62 | 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( | ||
63 | 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( | ||
64 | *) gl_cv_header_working_fcntl_h='no';; | ||
65 | esac], | ||
66 | [gl_cv_header_working_fcntl_h=cross-compiling])]) | ||
67 | |||
68 | case $gl_cv_header_working_fcntl_h in #( | ||
69 | *O_NOATIME* | no | cross-compiling) ac_val=0;; #( | ||
70 | *) ac_val=1;; | ||
71 | esac | ||
72 | AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], | ||
73 | [Define to 1 if O_NOATIME works.]) | ||
74 | |||
75 | case $gl_cv_header_working_fcntl_h in #( | ||
76 | *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( | ||
77 | *) ac_val=1;; | ||
78 | esac | ||
79 | AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], | ||
80 | [Define to 1 if O_NOFOLLOW works.]) | ||
81 | ]) | ||
diff --git a/gl/m4/fcntl-safer.m4 b/gl/m4/fcntl-safer.m4 index 3475b0a7..1a739b09 100644 --- a/gl/m4/fcntl-safer.m4 +++ b/gl/m4/fcntl-safer.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | #serial 5 | 1 | #serial 7 |
2 | dnl Copyright (C) 2005-2007 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -8,4 +8,12 @@ AC_DEFUN([gl_FCNTL_SAFER], | |||
8 | [ | 8 | [ |
9 | AC_LIBOBJ([open-safer]) | 9 | AC_LIBOBJ([open-safer]) |
10 | AC_LIBOBJ([creat-safer]) | 10 | AC_LIBOBJ([creat-safer]) |
11 | # Prerequisites of lib/open-safer.c. | ||
12 | AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T]) | ||
13 | ]) | ||
14 | |||
15 | AC_DEFUN([gl_OPENAT_SAFER], | ||
16 | [ | ||
17 | AC_REQUIRE([gl_FCNTL_SAFER]) | ||
18 | AC_LIBOBJ([openat-safer]) | ||
11 | ]) | 19 | ]) |
diff --git a/gl/m4/fcntl.m4 b/gl/m4/fcntl.m4 new file mode 100644 index 00000000..fcb5f447 --- /dev/null +++ b/gl/m4/fcntl.m4 | |||
@@ -0,0 +1,83 @@ | |||
1 | # fcntl.m4 serial 3 | ||
2 | dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | # For now, this module ensures that fcntl() | ||
8 | # - supports F_DUPFD correctly | ||
9 | # - supports or emulates F_DUPFD_CLOEXEC | ||
10 | # - supports F_GETFD | ||
11 | # Still to be ported to mingw: | ||
12 | # - F_SETFD | ||
13 | # - F_GETFL, F_SETFL | ||
14 | # - F_GETOWN, F_SETOWN | ||
15 | # - F_GETLK, F_SETLK, F_SETLKW | ||
16 | AC_DEFUN([gl_FUNC_FCNTL], | ||
17 | [ | ||
18 | dnl Persuade glibc to expose F_DUPFD_CLOEXEC. | ||
19 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | ||
20 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | ||
21 | AC_REQUIRE([AC_CANONICAL_HOST]) | ||
22 | AC_CHECK_FUNCS_ONCE([fcntl]) | ||
23 | if test $ac_cv_func_fcntl = no; then | ||
24 | gl_REPLACE_FCNTL | ||
25 | else | ||
26 | dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target | ||
27 | AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly], | ||
28 | [gl_cv_func_fcntl_f_dupfd_works], | ||
29 | [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | ||
30 | #include <fcntl.h> | ||
31 | ]], [[return fcntl (0, F_DUPFD, -1) != -1; | ||
32 | ]])], | ||
33 | [gl_cv_func_fcntl_f_dupfd_works=yes], | ||
34 | [gl_cv_func_fcntl_f_dupfd_works=no], | ||
35 | [# Guess that it works on glibc systems | ||
36 | case $host_os in #(( | ||
37 | *-gnu*) gl_cv_func_fcntl_f_dupfd_works="guessing yes";; | ||
38 | *) gl_cv_func_fcntl_f_dupfd_works="guessing no";; | ||
39 | esac])]) | ||
40 | case $gl_cv_func_fcntl_f_dupfd_works in | ||
41 | *yes) ;; | ||
42 | *) gl_REPLACE_FCNTL | ||
43 | AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD | ||
44 | behavior does not match POSIX]) ;; | ||
45 | esac | ||
46 | |||
47 | dnl Many systems lack F_DUPFD_CLOEXEC | ||
48 | AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC], | ||
49 | [gl_cv_func_fcntl_f_dupfd_cloexec], | ||
50 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ | ||
51 | #include <fcntl.h> | ||
52 | #ifndef F_DUPFD_CLOEXEC | ||
53 | choke me | ||
54 | #endif | ||
55 | ]])], | ||
56 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ | ||
57 | #ifdef __linux__ | ||
58 | /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace | ||
59 | it to support the semantics on older kernels that failed with EINVAL. */ | ||
60 | choke me | ||
61 | #endif | ||
62 | ]])], | ||
63 | [gl_cv_func_fcntl_f_dupfd_cloexec=yes], | ||
64 | [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])], | ||
65 | [gl_cv_func_fcntl_f_dupfd_cloexec=no])]) | ||
66 | if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then | ||
67 | gl_REPLACE_FCNTL | ||
68 | dnl No witness macro needed for this bug. | ||
69 | fi | ||
70 | fi | ||
71 | ]) | ||
72 | |||
73 | AC_DEFUN([gl_REPLACE_FCNTL], | ||
74 | [ | ||
75 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | ||
76 | AC_CHECK_FUNCS_ONCE([fcntl]) | ||
77 | if test $ac_cv_func_fcntl = no; then | ||
78 | HAVE_FCNTL=0 | ||
79 | else | ||
80 | REPLACE_FCNTL=1 | ||
81 | fi | ||
82 | AC_LIBOBJ([fcntl]) | ||
83 | ]) | ||
diff --git a/gl/m4/fcntl_h.m4 b/gl/m4/fcntl_h.m4 index 1ae0b15a..e41915c3 100644 --- a/gl/m4/fcntl_h.m4 +++ b/gl/m4/fcntl_h.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # serial 12 | ||
1 | # Configure fcntl.h. | 2 | # Configure fcntl.h. |
2 | dnl Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2006, 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
@@ -9,88 +10,34 @@ dnl Written by Paul Eggert. | |||
9 | AC_DEFUN([gl_FCNTL_H], | 10 | AC_DEFUN([gl_FCNTL_H], |
10 | [ | 11 | [ |
11 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | 12 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) |
12 | dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW. | 13 | AC_REQUIRE([gl_FCNTL_O_FLAGS]) |
13 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | ||
14 | AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], | ||
15 | [AC_RUN_IFELSE( | ||
16 | [AC_LANG_PROGRAM( | ||
17 | [[#include <sys/types.h> | ||
18 | #include <sys/stat.h> | ||
19 | #include <unistd.h> | ||
20 | #include <fcntl.h> | ||
21 | #ifndef O_NOATIME | ||
22 | #define O_NOATIME 0 | ||
23 | #endif | ||
24 | #ifndef O_NOFOLLOW | ||
25 | #define O_NOFOLLOW 0 | ||
26 | #endif | ||
27 | static int const constants[] = | ||
28 | { | ||
29 | O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, | ||
30 | O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY | ||
31 | }; | ||
32 | ]], | ||
33 | [[ | ||
34 | int status = !constants; | ||
35 | { | ||
36 | static char const sym[] = "conftest.sym"; | ||
37 | if (symlink (".", sym) != 0 | ||
38 | || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0) | ||
39 | status |= 32; | ||
40 | } | ||
41 | { | ||
42 | static char const file[] = "confdefs.h"; | ||
43 | int fd = open (file, O_RDONLY | O_NOATIME); | ||
44 | char c; | ||
45 | struct stat st0, st1; | ||
46 | if (fd < 0 | ||
47 | || fstat (fd, &st0) != 0 | ||
48 | || sleep (1) != 0 | ||
49 | || read (fd, &c, 1) != 1 | ||
50 | || close (fd) != 0 | ||
51 | || stat (file, &st1) != 0 | ||
52 | || st0.st_atime != st1.st_atime) | ||
53 | status |= 64; | ||
54 | } | ||
55 | return status;]])], | ||
56 | [gl_cv_header_working_fcntl_h=yes], | ||
57 | [case $? in #( | ||
58 | 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( | ||
59 | 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( | ||
60 | 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( | ||
61 | *) gl_cv_header_working_fcntl_h='no';; | ||
62 | esac], | ||
63 | [gl_cv_header_working_fcntl_h=cross-compiling])]) | ||
64 | |||
65 | case $gl_cv_header_working_fcntl_h in #( | ||
66 | *O_NOATIME* | no | cross-compiling) ac_val=0;; #( | ||
67 | *) ac_val=1;; | ||
68 | esac | ||
69 | AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], | ||
70 | [Define to 1 if O_NOATIME works.]) | ||
71 | |||
72 | case $gl_cv_header_working_fcntl_h in #( | ||
73 | *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( | ||
74 | *) ac_val=1;; | ||
75 | esac | ||
76 | AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], | ||
77 | [Define to 1 if O_NOFOLLOW works.]) | ||
78 | |||
79 | gl_CHECK_NEXT_HEADERS([fcntl.h]) | 14 | gl_CHECK_NEXT_HEADERS([fcntl.h]) |
80 | FCNTL_H='fcntl.h' | 15 | |
81 | AC_SUBST([FCNTL_H]) | 16 | dnl Check for declarations of anything we want to poison if the |
17 | dnl corresponding gnulib module is not in use, if it is not common | ||
18 | dnl enough to be declared everywhere. | ||
19 | gl_WARN_ON_USE_PREPARE([[#include <fcntl.h> | ||
20 | ]], [fcntl openat]) | ||
82 | ]) | 21 | ]) |
83 | 22 | ||
84 | AC_DEFUN([gl_FCNTL_MODULE_INDICATOR], | 23 | AC_DEFUN([gl_FCNTL_MODULE_INDICATOR], |
85 | [ | 24 | [ |
86 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 25 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
87 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | 26 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) |
88 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 27 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
28 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
29 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
89 | ]) | 30 | ]) |
90 | 31 | ||
91 | AC_DEFUN([gl_FCNTL_H_DEFAULTS], | 32 | AC_DEFUN([gl_FCNTL_H_DEFAULTS], |
92 | [ | 33 | [ |
93 | GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) | 34 | GNULIB_FCNTL=0; AC_SUBST([GNULIB_FCNTL]) |
35 | GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) | ||
36 | GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT]) | ||
94 | dnl Assume proper GNU behavior unless another module says otherwise. | 37 | dnl Assume proper GNU behavior unless another module says otherwise. |
95 | REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) | 38 | HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL]) |
39 | HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT]) | ||
40 | REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL]) | ||
41 | REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) | ||
42 | REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT]) | ||
96 | ]) | 43 | ]) |
diff --git a/gl/m4/float_h.m4 b/gl/m4/float_h.m4 index d36e3a46..a74a0d95 100644 --- a/gl/m4/float_h.m4 +++ b/gl/m4/float_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # float_h.m4 serial 3 | 1 | # float_h.m4 serial 3 |
2 | dnl Copyright (C) 2007 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/floorf.m4 b/gl/m4/floorf.m4 index 915e5664..fb17a5ea 100644 --- a/gl/m4/floorf.m4 +++ b/gl/m4/floorf.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # floorf.m4 serial 4 | 1 | # floorf.m4 serial 6 |
2 | dnl Copyright (C) 2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -20,13 +20,12 @@ AC_DEFUN([gl_FUNC_FLOORF], | |||
20 | REPLACE_FLOORF=1 | 20 | REPLACE_FLOORF=1 |
21 | fi | 21 | fi |
22 | else | 22 | else |
23 | REPLACE_FLOORF=1 | 23 | HAVE_DECL_FLOORF=0 |
24 | fi | 24 | fi |
25 | if test $REPLACE_FLOORF = 1; then | 25 | if test $HAVE_DECL_FLOORF = 0 || test $REPLACE_FLOORF = 1; then |
26 | AC_LIBOBJ([floorf]) | 26 | AC_LIBOBJ([floorf]) |
27 | FLOORF_LIBM= | 27 | FLOORF_LIBM= |
28 | fi | 28 | fi |
29 | AC_SUBST([REPLACE_FLOORF]) | ||
30 | AC_SUBST([FLOORF_LIBM]) | 29 | AC_SUBST([FLOORF_LIBM]) |
31 | ]) | 30 | ]) |
32 | 31 | ||
diff --git a/gl/m4/fstypename.m4 b/gl/m4/fstypename.m4 index aa676f3a..9e81efe3 100644 --- a/gl/m4/fstypename.m4 +++ b/gl/m4/fstypename.m4 | |||
@@ -6,7 +6,8 @@ dnl See if struct statfs has the f_fstypename member. | |||
6 | dnl If so, define HAVE_STRUCT_STATFS_F_FSTYPENAME. | 6 | dnl If so, define HAVE_STRUCT_STATFS_F_FSTYPENAME. |
7 | dnl | 7 | dnl |
8 | 8 | ||
9 | # Copyright (C) 1998, 1999, 2001, 2004, 2006 Free Software Foundation, Inc. | 9 | # Copyright (C) 1998-1999, 2001, 2004, 2006, 2009-2010 Free Software |
10 | # Foundation, Inc. | ||
10 | # This file is free software; the Free Software Foundation | 11 | # This file is free software; the Free Software Foundation |
11 | # gives unlimited permission to copy and/or distribute it, | 12 | # gives unlimited permission to copy and/or distribute it, |
12 | # with or without modifications, as long as this notice is preserved. | 13 | # with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/fsusage.m4 b/gl/m4/fsusage.m4 index 8b8cbf72..216b9dd8 100644 --- a/gl/m4/fsusage.m4 +++ b/gl/m4/fsusage.m4 | |||
@@ -1,7 +1,7 @@ | |||
1 | # serial 24 | 1 | # serial 25 |
2 | # Obtaining file system usage information. | 2 | # Obtaining file system usage information. |
3 | 3 | ||
4 | # Copyright (C) 1997-1998, 2000-2001, 2003-2009 Free Software Foundation, Inc. | 4 | # Copyright (C) 1997-1998, 2000-2001, 2003-2010 Free Software Foundation, Inc. |
5 | # | 5 | # |
6 | # This file is free software; the Free Software Foundation | 6 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 7 | # gives unlimited permission to copy and/or distribute it, |
@@ -46,7 +46,7 @@ ac_fsusage_space=no | |||
46 | if test $ac_fsusage_space = no; then | 46 | if test $ac_fsusage_space = no; then |
47 | # SVR4 | 47 | # SVR4 |
48 | AC_CACHE_CHECK([for statvfs function (SVR4)], [fu_cv_sys_stat_statvfs], | 48 | AC_CACHE_CHECK([for statvfs function (SVR4)], [fu_cv_sys_stat_statvfs], |
49 | [AC_TRY_LINK([#include <sys/types.h> | 49 | [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> |
50 | #if defined __GLIBC__ && defined __linux__ | 50 | #if defined __GLIBC__ && defined __linux__ |
51 | Do not use statvfs on systems with GNU libc on Linux, because that function | 51 | Do not use statvfs on systems with GNU libc on Linux, because that function |
52 | stats all preceding entries in /proc/mounts, and that makes df hang if even | 52 | stats all preceding entries in /proc/mounts, and that makes df hang if even |
@@ -59,14 +59,14 @@ a system call. | |||
59 | "Do not use Tru64's statvfs implementation" | 59 | "Do not use Tru64's statvfs implementation" |
60 | #endif | 60 | #endif |
61 | 61 | ||
62 | #include <sys/statvfs.h>], | 62 | #include <sys/statvfs.h>]], |
63 | [struct statvfs fsd; statvfs (0, &fsd);], | 63 | [[struct statvfs fsd; statvfs (0, &fsd);]])], |
64 | fu_cv_sys_stat_statvfs=yes, | 64 | [fu_cv_sys_stat_statvfs=yes], |
65 | fu_cv_sys_stat_statvfs=no)]) | 65 | [fu_cv_sys_stat_statvfs=no])]) |
66 | if test $fu_cv_sys_stat_statvfs = yes; then | 66 | if test $fu_cv_sys_stat_statvfs = yes; then |
67 | ac_fsusage_space=yes | 67 | ac_fsusage_space=yes |
68 | AC_DEFINE([STAT_STATVFS], [1], | 68 | AC_DEFINE([STAT_STATVFS], [1], |
69 | [ Define if there is a function named statvfs. (SVR4)]) | 69 | [ Define if there is a function named statvfs. (SVR4)]) |
70 | fi | 70 | fi |
71 | fi | 71 | fi |
72 | 72 | ||
@@ -74,7 +74,7 @@ if test $ac_fsusage_space = no; then | |||
74 | # DEC Alpha running OSF/1 | 74 | # DEC Alpha running OSF/1 |
75 | AC_MSG_CHECKING([for 3-argument statfs function (DEC OSF/1)]) | 75 | AC_MSG_CHECKING([for 3-argument statfs function (DEC OSF/1)]) |
76 | AC_CACHE_VAL([fu_cv_sys_stat_statfs3_osf1], | 76 | AC_CACHE_VAL([fu_cv_sys_stat_statfs3_osf1], |
77 | [AC_TRY_RUN([ | 77 | [AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
78 | #include <sys/param.h> | 78 | #include <sys/param.h> |
79 | #include <sys/types.h> | 79 | #include <sys/types.h> |
80 | #include <sys/mount.h> | 80 | #include <sys/mount.h> |
@@ -84,15 +84,15 @@ if test $ac_fsusage_space = no; then | |||
84 | struct statfs fsd; | 84 | struct statfs fsd; |
85 | fsd.f_fsize = 0; | 85 | fsd.f_fsize = 0; |
86 | return statfs (".", &fsd, sizeof (struct statfs)) != 0; | 86 | return statfs (".", &fsd, sizeof (struct statfs)) != 0; |
87 | }], | 87 | }]])], |
88 | fu_cv_sys_stat_statfs3_osf1=yes, | 88 | [fu_cv_sys_stat_statfs3_osf1=yes], |
89 | fu_cv_sys_stat_statfs3_osf1=no, | 89 | [fu_cv_sys_stat_statfs3_osf1=no], |
90 | fu_cv_sys_stat_statfs3_osf1=no)]) | 90 | [fu_cv_sys_stat_statfs3_osf1=no])]) |
91 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs3_osf1]) | 91 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs3_osf1]) |
92 | if test $fu_cv_sys_stat_statfs3_osf1 = yes; then | 92 | if test $fu_cv_sys_stat_statfs3_osf1 = yes; then |
93 | ac_fsusage_space=yes | 93 | ac_fsusage_space=yes |
94 | AC_DEFINE([STAT_STATFS3_OSF1], [1], | 94 | AC_DEFINE([STAT_STATFS3_OSF1], [1], |
95 | [ Define if statfs takes 3 args. (DEC Alpha running OSF/1)]) | 95 | [ Define if statfs takes 3 args. (DEC Alpha running OSF/1)]) |
96 | fi | 96 | fi |
97 | fi | 97 | fi |
98 | 98 | ||
@@ -101,7 +101,7 @@ if test $ac_fsusage_space = no; then | |||
101 | AC_MSG_CHECKING([for two-argument statfs with statfs.bsize dnl | 101 | AC_MSG_CHECKING([for two-argument statfs with statfs.bsize dnl |
102 | member (AIX, 4.3BSD)]) | 102 | member (AIX, 4.3BSD)]) |
103 | AC_CACHE_VAL([fu_cv_sys_stat_statfs2_bsize], | 103 | AC_CACHE_VAL([fu_cv_sys_stat_statfs2_bsize], |
104 | [AC_TRY_RUN([ | 104 | [AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
105 | #ifdef HAVE_SYS_PARAM_H | 105 | #ifdef HAVE_SYS_PARAM_H |
106 | #include <sys/param.h> | 106 | #include <sys/param.h> |
107 | #endif | 107 | #endif |
@@ -117,10 +117,10 @@ member (AIX, 4.3BSD)]) | |||
117 | struct statfs fsd; | 117 | struct statfs fsd; |
118 | fsd.f_bsize = 0; | 118 | fsd.f_bsize = 0; |
119 | return statfs (".", &fsd) != 0; | 119 | return statfs (".", &fsd) != 0; |
120 | }], | 120 | }]])], |
121 | fu_cv_sys_stat_statfs2_bsize=yes, | 121 | [fu_cv_sys_stat_statfs2_bsize=yes], |
122 | fu_cv_sys_stat_statfs2_bsize=no, | 122 | [fu_cv_sys_stat_statfs2_bsize=no], |
123 | fu_cv_sys_stat_statfs2_bsize=no)]) | 123 | [fu_cv_sys_stat_statfs2_bsize=no])]) |
124 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs2_bsize]) | 124 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs2_bsize]) |
125 | if test $fu_cv_sys_stat_statfs2_bsize = yes; then | 125 | if test $fu_cv_sys_stat_statfs2_bsize = yes; then |
126 | ac_fsusage_space=yes | 126 | ac_fsusage_space=yes |
@@ -134,22 +134,23 @@ if test $ac_fsusage_space = no; then | |||
134 | # SVR3 | 134 | # SVR3 |
135 | AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)]) | 135 | AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)]) |
136 | AC_CACHE_VAL([fu_cv_sys_stat_statfs4], | 136 | AC_CACHE_VAL([fu_cv_sys_stat_statfs4], |
137 | [AC_TRY_RUN([#include <sys/types.h> | 137 | [AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
138 | #include <sys/types.h> | ||
138 | #include <sys/statfs.h> | 139 | #include <sys/statfs.h> |
139 | int | 140 | int |
140 | main () | 141 | main () |
141 | { | 142 | { |
142 | struct statfs fsd; | 143 | struct statfs fsd; |
143 | return statfs (".", &fsd, sizeof fsd, 0) != 0; | 144 | return statfs (".", &fsd, sizeof fsd, 0) != 0; |
144 | }], | 145 | }]])], |
145 | fu_cv_sys_stat_statfs4=yes, | 146 | [fu_cv_sys_stat_statfs4=yes], |
146 | fu_cv_sys_stat_statfs4=no, | 147 | [fu_cv_sys_stat_statfs4=no], |
147 | fu_cv_sys_stat_statfs4=no)]) | 148 | [fu_cv_sys_stat_statfs4=no])]) |
148 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs4]) | 149 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs4]) |
149 | if test $fu_cv_sys_stat_statfs4 = yes; then | 150 | if test $fu_cv_sys_stat_statfs4 = yes; then |
150 | ac_fsusage_space=yes | 151 | ac_fsusage_space=yes |
151 | AC_DEFINE([STAT_STATFS4], [1], | 152 | AC_DEFINE([STAT_STATFS4], [1], |
152 | [ Define if statfs takes 4 args. (SVR3, Dynix, Irix, Dolphin)]) | 153 | [ Define if statfs takes 4 args. (SVR3, Dynix, Irix, Dolphin)]) |
153 | fi | 154 | fi |
154 | fi | 155 | fi |
155 | 156 | ||
@@ -158,7 +159,8 @@ if test $ac_fsusage_space = no; then | |||
158 | AC_MSG_CHECKING([for two-argument statfs with statfs.fsize dnl | 159 | AC_MSG_CHECKING([for two-argument statfs with statfs.fsize dnl |
159 | member (4.4BSD and NetBSD)]) | 160 | member (4.4BSD and NetBSD)]) |
160 | AC_CACHE_VAL([fu_cv_sys_stat_statfs2_fsize], | 161 | AC_CACHE_VAL([fu_cv_sys_stat_statfs2_fsize], |
161 | [AC_TRY_RUN([#include <sys/types.h> | 162 | [AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
163 | #include <sys/types.h> | ||
162 | #ifdef HAVE_SYS_PARAM_H | 164 | #ifdef HAVE_SYS_PARAM_H |
163 | #include <sys/param.h> | 165 | #include <sys/param.h> |
164 | #endif | 166 | #endif |
@@ -171,10 +173,10 @@ member (4.4BSD and NetBSD)]) | |||
171 | struct statfs fsd; | 173 | struct statfs fsd; |
172 | fsd.f_fsize = 0; | 174 | fsd.f_fsize = 0; |
173 | return statfs (".", &fsd) != 0; | 175 | return statfs (".", &fsd) != 0; |
174 | }], | 176 | }]])], |
175 | fu_cv_sys_stat_statfs2_fsize=yes, | 177 | [fu_cv_sys_stat_statfs2_fsize=yes], |
176 | fu_cv_sys_stat_statfs2_fsize=no, | 178 | [fu_cv_sys_stat_statfs2_fsize=no], |
177 | fu_cv_sys_stat_statfs2_fsize=no)]) | 179 | [fu_cv_sys_stat_statfs2_fsize=no])]) |
178 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs2_fsize]) | 180 | AC_MSG_RESULT([$fu_cv_sys_stat_statfs2_fsize]) |
179 | if test $fu_cv_sys_stat_statfs2_fsize = yes; then | 181 | if test $fu_cv_sys_stat_statfs2_fsize = yes; then |
180 | ac_fsusage_space=yes | 182 | ac_fsusage_space=yes |
@@ -188,7 +190,8 @@ if test $ac_fsusage_space = no; then | |||
188 | # Ultrix | 190 | # Ultrix |
189 | AC_MSG_CHECKING([for two-argument statfs with struct fs_data (Ultrix)]) | 191 | AC_MSG_CHECKING([for two-argument statfs with struct fs_data (Ultrix)]) |
190 | AC_CACHE_VAL([fu_cv_sys_stat_fs_data], | 192 | AC_CACHE_VAL([fu_cv_sys_stat_fs_data], |
191 | [AC_TRY_RUN([#include <sys/types.h> | 193 | [AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
194 | #include <sys/types.h> | ||
192 | #ifdef HAVE_SYS_PARAM_H | 195 | #ifdef HAVE_SYS_PARAM_H |
193 | #include <sys/param.h> | 196 | #include <sys/param.h> |
194 | #endif | 197 | #endif |
@@ -205,10 +208,10 @@ if test $ac_fsusage_space = no; then | |||
205 | /* Ultrix's statfs returns 1 for success, | 208 | /* Ultrix's statfs returns 1 for success, |
206 | 0 for not mounted, -1 for failure. */ | 209 | 0 for not mounted, -1 for failure. */ |
207 | return statfs (".", &fsd) != 1; | 210 | return statfs (".", &fsd) != 1; |
208 | }], | 211 | }]])], |
209 | fu_cv_sys_stat_fs_data=yes, | 212 | [fu_cv_sys_stat_fs_data=yes], |
210 | fu_cv_sys_stat_fs_data=no, | 213 | [fu_cv_sys_stat_fs_data=no], |
211 | fu_cv_sys_stat_fs_data=no)]) | 214 | [fu_cv_sys_stat_fs_data=no])]) |
212 | AC_MSG_RESULT([$fu_cv_sys_stat_fs_data]) | 215 | AC_MSG_RESULT([$fu_cv_sys_stat_fs_data]) |
213 | if test $fu_cv_sys_stat_fs_data = yes; then | 216 | if test $fu_cv_sys_stat_fs_data = yes; then |
214 | ac_fsusage_space=yes | 217 | ac_fsusage_space=yes |
@@ -220,12 +223,12 @@ fi | |||
220 | 223 | ||
221 | if test $ac_fsusage_space = no; then | 224 | if test $ac_fsusage_space = no; then |
222 | # SVR2 | 225 | # SVR2 |
223 | AC_TRY_CPP([#include <sys/filsys.h> | 226 | AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <sys/filsys.h> |
224 | ], | 227 | ]])], |
225 | AC_DEFINE([STAT_READ_FILSYS], [1], | 228 | [AC_DEFINE([STAT_READ_FILSYS], [1], |
226 | [Define if there is no specific function for reading file systems usage | 229 | [Define if there is no specific function for reading file systems usage |
227 | information and you have the <sys/filsys.h> header file. (SVR2)]) | 230 | information and you have the <sys/filsys.h> header file. (SVR2)]) |
228 | ac_fsusage_space=yes) | 231 | ac_fsusage_space=yes]) |
229 | fi | 232 | fi |
230 | 233 | ||
231 | AS_IF([test $ac_fsusage_space = yes], [$1], [$2]) | 234 | AS_IF([test $ac_fsusage_space = yes], [$1], [$2]) |
@@ -246,8 +249,8 @@ choke -- this is a workaround for a Sun-specific problem | |||
246 | #endif | 249 | #endif |
247 | #include <sys/types.h> | 250 | #include <sys/types.h> |
248 | #include <sys/vfs.h>]], | 251 | #include <sys/vfs.h>]], |
249 | [[struct statfs t; long c = *(t.f_spare); | 252 | [[struct statfs t; long c = *(t.f_spare); |
250 | if (c) return 0;]])], | 253 | if (c) return 0;]])], |
251 | [fu_cv_sys_truncating_statfs=yes], | 254 | [fu_cv_sys_truncating_statfs=yes], |
252 | [fu_cv_sys_truncating_statfs=no])]) | 255 | [fu_cv_sys_truncating_statfs=no])]) |
253 | if test $fu_cv_sys_truncating_statfs = yes; then | 256 | if test $fu_cv_sys_truncating_statfs = yes; then |
diff --git a/gl/m4/getaddrinfo.m4 b/gl/m4/getaddrinfo.m4 index 40886719..bc3066db 100644 --- a/gl/m4/getaddrinfo.m4 +++ b/gl/m4/getaddrinfo.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # getaddrinfo.m4 serial 20 | 1 | # getaddrinfo.m4 serial 23 |
2 | dnl Copyright (C) 2004-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -25,7 +25,7 @@ AC_DEFUN([gl_GETADDRINFO], | |||
25 | LIBS="$gai_saved_LIBS $GETADDRINFO_LIB" | 25 | LIBS="$gai_saved_LIBS $GETADDRINFO_LIB" |
26 | 26 | ||
27 | AC_CACHE_CHECK([for getaddrinfo], [gl_cv_func_getaddrinfo], [ | 27 | AC_CACHE_CHECK([for getaddrinfo], [gl_cv_func_getaddrinfo], [ |
28 | AC_TRY_LINK([ | 28 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[ |
29 | #include <sys/types.h> | 29 | #include <sys/types.h> |
30 | #ifdef HAVE_SYS_SOCKET_H | 30 | #ifdef HAVE_SYS_SOCKET_H |
31 | #include <sys/socket.h> | 31 | #include <sys/socket.h> |
@@ -34,21 +34,21 @@ AC_DEFUN([gl_GETADDRINFO], | |||
34 | #include <netdb.h> | 34 | #include <netdb.h> |
35 | #endif | 35 | #endif |
36 | #include <stddef.h> | 36 | #include <stddef.h> |
37 | ], [getaddrinfo("", "", NULL, NULL);], | 37 | ]], [[getaddrinfo("", "", NULL, NULL);]])], |
38 | [gl_cv_func_getaddrinfo=yes], | 38 | [gl_cv_func_getaddrinfo=yes], |
39 | [gl_cv_func_getaddrinfo=no])]) | 39 | [gl_cv_func_getaddrinfo=no])]) |
40 | if test $gl_cv_func_getaddrinfo = no; then | 40 | if test $gl_cv_func_getaddrinfo = no; then |
41 | AC_CACHE_CHECK([for getaddrinfo in ws2tcpip.h and -lws2_32], | 41 | AC_CACHE_CHECK([for getaddrinfo in ws2tcpip.h and -lws2_32], |
42 | gl_cv_w32_getaddrinfo, [ | 42 | gl_cv_w32_getaddrinfo, [ |
43 | gl_cv_w32_getaddrinfo=no | 43 | gl_cv_w32_getaddrinfo=no |
44 | am_save_LIBS="$LIBS" | 44 | am_save_LIBS="$LIBS" |
45 | LIBS="$LIBS -lws2_32" | 45 | LIBS="$LIBS -lws2_32" |
46 | AC_TRY_LINK([ | 46 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[ |
47 | #ifdef HAVE_WS2TCPIP_H | 47 | #ifdef HAVE_WS2TCPIP_H |
48 | #include <ws2tcpip.h> | 48 | #include <ws2tcpip.h> |
49 | #endif | 49 | #endif |
50 | #include <stddef.h> | 50 | #include <stddef.h> |
51 | ], [getaddrinfo(NULL, NULL, NULL, NULL);], gl_cv_w32_getaddrinfo=yes) | 51 | ]], [[getaddrinfo(NULL, NULL, NULL, NULL);]])], [gl_cv_w32_getaddrinfo=yes]) |
52 | LIBS="$am_save_LIBS" | 52 | LIBS="$am_save_LIBS" |
53 | ]) | 53 | ]) |
54 | if test "$gl_cv_w32_getaddrinfo" = "yes"; then | 54 | if test "$gl_cv_w32_getaddrinfo" = "yes"; then |
@@ -64,7 +64,7 @@ AC_DEFUN([gl_GETADDRINFO], | |||
64 | # header included somehow. | 64 | # header included somehow. |
65 | AC_CACHE_CHECK([for gai_strerror (possibly via ws2tcpip.h)], | 65 | AC_CACHE_CHECK([for gai_strerror (possibly via ws2tcpip.h)], |
66 | gl_cv_func_gai_strerror, [ | 66 | gl_cv_func_gai_strerror, [ |
67 | AC_TRY_LINK([ | 67 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[ |
68 | #include <sys/types.h> | 68 | #include <sys/types.h> |
69 | #ifdef HAVE_SYS_SOCKET_H | 69 | #ifdef HAVE_SYS_SOCKET_H |
70 | #include <sys/socket.h> | 70 | #include <sys/socket.h> |
@@ -76,7 +76,7 @@ AC_DEFUN([gl_GETADDRINFO], | |||
76 | #include <ws2tcpip.h> | 76 | #include <ws2tcpip.h> |
77 | #endif | 77 | #endif |
78 | #include <stddef.h> | 78 | #include <stddef.h> |
79 | ], [gai_strerror (NULL);], | 79 | ]], [[gai_strerror (NULL);]])], |
80 | [gl_cv_func_gai_strerror=yes], | 80 | [gl_cv_func_gai_strerror=yes], |
81 | [gl_cv_func_gai_strerror=no])]) | 81 | [gl_cv_func_gai_strerror=no])]) |
82 | if test $gl_cv_func_gai_strerror = no; then | 82 | if test $gl_cv_func_gai_strerror = no; then |
@@ -96,6 +96,7 @@ AC_DEFUN([gl_PREREQ_GETADDRINFO], [ | |||
96 | AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H | 96 | AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H |
97 | AC_REQUIRE([gl_HOSTENT]) dnl for HOSTENT_LIB | 97 | AC_REQUIRE([gl_HOSTENT]) dnl for HOSTENT_LIB |
98 | AC_REQUIRE([gl_SERVENT]) dnl for SERVENT_LIB | 98 | AC_REQUIRE([gl_SERVENT]) dnl for SERVENT_LIB |
99 | AC_REQUIRE([gl_FUNC_INET_NTOP]) dnl for INET_NTOP_LIB | ||
99 | AC_REQUIRE([AC_C_RESTRICT]) | 100 | AC_REQUIRE([AC_C_RESTRICT]) |
100 | AC_REQUIRE([gl_SOCKET_FAMILIES]) | 101 | AC_REQUIRE([gl_SOCKET_FAMILIES]) |
101 | AC_REQUIRE([gl_HEADER_SYS_SOCKET]) | 102 | AC_REQUIRE([gl_HEADER_SYS_SOCKET]) |
@@ -163,4 +164,10 @@ AC_DEFUN([gl_PREREQ_GETADDRINFO], [ | |||
163 | *" $SERVENT_LIB "*) ;; | 164 | *" $SERVENT_LIB "*) ;; |
164 | *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;; | 165 | *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;; |
165 | esac | 166 | esac |
167 | |||
168 | dnl Append $INET_NTOP_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates. | ||
169 | case " $GETADDRINFO_LIB " in | ||
170 | *" $INET_NTOP_LIB "*) ;; | ||
171 | *) GETADDRINFO_LIB="$GETADDRINFO_LIB $INET_NTOP_LIB" ;; | ||
172 | esac | ||
166 | ]) | 173 | ]) |
diff --git a/gl/m4/getdtablesize.m4 b/gl/m4/getdtablesize.m4 new file mode 100644 index 00000000..d2386284 --- /dev/null +++ b/gl/m4/getdtablesize.m4 | |||
@@ -0,0 +1,15 @@ | |||
1 | # getdtablesize.m4 serial 1 | ||
2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_FUNC_GETDTABLESIZE], | ||
8 | [ | ||
9 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | ||
10 | AC_CHECK_FUNCS_ONCE([getdtablesize]) | ||
11 | if test $ac_cv_func_getdtablesize != yes; then | ||
12 | HAVE_GETDTABLESIZE=0 | ||
13 | AC_LIBOBJ([getdtablesize]) | ||
14 | fi | ||
15 | ]) | ||
diff --git a/gl/m4/gethostname.m4 b/gl/m4/gethostname.m4 index 6b6fca95..ef0b43ef 100644 --- a/gl/m4/gethostname.m4 +++ b/gl/m4/gethostname.m4 | |||
@@ -1,21 +1,101 @@ | |||
1 | # gethostname.m4 serial 5 | 1 | # gethostname.m4 serial 9 |
2 | dnl Copyright (C) 2002, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
6 | 6 | ||
7 | # Ensure | ||
8 | # - the gethostname() function, | ||
9 | # - the HOST_NAME_MAX macro in <limits.h>. | ||
7 | AC_DEFUN([gl_FUNC_GETHOSTNAME], | 10 | AC_DEFUN([gl_FUNC_GETHOSTNAME], |
8 | [ | 11 | [ |
9 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | 12 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) |
10 | gl_PREREQ_SYS_H_WINSOCK2 | 13 | gl_PREREQ_SYS_H_WINSOCK2 |
11 | AC_REPLACE_FUNCS([gethostname]) | 14 | |
12 | if test $ac_cv_func_gethostname = no; then | 15 | dnl Where is gethostname() defined? |
16 | dnl - On native Windows, it is in ws2_32.dll. | ||
17 | dnl - Otherwise is is in libc. | ||
18 | GETHOSTNAME_LIB= | ||
19 | AC_CHECK_FUNCS([gethostname], , [ | ||
20 | AC_CACHE_CHECK([for gethostname in winsock2.h and -lws2_32], | ||
21 | [gl_cv_w32_gethostname], | ||
22 | [gl_cv_w32_gethostname=no | ||
23 | gl_save_LIBS="$LIBS" | ||
24 | LIBS="$LIBS -lws2_32" | ||
25 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
26 | #ifdef HAVE_WINSOCK2_H | ||
27 | #include <winsock2.h> | ||
28 | #endif | ||
29 | #include <stddef.h> | ||
30 | ]], [[gethostname(NULL, 0);]])], [gl_cv_w32_gethostname=yes]) | ||
31 | LIBS="$gl_save_LIBS" | ||
32 | ]) | ||
33 | if test "$gl_cv_w32_gethostname" = "yes"; then | ||
34 | GETHOSTNAME_LIB="-lws2_32" | ||
35 | fi | ||
36 | ]) | ||
37 | AC_SUBST([GETHOSTNAME_LIB]) | ||
38 | |||
39 | if test "$ac_cv_func_gethostname" = no; then | ||
40 | AC_LIBOBJ([gethostname]) | ||
13 | HAVE_GETHOSTNAME=0 | 41 | HAVE_GETHOSTNAME=0 |
14 | gl_PREREQ_GETHOSTNAME | 42 | gl_PREREQ_GETHOSTNAME |
15 | fi | 43 | fi |
44 | |||
45 | dnl Also provide HOST_NAME_MAX when <limits.h> lacks it. | ||
46 | dnl - On most Unix systems, use MAXHOSTNAMELEN from <sys/param.h> instead. | ||
47 | dnl - On Solaris, Cygwin, BeOS, use MAXHOSTNAMELEN from <netdb.h> instead. | ||
48 | dnl - On mingw, use 256, because | ||
49 | dnl <http://msdn.microsoft.com/en-us/library/ms738527.aspx> says: | ||
50 | dnl "if a buffer of 256 bytes is passed in the name parameter and | ||
51 | dnl the namelen parameter is set to 256, the buffer size will always | ||
52 | dnl be adequate." | ||
53 | dnl With this, there is no need to use sysconf (_SC_HOST_NAME_MAX), which | ||
54 | dnl is not a compile-time constant. | ||
55 | dnl We cannot override <limits.h> using the usual technique, because | ||
56 | dnl gl_CHECK_NEXT_HEADERS does not work for <limits.h>. Therefore retrieve | ||
57 | dnl the value of HOST_NAME_MAX at configure time. | ||
58 | AC_CHECK_HEADERS_ONCE([sys/param.h]) | ||
59 | AC_CHECK_HEADERS_ONCE([sys/socket.h]) | ||
60 | AC_CHECK_HEADERS_ONCE([netdb.h]) | ||
61 | AC_CACHE_CHECK([for HOST_NAME_MAX], [gl_cv_decl_HOST_NAME_MAX], [ | ||
62 | gl_cv_decl_HOST_NAME_MAX= | ||
63 | AC_EGREP_CPP([lucky], [ | ||
64 | #include <limits.h> | ||
65 | #ifdef HOST_NAME_MAX | ||
66 | lucky | ||
67 | #endif | ||
68 | ], [gl_cv_decl_HOST_NAME_MAX=yes]) | ||
69 | if test -z "$gl_cv_decl_HOST_NAME_MAX"; then | ||
70 | dnl It's not defined in <limits.h>. Substitute it. | ||
71 | if test "$gl_cv_w32_gethostname" = yes; then | ||
72 | dnl mingw. | ||
73 | gl_cv_decl_HOST_NAME_MAX=256 | ||
74 | else | ||
75 | _AC_COMPUTE_INT([MAXHOSTNAMELEN], [gl_cv_decl_HOST_NAME_MAX], [ | ||
76 | #include <sys/types.h> | ||
77 | #if HAVE_SYS_PARAM_H | ||
78 | # include <sys/param.h> | ||
79 | #endif | ||
80 | #if HAVE_SYS_SOCKET_H | ||
81 | # include <sys/socket.h> | ||
82 | #endif | ||
83 | #if HAVE_NETDB_H | ||
84 | # include <netdb.h> | ||
85 | #endif | ||
86 | ]) | ||
87 | fi | ||
88 | fi | ||
89 | ]) | ||
90 | if test "$gl_cv_decl_HOST_NAME_MAX" != yes; then | ||
91 | AC_DEFINE_UNQUOTED([HOST_NAME_MAX], [$gl_cv_decl_HOST_NAME_MAX], | ||
92 | [Define HOST_NAME_MAX when <limits.h> does not define it.]) | ||
93 | fi | ||
16 | ]) | 94 | ]) |
17 | 95 | ||
18 | # Prerequisites of lib/gethostname.c. | 96 | # Prerequisites of lib/gethostname.c. |
19 | AC_DEFUN([gl_PREREQ_GETHOSTNAME], [ | 97 | AC_DEFUN([gl_PREREQ_GETHOSTNAME], [ |
20 | AC_CHECK_FUNCS([uname]) | 98 | if test "$gl_cv_w32_gethostname" != "yes"; then |
99 | AC_CHECK_FUNCS([uname]) | ||
100 | fi | ||
21 | ]) | 101 | ]) |
diff --git a/gl/m4/getloadavg.m4 b/gl/m4/getloadavg.m4 index 015bcac2..0a731c4f 100644 --- a/gl/m4/getloadavg.m4 +++ b/gl/m4/getloadavg.m4 | |||
@@ -1,7 +1,7 @@ | |||
1 | # Check for getloadavg. | 1 | # Check for getloadavg. |
2 | 2 | ||
3 | # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2003, | 3 | # Copyright (C) 1992-1996, 1999-2000, 2002-2003, 2006, 2008-2010 Free Software |
4 | # 2006, 2008, 2009 Free Software Foundation, Inc. | 4 | # Foundation, Inc. |
5 | 5 | ||
6 | # This file is free software; the Free Software Foundation | 6 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 7 | # gives unlimited permission to copy and/or distribute it, |
@@ -60,17 +60,17 @@ if test $gl_have_func = no; then | |||
60 | gl_getloadavg_LIBS=$LIBS | 60 | gl_getloadavg_LIBS=$LIBS |
61 | LIBS="-L/usr/local/lib $LIBS" | 61 | LIBS="-L/usr/local/lib $LIBS" |
62 | AC_CHECK_LIB([getloadavg], [getloadavg], | 62 | AC_CHECK_LIB([getloadavg], [getloadavg], |
63 | [LIBS="-lgetloadavg $LIBS"], [LIBS=$gl_getloadavg_LIBS]) | 63 | [LIBS="-lgetloadavg $LIBS"], [LIBS=$gl_getloadavg_LIBS]) |
64 | fi | 64 | fi |
65 | 65 | ||
66 | # Make sure it is really in the library, if we think we found it, | 66 | # Make sure it is really in the library, if we think we found it, |
67 | # otherwise set up the replacement function. | 67 | # otherwise set up the replacement function. |
68 | AC_CHECK_FUNCS([getloadavg], [], | 68 | AC_CHECK_FUNCS([getloadavg], [], |
69 | [gl_PREREQ_GETLOADAVG]) | 69 | [gl_PREREQ_GETLOADAVG]) |
70 | 70 | ||
71 | # Some definitions of getloadavg require that the program be installed setgid. | 71 | # Some definitions of getloadavg require that the program be installed setgid. |
72 | AC_CACHE_CHECK([whether getloadavg requires setgid], | 72 | AC_CACHE_CHECK([whether getloadavg requires setgid], |
73 | gl_cv_func_getloadavg_setgid, | 73 | gl_cv_func_getloadavg_setgid, |
74 | [AC_EGREP_CPP([Yowza Am I SETGID yet], | 74 | [AC_EGREP_CPP([Yowza Am I SETGID yet], |
75 | [#define CONFIGURING_GETLOADAVG | 75 | [#define CONFIGURING_GETLOADAVG |
76 | #include "$srcdir/$1/getloadavg.c" | 76 | #include "$srcdir/$1/getloadavg.c" |
@@ -78,13 +78,13 @@ AC_CACHE_CHECK([whether getloadavg requires setgid], | |||
78 | Yowza Am I SETGID yet | 78 | Yowza Am I SETGID yet |
79 | #endif | 79 | #endif |
80 | ], | 80 | ], |
81 | gl_cv_func_getloadavg_setgid=yes, | 81 | gl_cv_func_getloadavg_setgid=yes, |
82 | gl_cv_func_getloadavg_setgid=no)]) | 82 | gl_cv_func_getloadavg_setgid=no)]) |
83 | if test $gl_cv_func_getloadavg_setgid = yes; then | 83 | if test $gl_cv_func_getloadavg_setgid = yes; then |
84 | NEED_SETGID=true | 84 | NEED_SETGID=true |
85 | AC_DEFINE([GETLOADAVG_PRIVILEGED], [1], | 85 | AC_DEFINE([GETLOADAVG_PRIVILEGED], [1], |
86 | [Define to 1 if the `getloadavg' function needs to be run setuid | 86 | [Define to 1 if the `getloadavg' function needs to be run setuid |
87 | or setgid.]) | 87 | or setgid.]) |
88 | else | 88 | else |
89 | NEED_SETGID=false | 89 | NEED_SETGID=false |
90 | fi | 90 | fi |
@@ -98,8 +98,8 @@ if test $gl_cv_func_getloadavg_setgid = yes; then | |||
98 | test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem` | 98 | test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem` |
99 | gl_cv_group_kmem=`echo $ac_ls_output \ | 99 | gl_cv_group_kmem=`echo $ac_ls_output \ |
100 | | sed -ne ['s/[ ][ ]*/ /g | 100 | | sed -ne ['s/[ ][ ]*/ /g |
101 | s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/ | 101 | s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/ |
102 | / /s/.* //;p']` | 102 | / /s/.* //;p']` |
103 | ]) | 103 | ]) |
104 | AC_SUBST([KMEM_GROUP], [$gl_cv_group_kmem])dnl | 104 | AC_SUBST([KMEM_GROUP], [$gl_cv_group_kmem])dnl |
105 | fi | 105 | fi |
@@ -154,8 +154,8 @@ if test $gl_have_func = no; then | |||
154 | [gl_have_func=yes | 154 | [gl_have_func=yes |
155 | AC_DEFINE([UMAX], [1], [Define to 1 for Encore UMAX.]) | 155 | AC_DEFINE([UMAX], [1], [Define to 1 for Encore UMAX.]) |
156 | AC_DEFINE([UMAX4_3], [1], | 156 | AC_DEFINE([UMAX4_3], [1], |
157 | [Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h> | 157 | [Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h> |
158 | instead of <sys/cpustats.h>.])]) | 158 | instead of <sys/cpustats.h>.])]) |
159 | fi | 159 | fi |
160 | 160 | ||
161 | if test $gl_have_func = no; then | 161 | if test $gl_have_func = no; then |
@@ -169,10 +169,19 @@ fi | |||
169 | 169 | ||
170 | AC_CHECK_HEADERS([nlist.h], | 170 | AC_CHECK_HEADERS([nlist.h], |
171 | [AC_CHECK_MEMBERS([struct nlist.n_un.n_name], | 171 | [AC_CHECK_MEMBERS([struct nlist.n_un.n_name], |
172 | [AC_DEFINE([NLIST_NAME_UNION], [1], | 172 | [AC_DEFINE([NLIST_NAME_UNION], [1], |
173 | [Define to 1 if your `struct nlist' has an | 173 | [Define to 1 if your `struct nlist' has an |
174 | `n_un' member. Obsolete, depend on | 174 | `n_un' member. Obsolete, depend on |
175 | `HAVE_STRUCT_NLIST_N_UN_N_NAME])], [], | 175 | `HAVE_STRUCT_NLIST_N_UN_N_NAME])], [], |
176 | [@%:@include <nlist.h>]) | 176 | [@%:@include <nlist.h>]) |
177 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <nlist.h>]], | ||
178 | [[struct nlist x; | ||
179 | #ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME | ||
180 | x.n_un.n_name = ""; | ||
181 | #else | ||
182 | x.n_name = ""; | ||
183 | #endif]])], | ||
184 | [AC_DEFINE([N_NAME_POINTER], [1], | ||
185 | [Define to 1 if the nlist n_name member is a pointer])]) | ||
177 | ])dnl | 186 | ])dnl |
178 | ])# gl_PREREQ_GETLOADAVG | 187 | ])# gl_PREREQ_GETLOADAVG |
diff --git a/gl/m4/getopt.m4 b/gl/m4/getopt.m4 index 9b683c2f..a19805ea 100644 --- a/gl/m4/getopt.m4 +++ b/gl/m4/getopt.m4 | |||
@@ -1,82 +1,272 @@ | |||
1 | # getopt.m4 serial 14 | 1 | # getopt.m4 serial 24 |
2 | dnl Copyright (C) 2002-2006, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
6 | 6 | ||
7 | # The getopt module assume you want GNU getopt, with getopt_long etc, | 7 | # Request a POSIX compliant getopt function. |
8 | # rather than vanilla POSIX getopt. This means your code should | 8 | AC_DEFUN([gl_FUNC_GETOPT_POSIX], |
9 | # always include <getopt.h> for the getopt prototypes. | 9 | [ |
10 | m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX]) | ||
11 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | ||
12 | gl_GETOPT_IFELSE([ | ||
13 | gl_REPLACE_GETOPT | ||
14 | ], | ||
15 | []) | ||
16 | ]) | ||
17 | |||
18 | # Request a POSIX compliant getopt function with GNU extensions (such as | ||
19 | # options with optional arguments) and the functions getopt_long, | ||
20 | # getopt_long_only. | ||
21 | AC_DEFUN([gl_FUNC_GETOPT_GNU], | ||
22 | [ | ||
23 | m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU]) | ||
24 | |||
25 | AC_REQUIRE([gl_FUNC_GETOPT_POSIX]) | ||
26 | ]) | ||
10 | 27 | ||
11 | AC_DEFUN([gl_GETOPT_SUBSTITUTE], | 28 | # Request the gnulib implementation of the getopt functions unconditionally. |
29 | # argp.m4 uses this. | ||
30 | AC_DEFUN([gl_REPLACE_GETOPT], | ||
12 | [ | 31 | [ |
32 | dnl Arrange for getopt.h to be created. | ||
33 | gl_GETOPT_SUBSTITUTE_HEADER | ||
34 | dnl Arrange for unistd.h to include getopt.h. | ||
35 | GNULIB_UNISTD_H_GETOPT=1 | ||
36 | dnl Arrange to compile the getopt implementation. | ||
13 | AC_LIBOBJ([getopt]) | 37 | AC_LIBOBJ([getopt]) |
14 | AC_LIBOBJ([getopt1]) | 38 | AC_LIBOBJ([getopt1]) |
15 | gl_GETOPT_SUBSTITUTE_HEADER | ||
16 | gl_PREREQ_GETOPT | 39 | gl_PREREQ_GETOPT |
17 | ]) | 40 | ]) |
18 | 41 | ||
19 | AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], | 42 | # emacs' configure.in uses this. |
43 | AC_DEFUN([gl_GETOPT_IFELSE], | ||
20 | [ | 44 | [ |
21 | GETOPT_H=getopt.h | 45 | AC_REQUIRE([gl_GETOPT_CHECK_HEADERS]) |
22 | AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], | 46 | AS_IF([test -n "$gl_replace_getopt"], [$1], [$2]) |
23 | [Define to rpl_ if the getopt replacement functions and variables | ||
24 | should be used.]) | ||
25 | AC_SUBST([GETOPT_H]) | ||
26 | ]) | 47 | ]) |
27 | 48 | ||
49 | # Determine whether to replace the entire getopt facility. | ||
28 | AC_DEFUN([gl_GETOPT_CHECK_HEADERS], | 50 | AC_DEFUN([gl_GETOPT_CHECK_HEADERS], |
29 | [ | 51 | [ |
30 | if test -z "$GETOPT_H"; then | 52 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles |
31 | AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h]) | 53 | |
54 | dnl Persuade Solaris <unistd.h> to declare optarg, optind, opterr, optopt. | ||
55 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | ||
56 | |||
57 | gl_CHECK_NEXT_HEADERS([getopt.h]) | ||
58 | AC_CHECK_HEADERS_ONCE([getopt.h]) | ||
59 | if test $ac_cv_header_getopt_h = yes; then | ||
60 | HAVE_GETOPT_H=1 | ||
61 | else | ||
62 | HAVE_GETOPT_H=0 | ||
63 | fi | ||
64 | AC_SUBST([HAVE_GETOPT_H]) | ||
65 | |||
66 | gl_replace_getopt= | ||
67 | |||
68 | dnl Test whether <getopt.h> is available. | ||
69 | if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then | ||
70 | AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes]) | ||
71 | fi | ||
72 | |||
73 | dnl Test whether the function getopt_long is available. | ||
74 | if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then | ||
75 | AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes]) | ||
32 | fi | 76 | fi |
33 | 77 | ||
34 | if test -z "$GETOPT_H"; then | 78 | dnl BSD getopt_long uses an incompatible method to reset option processing. |
35 | AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h]) | 79 | dnl Existence of the variable, in and of itself, is not a reason to replace |
80 | dnl getopt, but knowledge of the variable is needed to determine how to | ||
81 | dnl reset and whether a reset reparses the environment. | ||
82 | if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then | ||
83 | AC_CHECK_DECLS([optreset], [], [], | ||
84 | [[#include <getopt.h>]]) | ||
36 | fi | 85 | fi |
37 | 86 | ||
38 | dnl BSD getopt_long uses an incompatible method to reset option processing, | 87 | dnl mingw's getopt (in libmingwex.a) does weird things when the options |
39 | dnl and (as of 2004-10-15) mishandles optional option-arguments. | 88 | dnl strings starts with '+' and it's not the first call. Some internal state |
40 | if test -z "$GETOPT_H"; then | 89 | dnl is left over from earlier calls, and neither setting optind = 0 nor |
41 | AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include <getopt.h>]) | 90 | dnl setting optreset = 1 get rid of this internal state. |
91 | dnl POSIX is silent on optind vs. optreset, so we allow either behavior. | ||
92 | if test -z "$gl_replace_getopt"; then | ||
93 | AC_CACHE_CHECK([whether getopt is POSIX compatible], | ||
94 | [gl_cv_func_getopt_posix], | ||
95 | [ | ||
96 | dnl This test fails on mingw and succeeds on all other platforms. | ||
97 | AC_RUN_IFELSE([AC_LANG_SOURCE([[ | ||
98 | #include <unistd.h> | ||
99 | #include <stdlib.h> | ||
100 | #include <string.h> | ||
101 | |||
102 | #if !HAVE_DECL_OPTRESET | ||
103 | # define OPTIND_MIN 0 | ||
104 | #else | ||
105 | # define OPTIND_MIN 1 | ||
106 | #endif | ||
107 | |||
108 | int | ||
109 | main () | ||
110 | { | ||
111 | { | ||
112 | int argc = 0; | ||
113 | char *argv[10]; | ||
114 | int c; | ||
115 | |||
116 | argv[argc++] = "program"; | ||
117 | argv[argc++] = "-a"; | ||
118 | argv[argc++] = "foo"; | ||
119 | argv[argc++] = "bar"; | ||
120 | argv[argc] = NULL; | ||
121 | optind = OPTIND_MIN; | ||
122 | opterr = 0; | ||
123 | |||
124 | c = getopt (argc, argv, "ab"); | ||
125 | if (!(c == 'a')) | ||
126 | return 1; | ||
127 | c = getopt (argc, argv, "ab"); | ||
128 | if (!(c == -1)) | ||
129 | return 2; | ||
130 | if (!(optind == 2)) | ||
131 | return 3; | ||
132 | } | ||
133 | /* Some internal state exists at this point. */ | ||
134 | { | ||
135 | int argc = 0; | ||
136 | char *argv[10]; | ||
137 | int c; | ||
138 | |||
139 | argv[argc++] = "program"; | ||
140 | argv[argc++] = "donald"; | ||
141 | argv[argc++] = "-p"; | ||
142 | argv[argc++] = "billy"; | ||
143 | argv[argc++] = "duck"; | ||
144 | argv[argc++] = "-a"; | ||
145 | argv[argc++] = "bar"; | ||
146 | argv[argc] = NULL; | ||
147 | optind = OPTIND_MIN; | ||
148 | opterr = 0; | ||
149 | |||
150 | c = getopt (argc, argv, "+abp:q:"); | ||
151 | if (!(c == -1)) | ||
152 | return 4; | ||
153 | if (!(strcmp (argv[0], "program") == 0)) | ||
154 | return 5; | ||
155 | if (!(strcmp (argv[1], "donald") == 0)) | ||
156 | return 6; | ||
157 | if (!(strcmp (argv[2], "-p") == 0)) | ||
158 | return 7; | ||
159 | if (!(strcmp (argv[3], "billy") == 0)) | ||
160 | return 8; | ||
161 | if (!(strcmp (argv[4], "duck") == 0)) | ||
162 | return 9; | ||
163 | if (!(strcmp (argv[5], "-a") == 0)) | ||
164 | return 10; | ||
165 | if (!(strcmp (argv[6], "bar") == 0)) | ||
166 | return 11; | ||
167 | if (!(optind == 1)) | ||
168 | return 12; | ||
169 | } | ||
170 | |||
171 | return 0; | ||
172 | } | ||
173 | ]])], | ||
174 | [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no], | ||
175 | [case "$host_os" in | ||
176 | mingw*) gl_cv_func_getopt_posix="guessing no";; | ||
177 | *) gl_cv_func_getopt_posix="guessing yes";; | ||
178 | esac | ||
179 | ]) | ||
180 | ]) | ||
181 | case "$gl_cv_func_getopt_posix" in | ||
182 | *no) gl_replace_getopt=yes ;; | ||
183 | esac | ||
42 | fi | 184 | fi |
43 | 185 | ||
44 | dnl Solaris 10 getopt doesn't handle `+' as a leading character in an | 186 | if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then |
45 | dnl option string (as of 2005-05-05). | 187 | AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu], |
46 | if test -z "$GETOPT_H"; then | 188 | [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the |
47 | AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt], | 189 | # optstring is necessary for programs like m4 that have POSIX-mandated |
48 | [AC_RUN_IFELSE( | 190 | # semantics for supporting options interspersed with files. |
49 | [AC_LANG_PROGRAM([[#include <getopt.h>]], | 191 | # Also, since getopt_long is a GNU extension, we require optind=0. |
50 | [[ | 192 | gl_had_POSIXLY_CORRECT=${POSIXLY_CORRECT:+yes} |
51 | char *myargv[3]; | 193 | POSIXLY_CORRECT=1 |
52 | myargv[0] = "conftest"; | 194 | export POSIXLY_CORRECT |
53 | myargv[1] = "-+"; | 195 | AC_RUN_IFELSE( |
54 | myargv[2] = 0; | 196 | [AC_LANG_PROGRAM([[#include <getopt.h> |
55 | return getopt (2, myargv, "+a") != '?'; | 197 | #include <stddef.h> |
56 | ]])], | 198 | #include <string.h> |
57 | [gl_cv_func_gnu_getopt=yes], | 199 | ]], [[ |
58 | [gl_cv_func_gnu_getopt=no], | 200 | /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, |
59 | [dnl cross compiling - pessimistically guess based on decls | 201 | and fails on MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, |
60 | dnl Solaris 10 getopt doesn't handle `+' as a leading character in an | 202 | OSF/1 5.1, Solaris 10. */ |
61 | dnl option string (as of 2005-05-05). | 203 | { |
62 | AC_CHECK_DECL([getopt_clip], | 204 | char *myargv[3]; |
63 | [gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes], | 205 | myargv[0] = "conftest"; |
64 | [#include <getopt.h>])])]) | 206 | myargv[1] = "-+"; |
65 | if test "$gl_cv_func_gnu_getopt" = "no"; then | 207 | myargv[2] = 0; |
66 | GETOPT_H=getopt.h | 208 | opterr = 0; |
209 | if (getopt (2, myargv, "+a") != '?') | ||
210 | return 1; | ||
211 | } | ||
212 | /* This code succeeds on glibc 2.8, mingw, | ||
213 | and fails on MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, | ||
214 | IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ | ||
215 | { | ||
216 | char *argv[] = { "program", "-p", "foo", "bar", NULL }; | ||
217 | |||
218 | optind = 1; | ||
219 | if (getopt (4, argv, "p::") != 'p') | ||
220 | return 2; | ||
221 | if (optarg != NULL) | ||
222 | return 3; | ||
223 | if (getopt (4, argv, "p::") != -1) | ||
224 | return 4; | ||
225 | if (optind != 2) | ||
226 | return 5; | ||
227 | } | ||
228 | /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ | ||
229 | { | ||
230 | char *argv[] = { "program", "foo", "-p", NULL }; | ||
231 | optind = 0; | ||
232 | if (getopt (3, argv, "-p") != 1) | ||
233 | return 6; | ||
234 | if (getopt (3, argv, "-p") != 'p') | ||
235 | return 7; | ||
236 | } | ||
237 | return 0; | ||
238 | ]])], | ||
239 | [gl_cv_func_getopt_gnu=yes], | ||
240 | [gl_cv_func_getopt_gnu=no], | ||
241 | [dnl Cross compiling. Guess based on host and declarations. | ||
242 | case $host_os:$ac_cv_have_decl_optreset in | ||
243 | *-gnu*:* | mingw*:*) gl_cv_func_getopt_gnu=no;; | ||
244 | *:yes) gl_cv_func_getopt_gnu=no;; | ||
245 | *) gl_cv_func_getopt_gnu=yes;; | ||
246 | esac | ||
247 | ]) | ||
248 | if test "$gl_had_POSIXLY_CORRECT" != yes; then | ||
249 | AS_UNSET([POSIXLY_CORRECT]) | ||
250 | fi | ||
251 | ]) | ||
252 | if test "$gl_cv_func_getopt_gnu" = "no"; then | ||
253 | gl_replace_getopt=yes | ||
67 | fi | 254 | fi |
68 | fi | 255 | fi |
69 | ]) | 256 | ]) |
70 | 257 | ||
71 | AC_DEFUN([gl_GETOPT_IFELSE], | 258 | # emacs' configure.in uses this. |
259 | AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], | ||
72 | [ | 260 | [ |
73 | AC_REQUIRE([gl_GETOPT_CHECK_HEADERS]) | 261 | GETOPT_H=getopt.h |
74 | AS_IF([test -n "$GETOPT_H"], [$1], [$2]) | 262 | AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], |
263 | [Define to rpl_ if the getopt replacement functions and variables | ||
264 | should be used.]) | ||
265 | AC_SUBST([GETOPT_H]) | ||
75 | ]) | 266 | ]) |
76 | 267 | ||
77 | AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])]) | ||
78 | |||
79 | # Prerequisites of lib/getopt*. | 268 | # Prerequisites of lib/getopt*. |
269 | # emacs' configure.in uses this. | ||
80 | AC_DEFUN([gl_PREREQ_GETOPT], | 270 | AC_DEFUN([gl_PREREQ_GETOPT], |
81 | [ | 271 | [ |
82 | AC_CHECK_DECLS_ONCE([getenv]) | 272 | AC_CHECK_DECLS_ONCE([getenv]) |
diff --git a/gl/m4/gettext.m4 b/gl/m4/gettext.m4 index d90c8500..d6dc3fe2 100644 --- a/gl/m4/gettext.m4 +++ b/gl/m4/gettext.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # gettext.m4 serial 62 (gettext-0.18) | 1 | # gettext.m4 serial 62 (gettext-0.18) |
2 | dnl Copyright (C) 1995-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/glibc2.m4 b/gl/m4/glibc2.m4 index fe58a0f3..f148c12c 100644 --- a/gl/m4/glibc2.m4 +++ b/gl/m4/glibc2.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # glibc2.m4 serial 2 | 1 | # glibc2.m4 serial 2 |
2 | dnl Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -12,16 +12,16 @@ AC_DEFUN([gt_GLIBC2], | |||
12 | AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer], | 12 | AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer], |
13 | [ac_cv_gnu_library_2], | 13 | [ac_cv_gnu_library_2], |
14 | [AC_EGREP_CPP([Lucky GNU user], | 14 | [AC_EGREP_CPP([Lucky GNU user], |
15 | [ | 15 | [ |
16 | #include <features.h> | 16 | #include <features.h> |
17 | #ifdef __GNU_LIBRARY__ | 17 | #ifdef __GNU_LIBRARY__ |
18 | #if (__GLIBC__ >= 2) | 18 | #if (__GLIBC__ >= 2) |
19 | Lucky GNU user | 19 | Lucky GNU user |
20 | #endif | 20 | #endif |
21 | #endif | 21 | #endif |
22 | ], | 22 | ], |
23 | [ac_cv_gnu_library_2=yes], | 23 | [ac_cv_gnu_library_2=yes], |
24 | [ac_cv_gnu_library_2=no]) | 24 | [ac_cv_gnu_library_2=no]) |
25 | ] | 25 | ] |
26 | ) | 26 | ) |
27 | AC_SUBST([GLIBC2]) | 27 | AC_SUBST([GLIBC2]) |
diff --git a/gl/m4/glibc21.m4 b/gl/m4/glibc21.m4 index 93fbf474..68ada9d4 100644 --- a/gl/m4/glibc21.m4 +++ b/gl/m4/glibc21.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # glibc21.m4 serial 4 | 1 | # glibc21.m4 serial 4 |
2 | dnl Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -12,16 +12,16 @@ AC_DEFUN([gl_GLIBC21], | |||
12 | AC_CACHE_CHECK([whether we are using the GNU C Library 2.1 or newer], | 12 | AC_CACHE_CHECK([whether we are using the GNU C Library 2.1 or newer], |
13 | [ac_cv_gnu_library_2_1], | 13 | [ac_cv_gnu_library_2_1], |
14 | [AC_EGREP_CPP([Lucky GNU user], | 14 | [AC_EGREP_CPP([Lucky GNU user], |
15 | [ | 15 | [ |
16 | #include <features.h> | 16 | #include <features.h> |
17 | #ifdef __GNU_LIBRARY__ | 17 | #ifdef __GNU_LIBRARY__ |
18 | #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) | 18 | #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) |
19 | Lucky GNU user | 19 | Lucky GNU user |
20 | #endif | 20 | #endif |
21 | #endif | 21 | #endif |
22 | ], | 22 | ], |
23 | [ac_cv_gnu_library_2_1=yes], | 23 | [ac_cv_gnu_library_2_1=yes], |
24 | [ac_cv_gnu_library_2_1=no]) | 24 | [ac_cv_gnu_library_2_1=no]) |
25 | ] | 25 | ] |
26 | ) | 26 | ) |
27 | AC_SUBST([GLIBC21]) | 27 | AC_SUBST([GLIBC21]) |
diff --git a/gl/m4/gnulib-cache.m4 b/gl/m4/gnulib-cache.m4 index 385f5432..0ac6b969 100644 --- a/gl/m4/gnulib-cache.m4 +++ b/gl/m4/gnulib-cache.m4 | |||
@@ -1,4 +1,4 @@ | |||
1 | # Copyright (C) 2002-2009 Free Software Foundation, Inc. | 1 | # Copyright (C) 2002-2010 Free Software Foundation, Inc. |
2 | # | 2 | # |
3 | # This file is free software, distributed under the terms of the GNU | 3 | # This file is free software, distributed under the terms of the GNU |
4 | # General Public License. As a special exception to the GNU General | 4 | # General Public License. As a special exception to the GNU General |
diff --git a/gl/m4/gnulib-common.m4 b/gl/m4/gnulib-common.m4 index c8fda203..9cc519e7 100644 --- a/gl/m4/gnulib-common.m4 +++ b/gl/m4/gnulib-common.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # gnulib-common.m4 serial 11 | 1 | # gnulib-common.m4 serial 18 |
2 | dnl Copyright (C) 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -23,23 +23,77 @@ AC_DEFUN([gl_COMMON_BODY], [ | |||
23 | # define __GNUC_STDC_INLINE__ 1 | 23 | # define __GNUC_STDC_INLINE__ 1 |
24 | #endif]) | 24 | #endif]) |
25 | AH_VERBATIM([unused_parameter], | 25 | AH_VERBATIM([unused_parameter], |
26 | [/* Define as a marker that can be attached to function parameter declarations | 26 | [/* Define as a marker that can be attached to declarations that might not |
27 | for parameters that are not used. This helps to reduce warnings, such as | 27 | be used. This helps to reduce warnings, such as from |
28 | from GCC -Wunused-parameter. */ | 28 | GCC -Wunused-parameter. */ |
29 | #if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) | 29 | #if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) |
30 | # define _UNUSED_PARAMETER_ __attribute__ ((__unused__)) | 30 | # define _GL_UNUSED __attribute__ ((__unused__)) |
31 | #else | 31 | #else |
32 | # define _UNUSED_PARAMETER_ | 32 | # define _GL_UNUSED |
33 | #endif | 33 | #endif |
34 | /* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name | ||
35 | is a misnomer outside of parameter lists. */ | ||
36 | #define _UNUSED_PARAMETER_ _GL_UNUSED | ||
34 | ]) | 37 | ]) |
35 | ]) | 38 | ]) |
36 | 39 | ||
40 | # gl_MODULE_INDICATOR_CONDITION | ||
41 | # expands to a C preprocessor expression that evaluates to 1 or 0, depending | ||
42 | # whether a gnulib module that has been requested shall be considered present | ||
43 | # or not. | ||
44 | AC_DEFUN([gl_MODULE_INDICATOR_CONDITION], [1]) | ||
45 | |||
46 | # gl_MODULE_INDICATOR_SET_VARIABLE([modulename]) | ||
47 | # sets the shell variable that indicates the presence of the given module to | ||
48 | # a C preprocessor expression that will evaluate to 1. | ||
49 | AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE], | ||
50 | [ | ||
51 | GNULIB_[]m4_translit([[$1]], | ||
52 | [abcdefghijklmnopqrstuvwxyz./-], | ||
53 | [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=gl_MODULE_INDICATOR_CONDITION | ||
54 | ]) | ||
55 | |||
37 | # gl_MODULE_INDICATOR([modulename]) | 56 | # gl_MODULE_INDICATOR([modulename]) |
38 | # defines a C macro indicating the presence of the given module. | 57 | # defines a C macro indicating the presence of the given module |
58 | # in a location where it can be used. | ||
59 | # | Value | Value | | ||
60 | # | in lib/ | in tests/ | | ||
61 | # --------------------------------------------+---------+-----------+ | ||
62 | # Module present among main modules: | 1 | 1 | | ||
63 | # --------------------------------------------+---------+-----------+ | ||
64 | # Module present among tests-related modules: | 0 | 1 | | ||
65 | # --------------------------------------------+---------+-----------+ | ||
66 | # Module not present at all: | 0 | 0 | | ||
67 | # --------------------------------------------+---------+-----------+ | ||
39 | AC_DEFUN([gl_MODULE_INDICATOR], | 68 | AC_DEFUN([gl_MODULE_INDICATOR], |
40 | [ | 69 | [ |
41 | AC_DEFINE([GNULIB_]translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1], | 70 | AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]], |
42 | [Define to 1 when using the gnulib module ]$1[.]) | 71 | [abcdefghijklmnopqrstuvwxyz./-], |
72 | [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), | ||
73 | [gl_MODULE_INDICATOR_CONDITION], | ||
74 | [Define to a C preprocessor expression that evaluates to 1 or 0, | ||
75 | depending whether the gnulib module $1 shall be considered present.]) | ||
76 | ]) | ||
77 | |||
78 | # gl_MODULE_INDICATOR_FOR_TESTS([modulename]) | ||
79 | # defines a C macro indicating the presence of the given module | ||
80 | # in lib or tests. This is useful to determine whether the module | ||
81 | # should be tested. | ||
82 | # | Value | Value | | ||
83 | # | in lib/ | in tests/ | | ||
84 | # --------------------------------------------+---------+-----------+ | ||
85 | # Module present among main modules: | 1 | 1 | | ||
86 | # --------------------------------------------+---------+-----------+ | ||
87 | # Module present among tests-related modules: | 1 | 1 | | ||
88 | # --------------------------------------------+---------+-----------+ | ||
89 | # Module not present at all: | 0 | 0 | | ||
90 | # --------------------------------------------+---------+-----------+ | ||
91 | AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], | ||
92 | [ | ||
93 | AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]], | ||
94 | [abcdefghijklmnopqrstuvwxyz./-], | ||
95 | [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1], | ||
96 | [Define to 1 when the gnulib module $1 should be tested.]) | ||
43 | ]) | 97 | ]) |
44 | 98 | ||
45 | # m4_foreach_w | 99 | # m4_foreach_w |
@@ -49,10 +103,25 @@ m4_ifndef([m4_foreach_w], | |||
49 | [m4_define([m4_foreach_w], | 103 | [m4_define([m4_foreach_w], |
50 | [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) | 104 | [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) |
51 | 105 | ||
106 | # AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH]) | ||
107 | # ---------------------------------------------------- | ||
108 | # Backport of autoconf-2.63b's macro. | ||
109 | # Remove this macro when we can assume autoconf >= 2.64. | ||
110 | m4_ifndef([AS_VAR_IF], | ||
111 | [m4_define([AS_VAR_IF], | ||
112 | [AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])]) | ||
113 | |||
52 | # AC_PROG_MKDIR_P | 114 | # AC_PROG_MKDIR_P |
53 | # is a backport of autoconf-2.60's AC_PROG_MKDIR_P. | 115 | # is a backport of autoconf-2.60's AC_PROG_MKDIR_P, with a fix |
54 | # Remove this macro when we can assume autoconf >= 2.60. | 116 | # for interoperability with automake-1.9.6 from autoconf-2.62. |
55 | m4_ifdef([AC_PROG_MKDIR_P], [], [ | 117 | # Remove this macro when we can assume autoconf >= 2.62 or |
118 | # autoconf >= 2.60 && automake >= 1.10. | ||
119 | m4_ifdef([AC_PROG_MKDIR_P], [ | ||
120 | dnl For automake-1.9.6 && autoconf < 2.62: Ensure MKDIR_P is AC_SUBSTed. | ||
121 | m4_define([AC_PROG_MKDIR_P], | ||
122 | m4_defn([AC_PROG_MKDIR_P])[ | ||
123 | AC_SUBST([MKDIR_P])])], [ | ||
124 | dnl For autoconf < 2.60: Backport of AC_PROG_MKDIR_P. | ||
56 | AC_DEFUN_ONCE([AC_PROG_MKDIR_P], | 125 | AC_DEFUN_ONCE([AC_PROG_MKDIR_P], |
57 | [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake | 126 | [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake |
58 | MKDIR_P='$(mkdir_p)' | 127 | MKDIR_P='$(mkdir_p)' |
@@ -70,13 +139,13 @@ AC_DEFUN([AC_C_RESTRICT], | |||
70 | for ac_kw in __restrict __restrict__ _Restrict restrict; do | 139 | for ac_kw in __restrict __restrict__ _Restrict restrict; do |
71 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM( | 140 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM( |
72 | [[typedef int * int_ptr; | 141 | [[typedef int * int_ptr; |
73 | int foo (int_ptr $ac_kw ip) { | 142 | int foo (int_ptr $ac_kw ip) { |
74 | return ip[0]; | 143 | return ip[0]; |
75 | }]], | 144 | }]], |
76 | [[int s[1]; | 145 | [[int s[1]; |
77 | int * $ac_kw t = s; | 146 | int * $ac_kw t = s; |
78 | t[0] = 0; | 147 | t[0] = 0; |
79 | return foo(t)]])], | 148 | return foo(t)]])], |
80 | [ac_cv_c_restrict=$ac_kw]) | 149 | [ac_cv_c_restrict=$ac_kw]) |
81 | test "$ac_cv_c_restrict" != no && break | 150 | test "$ac_cv_c_restrict" != no && break |
82 | done | 151 | done |
diff --git a/gl/m4/gnulib-comp.m4 b/gl/m4/gnulib-comp.m4 index 005cc4eb..4a956e44 100644 --- a/gl/m4/gnulib-comp.m4 +++ b/gl/m4/gnulib-comp.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # DO NOT EDIT! GENERATED AUTOMATICALLY! | 1 | # DO NOT EDIT! GENERATED AUTOMATICALLY! |
2 | # Copyright (C) 2002-2009 Free Software Foundation, Inc. | 2 | # Copyright (C) 2002-2010 Free Software Foundation, Inc. |
3 | # | 3 | # |
4 | # This file is free software, distributed under the terms of the GNU | 4 | # This file is free software, distributed under the terms of the GNU |
5 | # General Public License. As a special exception to the GNU General | 5 | # General Public License. As a special exception to the GNU General |
@@ -25,7 +25,108 @@ AC_DEFUN([gl_EARLY], | |||
25 | m4_pattern_allow([^gl_LIBOBJS$])dnl a variable | 25 | m4_pattern_allow([^gl_LIBOBJS$])dnl a variable |
26 | m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable | 26 | m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable |
27 | AC_REQUIRE([AC_PROG_RANLIB]) | 27 | AC_REQUIRE([AC_PROG_RANLIB]) |
28 | # Code from module alignof: | ||
29 | # Code from module alloca: | ||
30 | # Code from module alloca-opt: | ||
31 | # Code from module arg-nonnull: | ||
32 | # Code from module arpa_inet: | ||
33 | # Code from module base64: | ||
34 | # Code from module btowc: | ||
35 | # Code from module c++defs: | ||
36 | # Code from module c-strtod: | ||
37 | # Code from module cloexec: | ||
38 | # Code from module close-hook: | ||
39 | # Code from module configmake: | ||
40 | # Code from module dirname: | ||
41 | # Code from module dirname-lgpl: | ||
42 | # Code from module double-slash-root: | ||
43 | # Code from module dup2: | ||
44 | # Code from module errno: | ||
45 | # Code from module error: | ||
46 | # Code from module exitfail: | ||
47 | # Code from module extensions: | ||
28 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | 48 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) |
49 | # Code from module fcntl: | ||
50 | # Code from module fcntl-h: | ||
51 | # Code from module fcntl-safer: | ||
52 | # Code from module float: | ||
53 | # Code from module floorf: | ||
54 | # Code from module fsusage: | ||
55 | # Code from module full-read: | ||
56 | # Code from module full-write: | ||
57 | # Code from module getaddrinfo: | ||
58 | # Code from module getdtablesize: | ||
59 | # Code from module gethostname: | ||
60 | # Code from module getloadavg: | ||
61 | # Code from module getopt: | ||
62 | # Code from module getopt-gnu: | ||
63 | # Code from module getopt-posix: | ||
64 | # Code from module gettext: | ||
65 | # Code from module gettext-h: | ||
66 | # Code from module havelib: | ||
67 | # Code from module hostent: | ||
68 | # Code from module include_next: | ||
69 | # Code from module inet_ntop: | ||
70 | # Code from module inline: | ||
71 | # Code from module intprops: | ||
72 | # Code from module langinfo: | ||
73 | # Code from module localcharset: | ||
74 | # Code from module locale: | ||
75 | # Code from module malloc: | ||
76 | # Code from module malloc-posix: | ||
77 | # Code from module math: | ||
78 | # Code from module mbrtowc: | ||
79 | # Code from module mbsinit: | ||
80 | # Code from module memchr: | ||
81 | # Code from module mktime: | ||
82 | # Code from module mountlist: | ||
83 | # Code from module multiarch: | ||
84 | # Code from module netdb: | ||
85 | # Code from module netinet_in: | ||
86 | # Code from module nl_langinfo: | ||
87 | # Code from module open: | ||
88 | # Code from module regex: | ||
89 | # Code from module safe-read: | ||
90 | # Code from module safe-write: | ||
91 | # Code from module servent: | ||
92 | # Code from module size_max: | ||
93 | # Code from module snprintf: | ||
94 | # Code from module sockets: | ||
95 | # Code from module socklen: | ||
96 | # Code from module ssize_t: | ||
97 | # Code from module stat: | ||
98 | # Code from module stdbool: | ||
99 | # Code from module stddef: | ||
100 | # Code from module stdint: | ||
101 | # Code from module stdio: | ||
102 | # Code from module stdlib: | ||
103 | # Code from module strdup-posix: | ||
104 | # Code from module streq: | ||
105 | # Code from module strerror: | ||
106 | # Code from module string: | ||
107 | # Code from module strndup: | ||
108 | # Code from module strnlen: | ||
109 | # Code from module strstr-simple: | ||
110 | # Code from module sys_socket: | ||
111 | # Code from module sys_stat: | ||
112 | # Code from module time: | ||
113 | # Code from module time_r: | ||
114 | # Code from module timegm: | ||
115 | # Code from module unistd: | ||
116 | # Code from module unistd-safer: | ||
117 | # Code from module vasnprintf: | ||
118 | # Code from module vasprintf: | ||
119 | # Code from module verify: | ||
120 | # Code from module vsnprintf: | ||
121 | # Code from module warn-on-use: | ||
122 | # Code from module wchar: | ||
123 | # Code from module wcrtomb: | ||
124 | # Code from module wctype: | ||
125 | # Code from module write: | ||
126 | # Code from module xalloc: | ||
127 | # Code from module xalloc-die: | ||
128 | # Code from module xsize: | ||
129 | # Code from module xstrndup: | ||
29 | ]) | 130 | ]) |
30 | 131 | ||
31 | # This macro should be invoked from ./configure.in, in the section | 132 | # This macro should be invoked from ./configure.in, in the section |
@@ -36,6 +137,7 @@ AC_DEFUN([gl_INIT], | |||
36 | gl_cond_libtool=false | 137 | gl_cond_libtool=false |
37 | gl_libdeps= | 138 | gl_libdeps= |
38 | gl_ltlibdeps= | 139 | gl_ltlibdeps= |
140 | gl_m4_base='gl/m4' | ||
39 | m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) | 141 | m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) |
40 | m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) | 142 | m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) |
41 | m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES])) | 143 | m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES])) |
@@ -43,111 +145,239 @@ AC_DEFUN([gl_INIT], | |||
43 | m4_pushdef([gl_LIBSOURCES_DIR], []) | 145 | m4_pushdef([gl_LIBSOURCES_DIR], []) |
44 | gl_COMMON | 146 | gl_COMMON |
45 | gl_source_base='gl' | 147 | gl_source_base='gl' |
148 | # Code from module alignof: | ||
149 | # Code from module alloca: | ||
150 | # Code from module alloca-opt: | ||
46 | gl_FUNC_ALLOCA | 151 | gl_FUNC_ALLOCA |
152 | # Code from module arg-nonnull: | ||
153 | # Code from module arpa_inet: | ||
47 | gl_HEADER_ARPA_INET | 154 | gl_HEADER_ARPA_INET |
48 | AC_PROG_MKDIR_P | 155 | AC_PROG_MKDIR_P |
156 | # Code from module base64: | ||
49 | gl_FUNC_BASE64 | 157 | gl_FUNC_BASE64 |
158 | # Code from module btowc: | ||
50 | gl_FUNC_BTOWC | 159 | gl_FUNC_BTOWC |
51 | gl_WCHAR_MODULE_INDICATOR([btowc]) | 160 | gl_WCHAR_MODULE_INDICATOR([btowc]) |
161 | # Code from module c++defs: | ||
162 | # Code from module c-strtod: | ||
52 | gl_C_STRTOD | 163 | gl_C_STRTOD |
164 | # Code from module cloexec: | ||
53 | gl_CLOEXEC | 165 | gl_CLOEXEC |
166 | gl_MODULE_INDICATOR_FOR_TESTS([cloexec]) | ||
167 | # Code from module close-hook: | ||
168 | # Code from module configmake: | ||
169 | # Code from module dirname: | ||
54 | gl_DIRNAME | 170 | gl_DIRNAME |
171 | gl_MODULE_INDICATOR([dirname]) | ||
172 | # Code from module dirname-lgpl: | ||
173 | gl_DIRNAME_LGPL | ||
174 | # Code from module double-slash-root: | ||
55 | gl_DOUBLE_SLASH_ROOT | 175 | gl_DOUBLE_SLASH_ROOT |
176 | # Code from module dup2: | ||
177 | gl_FUNC_DUP2 | ||
178 | gl_UNISTD_MODULE_INDICATOR([dup2]) | ||
179 | # Code from module errno: | ||
56 | gl_HEADER_ERRNO_H | 180 | gl_HEADER_ERRNO_H |
181 | # Code from module error: | ||
57 | gl_ERROR | 182 | gl_ERROR |
58 | m4_ifdef([AM_XGETTEXT_OPTION], | 183 | m4_ifdef([AM_XGETTEXT_OPTION], |
59 | [AM_XGETTEXT_OPTION([--flag=error:3:c-format]) | 184 | [AM_][XGETTEXT_OPTION([--flag=error:3:c-format]) |
60 | AM_XGETTEXT_OPTION([--flag=error_at_line:5:c-format])]) | 185 | AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])]) |
61 | gl_EXITFAIL | 186 | # Code from module exitfail: |
187 | # Code from module extensions: | ||
188 | # Code from module fcntl: | ||
189 | gl_FUNC_FCNTL | ||
190 | gl_FCNTL_MODULE_INDICATOR([fcntl]) | ||
191 | # Code from module fcntl-h: | ||
62 | gl_FCNTL_H | 192 | gl_FCNTL_H |
193 | # Code from module fcntl-safer: | ||
63 | gl_FCNTL_SAFER | 194 | gl_FCNTL_SAFER |
64 | gl_MODULE_INDICATOR([fcntl-safer]) | 195 | gl_MODULE_INDICATOR([fcntl-safer]) |
196 | # Code from module float: | ||
65 | gl_FLOAT_H | 197 | gl_FLOAT_H |
198 | # Code from module floorf: | ||
66 | gl_FUNC_FLOORF | 199 | gl_FUNC_FLOORF |
67 | gl_MATH_MODULE_INDICATOR([floorf]) | 200 | gl_MATH_MODULE_INDICATOR([floorf]) |
201 | # Code from module fsusage: | ||
68 | gl_FSUSAGE | 202 | gl_FSUSAGE |
203 | # Code from module full-read: | ||
204 | # Code from module full-write: | ||
205 | # Code from module getaddrinfo: | ||
69 | gl_GETADDRINFO | 206 | gl_GETADDRINFO |
70 | gl_NETDB_MODULE_INDICATOR([getaddrinfo]) | 207 | gl_NETDB_MODULE_INDICATOR([getaddrinfo]) |
208 | # Code from module getdtablesize: | ||
209 | gl_FUNC_GETDTABLESIZE | ||
210 | gl_UNISTD_MODULE_INDICATOR([getdtablesize]) | ||
211 | # Code from module gethostname: | ||
71 | gl_FUNC_GETHOSTNAME | 212 | gl_FUNC_GETHOSTNAME |
72 | gl_UNISTD_MODULE_INDICATOR([gethostname]) | 213 | gl_UNISTD_MODULE_INDICATOR([gethostname]) |
214 | # Code from module getloadavg: | ||
73 | gl_GETLOADAVG([$gl_source_base]) | 215 | gl_GETLOADAVG([$gl_source_base]) |
74 | gl_STDLIB_MODULE_INDICATOR([getloadavg]) | 216 | gl_STDLIB_MODULE_INDICATOR([getloadavg]) |
75 | gl_GETOPT | 217 | # Code from module getopt: |
218 | # Code from module getopt-gnu: | ||
219 | gl_FUNC_GETOPT_GNU | ||
220 | gl_MODULE_INDICATOR_FOR_TESTS([getopt-gnu]) | ||
221 | # Code from module getopt-posix: | ||
222 | gl_FUNC_GETOPT_POSIX | ||
223 | # Code from module gettext: | ||
76 | dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac. | 224 | dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac. |
77 | AM_GNU_GETTEXT_VERSION([0.17]) | 225 | AM_GNU_GETTEXT_VERSION([0.17]) |
226 | # Code from module gettext-h: | ||
78 | AC_SUBST([LIBINTL]) | 227 | AC_SUBST([LIBINTL]) |
79 | AC_SUBST([LTLIBINTL]) | 228 | AC_SUBST([LTLIBINTL]) |
229 | # Code from module havelib: | ||
230 | # Code from module hostent: | ||
80 | gl_HOSTENT | 231 | gl_HOSTENT |
81 | gl_INET_NTOP | 232 | # Code from module include_next: |
233 | # Code from module inet_ntop: | ||
234 | gl_FUNC_INET_NTOP | ||
82 | gl_ARPA_INET_MODULE_INDICATOR([inet_ntop]) | 235 | gl_ARPA_INET_MODULE_INDICATOR([inet_ntop]) |
236 | # Code from module inline: | ||
83 | gl_INLINE | 237 | gl_INLINE |
238 | # Code from module intprops: | ||
239 | # Code from module langinfo: | ||
240 | gl_LANGINFO_H | ||
241 | # Code from module localcharset: | ||
84 | gl_LOCALCHARSET | 242 | gl_LOCALCHARSET |
85 | LOCALCHARSET_TESTS_ENVIRONMENT="CHARSETALIASDIR=\"\$(top_builddir)/$gl_source_base\"" | 243 | LOCALCHARSET_TESTS_ENVIRONMENT="CHARSETALIASDIR=\"\$(top_builddir)/$gl_source_base\"" |
86 | AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT]) | 244 | AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT]) |
245 | # Code from module locale: | ||
246 | gl_LOCALE_H | ||
247 | # Code from module malloc: | ||
87 | AC_FUNC_MALLOC | 248 | AC_FUNC_MALLOC |
88 | AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.]) | 249 | AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.]) |
250 | # Code from module malloc-posix: | ||
89 | gl_FUNC_MALLOC_POSIX | 251 | gl_FUNC_MALLOC_POSIX |
90 | gl_STDLIB_MODULE_INDICATOR([malloc-posix]) | 252 | gl_STDLIB_MODULE_INDICATOR([malloc-posix]) |
253 | # Code from module math: | ||
91 | gl_MATH_H | 254 | gl_MATH_H |
255 | # Code from module mbrtowc: | ||
92 | gl_FUNC_MBRTOWC | 256 | gl_FUNC_MBRTOWC |
93 | gl_WCHAR_MODULE_INDICATOR([mbrtowc]) | 257 | gl_WCHAR_MODULE_INDICATOR([mbrtowc]) |
258 | # Code from module mbsinit: | ||
94 | gl_FUNC_MBSINIT | 259 | gl_FUNC_MBSINIT |
95 | gl_WCHAR_MODULE_INDICATOR([mbsinit]) | 260 | gl_WCHAR_MODULE_INDICATOR([mbsinit]) |
261 | # Code from module memchr: | ||
262 | gl_FUNC_MEMCHR | ||
263 | gl_STRING_MODULE_INDICATOR([memchr]) | ||
264 | # Code from module mktime: | ||
96 | gl_FUNC_MKTIME | 265 | gl_FUNC_MKTIME |
266 | gl_TIME_MODULE_INDICATOR([mktime]) | ||
267 | # Code from module mountlist: | ||
97 | gl_MOUNTLIST | 268 | gl_MOUNTLIST |
269 | # Code from module multiarch: | ||
98 | gl_MULTIARCH | 270 | gl_MULTIARCH |
271 | # Code from module netdb: | ||
99 | gl_HEADER_NETDB | 272 | gl_HEADER_NETDB |
273 | # Code from module netinet_in: | ||
100 | gl_HEADER_NETINET_IN | 274 | gl_HEADER_NETINET_IN |
101 | AC_PROG_MKDIR_P | 275 | AC_PROG_MKDIR_P |
276 | # Code from module nl_langinfo: | ||
277 | gl_FUNC_NL_LANGINFO | ||
278 | gl_LANGINFO_MODULE_INDICATOR([nl_langinfo]) | ||
279 | # Code from module open: | ||
102 | gl_FUNC_OPEN | 280 | gl_FUNC_OPEN |
103 | gl_MODULE_INDICATOR([open]) | ||
104 | gl_FCNTL_MODULE_INDICATOR([open]) | 281 | gl_FCNTL_MODULE_INDICATOR([open]) |
282 | # Code from module regex: | ||
105 | gl_REGEX | 283 | gl_REGEX |
284 | # Code from module safe-read: | ||
106 | gl_SAFE_READ | 285 | gl_SAFE_READ |
286 | # Code from module safe-write: | ||
107 | gl_SAFE_WRITE | 287 | gl_SAFE_WRITE |
288 | # Code from module servent: | ||
108 | gl_SERVENT | 289 | gl_SERVENT |
290 | # Code from module size_max: | ||
109 | gl_SIZE_MAX | 291 | gl_SIZE_MAX |
292 | # Code from module snprintf: | ||
110 | gl_FUNC_SNPRINTF | 293 | gl_FUNC_SNPRINTF |
111 | gl_STDIO_MODULE_INDICATOR([snprintf]) | 294 | gl_STDIO_MODULE_INDICATOR([snprintf]) |
295 | # Code from module sockets: | ||
296 | gl_SOCKETS | ||
297 | # Code from module socklen: | ||
112 | gl_TYPE_SOCKLEN_T | 298 | gl_TYPE_SOCKLEN_T |
299 | # Code from module ssize_t: | ||
113 | gt_TYPE_SSIZE_T | 300 | gt_TYPE_SSIZE_T |
301 | # Code from module stat: | ||
302 | gl_FUNC_STAT | ||
303 | gl_SYS_STAT_MODULE_INDICATOR([stat]) | ||
304 | # Code from module stdbool: | ||
114 | AM_STDBOOL_H | 305 | AM_STDBOOL_H |
306 | # Code from module stddef: | ||
307 | gl_STDDEF_H | ||
308 | # Code from module stdint: | ||
115 | gl_STDINT_H | 309 | gl_STDINT_H |
310 | # Code from module stdio: | ||
116 | gl_STDIO_H | 311 | gl_STDIO_H |
312 | # Code from module stdlib: | ||
117 | gl_STDLIB_H | 313 | gl_STDLIB_H |
314 | # Code from module strdup-posix: | ||
118 | gl_FUNC_STRDUP_POSIX | 315 | gl_FUNC_STRDUP_POSIX |
119 | gl_STRING_MODULE_INDICATOR([strdup]) | 316 | gl_STRING_MODULE_INDICATOR([strdup]) |
317 | # Code from module streq: | ||
318 | # Code from module strerror: | ||
120 | gl_FUNC_STRERROR | 319 | gl_FUNC_STRERROR |
121 | gl_STRING_MODULE_INDICATOR([strerror]) | 320 | gl_STRING_MODULE_INDICATOR([strerror]) |
321 | # Code from module string: | ||
122 | gl_HEADER_STRING_H | 322 | gl_HEADER_STRING_H |
323 | # Code from module strndup: | ||
123 | gl_FUNC_STRNDUP | 324 | gl_FUNC_STRNDUP |
124 | gl_STRING_MODULE_INDICATOR([strndup]) | 325 | gl_STRING_MODULE_INDICATOR([strndup]) |
326 | # Code from module strnlen: | ||
125 | gl_FUNC_STRNLEN | 327 | gl_FUNC_STRNLEN |
126 | gl_STRING_MODULE_INDICATOR([strnlen]) | 328 | gl_STRING_MODULE_INDICATOR([strnlen]) |
329 | # Code from module strstr-simple: | ||
330 | gl_FUNC_STRSTR_SIMPLE | ||
331 | gl_STRING_MODULE_INDICATOR([strstr]) | ||
332 | # Code from module sys_socket: | ||
127 | gl_HEADER_SYS_SOCKET | 333 | gl_HEADER_SYS_SOCKET |
128 | AC_PROG_MKDIR_P | 334 | AC_PROG_MKDIR_P |
335 | # Code from module sys_stat: | ||
336 | gl_HEADER_SYS_STAT_H | ||
337 | AC_PROG_MKDIR_P | ||
338 | # Code from module time: | ||
129 | gl_HEADER_TIME_H | 339 | gl_HEADER_TIME_H |
340 | # Code from module time_r: | ||
130 | gl_TIME_R | 341 | gl_TIME_R |
342 | gl_TIME_MODULE_INDICATOR([time_r]) | ||
343 | # Code from module timegm: | ||
131 | gl_FUNC_TIMEGM | 344 | gl_FUNC_TIMEGM |
345 | gl_TIME_MODULE_INDICATOR([timegm]) | ||
346 | # Code from module unistd: | ||
132 | gl_UNISTD_H | 347 | gl_UNISTD_H |
348 | # Code from module unistd-safer: | ||
133 | gl_UNISTD_SAFER | 349 | gl_UNISTD_SAFER |
350 | # Code from module vasnprintf: | ||
134 | gl_FUNC_VASNPRINTF | 351 | gl_FUNC_VASNPRINTF |
352 | # Code from module vasprintf: | ||
135 | gl_FUNC_VASPRINTF | 353 | gl_FUNC_VASPRINTF |
136 | gl_STDIO_MODULE_INDICATOR([vasprintf]) | 354 | gl_STDIO_MODULE_INDICATOR([vasprintf]) |
137 | m4_ifdef([AM_XGETTEXT_OPTION], | 355 | m4_ifdef([AM_XGETTEXT_OPTION], |
138 | [AM_XGETTEXT_OPTION([--flag=asprintf:2:c-format]) | 356 | [AM_][XGETTEXT_OPTION([--flag=asprintf:2:c-format]) |
139 | AM_XGETTEXT_OPTION([--flag=vasprintf:2:c-format])]) | 357 | AM_][XGETTEXT_OPTION([--flag=vasprintf:2:c-format])]) |
358 | # Code from module verify: | ||
359 | # Code from module vsnprintf: | ||
140 | gl_FUNC_VSNPRINTF | 360 | gl_FUNC_VSNPRINTF |
141 | gl_STDIO_MODULE_INDICATOR([vsnprintf]) | 361 | gl_STDIO_MODULE_INDICATOR([vsnprintf]) |
362 | # Code from module warn-on-use: | ||
363 | # Code from module wchar: | ||
142 | gl_WCHAR_H | 364 | gl_WCHAR_H |
365 | # Code from module wcrtomb: | ||
143 | gl_FUNC_WCRTOMB | 366 | gl_FUNC_WCRTOMB |
144 | gl_WCHAR_MODULE_INDICATOR([wcrtomb]) | 367 | gl_WCHAR_MODULE_INDICATOR([wcrtomb]) |
368 | # Code from module wctype: | ||
145 | gl_WCTYPE_H | 369 | gl_WCTYPE_H |
370 | # Code from module write: | ||
146 | gl_FUNC_WRITE | 371 | gl_FUNC_WRITE |
147 | gl_UNISTD_MODULE_INDICATOR([write]) | 372 | gl_UNISTD_MODULE_INDICATOR([write]) |
373 | # Code from module xalloc: | ||
148 | gl_XALLOC | 374 | gl_XALLOC |
375 | # Code from module xalloc-die: | ||
376 | # Code from module xsize: | ||
149 | gl_XSIZE | 377 | gl_XSIZE |
378 | # Code from module xstrndup: | ||
150 | gl_XSTRNDUP | 379 | gl_XSTRNDUP |
380 | # End of code from modules | ||
151 | m4_ifval(gl_LIBSOURCES_LIST, [ | 381 | m4_ifval(gl_LIBSOURCES_LIST, [ |
152 | m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || | 382 | m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || |
153 | for gl_file in ]gl_LIBSOURCES_LIST[ ; do | 383 | for gl_file in ]gl_LIBSOURCES_LIST[ ; do |
@@ -170,7 +400,7 @@ AC_DEFUN([gl_INIT], | |||
170 | if test -n "$gl_LIBOBJS"; then | 400 | if test -n "$gl_LIBOBJS"; then |
171 | # Remove the extension. | 401 | # Remove the extension. |
172 | sed_drop_objext='s/\.o$//;s/\.obj$//' | 402 | sed_drop_objext='s/\.o$//;s/\.obj$//' |
173 | for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed "$sed_drop_objext" | sort | uniq`; do | 403 | for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do |
174 | gl_libobjs="$gl_libobjs $i.$ac_objext" | 404 | gl_libobjs="$gl_libobjs $i.$ac_objext" |
175 | gl_ltlibobjs="$gl_ltlibobjs $i.lo" | 405 | gl_ltlibobjs="$gl_ltlibobjs $i.lo" |
176 | done | 406 | done |
@@ -187,6 +417,13 @@ AC_DEFUN([gl_INIT], | |||
187 | m4_pushdef([gltests_LIBSOURCES_DIR], []) | 417 | m4_pushdef([gltests_LIBSOURCES_DIR], []) |
188 | gl_COMMON | 418 | gl_COMMON |
189 | gl_source_base='tests' | 419 | gl_source_base='tests' |
420 | changequote(,)dnl | ||
421 | gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS | ||
422 | changequote([, ])dnl | ||
423 | AC_SUBST([gltests_WITNESS]) | ||
424 | gl_module_indicator_condition=$gltests_WITNESS | ||
425 | m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) | ||
426 | m4_popdef([gl_MODULE_INDICATOR_CONDITION]) | ||
190 | m4_ifval(gltests_LIBSOURCES_LIST, [ | 427 | m4_ifval(gltests_LIBSOURCES_LIST, [ |
191 | m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ || | 428 | m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ || |
192 | for gl_file in ]gltests_LIBSOURCES_LIST[ ; do | 429 | for gl_file in ]gltests_LIBSOURCES_LIST[ ; do |
@@ -209,7 +446,7 @@ AC_DEFUN([gl_INIT], | |||
209 | if test -n "$gltests_LIBOBJS"; then | 446 | if test -n "$gltests_LIBOBJS"; then |
210 | # Remove the extension. | 447 | # Remove the extension. |
211 | sed_drop_objext='s/\.o$//;s/\.obj$//' | 448 | sed_drop_objext='s/\.o$//;s/\.obj$//' |
212 | for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed "$sed_drop_objext" | sort | uniq`; do | 449 | for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do |
213 | gltests_libobjs="$gltests_libobjs $i.$ac_objext" | 450 | gltests_libobjs="$gltests_libobjs $i.$ac_objext" |
214 | gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" | 451 | gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" |
215 | done | 452 | done |
@@ -280,8 +517,10 @@ AC_DEFUN([gltests_LIBSOURCES], [ | |||
280 | # This macro records the list of files which have been installed by | 517 | # This macro records the list of files which have been installed by |
281 | # gnulib-tool and may be removed by future gnulib-tool invocations. | 518 | # gnulib-tool and may be removed by future gnulib-tool invocations. |
282 | AC_DEFUN([gl_FILE_LIST], [ | 519 | AC_DEFUN([gl_FILE_LIST], [ |
520 | build-aux/arg-nonnull.h | ||
521 | build-aux/c++defs.h | ||
283 | build-aux/config.rpath | 522 | build-aux/config.rpath |
284 | build-aux/link-warning.h | 523 | build-aux/warn-on-use.h |
285 | lib/alignof.h | 524 | lib/alignof.h |
286 | lib/alloca.c | 525 | lib/alloca.c |
287 | lib/alloca.in.h | 526 | lib/alloca.in.h |
@@ -290,17 +529,22 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
290 | lib/asprintf.c | 529 | lib/asprintf.c |
291 | lib/base64.c | 530 | lib/base64.c |
292 | lib/base64.h | 531 | lib/base64.h |
532 | lib/basename-lgpl.c | ||
293 | lib/basename.c | 533 | lib/basename.c |
294 | lib/btowc.c | 534 | lib/btowc.c |
295 | lib/c-strtod.c | 535 | lib/c-strtod.c |
296 | lib/c-strtod.h | 536 | lib/c-strtod.h |
297 | lib/cloexec.c | 537 | lib/cloexec.c |
298 | lib/cloexec.h | 538 | lib/cloexec.h |
539 | lib/close-hook.c | ||
540 | lib/close-hook.h | ||
299 | lib/config.charset | 541 | lib/config.charset |
300 | lib/creat-safer.c | 542 | lib/creat-safer.c |
543 | lib/dirname-lgpl.c | ||
301 | lib/dirname.c | 544 | lib/dirname.c |
302 | lib/dirname.h | 545 | lib/dirname.h |
303 | lib/dup-safer.c | 546 | lib/dup-safer.c |
547 | lib/dup2.c | ||
304 | lib/errno.in.h | 548 | lib/errno.in.h |
305 | lib/error.c | 549 | lib/error.c |
306 | lib/error.h | 550 | lib/error.h |
@@ -308,6 +552,7 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
308 | lib/exitfail.h | 552 | lib/exitfail.h |
309 | lib/fcntl--.h | 553 | lib/fcntl--.h |
310 | lib/fcntl-safer.h | 554 | lib/fcntl-safer.h |
555 | lib/fcntl.c | ||
311 | lib/fcntl.in.h | 556 | lib/fcntl.in.h |
312 | lib/fd-safer.c | 557 | lib/fd-safer.c |
313 | lib/float+.h | 558 | lib/float+.h |
@@ -322,6 +567,7 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
322 | lib/full-write.h | 567 | lib/full-write.h |
323 | lib/gai_strerror.c | 568 | lib/gai_strerror.c |
324 | lib/getaddrinfo.c | 569 | lib/getaddrinfo.c |
570 | lib/getdtablesize.c | ||
325 | lib/gethostname.c | 571 | lib/gethostname.c |
326 | lib/getloadavg.c | 572 | lib/getloadavg.c |
327 | lib/getopt.c | 573 | lib/getopt.c |
@@ -331,17 +577,23 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
331 | lib/gettext.h | 577 | lib/gettext.h |
332 | lib/inet_ntop.c | 578 | lib/inet_ntop.c |
333 | lib/intprops.h | 579 | lib/intprops.h |
580 | lib/langinfo.in.h | ||
334 | lib/localcharset.c | 581 | lib/localcharset.c |
335 | lib/localcharset.h | 582 | lib/localcharset.h |
583 | lib/locale.in.h | ||
336 | lib/malloc.c | 584 | lib/malloc.c |
337 | lib/math.in.h | 585 | lib/math.in.h |
338 | lib/mbrtowc.c | 586 | lib/mbrtowc.c |
339 | lib/mbsinit.c | 587 | lib/mbsinit.c |
588 | lib/memchr.c | ||
589 | lib/memchr.valgrind | ||
590 | lib/mktime-internal.h | ||
340 | lib/mktime.c | 591 | lib/mktime.c |
341 | lib/mountlist.c | 592 | lib/mountlist.c |
342 | lib/mountlist.h | 593 | lib/mountlist.h |
343 | lib/netdb.in.h | 594 | lib/netdb.in.h |
344 | lib/netinet_in.in.h | 595 | lib/netinet_in.in.h |
596 | lib/nl_langinfo.c | ||
345 | lib/open-safer.c | 597 | lib/open-safer.c |
346 | lib/open.c | 598 | lib/open.c |
347 | lib/pipe-safer.c | 599 | lib/pipe-safer.c |
@@ -363,11 +615,16 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
363 | lib/safe-write.h | 615 | lib/safe-write.h |
364 | lib/size_max.h | 616 | lib/size_max.h |
365 | lib/snprintf.c | 617 | lib/snprintf.c |
618 | lib/sockets.c | ||
619 | lib/sockets.h | ||
620 | lib/stat.c | ||
366 | lib/stdbool.in.h | 621 | lib/stdbool.in.h |
622 | lib/stddef.in.h | ||
367 | lib/stdint.in.h | 623 | lib/stdint.in.h |
368 | lib/stdio-write.c | 624 | lib/stdio-write.c |
369 | lib/stdio.in.h | 625 | lib/stdio.in.h |
370 | lib/stdlib.in.h | 626 | lib/stdlib.in.h |
627 | lib/str-two-way.h | ||
371 | lib/strdup.c | 628 | lib/strdup.c |
372 | lib/streq.h | 629 | lib/streq.h |
373 | lib/strerror.c | 630 | lib/strerror.c |
@@ -375,7 +632,9 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
375 | lib/stripslash.c | 632 | lib/stripslash.c |
376 | lib/strndup.c | 633 | lib/strndup.c |
377 | lib/strnlen.c | 634 | lib/strnlen.c |
635 | lib/strstr.c | ||
378 | lib/sys_socket.in.h | 636 | lib/sys_socket.in.h |
637 | lib/sys_stat.in.h | ||
379 | lib/time.in.h | 638 | lib/time.in.h |
380 | lib/time_r.c | 639 | lib/time_r.c |
381 | lib/timegm.c | 640 | lib/timegm.c |
@@ -387,6 +646,7 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
387 | lib/vasprintf.c | 646 | lib/vasprintf.c |
388 | lib/verify.h | 647 | lib/verify.h |
389 | lib/vsnprintf.c | 648 | lib/vsnprintf.c |
649 | lib/w32sock.h | ||
390 | lib/wchar.in.h | 650 | lib/wchar.in.h |
391 | lib/wcrtomb.c | 651 | lib/wcrtomb.c |
392 | lib/wctype.in.h | 652 | lib/wctype.in.h |
@@ -408,17 +668,20 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
408 | m4/dirname.m4 | 668 | m4/dirname.m4 |
409 | m4/dos.m4 | 669 | m4/dos.m4 |
410 | m4/double-slash-root.m4 | 670 | m4/double-slash-root.m4 |
671 | m4/dup2.m4 | ||
411 | m4/errno_h.m4 | 672 | m4/errno_h.m4 |
412 | m4/error.m4 | 673 | m4/error.m4 |
413 | m4/exitfail.m4 | ||
414 | m4/extensions.m4 | 674 | m4/extensions.m4 |
675 | m4/fcntl-o.m4 | ||
415 | m4/fcntl-safer.m4 | 676 | m4/fcntl-safer.m4 |
677 | m4/fcntl.m4 | ||
416 | m4/fcntl_h.m4 | 678 | m4/fcntl_h.m4 |
417 | m4/float_h.m4 | 679 | m4/float_h.m4 |
418 | m4/floorf.m4 | 680 | m4/floorf.m4 |
419 | m4/fstypename.m4 | 681 | m4/fstypename.m4 |
420 | m4/fsusage.m4 | 682 | m4/fsusage.m4 |
421 | m4/getaddrinfo.m4 | 683 | m4/getaddrinfo.m4 |
684 | m4/getdtablesize.m4 | ||
422 | m4/gethostname.m4 | 685 | m4/gethostname.m4 |
423 | m4/getloadavg.m4 | 686 | m4/getloadavg.m4 |
424 | m4/getopt.m4 | 687 | m4/getopt.m4 |
@@ -439,6 +702,7 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
439 | m4/intmax_t.m4 | 702 | m4/intmax_t.m4 |
440 | m4/inttypes-pri.m4 | 703 | m4/inttypes-pri.m4 |
441 | m4/inttypes_h.m4 | 704 | m4/inttypes_h.m4 |
705 | m4/langinfo_h.m4 | ||
442 | m4/lcmessage.m4 | 706 | m4/lcmessage.m4 |
443 | m4/lib-ld.m4 | 707 | m4/lib-ld.m4 |
444 | m4/lib-link.m4 | 708 | m4/lib-link.m4 |
@@ -447,6 +711,7 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
447 | m4/locale-fr.m4 | 711 | m4/locale-fr.m4 |
448 | m4/locale-ja.m4 | 712 | m4/locale-ja.m4 |
449 | m4/locale-zh.m4 | 713 | m4/locale-zh.m4 |
714 | m4/locale_h.m4 | ||
450 | m4/lock.m4 | 715 | m4/lock.m4 |
451 | m4/longlong.m4 | 716 | m4/longlong.m4 |
452 | m4/ls-mntd-fs.m4 | 717 | m4/ls-mntd-fs.m4 |
@@ -455,11 +720,15 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
455 | m4/mbrtowc.m4 | 720 | m4/mbrtowc.m4 |
456 | m4/mbsinit.m4 | 721 | m4/mbsinit.m4 |
457 | m4/mbstate_t.m4 | 722 | m4/mbstate_t.m4 |
723 | m4/memchr.m4 | ||
458 | m4/mktime.m4 | 724 | m4/mktime.m4 |
725 | m4/mmap-anon.m4 | ||
726 | m4/mode_t.m4 | ||
459 | m4/mountlist.m4 | 727 | m4/mountlist.m4 |
460 | m4/multiarch.m4 | 728 | m4/multiarch.m4 |
461 | m4/netdb_h.m4 | 729 | m4/netdb_h.m4 |
462 | m4/netinet_in_h.m4 | 730 | m4/netinet_in_h.m4 |
731 | m4/nl_langinfo.m4 | ||
463 | m4/nls.m4 | 732 | m4/nls.m4 |
464 | m4/onceonly.m4 | 733 | m4/onceonly.m4 |
465 | m4/open.m4 | 734 | m4/open.m4 |
@@ -473,10 +742,13 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
473 | m4/servent.m4 | 742 | m4/servent.m4 |
474 | m4/size_max.m4 | 743 | m4/size_max.m4 |
475 | m4/snprintf.m4 | 744 | m4/snprintf.m4 |
745 | m4/sockets.m4 | ||
476 | m4/socklen.m4 | 746 | m4/socklen.m4 |
477 | m4/sockpfaf.m4 | 747 | m4/sockpfaf.m4 |
478 | m4/ssize_t.m4 | 748 | m4/ssize_t.m4 |
749 | m4/stat.m4 | ||
479 | m4/stdbool.m4 | 750 | m4/stdbool.m4 |
751 | m4/stddef_h.m4 | ||
480 | m4/stdint.m4 | 752 | m4/stdint.m4 |
481 | m4/stdint_h.m4 | 753 | m4/stdint_h.m4 |
482 | m4/stdio_h.m4 | 754 | m4/stdio_h.m4 |
@@ -486,7 +758,9 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
486 | m4/string_h.m4 | 758 | m4/string_h.m4 |
487 | m4/strndup.m4 | 759 | m4/strndup.m4 |
488 | m4/strnlen.m4 | 760 | m4/strnlen.m4 |
761 | m4/strstr.m4 | ||
489 | m4/sys_socket_h.m4 | 762 | m4/sys_socket_h.m4 |
763 | m4/sys_stat_h.m4 | ||
490 | m4/threadlib.m4 | 764 | m4/threadlib.m4 |
491 | m4/time_h.m4 | 765 | m4/time_h.m4 |
492 | m4/time_r.m4 | 766 | m4/time_r.m4 |
@@ -498,10 +772,11 @@ AC_DEFUN([gl_FILE_LIST], [ | |||
498 | m4/vasprintf.m4 | 772 | m4/vasprintf.m4 |
499 | m4/visibility.m4 | 773 | m4/visibility.m4 |
500 | m4/vsnprintf.m4 | 774 | m4/vsnprintf.m4 |
501 | m4/wchar.m4 | 775 | m4/warn-on-use.m4 |
776 | m4/wchar_h.m4 | ||
502 | m4/wchar_t.m4 | 777 | m4/wchar_t.m4 |
503 | m4/wcrtomb.m4 | 778 | m4/wcrtomb.m4 |
504 | m4/wctype.m4 | 779 | m4/wctype_h.m4 |
505 | m4/wint_t.m4 | 780 | m4/wint_t.m4 |
506 | m4/write.m4 | 781 | m4/write.m4 |
507 | m4/xalloc.m4 | 782 | m4/xalloc.m4 |
diff --git a/gl/m4/gnulib-tool.m4 b/gl/m4/gnulib-tool.m4 index 4438d488..69e7733b 100644 --- a/gl/m4/gnulib-tool.m4 +++ b/gl/m4/gnulib-tool.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # gnulib-tool.m4 serial 2 | 1 | # gnulib-tool.m4 serial 2 |
2 | dnl Copyright (C) 2004-2005 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004-2005, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/hostent.m4 b/gl/m4/hostent.m4 index 4a96af7a..11110411 100644 --- a/gl/m4/hostent.m4 +++ b/gl/m4/hostent.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # hostent.m4 serial 1 | 1 | # hostent.m4 serial 1 |
2 | dnl Copyright (C) 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/iconv.m4 b/gl/m4/iconv.m4 index 3cc62682..f46ff142 100644 --- a/gl/m4/iconv.m4 +++ b/gl/m4/iconv.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # iconv.m4 serial AM7 (gettext-0.18) | 1 | # iconv.m4 serial 9 (gettext-0.18) |
2 | dnl Copyright (C) 2000-2002, 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -58,7 +58,7 @@ AC_DEFUN([AM_ICONV_LINK], | |||
58 | ]) | 58 | ]) |
59 | if test "$am_cv_func_iconv" = yes; then | 59 | if test "$am_cv_func_iconv" = yes; then |
60 | AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ | 60 | AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ |
61 | dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. | 61 | dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. |
62 | am_save_LIBS="$LIBS" | 62 | am_save_LIBS="$LIBS" |
63 | if test $am_cv_lib_iconv = yes; then | 63 | if test $am_cv_lib_iconv = yes; then |
64 | LIBS="$LIBS $LIBICONV" | 64 | LIBS="$LIBS $LIBICONV" |
@@ -87,6 +87,25 @@ int main () | |||
87 | return 1; | 87 | return 1; |
88 | } | 88 | } |
89 | } | 89 | } |
90 | /* Test against Solaris 10 bug: Failures are not distinguishable from | ||
91 | successful returns. */ | ||
92 | { | ||
93 | iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); | ||
94 | if (cd_ascii_to_88591 != (iconv_t)(-1)) | ||
95 | { | ||
96 | static const char input[] = "\263"; | ||
97 | char buf[10]; | ||
98 | const char *inptr = input; | ||
99 | size_t inbytesleft = strlen (input); | ||
100 | char *outptr = buf; | ||
101 | size_t outbytesleft = sizeof (buf); | ||
102 | size_t res = iconv (cd_ascii_to_88591, | ||
103 | (char **) &inptr, &inbytesleft, | ||
104 | &outptr, &outbytesleft); | ||
105 | if (res == 0) | ||
106 | return 1; | ||
107 | } | ||
108 | } | ||
90 | #if 0 /* This bug could be worked around by the caller. */ | 109 | #if 0 /* This bug could be worked around by the caller. */ |
91 | /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ | 110 | /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ |
92 | { | 111 | { |
@@ -172,8 +191,8 @@ size_t iconv(); | |||
172 | ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) | 191 | ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) |
173 | am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) | 192 | am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) |
174 | am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` | 193 | am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` |
175 | AC_MSG_RESULT([${ac_t:- | 194 | AC_MSG_RESULT([ |
176 | }$am_cv_proto_iconv]) | 195 | $am_cv_proto_iconv]) |
177 | AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], | 196 | AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], |
178 | [Define as const if the declaration of iconv() needs const.]) | 197 | [Define as const if the declaration of iconv() needs const.]) |
179 | fi | 198 | fi |
diff --git a/gl/m4/include_next.m4 b/gl/m4/include_next.m4 index d6101fe3..c7e0672f 100644 --- a/gl/m4/include_next.m4 +++ b/gl/m4/include_next.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # include_next.m4 serial 12 | 1 | # include_next.m4 serial 14 |
2 | dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -104,10 +104,16 @@ EOF | |||
104 | # For each arg foo.h, if #include_next works, define NEXT_FOO_H to be | 104 | # For each arg foo.h, if #include_next works, define NEXT_FOO_H to be |
105 | # '<foo.h>'; otherwise define it to be | 105 | # '<foo.h>'; otherwise define it to be |
106 | # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. | 106 | # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. |
107 | # Also, if #include_next works as first preprocessing directive in a file, | ||
108 | # define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to | ||
109 | # be | ||
110 | # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. | ||
107 | # That way, a header file with the following line: | 111 | # That way, a header file with the following line: |
108 | # #@INCLUDE_NEXT@ @NEXT_FOO_H@ | 112 | # #@INCLUDE_NEXT@ @NEXT_FOO_H@ |
113 | # or | ||
114 | # #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@ | ||
109 | # behaves (after sed substitution) as if it contained | 115 | # behaves (after sed substitution) as if it contained |
110 | # #include_next <foo.h> | 116 | # #include_next <foo.h> |
111 | # even if the compiler does not support include_next. | 117 | # even if the compiler does not support include_next. |
112 | # The three "///" are to pacify Sun C 5.8, which otherwise would say | 118 | # The three "///" are to pacify Sun C 5.8, which otherwise would say |
113 | # "warning: #include of /usr/include/... may be non-portable". | 119 | # "warning: #include of /usr/include/... may be non-portable". |
@@ -123,49 +129,59 @@ AC_DEFUN([gl_CHECK_NEXT_HEADERS], | |||
123 | 129 | ||
124 | m4_foreach_w([gl_HEADER_NAME], [$1], | 130 | m4_foreach_w([gl_HEADER_NAME], [$1], |
125 | [AS_VAR_PUSHDEF([gl_next_header], | 131 | [AS_VAR_PUSHDEF([gl_next_header], |
126 | [gl_cv_next_]m4_quote(m4_defn([gl_HEADER_NAME]))) | 132 | [gl_cv_next_]m4_defn([gl_HEADER_NAME])) |
127 | if test $gl_cv_have_include_next = yes; then | 133 | if test $gl_cv_have_include_next = yes; then |
128 | AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) | 134 | AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) |
129 | else | 135 | else |
130 | AC_CACHE_CHECK( | 136 | AC_CACHE_CHECK( |
131 | [absolute name of <]m4_quote(m4_defn([gl_HEADER_NAME]))[>], | 137 | [absolute name of <]m4_defn([gl_HEADER_NAME])[>], |
132 | m4_quote(m4_defn([gl_next_header])), | 138 | m4_defn([gl_next_header]), |
133 | [AS_VAR_PUSHDEF([gl_header_exists], | 139 | [AS_VAR_PUSHDEF([gl_header_exists], |
134 | [ac_cv_header_]m4_quote(m4_defn([gl_HEADER_NAME]))) | 140 | [ac_cv_header_]m4_defn([gl_HEADER_NAME])) |
135 | if test AS_VAR_GET(gl_header_exists) = yes; then | 141 | if test AS_VAR_GET(gl_header_exists) = yes; then |
136 | AC_LANG_CONFTEST( | 142 | AC_LANG_CONFTEST( |
137 | [AC_LANG_SOURCE( | 143 | [AC_LANG_SOURCE( |
138 | [[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]] | 144 | [[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]] |
139 | )]) | 145 | )]) |
140 | dnl AIX "xlc -E" and "cc -E" omit #line directives for header files | 146 | dnl AIX "xlc -E" and "cc -E" omit #line directives for header files |
141 | dnl that contain only a #include of other header files and no | 147 | dnl that contain only a #include of other header files and no |
142 | dnl non-comment tokens of their own. This leads to a failure to | 148 | dnl non-comment tokens of their own. This leads to a failure to |
143 | dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h> | 149 | dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h> |
144 | dnl and others. The workaround is to force preservation of comments | 150 | dnl and others. The workaround is to force preservation of comments |
145 | dnl through option -C. This ensures all necessary #line directives | 151 | dnl through option -C. This ensures all necessary #line directives |
146 | dnl are present. GCC supports option -C as well. | 152 | dnl are present. GCC supports option -C as well. |
147 | case "$host_os" in | 153 | case "$host_os" in |
148 | aix*) gl_absname_cpp="$ac_cpp -C" ;; | 154 | aix*) gl_absname_cpp="$ac_cpp -C" ;; |
149 | *) gl_absname_cpp="$ac_cpp" ;; | 155 | *) gl_absname_cpp="$ac_cpp" ;; |
150 | esac | 156 | esac |
151 | dnl eval is necessary to expand gl_absname_cpp. | 157 | dnl eval is necessary to expand gl_absname_cpp. |
152 | dnl Ultrix and Pyramid sh refuse to redirect output of eval, | 158 | dnl Ultrix and Pyramid sh refuse to redirect output of eval, |
153 | dnl so use subshell. | 159 | dnl so use subshell. |
154 | AS_VAR_SET([gl_next_header], | 160 | AS_VAR_SET([gl_next_header], |
155 | ['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | | 161 | ['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | |
156 | sed -n '\#/]m4_quote(m4_defn([gl_HEADER_NAME]))[#{ | 162 | sed -n '\#/]m4_defn([gl_HEADER_NAME])[#{ |
157 | s#.*"\(.*/]m4_quote(m4_defn([gl_HEADER_NAME]))[\)".*#\1# | 163 | s#.*"\(.*/]m4_defn([gl_HEADER_NAME])[\)".*#\1# |
158 | s#^/[^/]#//&# | 164 | s#^/[^/]#//&# |
159 | p | 165 | p |
160 | q | 166 | q |
161 | }'`'"']) | 167 | }'`'"']) |
162 | else | 168 | else |
163 | AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) | 169 | AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) |
164 | fi | 170 | fi |
165 | AS_VAR_POPDEF([gl_header_exists])]) | 171 | AS_VAR_POPDEF([gl_header_exists])]) |
166 | fi | 172 | fi |
167 | AC_SUBST( | 173 | AC_SUBST( |
168 | AS_TR_CPP([NEXT_]m4_quote(m4_defn([gl_HEADER_NAME]))), | 174 | AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])), |
169 | [AS_VAR_GET([gl_next_header])]) | 175 | [AS_VAR_GET([gl_next_header])]) |
176 | if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then | ||
177 | # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' | ||
178 | gl_next_as_first_directive='<'gl_HEADER_NAME'>' | ||
179 | else | ||
180 | # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' | ||
181 | gl_next_as_first_directive=AS_VAR_GET([gl_next_header]) | ||
182 | fi | ||
183 | AC_SUBST( | ||
184 | AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])), | ||
185 | [$gl_next_as_first_directive]) | ||
170 | AS_VAR_POPDEF([gl_next_header])]) | 186 | AS_VAR_POPDEF([gl_next_header])]) |
171 | ]) | 187 | ]) |
diff --git a/gl/m4/inet_ntop.m4 b/gl/m4/inet_ntop.m4 index 2bbdca10..a6d219c2 100644 --- a/gl/m4/inet_ntop.m4 +++ b/gl/m4/inet_ntop.m4 | |||
@@ -1,27 +1,28 @@ | |||
1 | # inet_ntop.m4 serial 9 | 1 | # inet_ntop.m4 serial 12 |
2 | dnl Copyright (C) 2005, 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
6 | 6 | ||
7 | AC_DEFUN([gl_INET_NTOP], | 7 | AC_DEFUN([gl_FUNC_INET_NTOP], |
8 | [ | 8 | [ |
9 | dnl Persuade Solaris <arpa/inet.h> to declare inet_ntop. | 9 | dnl Persuade Solaris <arpa/inet.h> to declare inet_ntop. |
10 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | 10 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) |
11 | 11 | ||
12 | gl_REPLACE_ARPA_INET_H | 12 | gl_REPLACE_ARPA_INET_H |
13 | 13 | ||
14 | dnl The AC_SEARCH_LIBS call is a hack to persuade the Solaris 8 linker to | 14 | dnl Most platforms that provide inet_ntop define it in libc. |
15 | dnl find inet_ntop. | 15 | dnl Solaris 8..10 provide inet_ntop in libnsl instead. |
16 | dnl | ||
17 | dnl It is the responsibility of gl_INET_NTOP's caller to arrange for | ||
18 | dnl -lnsl if it is needed. Normally -lnsl is not needed on Solaris 8, | ||
19 | dnl since inet_ntop is needed only by getaddrinfo, and getaddrinfo | ||
20 | dnl isn't built on Solaris 8. | ||
21 | gl_save_LIBS=$LIBS | 16 | gl_save_LIBS=$LIBS |
22 | AC_SEARCH_LIBS([inet_ntop], [nsl], [], | 17 | AC_SEARCH_LIBS([inet_ntop], [nsl], [], |
23 | [AC_REPLACE_FUNCS([inet_ntop])]) | 18 | [AC_REPLACE_FUNCS([inet_ntop])]) |
24 | LIBS=$gl_save_LIBS | 19 | LIBS=$gl_save_LIBS |
20 | INET_NTOP_LIB= | ||
21 | if test "$ac_cv_search_inet_ntop" != "no" && | ||
22 | test "$ac_cv_search_inet_ntop" != "none required"; then | ||
23 | INET_NTOP_LIB="$ac_cv_search_inet_ntop" | ||
24 | fi | ||
25 | AC_SUBST([INET_NTOP_LIB]) | ||
25 | 26 | ||
26 | gl_PREREQ_INET_NTOP | 27 | gl_PREREQ_INET_NTOP |
27 | ]) | 28 | ]) |
diff --git a/gl/m4/inline.m4 b/gl/m4/inline.m4 index cee51099..4ef768de 100644 --- a/gl/m4/inline.m4 +++ b/gl/m4/inline.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # inline.m4 serial 4 | 1 | # inline.m4 serial 4 |
2 | dnl Copyright (C) 2006, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/intdiv0.m4 b/gl/m4/intdiv0.m4 index 29e6e0aa..289c4df5 100644 --- a/gl/m4/intdiv0.m4 +++ b/gl/m4/intdiv0.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # intdiv0.m4 serial 3 (gettext-0.18) | 1 | # intdiv0.m4 serial 3 (gettext-0.18) |
2 | dnl Copyright (C) 2002, 2007-2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/intl.m4 b/gl/m4/intl.m4 index 934408bb..5e17fea9 100644 --- a/gl/m4/intl.m4 +++ b/gl/m4/intl.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # intl.m4 serial 8 (gettext-0.17) | 1 | # intl.m4 serial 8 (gettext-0.17) |
2 | dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1995-2007, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/intldir.m4 b/gl/m4/intldir.m4 index 0980e6f2..ebae76d3 100644 --- a/gl/m4/intldir.m4 +++ b/gl/m4/intldir.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # intldir.m4 serial 2 (gettext-0.18) | 1 | # intldir.m4 serial 2 (gettext-0.18) |
2 | dnl Copyright (C) 2006, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/intlmacosx.m4 b/gl/m4/intlmacosx.m4 index c24837c4..dd910259 100644 --- a/gl/m4/intlmacosx.m4 +++ b/gl/m4/intlmacosx.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # intlmacosx.m4 serial 3 (gettext-0.18) | 1 | # intlmacosx.m4 serial 3 (gettext-0.18) |
2 | dnl Copyright (C) 2004-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/intmax.m4 b/gl/m4/intmax.m4 index a3785e99..74aaaf5e 100644 --- a/gl/m4/intmax.m4 +++ b/gl/m4/intmax.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # intmax.m4 serial 5 (gettext-0.18) | 1 | # intmax.m4 serial 5 (gettext-0.18) |
2 | dnl Copyright (C) 2002-2005, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2005, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/intmax_t.m4 b/gl/m4/intmax_t.m4 index 264cb571..975caac5 100644 --- a/gl/m4/intmax_t.m4 +++ b/gl/m4/intmax_t.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # intmax_t.m4 serial 7 | 1 | # intmax_t.m4 serial 7 |
2 | dnl Copyright (C) 1997-2004, 2006-2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1997-2004, 2006-2007, 2009-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/inttypes-pri.m4 b/gl/m4/inttypes-pri.m4 index 98fec7bc..718a4f4e 100644 --- a/gl/m4/inttypes-pri.m4 +++ b/gl/m4/inttypes-pri.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # inttypes-pri.m4 serial 6 (gettext-0.18) | 1 | # inttypes-pri.m4 serial 6 (gettext-0.18) |
2 | dnl Copyright (C) 1997-2002, 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1997-2002, 2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/inttypes_h.m4 b/gl/m4/inttypes_h.m4 index f4ca1602..782d77ed 100644 --- a/gl/m4/inttypes_h.m4 +++ b/gl/m4/inttypes_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # inttypes_h.m4 serial 9 | 1 | # inttypes_h.m4 serial 9 |
2 | dnl Copyright (C) 1997-2004, 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/langinfo_h.m4 b/gl/m4/langinfo_h.m4 new file mode 100644 index 00000000..11a56980 --- /dev/null +++ b/gl/m4/langinfo_h.m4 | |||
@@ -0,0 +1,77 @@ | |||
1 | # langinfo_h.m4 serial 6 | ||
2 | dnl Copyright (C) 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_LANGINFO_H], | ||
8 | [ | ||
9 | AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) | ||
10 | |||
11 | dnl Persuade glibc-2.0.6 <langinfo.h> to define CODESET. | ||
12 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | ||
13 | |||
14 | dnl <langinfo.h> is always overridden, because of GNULIB_POSIXCHECK. | ||
15 | gl_CHECK_NEXT_HEADERS([langinfo.h]) | ||
16 | |||
17 | dnl Determine whether <langinfo.h> exists. It is missing on mingw and BeOS. | ||
18 | HAVE_LANGINFO_CODESET=0 | ||
19 | HAVE_LANGINFO_ERA=0 | ||
20 | AC_CHECK_HEADERS_ONCE([langinfo.h]) | ||
21 | if test $ac_cv_header_langinfo_h = yes; then | ||
22 | HAVE_LANGINFO_H=1 | ||
23 | dnl Determine what <langinfo.h> defines. CODESET and ERA etc. are missing | ||
24 | dnl on OpenBSD 3.8. | ||
25 | AC_CACHE_CHECK([whether langinfo.h defines CODESET], | ||
26 | [gl_cv_header_langinfo_codeset], | ||
27 | [AC_COMPILE_IFELSE( | ||
28 | [AC_LANG_PROGRAM([[#include <langinfo.h> | ||
29 | int a = CODESET; | ||
30 | ]])], | ||
31 | [gl_cv_header_langinfo_codeset=yes], | ||
32 | [gl_cv_header_langinfo_codeset=no]) | ||
33 | ]) | ||
34 | if test $gl_cv_header_langinfo_codeset = yes; then | ||
35 | HAVE_LANGINFO_CODESET=1 | ||
36 | fi | ||
37 | AC_CACHE_CHECK([whether langinfo.h defines ERA], | ||
38 | [gl_cv_header_langinfo_era], | ||
39 | [AC_COMPILE_IFELSE( | ||
40 | [AC_LANG_PROGRAM([[#include <langinfo.h> | ||
41 | int a = ERA; | ||
42 | ]])], | ||
43 | [gl_cv_header_langinfo_era=yes], | ||
44 | [gl_cv_header_langinfo_era=no]) | ||
45 | ]) | ||
46 | if test $gl_cv_header_langinfo_era = yes; then | ||
47 | HAVE_LANGINFO_ERA=1 | ||
48 | fi | ||
49 | else | ||
50 | HAVE_LANGINFO_H=0 | ||
51 | fi | ||
52 | AC_SUBST([HAVE_LANGINFO_H]) | ||
53 | AC_SUBST([HAVE_LANGINFO_CODESET]) | ||
54 | AC_SUBST([HAVE_LANGINFO_ERA]) | ||
55 | |||
56 | dnl Check for declarations of anything we want to poison if the | ||
57 | dnl corresponding gnulib module is not in use. | ||
58 | gl_WARN_ON_USE_PREPARE([[#include <langinfo.h> | ||
59 | ]], [nl_langinfo]) | ||
60 | ]) | ||
61 | |||
62 | AC_DEFUN([gl_LANGINFO_MODULE_INDICATOR], | ||
63 | [ | ||
64 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | ||
65 | AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) | ||
66 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) | ||
67 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
68 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
69 | ]) | ||
70 | |||
71 | AC_DEFUN([gl_LANGINFO_H_DEFAULTS], | ||
72 | [ | ||
73 | GNULIB_NL_LANGINFO=0; AC_SUBST([GNULIB_NL_LANGINFO]) | ||
74 | dnl Assume proper GNU behavior unless another module says otherwise. | ||
75 | HAVE_NL_LANGINFO=1; AC_SUBST([HAVE_NL_LANGINFO]) | ||
76 | REPLACE_NL_LANGINFO=0; AC_SUBST([REPLACE_NL_LANGINFO]) | ||
77 | ]) | ||
diff --git a/gl/m4/lcmessage.m4 b/gl/m4/lcmessage.m4 index fa8e4167..1a705431 100644 --- a/gl/m4/lcmessage.m4 +++ b/gl/m4/lcmessage.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # lcmessage.m4 serial 6 (gettext-0.18) | 1 | # lcmessage.m4 serial 6 (gettext-0.18) |
2 | dnl Copyright (C) 1995-2002, 2004-2005, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1995-2002, 2004-2005, 2008-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/lib-ld.m4 b/gl/m4/lib-ld.m4 index e4863f2c..ebb30528 100644 --- a/gl/m4/lib-ld.m4 +++ b/gl/m4/lib-ld.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # lib-ld.m4 serial 4 (gettext-0.18) | 1 | # lib-ld.m4 serial 4 (gettext-0.18) |
2 | dnl Copyright (C) 1996-2003, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -59,7 +59,7 @@ if test "$GCC" = yes; then | |||
59 | # Canonicalize the path of ld | 59 | # Canonicalize the path of ld |
60 | ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` | 60 | ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` |
61 | while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do | 61 | while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do |
62 | ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` | 62 | ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` |
63 | done | 63 | done |
64 | test -z "$LD" && LD="$ac_prog" | 64 | test -z "$LD" && LD="$ac_prog" |
65 | ;; | 65 | ;; |
@@ -89,9 +89,9 @@ AC_CACHE_VAL([acl_cv_path_LD], | |||
89 | # Break only if it was the GNU/non-GNU ld that we prefer. | 89 | # Break only if it was the GNU/non-GNU ld that we prefer. |
90 | case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in | 90 | case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in |
91 | *GNU* | *'with BFD'*) | 91 | *GNU* | *'with BFD'*) |
92 | test "$with_gnu_ld" != no && break ;; | 92 | test "$with_gnu_ld" != no && break ;; |
93 | *) | 93 | *) |
94 | test "$with_gnu_ld" != yes && break ;; | 94 | test "$with_gnu_ld" != yes && break ;; |
95 | esac | 95 | esac |
96 | fi | 96 | fi |
97 | done | 97 | done |
diff --git a/gl/m4/lib-link.m4 b/gl/m4/lib-link.m4 index 21442033..90e1ac91 100644 --- a/gl/m4/lib-link.m4 +++ b/gl/m4/lib-link.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # lib-link.m4 serial 19 (gettext-0.18) | 1 | # lib-link.m4 serial 20 (gettext-0.18) |
2 | dnl Copyright (C) 2001-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -82,7 +82,7 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], | |||
82 | ]) | 82 | ]) |
83 | if test "$ac_cv_lib[]Name" = yes; then | 83 | if test "$ac_cv_lib[]Name" = yes; then |
84 | HAVE_LIB[]NAME=yes | 84 | HAVE_LIB[]NAME=yes |
85 | AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib[]$1 library.]) | 85 | AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) |
86 | AC_MSG_CHECKING([how to link with lib[]$1]) | 86 | AC_MSG_CHECKING([how to link with lib[]$1]) |
87 | AC_MSG_RESULT([$LIB[]NAME]) | 87 | AC_MSG_RESULT([$LIB[]NAME]) |
88 | else | 88 | else |
@@ -210,6 +210,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY], | |||
210 | LTLIB[]NAME= | 210 | LTLIB[]NAME= |
211 | INC[]NAME= | 211 | INC[]NAME= |
212 | LIB[]NAME[]_PREFIX= | 212 | LIB[]NAME[]_PREFIX= |
213 | dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been | ||
214 | dnl computed. So it has to be reset here. | ||
215 | HAVE_LIB[]NAME= | ||
213 | rpathdirs= | 216 | rpathdirs= |
214 | ltrpathdirs= | 217 | ltrpathdirs= |
215 | names_already_handled= | 218 | names_already_handled= |
diff --git a/gl/m4/lib-prefix.m4 b/gl/m4/lib-prefix.m4 index 4b7ee335..1601ceae 100644 --- a/gl/m4/lib-prefix.m4 +++ b/gl/m4/lib-prefix.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # lib-prefix.m4 serial 7 (gettext-0.18) | 1 | # lib-prefix.m4 serial 7 (gettext-0.18) |
2 | dnl Copyright (C) 2001-2005, 2008-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/localcharset.m4 b/gl/m4/localcharset.m4 index e9601041..ee2e801b 100644 --- a/gl/m4/localcharset.m4 +++ b/gl/m4/localcharset.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # localcharset.m4 serial 6 | 1 | # localcharset.m4 serial 7 |
2 | dnl Copyright (C) 2002, 2004, 2006, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2004, 2006, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -8,6 +8,7 @@ AC_DEFUN([gl_LOCALCHARSET], | |||
8 | [ | 8 | [ |
9 | dnl Prerequisites of lib/localcharset.c. | 9 | dnl Prerequisites of lib/localcharset.c. |
10 | AC_REQUIRE([AM_LANGINFO_CODESET]) | 10 | AC_REQUIRE([AM_LANGINFO_CODESET]) |
11 | AC_REQUIRE([gl_FCNTL_O_FLAGS]) | ||
11 | AC_CHECK_DECLS_ONCE([getc_unlocked]) | 12 | AC_CHECK_DECLS_ONCE([getc_unlocked]) |
12 | 13 | ||
13 | dnl Prerequisites of the lib/Makefile.am snippet. | 14 | dnl Prerequisites of the lib/Makefile.am snippet. |
diff --git a/gl/m4/locale-fr.m4 b/gl/m4/locale-fr.m4 index 653a5bc2..001f5390 100644 --- a/gl/m4/locale-fr.m4 +++ b/gl/m4/locale-fr.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # locale-fr.m4 serial 11 | 1 | # locale-fr.m4 serial 11 |
2 | dnl Copyright (C) 2003, 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/locale-ja.m4 b/gl/m4/locale-ja.m4 index 93605764..0eedaf14 100644 --- a/gl/m4/locale-ja.m4 +++ b/gl/m4/locale-ja.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # locale-ja.m4 serial 7 | 1 | # locale-ja.m4 serial 7 |
2 | dnl Copyright (C) 2003, 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/locale-zh.m4 b/gl/m4/locale-zh.m4 index 36a5f1df..777fd141 100644 --- a/gl/m4/locale-zh.m4 +++ b/gl/m4/locale-zh.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # locale-zh.m4 serial 6 | 1 | # locale-zh.m4 serial 6 |
2 | dnl Copyright (C) 2003, 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/locale_h.m4 b/gl/m4/locale_h.m4 new file mode 100644 index 00000000..18a119b8 --- /dev/null +++ b/gl/m4/locale_h.m4 | |||
@@ -0,0 +1,92 @@ | |||
1 | # locale_h.m4 serial 10 | ||
2 | dnl Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_LOCALE_H], | ||
8 | [ | ||
9 | dnl Use AC_REQUIRE here, so that the default behavior below is expanded | ||
10 | dnl once only, before all statements that occur in other macros. | ||
11 | AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) | ||
12 | |||
13 | dnl Persuade glibc <locale.h> to define locale_t. | ||
14 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | ||
15 | |||
16 | dnl If <stddef.h> is replaced, then <locale.h> must also be replaced. | ||
17 | AC_REQUIRE([gl_STDDEF_H]) | ||
18 | |||
19 | AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001], | ||
20 | [gl_cv_header_locale_h_posix2001], | ||
21 | [AC_TRY_COMPILE([#include <locale.h> | ||
22 | int x = LC_MESSAGES;], [], | ||
23 | [gl_cv_header_locale_h_posix2001=yes], | ||
24 | [gl_cv_header_locale_h_posix2001=no])]) | ||
25 | |||
26 | dnl Check for <xlocale.h>. | ||
27 | AC_CHECK_HEADERS_ONCE([xlocale.h]) | ||
28 | if test $ac_cv_header_xlocale_h = yes; then | ||
29 | HAVE_XLOCALE_H=1 | ||
30 | dnl Check whether use of locale_t requires inclusion of <xlocale.h>, | ||
31 | dnl e.g. on MacOS X 10.5. If <locale.h> does not define locale_t by | ||
32 | dnl itself, we assume that <xlocale.h> will do so. | ||
33 | AC_CACHE_CHECK([whether locale.h defines locale_t], | ||
34 | [gl_cv_header_locale_has_locale_t], | ||
35 | [AC_TRY_COMPILE([#include <locale.h> | ||
36 | locale_t x;], [], | ||
37 | [gl_cv_header_locale_has_locale_t=yes], | ||
38 | [gl_cv_header_locale_has_locale_t=no]) | ||
39 | ]) | ||
40 | if test $gl_cv_header_locale_has_locale_t = yes; then | ||
41 | gl_cv_header_locale_h_needs_xlocale_h=no | ||
42 | else | ||
43 | gl_cv_header_locale_h_needs_xlocale_h=yes | ||
44 | fi | ||
45 | else | ||
46 | HAVE_XLOCALE_H=0 | ||
47 | gl_cv_header_locale_h_needs_xlocale_h=no | ||
48 | fi | ||
49 | AC_SUBST([HAVE_XLOCALE_H]) | ||
50 | |||
51 | dnl <locale.h> is always overridden, because of GNULIB_POSIXCHECK. | ||
52 | gl_CHECK_NEXT_HEADERS([locale.h]) | ||
53 | |||
54 | if test -n "$STDDEF_H" \ | ||
55 | || test $gl_cv_header_locale_h_posix2001 = no \ | ||
56 | || test $gl_cv_header_locale_h_needs_xlocale_h = yes; then | ||
57 | gl_REPLACE_LOCALE_H | ||
58 | fi | ||
59 | |||
60 | dnl Check for declarations of anything we want to poison if the | ||
61 | dnl corresponding gnulib module is not in use. | ||
62 | gl_WARN_ON_USE_PREPARE([[#include <locale.h> | ||
63 | /* Some systems provide declarations in a non-standard header. */ | ||
64 | #if HAVE_XLOCALE_H | ||
65 | # include <xlocale.h> | ||
66 | #endif | ||
67 | ]], [duplocale]) | ||
68 | ]) | ||
69 | |||
70 | dnl Unconditionally enables the replacement of <locale.h>. | ||
71 | AC_DEFUN([gl_REPLACE_LOCALE_H], | ||
72 | [ | ||
73 | dnl This is a no-op, because <locale.h> is always overridden. | ||
74 | : | ||
75 | ]) | ||
76 | |||
77 | AC_DEFUN([gl_LOCALE_MODULE_INDICATOR], | ||
78 | [ | ||
79 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | ||
80 | AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) | ||
81 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) | ||
82 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
83 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
84 | ]) | ||
85 | |||
86 | AC_DEFUN([gl_LOCALE_H_DEFAULTS], | ||
87 | [ | ||
88 | GNULIB_DUPLOCALE=0; AC_SUBST([GNULIB_DUPLOCALE]) | ||
89 | dnl Assume proper GNU behavior unless another module says otherwise. | ||
90 | HAVE_DUPLOCALE=1; AC_SUBST([HAVE_DUPLOCALE]) | ||
91 | REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE]) | ||
92 | ]) | ||
diff --git a/gl/m4/lock.m4 b/gl/m4/lock.m4 index b416e31a..9da8465e 100644 --- a/gl/m4/lock.m4 +++ b/gl/m4/lock.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # lock.m4 serial 10 (gettext-0.18) | 1 | # lock.m4 serial 10 (gettext-0.18) |
2 | dnl Copyright (C) 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/longlong.m4 b/gl/m4/longlong.m4 index eedc8d56..cca3c1a9 100644 --- a/gl/m4/longlong.m4 +++ b/gl/m4/longlong.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # longlong.m4 serial 14 | 1 | # longlong.m4 serial 14 |
2 | dnl Copyright (C) 1999-2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -20,30 +20,30 @@ AC_DEFUN([AC_TYPE_LONG_LONG_INT], | |||
20 | [AC_LINK_IFELSE( | 20 | [AC_LINK_IFELSE( |
21 | [_AC_TYPE_LONG_LONG_SNIPPET], | 21 | [_AC_TYPE_LONG_LONG_SNIPPET], |
22 | [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. | 22 | [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. |
23 | dnl If cross compiling, assume the bug isn't important, since | 23 | dnl If cross compiling, assume the bug isn't important, since |
24 | dnl nobody cross compiles for this platform as far as we know. | 24 | dnl nobody cross compiles for this platform as far as we know. |
25 | AC_RUN_IFELSE( | 25 | AC_RUN_IFELSE( |
26 | [AC_LANG_PROGRAM( | 26 | [AC_LANG_PROGRAM( |
27 | [[@%:@include <limits.h> | 27 | [[@%:@include <limits.h> |
28 | @%:@ifndef LLONG_MAX | 28 | @%:@ifndef LLONG_MAX |
29 | @%:@ define HALF \ | 29 | @%:@ define HALF \ |
30 | (1LL << (sizeof (long long int) * CHAR_BIT - 2)) | 30 | (1LL << (sizeof (long long int) * CHAR_BIT - 2)) |
31 | @%:@ define LLONG_MAX (HALF - 1 + HALF) | 31 | @%:@ define LLONG_MAX (HALF - 1 + HALF) |
32 | @%:@endif]], | 32 | @%:@endif]], |
33 | [[long long int n = 1; | 33 | [[long long int n = 1; |
34 | int i; | 34 | int i; |
35 | for (i = 0; ; i++) | 35 | for (i = 0; ; i++) |
36 | { | 36 | { |
37 | long long int m = n << i; | 37 | long long int m = n << i; |
38 | if (m >> i != n) | 38 | if (m >> i != n) |
39 | return 1; | 39 | return 1; |
40 | if (LLONG_MAX / 2 < m) | 40 | if (LLONG_MAX / 2 < m) |
41 | break; | 41 | break; |
42 | } | 42 | } |
43 | return 0;]])], | 43 | return 0;]])], |
44 | [ac_cv_type_long_long_int=yes], | 44 | [ac_cv_type_long_long_int=yes], |
45 | [ac_cv_type_long_long_int=no], | 45 | [ac_cv_type_long_long_int=no], |
46 | [ac_cv_type_long_long_int=yes])], | 46 | [ac_cv_type_long_long_int=yes])], |
47 | [ac_cv_type_long_long_int=no])]) | 47 | [ac_cv_type_long_long_int=no])]) |
48 | if test $ac_cv_type_long_long_int = yes; then | 48 | if test $ac_cv_type_long_long_int = yes; then |
49 | AC_DEFINE([HAVE_LONG_LONG_INT], [1], | 49 | AC_DEFINE([HAVE_LONG_LONG_INT], [1], |
@@ -83,24 +83,24 @@ AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET], | |||
83 | [ | 83 | [ |
84 | AC_LANG_PROGRAM( | 84 | AC_LANG_PROGRAM( |
85 | [[/* For now, do not test the preprocessor; as of 2007 there are too many | 85 | [[/* For now, do not test the preprocessor; as of 2007 there are too many |
86 | implementations with broken preprocessors. Perhaps this can | 86 | implementations with broken preprocessors. Perhaps this can |
87 | be revisited in 2012. In the meantime, code should not expect | 87 | be revisited in 2012. In the meantime, code should not expect |
88 | #if to work with literals wider than 32 bits. */ | 88 | #if to work with literals wider than 32 bits. */ |
89 | /* Test literals. */ | 89 | /* Test literals. */ |
90 | long long int ll = 9223372036854775807ll; | 90 | long long int ll = 9223372036854775807ll; |
91 | long long int nll = -9223372036854775807LL; | 91 | long long int nll = -9223372036854775807LL; |
92 | unsigned long long int ull = 18446744073709551615ULL; | 92 | unsigned long long int ull = 18446744073709551615ULL; |
93 | /* Test constant expressions. */ | 93 | /* Test constant expressions. */ |
94 | typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) | 94 | typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) |
95 | ? 1 : -1)]; | 95 | ? 1 : -1)]; |
96 | typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 | 96 | typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 |
97 | ? 1 : -1)]; | 97 | ? 1 : -1)]; |
98 | int i = 63;]], | 98 | int i = 63;]], |
99 | [[/* Test availability of runtime routines for shift and division. */ | 99 | [[/* Test availability of runtime routines for shift and division. */ |
100 | long long int llmax = 9223372036854775807ll; | 100 | long long int llmax = 9223372036854775807ll; |
101 | unsigned long long int ullmax = 18446744073709551615ull; | 101 | unsigned long long int ullmax = 18446744073709551615ull; |
102 | return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | 102 | return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) |
103 | | (llmax / ll) | (llmax % ll) | 103 | | (llmax / ll) | (llmax % ll) |
104 | | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | 104 | | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) |
105 | | (ullmax / ull) | (ullmax % ull));]]) | 105 | | (ullmax / ull) | (ullmax % ull));]]) |
106 | ]) | 106 | ]) |
diff --git a/gl/m4/ls-mntd-fs.m4 b/gl/m4/ls-mntd-fs.m4 index 32ccb984..40b93366 100644 --- a/gl/m4/ls-mntd-fs.m4 +++ b/gl/m4/ls-mntd-fs.m4 | |||
@@ -1,7 +1,7 @@ | |||
1 | # serial 27 | 1 | # serial 28 |
2 | # How to list mounted file systems. | 2 | # How to list mounted file systems. |
3 | 3 | ||
4 | # Copyright (C) 1998-2004, 2006, 2009 Free Software Foundation, Inc. | 4 | # Copyright (C) 1998-2004, 2006, 2009-2010 Free Software Foundation, Inc. |
5 | # | 5 | # |
6 | # This file is free software; the Free Software Foundation | 6 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 7 | # gives unlimited permission to copy and/or distribute it, |
@@ -84,7 +84,7 @@ if test -z "$ac_list_mounted_fs"; then | |||
84 | yes | 84 | yes |
85 | #endif | 85 | #endif |
86 | ], [test $ac_cv_func_listmntent = yes \ | 86 | ], [test $ac_cv_func_listmntent = yes \ |
87 | && fu_cv_sys_mounted_cray_listmntent=yes] | 87 | && fu_cv_sys_mounted_cray_listmntent=yes] |
88 | ) | 88 | ) |
89 | ] | 89 | ] |
90 | ) | 90 | ) |
@@ -101,14 +101,14 @@ if test -z "$ac_list_mounted_fs"; then | |||
101 | # AIX. | 101 | # AIX. |
102 | AC_MSG_CHECKING([for mntctl function and struct vmount]) | 102 | AC_MSG_CHECKING([for mntctl function and struct vmount]) |
103 | AC_CACHE_VAL([fu_cv_sys_mounted_vmount], | 103 | AC_CACHE_VAL([fu_cv_sys_mounted_vmount], |
104 | [AC_TRY_CPP([#include <fshelp.h>], | 104 | [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <fshelp.h>]])], |
105 | fu_cv_sys_mounted_vmount=yes, | 105 | [fu_cv_sys_mounted_vmount=yes], |
106 | fu_cv_sys_mounted_vmount=no)]) | 106 | [fu_cv_sys_mounted_vmount=no])]) |
107 | AC_MSG_RESULT([$fu_cv_sys_mounted_vmount]) | 107 | AC_MSG_RESULT([$fu_cv_sys_mounted_vmount]) |
108 | if test $fu_cv_sys_mounted_vmount = yes; then | 108 | if test $fu_cv_sys_mounted_vmount = yes; then |
109 | ac_list_mounted_fs=found | 109 | ac_list_mounted_fs=found |
110 | AC_DEFINE([MOUNTED_VMOUNT], [1], | 110 | AC_DEFINE([MOUNTED_VMOUNT], [1], |
111 | [Define if there is a function named mntctl that can be used to read | 111 | [Define if there is a function named mntctl that can be used to read |
112 | the list of mounted file systems, and there is a system header file | 112 | the list of mounted file systems, and there is a system header file |
113 | that declares `struct vmount.' (AIX)]) | 113 | that declares `struct vmount.' (AIX)]) |
114 | fi | 114 | fi |
@@ -123,27 +123,27 @@ if test $ac_cv_func_getmntent = yes; then | |||
123 | # 4.3BSD, SunOS, HP-UX, Dynix, Irix | 123 | # 4.3BSD, SunOS, HP-UX, Dynix, Irix |
124 | AC_MSG_CHECKING([for one-argument getmntent function]) | 124 | AC_MSG_CHECKING([for one-argument getmntent function]) |
125 | AC_CACHE_VAL([fu_cv_sys_mounted_getmntent1], | 125 | AC_CACHE_VAL([fu_cv_sys_mounted_getmntent1], |
126 | [AC_TRY_COMPILE([ | 126 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ |
127 | /* SunOS 4.1.x /usr/include/mntent.h needs this for FILE */ | 127 | /* SunOS 4.1.x /usr/include/mntent.h needs this for FILE */ |
128 | #include <stdio.h> | 128 | #include <stdio.h> |
129 | 129 | ||
130 | #include <mntent.h> | 130 | #include <mntent.h> |
131 | #if !defined MOUNTED | 131 | #if !defined MOUNTED |
132 | # if defined _PATH_MOUNTED /* GNU libc */ | 132 | # if defined _PATH_MOUNTED /* GNU libc */ |
133 | # define MOUNTED _PATH_MOUNTED | 133 | # define MOUNTED _PATH_MOUNTED |
134 | # endif | 134 | # endif |
135 | # if defined MNT_MNTTAB /* HP-UX. */ | 135 | # if defined MNT_MNTTAB /* HP-UX. */ |
136 | # define MOUNTED MNT_MNTTAB | 136 | # define MOUNTED MNT_MNTTAB |
137 | # endif | 137 | # endif |
138 | # if defined MNTTABNAME /* Dynix. */ | 138 | # if defined MNTTABNAME /* Dynix. */ |
139 | # define MOUNTED MNTTABNAME | 139 | # define MOUNTED MNTTABNAME |
140 | # endif | 140 | # endif |
141 | #endif | 141 | #endif |
142 | ], | 142 | ]], |
143 | [ struct mntent *mnt = 0; char *table = MOUNTED; | 143 | [[ struct mntent *mnt = 0; char *table = MOUNTED; |
144 | if (sizeof mnt && sizeof table) return 0;], | 144 | if (sizeof mnt && sizeof table) return 0;]])], |
145 | fu_cv_sys_mounted_getmntent1=yes, | 145 | [fu_cv_sys_mounted_getmntent1=yes], |
146 | fu_cv_sys_mounted_getmntent1=no)]) | 146 | [fu_cv_sys_mounted_getmntent1=no])]) |
147 | AC_MSG_RESULT([$fu_cv_sys_mounted_getmntent1]) | 147 | AC_MSG_RESULT([$fu_cv_sys_mounted_getmntent1]) |
148 | if test $fu_cv_sys_mounted_getmntent1 = yes; then | 148 | if test $fu_cv_sys_mounted_getmntent1 = yes; then |
149 | ac_list_mounted_fs=found | 149 | ac_list_mounted_fs=found |
@@ -179,25 +179,25 @@ if test -z "$ac_list_mounted_fs"; then | |||
179 | 179 | ||
180 | AC_MSG_CHECKING([for getfsstat function]) | 180 | AC_MSG_CHECKING([for getfsstat function]) |
181 | AC_CACHE_VAL([fu_cv_sys_mounted_getfsstat], | 181 | AC_CACHE_VAL([fu_cv_sys_mounted_getfsstat], |
182 | [AC_TRY_LINK([ | 182 | [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ |
183 | #include <sys/types.h> | 183 | #include <sys/types.h> |
184 | #if HAVE_STRUCT_FSSTAT_F_FSTYPENAME | 184 | #if HAVE_STRUCT_FSSTAT_F_FSTYPENAME |
185 | # define FS_TYPE(Ent) ((Ent).f_fstypename) | 185 | # define FS_TYPE(Ent) ((Ent).f_fstypename) |
186 | #else | 186 | #else |
187 | # define FS_TYPE(Ent) mnt_names[(Ent).f_type] | 187 | # define FS_TYPE(Ent) mnt_names[(Ent).f_type] |
188 | #endif | 188 | #endif |
189 | ]$getfsstat_includes | 189 | $getfsstat_includes]] |
190 | , | 190 | , |
191 | [struct statfs *stats; | 191 | [[struct statfs *stats; |
192 | int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); | 192 | int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); |
193 | char *t = FS_TYPE (*stats); ], | 193 | char *t = FS_TYPE (*stats); ]])], |
194 | fu_cv_sys_mounted_getfsstat=yes, | 194 | [fu_cv_sys_mounted_getfsstat=yes], |
195 | fu_cv_sys_mounted_getfsstat=no)]) | 195 | [fu_cv_sys_mounted_getfsstat=no])]) |
196 | AC_MSG_RESULT([$fu_cv_sys_mounted_getfsstat]) | 196 | AC_MSG_RESULT([$fu_cv_sys_mounted_getfsstat]) |
197 | if test $fu_cv_sys_mounted_getfsstat = yes; then | 197 | if test $fu_cv_sys_mounted_getfsstat = yes; then |
198 | ac_list_mounted_fs=found | 198 | ac_list_mounted_fs=found |
199 | AC_DEFINE([MOUNTED_GETFSSTAT], [1], | 199 | AC_DEFINE([MOUNTED_GETFSSTAT], [1], |
200 | [Define if there is a function named getfsstat for reading the | 200 | [Define if there is a function named getfsstat for reading the |
201 | list of mounted file systems. (DEC Alpha running OSF/1)]) | 201 | list of mounted file systems. (DEC Alpha running OSF/1)]) |
202 | fi | 202 | fi |
203 | fi | 203 | fi |
@@ -206,12 +206,12 @@ if test -z "$ac_list_mounted_fs"; then | |||
206 | # SVR3 | 206 | # SVR3 |
207 | AC_MSG_CHECKING([for FIXME existence of three headers]) | 207 | AC_MSG_CHECKING([for FIXME existence of three headers]) |
208 | AC_CACHE_VAL([fu_cv_sys_mounted_fread_fstyp], | 208 | AC_CACHE_VAL([fu_cv_sys_mounted_fread_fstyp], |
209 | [AC_TRY_CPP([ | 209 | [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ |
210 | #include <sys/statfs.h> | 210 | #include <sys/statfs.h> |
211 | #include <sys/fstyp.h> | 211 | #include <sys/fstyp.h> |
212 | #include <mnttab.h>], | 212 | #include <mnttab.h>]])], |
213 | fu_cv_sys_mounted_fread_fstyp=yes, | 213 | [fu_cv_sys_mounted_fread_fstyp=yes], |
214 | fu_cv_sys_mounted_fread_fstyp=no)]) | 214 | [fu_cv_sys_mounted_fread_fstyp=no])]) |
215 | AC_MSG_RESULT([$fu_cv_sys_mounted_fread_fstyp]) | 215 | AC_MSG_RESULT([$fu_cv_sys_mounted_fread_fstyp]) |
216 | if test $fu_cv_sys_mounted_fread_fstyp = yes; then | 216 | if test $fu_cv_sys_mounted_fread_fstyp = yes; then |
217 | ac_list_mounted_fs=found | 217 | ac_list_mounted_fs=found |
@@ -228,15 +228,15 @@ if test -z "$ac_list_mounted_fs"; then | |||
228 | AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo], | 228 | AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo], |
229 | [ | 229 | [ |
230 | test "$ac_cv_func_getmntinfo" = yes \ | 230 | test "$ac_cv_func_getmntinfo" = yes \ |
231 | && fu_cv_sys_mounted_getmntinfo=yes \ | 231 | && fu_cv_sys_mounted_getmntinfo=yes \ |
232 | || fu_cv_sys_mounted_getmntinfo=no | 232 | || fu_cv_sys_mounted_getmntinfo=no |
233 | ]) | 233 | ]) |
234 | AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo]) | 234 | AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo]) |
235 | if test $fu_cv_sys_mounted_getmntinfo = yes; then | 235 | if test $fu_cv_sys_mounted_getmntinfo = yes; then |
236 | AC_MSG_CHECKING([whether getmntinfo returns statvfs structures]) | 236 | AC_MSG_CHECKING([whether getmntinfo returns statvfs structures]) |
237 | AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo2], | 237 | AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo2], |
238 | [ | 238 | [ |
239 | AC_TRY_COMPILE([ | 239 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ |
240 | #if HAVE_SYS_PARAM_H | 240 | #if HAVE_SYS_PARAM_H |
241 | # include <sys/param.h> | 241 | # include <sys/param.h> |
242 | #endif | 242 | #endif |
@@ -248,7 +248,7 @@ if test -z "$ac_list_mounted_fs"; then | |||
248 | # include <sys/statvfs.h> | 248 | # include <sys/statvfs.h> |
249 | #endif | 249 | #endif |
250 | extern int getmntinfo (struct statfs **, int); | 250 | extern int getmntinfo (struct statfs **, int); |
251 | ], [], | 251 | ]], [])], |
252 | [fu_cv_sys_mounted_getmntinfo2=no], | 252 | [fu_cv_sys_mounted_getmntinfo2=no], |
253 | [fu_cv_sys_mounted_getmntinfo2=yes]) | 253 | [fu_cv_sys_mounted_getmntinfo2=yes]) |
254 | ]) | 254 | ]) |
@@ -256,13 +256,13 @@ extern int getmntinfo (struct statfs **, int); | |||
256 | if test $fu_cv_sys_mounted_getmntinfo2 = no; then | 256 | if test $fu_cv_sys_mounted_getmntinfo2 = no; then |
257 | ac_list_mounted_fs=found | 257 | ac_list_mounted_fs=found |
258 | AC_DEFINE([MOUNTED_GETMNTINFO], [1], | 258 | AC_DEFINE([MOUNTED_GETMNTINFO], [1], |
259 | [Define if there is a function named getmntinfo for reading the | 259 | [Define if there is a function named getmntinfo for reading the |
260 | list of mounted file systems and it returns an array of | 260 | list of mounted file systems and it returns an array of |
261 | 'struct statfs'. (4.4BSD, Darwin)]) | 261 | 'struct statfs'. (4.4BSD, Darwin)]) |
262 | else | 262 | else |
263 | ac_list_mounted_fs=found | 263 | ac_list_mounted_fs=found |
264 | AC_DEFINE([MOUNTED_GETMNTINFO2], [1], | 264 | AC_DEFINE([MOUNTED_GETMNTINFO2], [1], |
265 | [Define if there is a function named getmntinfo for reading the | 265 | [Define if there is a function named getmntinfo for reading the |
266 | list of mounted file systems and it returns an array of | 266 | list of mounted file systems and it returns an array of |
267 | 'struct statvfs'. (NetBSD 3.0)]) | 267 | 'struct statvfs'. (NetBSD 3.0)]) |
268 | fi | 268 | fi |
@@ -273,11 +273,11 @@ if test -z "$ac_list_mounted_fs"; then | |||
273 | # Ultrix | 273 | # Ultrix |
274 | AC_MSG_CHECKING([for getmnt function]) | 274 | AC_MSG_CHECKING([for getmnt function]) |
275 | AC_CACHE_VAL([fu_cv_sys_mounted_getmnt], | 275 | AC_CACHE_VAL([fu_cv_sys_mounted_getmnt], |
276 | [AC_TRY_CPP([ | 276 | [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ |
277 | #include <sys/fs_types.h> | 277 | #include <sys/fs_types.h> |
278 | #include <sys/mount.h>], | 278 | #include <sys/mount.h>]])], |
279 | fu_cv_sys_mounted_getmnt=yes, | 279 | [fu_cv_sys_mounted_getmnt=yes], |
280 | fu_cv_sys_mounted_getmnt=no)]) | 280 | [fu_cv_sys_mounted_getmnt=no])]) |
281 | AC_MSG_RESULT([$fu_cv_sys_mounted_getmnt]) | 281 | AC_MSG_RESULT([$fu_cv_sys_mounted_getmnt]) |
282 | if test $fu_cv_sys_mounted_getmnt = yes; then | 282 | if test $fu_cv_sys_mounted_getmnt = yes; then |
283 | ac_list_mounted_fs=found | 283 | ac_list_mounted_fs=found |
@@ -294,7 +294,7 @@ if test -z "$ac_list_mounted_fs"; then | |||
294 | AC_MSG_CHECKING([for BEOS mounted file system support functions]) | 294 | AC_MSG_CHECKING([for BEOS mounted file system support functions]) |
295 | if test $ac_cv_header_fs_info_h = yes \ | 295 | if test $ac_cv_header_fs_info_h = yes \ |
296 | && test $ac_cv_func_next_dev = yes \ | 296 | && test $ac_cv_func_next_dev = yes \ |
297 | && test $ac_cv_func_fs_stat_dev = yes; then | 297 | && test $ac_cv_func_fs_stat_dev = yes; then |
298 | fu_result=yes | 298 | fu_result=yes |
299 | else | 299 | else |
300 | fu_result=no | 300 | fu_result=no |
@@ -312,14 +312,14 @@ if test -z "$ac_list_mounted_fs"; then | |||
312 | # SVR2 | 312 | # SVR2 |
313 | AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab]) | 313 | AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab]) |
314 | AC_CACHE_VAL([fu_cv_sys_mounted_fread], | 314 | AC_CACHE_VAL([fu_cv_sys_mounted_fread], |
315 | [AC_TRY_CPP([#include <mnttab.h>], | 315 | [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <mnttab.h>]])], |
316 | fu_cv_sys_mounted_fread=yes, | 316 | [fu_cv_sys_mounted_fread=yes], |
317 | fu_cv_sys_mounted_fread=no)]) | 317 | [fu_cv_sys_mounted_fread=no])]) |
318 | AC_MSG_RESULT([$fu_cv_sys_mounted_fread]) | 318 | AC_MSG_RESULT([$fu_cv_sys_mounted_fread]) |
319 | if test $fu_cv_sys_mounted_fread = yes; then | 319 | if test $fu_cv_sys_mounted_fread = yes; then |
320 | ac_list_mounted_fs=found | 320 | ac_list_mounted_fs=found |
321 | AC_DEFINE([MOUNTED_FREAD], [1], | 321 | AC_DEFINE([MOUNTED_FREAD], [1], |
322 | [Define if there is no specific function for reading the list of | 322 | [Define if there is no specific function for reading the list of |
323 | mounted file systems. fread will be used to read /etc/mnttab. | 323 | mounted file systems. fread will be used to read /etc/mnttab. |
324 | (SVR2) ]) | 324 | (SVR2) ]) |
325 | fi | 325 | fi |
diff --git a/gl/m4/malloc.m4 b/gl/m4/malloc.m4 index 80701716..910ac922 100644 --- a/gl/m4/malloc.m4 +++ b/gl/m4/malloc.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # malloc.m4 serial 9 | 1 | # malloc.m4 serial 9 |
2 | dnl Copyright (C) 2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/math_h.m4 b/gl/m4/math_h.m4 index d941bc33..2d89ca3f 100644 --- a/gl/m4/math_h.m4 +++ b/gl/m4/math_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # math_h.m4 serial 14 | 1 | # math_h.m4 serial 21 |
2 | dnl Copyright (C) 2007-2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -8,6 +8,8 @@ AC_DEFUN([gl_MATH_H], | |||
8 | [ | 8 | [ |
9 | AC_REQUIRE([gl_MATH_H_DEFAULTS]) | 9 | AC_REQUIRE([gl_MATH_H_DEFAULTS]) |
10 | gl_CHECK_NEXT_HEADERS([math.h]) | 10 | gl_CHECK_NEXT_HEADERS([math.h]) |
11 | AC_REQUIRE([AC_C_INLINE]) | ||
12 | |||
11 | AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works], | 13 | AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works], |
12 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]], | 14 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]], |
13 | [[/* Solaris 10 has a broken definition of NAN. Other platforms | 15 | [[/* Solaris 10 has a broken definition of NAN. Other platforms |
@@ -15,9 +17,9 @@ AC_DEFUN([gl_MATH_H], | |||
15 | test only needs to fail when NAN is provided but wrong. */ | 17 | test only needs to fail when NAN is provided but wrong. */ |
16 | float f = 1.0f; | 18 | float f = 1.0f; |
17 | #ifdef NAN | 19 | #ifdef NAN |
18 | f = NAN; | 20 | f = NAN; |
19 | #endif | 21 | #endif |
20 | return f == 0;]])], | 22 | return f == 0;]])], |
21 | [gl_cv_header_math_nan_works=yes], | 23 | [gl_cv_header_math_nan_works=yes], |
22 | [gl_cv_header_math_nan_works=no])]) | 24 | [gl_cv_header_math_nan_works=no])]) |
23 | if test $gl_cv_header_math_nan_works = no; then | 25 | if test $gl_cv_header_math_nan_works = no; then |
@@ -26,26 +28,39 @@ AC_DEFUN([gl_MATH_H], | |||
26 | AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works], | 28 | AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works], |
27 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]], | 29 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]], |
28 | [[/* Solaris 10 has a broken definition of HUGE_VAL. */ | 30 | [[/* Solaris 10 has a broken definition of HUGE_VAL. */ |
29 | double d = HUGE_VAL; | 31 | double d = HUGE_VAL; |
30 | return d == 0;]])], | 32 | return d == 0;]])], |
31 | [gl_cv_header_math_huge_val_works=yes], | 33 | [gl_cv_header_math_huge_val_works=yes], |
32 | [gl_cv_header_math_huge_val_works=no])]) | 34 | [gl_cv_header_math_huge_val_works=no])]) |
33 | if test $gl_cv_header_math_huge_val_works = no; then | 35 | if test $gl_cv_header_math_huge_val_works = no; then |
34 | REPLACE_HUGE_VAL=1 | 36 | REPLACE_HUGE_VAL=1 |
35 | fi | 37 | fi |
38 | |||
39 | dnl Check for declarations of anything we want to poison if the | ||
40 | dnl corresponding gnulib module is not in use. | ||
41 | gl_WARN_ON_USE_PREPARE([[#include <math.h> | ||
42 | ]], [acosl asinl atanl ceilf ceill cosl expl floorf floorl frexpl | ||
43 | ldexpl logb logl round roundf roundl sinl sqrtl tanl trunc truncf truncl]) | ||
36 | ]) | 44 | ]) |
37 | 45 | ||
38 | AC_DEFUN([gl_MATH_MODULE_INDICATOR], | 46 | AC_DEFUN([gl_MATH_MODULE_INDICATOR], |
39 | [ | 47 | [ |
40 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 48 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
41 | AC_REQUIRE([gl_MATH_H_DEFAULTS]) | 49 | AC_REQUIRE([gl_MATH_H_DEFAULTS]) |
42 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 50 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
51 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
52 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
43 | ]) | 53 | ]) |
44 | 54 | ||
45 | AC_DEFUN([gl_MATH_H_DEFAULTS], | 55 | AC_DEFUN([gl_MATH_H_DEFAULTS], |
46 | [ | 56 | [ |
57 | GNULIB_ACOSL=0; AC_SUBST([GNULIB_ACOSL]) | ||
58 | GNULIB_ASINL=0; AC_SUBST([GNULIB_ASINL]) | ||
59 | GNULIB_ATANL=0; AC_SUBST([GNULIB_ATANL]) | ||
47 | GNULIB_CEILF=0; AC_SUBST([GNULIB_CEILF]) | 60 | GNULIB_CEILF=0; AC_SUBST([GNULIB_CEILF]) |
48 | GNULIB_CEILL=0; AC_SUBST([GNULIB_CEILL]) | 61 | GNULIB_CEILL=0; AC_SUBST([GNULIB_CEILL]) |
62 | GNULIB_COSL=0; AC_SUBST([GNULIB_COSL]) | ||
63 | GNULIB_EXPL=0; AC_SUBST([GNULIB_EXPL]) | ||
49 | GNULIB_FLOORF=0; AC_SUBST([GNULIB_FLOORF]) | 64 | GNULIB_FLOORF=0; AC_SUBST([GNULIB_FLOORF]) |
50 | GNULIB_FLOORL=0; AC_SUBST([GNULIB_FLOORL]) | 65 | GNULIB_FLOORL=0; AC_SUBST([GNULIB_FLOORL]) |
51 | GNULIB_FREXP=0; AC_SUBST([GNULIB_FREXP]) | 66 | GNULIB_FREXP=0; AC_SUBST([GNULIB_FREXP]) |
@@ -57,31 +72,53 @@ AC_DEFUN([gl_MATH_H_DEFAULTS], | |||
57 | GNULIB_ISNAND=0; AC_SUBST([GNULIB_ISNAND]) | 72 | GNULIB_ISNAND=0; AC_SUBST([GNULIB_ISNAND]) |
58 | GNULIB_ISNANL=0; AC_SUBST([GNULIB_ISNANL]) | 73 | GNULIB_ISNANL=0; AC_SUBST([GNULIB_ISNANL]) |
59 | GNULIB_LDEXPL=0; AC_SUBST([GNULIB_LDEXPL]) | 74 | GNULIB_LDEXPL=0; AC_SUBST([GNULIB_LDEXPL]) |
60 | GNULIB_MATHL=0; AC_SUBST([GNULIB_MATHL]) | 75 | GNULIB_LOGB=0; AC_SUBST([GNULIB_LOGB]) |
76 | GNULIB_LOGL=0; AC_SUBST([GNULIB_LOGL]) | ||
61 | GNULIB_ROUND=0; AC_SUBST([GNULIB_ROUND]) | 77 | GNULIB_ROUND=0; AC_SUBST([GNULIB_ROUND]) |
62 | GNULIB_ROUNDF=0; AC_SUBST([GNULIB_ROUNDF]) | 78 | GNULIB_ROUNDF=0; AC_SUBST([GNULIB_ROUNDF]) |
63 | GNULIB_ROUNDL=0; AC_SUBST([GNULIB_ROUNDL]) | 79 | GNULIB_ROUNDL=0; AC_SUBST([GNULIB_ROUNDL]) |
64 | GNULIB_SIGNBIT=0; AC_SUBST([GNULIB_SIGNBIT]) | 80 | GNULIB_SIGNBIT=0; AC_SUBST([GNULIB_SIGNBIT]) |
81 | GNULIB_SINL=0; AC_SUBST([GNULIB_SINL]) | ||
82 | GNULIB_SQRTL=0; AC_SUBST([GNULIB_SQRTL]) | ||
83 | GNULIB_TANL=0; AC_SUBST([GNULIB_TANL]) | ||
65 | GNULIB_TRUNC=0; AC_SUBST([GNULIB_TRUNC]) | 84 | GNULIB_TRUNC=0; AC_SUBST([GNULIB_TRUNC]) |
66 | GNULIB_TRUNCF=0; AC_SUBST([GNULIB_TRUNCF]) | 85 | GNULIB_TRUNCF=0; AC_SUBST([GNULIB_TRUNCF]) |
67 | GNULIB_TRUNCL=0; AC_SUBST([GNULIB_TRUNCL]) | 86 | GNULIB_TRUNCL=0; AC_SUBST([GNULIB_TRUNCL]) |
68 | dnl Assume proper GNU behavior unless another module says otherwise. | 87 | dnl Assume proper GNU behavior unless another module says otherwise. |
88 | HAVE_ACOSL=1; AC_SUBST([HAVE_ACOSL]) | ||
89 | HAVE_ASINL=1; AC_SUBST([HAVE_ASINL]) | ||
90 | HAVE_ATANL=1; AC_SUBST([HAVE_ATANL]) | ||
91 | HAVE_COSL=1; AC_SUBST([HAVE_COSL]) | ||
92 | HAVE_EXPL=1; AC_SUBST([HAVE_EXPL]) | ||
69 | HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF]) | 93 | HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF]) |
70 | HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND]) | 94 | HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND]) |
71 | HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL]) | 95 | HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL]) |
96 | HAVE_LOGL=1; AC_SUBST([HAVE_LOGL]) | ||
97 | HAVE_SINL=1; AC_SUBST([HAVE_SINL]) | ||
98 | HAVE_SQRTL=1; AC_SUBST([HAVE_SQRTL]) | ||
99 | HAVE_TANL=1; AC_SUBST([HAVE_TANL]) | ||
72 | HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL]) | 100 | HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL]) |
73 | HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL]) | 101 | HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL]) |
74 | HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL]) | 102 | HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL]) |
103 | HAVE_DECL_CEILF=1; AC_SUBST([HAVE_DECL_CEILF]) | ||
104 | HAVE_DECL_CEILL=1; AC_SUBST([HAVE_DECL_CEILL]) | ||
75 | HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL]) | 105 | HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL]) |
76 | HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL]) | 106 | HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL]) |
107 | HAVE_DECL_FLOORF=1; AC_SUBST([HAVE_DECL_FLOORF]) | ||
108 | HAVE_DECL_FLOORL=1; AC_SUBST([HAVE_DECL_FLOORL]) | ||
77 | HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL]) | 109 | HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL]) |
78 | HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL]) | 110 | HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL]) |
111 | HAVE_DECL_LOGB=1; AC_SUBST([HAVE_DECL_LOGB]) | ||
79 | HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL]) | 112 | HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL]) |
113 | HAVE_DECL_ROUND=1; AC_SUBST([HAVE_DECL_ROUND]) | ||
114 | HAVE_DECL_ROUNDF=1; AC_SUBST([HAVE_DECL_ROUNDF]) | ||
115 | HAVE_DECL_ROUNDL=1; AC_SUBST([HAVE_DECL_ROUNDL]) | ||
80 | HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL]) | 116 | HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL]) |
81 | HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL]) | 117 | HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL]) |
82 | HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL]) | 118 | HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL]) |
83 | HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC]) | 119 | HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC]) |
84 | HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF]) | 120 | HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF]) |
121 | HAVE_DECL_TRUNCL=1; AC_SUBST([HAVE_DECL_TRUNCL]) | ||
85 | REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF]) | 122 | REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF]) |
86 | REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL]) | 123 | REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL]) |
87 | REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF]) | 124 | REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF]) |
diff --git a/gl/m4/mbrtowc.m4 b/gl/m4/mbrtowc.m4 index 11d7d23e..606de5c9 100644 --- a/gl/m4/mbrtowc.m4 +++ b/gl/m4/mbrtowc.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # mbrtowc.m4 serial 15 | 1 | # mbrtowc.m4 serial 17 |
2 | dnl Copyright (C) 2001-2002, 2004-2005, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2001-2002, 2004-2005, 2008-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
@@ -10,38 +11,39 @@ AC_DEFUN([gl_FUNC_MBRTOWC], | |||
10 | 11 | ||
11 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) | 12 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) |
12 | gl_MBSTATE_T_BROKEN | 13 | gl_MBSTATE_T_BROKEN |
13 | if test $REPLACE_MBSTATE_T = 1; then | 14 | |
14 | REPLACE_MBRTOWC=1 | ||
15 | fi | ||
16 | AC_CHECK_FUNCS_ONCE([mbrtowc]) | 15 | AC_CHECK_FUNCS_ONCE([mbrtowc]) |
17 | if test $ac_cv_func_mbrtowc = no; then | 16 | if test $ac_cv_func_mbrtowc = no; then |
18 | HAVE_MBRTOWC=0 | 17 | HAVE_MBRTOWC=0 |
19 | fi | 18 | else |
20 | if test $HAVE_MBRTOWC != 0 && test $REPLACE_MBRTOWC != 1; then | 19 | if test $REPLACE_MBSTATE_T = 1; then |
21 | gl_MBRTOWC_NULL_ARG | 20 | REPLACE_MBRTOWC=1 |
22 | gl_MBRTOWC_RETVAL | 21 | else |
23 | gl_MBRTOWC_NUL_RETVAL | 22 | gl_MBRTOWC_NULL_ARG |
24 | case "$gl_cv_func_mbrtowc_null_arg" in | 23 | gl_MBRTOWC_RETVAL |
25 | *yes) ;; | 24 | gl_MBRTOWC_NUL_RETVAL |
26 | *) AC_DEFINE([MBRTOWC_NULL_ARG_BUG], [1], | 25 | case "$gl_cv_func_mbrtowc_null_arg" in |
27 | [Define if the mbrtowc function has the NULL string argument bug.]) | 26 | *yes) ;; |
28 | REPLACE_MBRTOWC=1 | 27 | *) AC_DEFINE([MBRTOWC_NULL_ARG_BUG], [1], |
29 | ;; | 28 | [Define if the mbrtowc function has the NULL string argument bug.]) |
30 | esac | 29 | REPLACE_MBRTOWC=1 |
31 | case "$gl_cv_func_mbrtowc_retval" in | 30 | ;; |
32 | *yes) ;; | 31 | esac |
33 | *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1], | 32 | case "$gl_cv_func_mbrtowc_retval" in |
34 | [Define if the mbrtowc function returns a wrong return value.]) | 33 | *yes) ;; |
35 | REPLACE_MBRTOWC=1 | 34 | *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1], |
36 | ;; | 35 | [Define if the mbrtowc function returns a wrong return value.]) |
37 | esac | 36 | REPLACE_MBRTOWC=1 |
38 | case "$gl_cv_func_mbrtowc_nul_retval" in | 37 | ;; |
39 | *yes) ;; | 38 | esac |
40 | *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1], | 39 | case "$gl_cv_func_mbrtowc_nul_retval" in |
41 | [Define if the mbrtowc function does not return 0 for a NUL character.]) | 40 | *yes) ;; |
42 | REPLACE_MBRTOWC=1 | 41 | *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1], |
43 | ;; | 42 | [Define if the mbrtowc function does not return 0 for a NUL character.]) |
44 | esac | 43 | REPLACE_MBRTOWC=1 |
44 | ;; | ||
45 | esac | ||
46 | fi | ||
45 | fi | 47 | fi |
46 | if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then | 48 | if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then |
47 | gl_REPLACE_WCHAR_H | 49 | gl_REPLACE_WCHAR_H |
@@ -156,6 +158,7 @@ changequote([,])dnl | |||
156 | if test $LOCALE_ZH_CN != none; then | 158 | if test $LOCALE_ZH_CN != none; then |
157 | AC_TRY_RUN([ | 159 | AC_TRY_RUN([ |
158 | #include <locale.h> | 160 | #include <locale.h> |
161 | #include <stdlib.h> | ||
159 | #include <string.h> | 162 | #include <string.h> |
160 | #include <wchar.h> | 163 | #include <wchar.h> |
161 | int main () | 164 | int main () |
diff --git a/gl/m4/mbsinit.m4 b/gl/m4/mbsinit.m4 index 03b055cd..46c106fc 100644 --- a/gl/m4/mbsinit.m4 +++ b/gl/m4/mbsinit.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # mbsinit.m4 serial 3 | 1 | # mbsinit.m4 serial 4 |
2 | dnl Copyright (C) 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -10,12 +10,14 @@ AC_DEFUN([gl_FUNC_MBSINIT], | |||
10 | 10 | ||
11 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) | 11 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) |
12 | gl_MBSTATE_T_BROKEN | 12 | gl_MBSTATE_T_BROKEN |
13 | if test $REPLACE_MBSTATE_T = 1; then | 13 | |
14 | REPLACE_MBSINIT=1 | ||
15 | fi | ||
16 | AC_CHECK_FUNCS_ONCE([mbsinit]) | 14 | AC_CHECK_FUNCS_ONCE([mbsinit]) |
17 | if test $ac_cv_func_mbsinit = no; then | 15 | if test $ac_cv_func_mbsinit = no; then |
18 | HAVE_MBSINIT=0 | 16 | HAVE_MBSINIT=0 |
17 | else | ||
18 | if test $REPLACE_MBSTATE_T = 1; then | ||
19 | REPLACE_MBSINIT=1 | ||
20 | fi | ||
19 | fi | 21 | fi |
20 | if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then | 22 | if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then |
21 | gl_REPLACE_WCHAR_H | 23 | gl_REPLACE_WCHAR_H |
diff --git a/gl/m4/mbstate_t.m4 b/gl/m4/mbstate_t.m4 index d4ec6f0f..3e2df29f 100644 --- a/gl/m4/mbstate_t.m4 +++ b/gl/m4/mbstate_t.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # mbstate_t.m4 serial 12 | 1 | # mbstate_t.m4 serial 12 |
2 | dnl Copyright (C) 2000-2002, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2000-2002, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -18,17 +18,17 @@ AC_DEFUN([AC_TYPE_MBSTATE_T], | |||
18 | 18 | ||
19 | AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t], | 19 | AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t], |
20 | [AC_COMPILE_IFELSE( | 20 | [AC_COMPILE_IFELSE( |
21 | [AC_LANG_PROGRAM( | 21 | [AC_LANG_PROGRAM( |
22 | [AC_INCLUDES_DEFAULT[ | 22 | [AC_INCLUDES_DEFAULT[ |
23 | # include <wchar.h>]], | 23 | # include <wchar.h>]], |
24 | [[mbstate_t x; return sizeof x;]])], | 24 | [[mbstate_t x; return sizeof x;]])], |
25 | [ac_cv_type_mbstate_t=yes], | 25 | [ac_cv_type_mbstate_t=yes], |
26 | [ac_cv_type_mbstate_t=no])]) | 26 | [ac_cv_type_mbstate_t=no])]) |
27 | if test $ac_cv_type_mbstate_t = yes; then | 27 | if test $ac_cv_type_mbstate_t = yes; then |
28 | AC_DEFINE([HAVE_MBSTATE_T], [1], | 28 | AC_DEFINE([HAVE_MBSTATE_T], [1], |
29 | [Define to 1 if <wchar.h> declares mbstate_t.]) | 29 | [Define to 1 if <wchar.h> declares mbstate_t.]) |
30 | else | 30 | else |
31 | AC_DEFINE([mbstate_t], [int], | 31 | AC_DEFINE([mbstate_t], [int], |
32 | [Define to a type if <wchar.h> does not define.]) | 32 | [Define to a type if <wchar.h> does not define.]) |
33 | fi | 33 | fi |
34 | ]) | 34 | ]) |
diff --git a/gl/m4/memchr.m4 b/gl/m4/memchr.m4 new file mode 100644 index 00000000..ab773b81 --- /dev/null +++ b/gl/m4/memchr.m4 | |||
@@ -0,0 +1,85 @@ | |||
1 | # memchr.m4 serial 8 | ||
2 | dnl Copyright (C) 2002-2004, 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN_ONCE([gl_FUNC_MEMCHR], | ||
8 | [ | ||
9 | dnl Check for prerequisites for memory fence checks. | ||
10 | gl_FUNC_MMAP_ANON | ||
11 | AC_CHECK_HEADERS_ONCE([sys/mman.h]) | ||
12 | AC_CHECK_FUNCS_ONCE([mprotect]) | ||
13 | |||
14 | dnl These days, we assume memchr is present. But just in case... | ||
15 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | ||
16 | AC_CHECK_FUNCS_ONCE([memchr]) | ||
17 | if test $ac_cv_func_memchr = yes; then | ||
18 | # Detect platform-specific bugs in some versions of glibc: | ||
19 | # memchr should not dereference anything with length 0 | ||
20 | # http://bugzilla.redhat.com/499689 | ||
21 | # memchr should not dereference overestimated length after a match | ||
22 | # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 | ||
23 | # http://sourceware.org/bugzilla/show_bug.cgi?id=10162 | ||
24 | # Assume that memchr works on platforms that lack mprotect. | ||
25 | AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works], | ||
26 | [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | ||
27 | #include <string.h> | ||
28 | #if HAVE_SYS_MMAN_H | ||
29 | # include <fcntl.h> | ||
30 | # include <unistd.h> | ||
31 | # include <sys/types.h> | ||
32 | # include <sys/mman.h> | ||
33 | # ifndef MAP_FILE | ||
34 | # define MAP_FILE 0 | ||
35 | # endif | ||
36 | #endif | ||
37 | ]], [[ | ||
38 | char *fence = NULL; | ||
39 | #if HAVE_SYS_MMAN_H && HAVE_MPROTECT | ||
40 | # if HAVE_MAP_ANONYMOUS | ||
41 | const int flags = MAP_ANONYMOUS | MAP_PRIVATE; | ||
42 | const int fd = -1; | ||
43 | # else /* !HAVE_MAP_ANONYMOUS */ | ||
44 | const int flags = MAP_FILE | MAP_PRIVATE; | ||
45 | int fd = open ("/dev/zero", O_RDONLY, 0666); | ||
46 | if (fd >= 0) | ||
47 | # endif | ||
48 | { | ||
49 | int pagesize = getpagesize (); | ||
50 | char *two_pages = | ||
51 | (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, | ||
52 | flags, fd, 0); | ||
53 | if (two_pages != (char *)(-1) | ||
54 | && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) | ||
55 | fence = two_pages + pagesize; | ||
56 | } | ||
57 | #endif | ||
58 | if (fence) | ||
59 | { | ||
60 | if (memchr (fence, 0, 0)) | ||
61 | return 1; | ||
62 | strcpy (fence - 9, "12345678"); | ||
63 | if (memchr (fence - 9, 0, 79) != fence - 1) | ||
64 | return 2; | ||
65 | } | ||
66 | return 0; | ||
67 | ]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no], | ||
68 | [dnl Be pessimistic for now. | ||
69 | gl_cv_func_memchr_works="guessing no"])]) | ||
70 | if test "$gl_cv_func_memchr_works" != yes; then | ||
71 | REPLACE_MEMCHR=1 | ||
72 | fi | ||
73 | else | ||
74 | HAVE_MEMCHR=0 | ||
75 | fi | ||
76 | if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then | ||
77 | AC_LIBOBJ([memchr]) | ||
78 | gl_PREREQ_MEMCHR | ||
79 | fi | ||
80 | ]) | ||
81 | |||
82 | # Prerequisites of lib/memchr.c. | ||
83 | AC_DEFUN([gl_PREREQ_MEMCHR], [ | ||
84 | AC_CHECK_HEADERS([bp-sym.h]) | ||
85 | ]) | ||
diff --git a/gl/m4/mktime.m4 b/gl/m4/mktime.m4 index 1e926e86..44b8d878 100644 --- a/gl/m4/mktime.m4 +++ b/gl/m4/mktime.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # serial 15 | 1 | # serial 15 |
2 | dnl Copyright (C) 2002-2003, 2005-2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
@@ -85,8 +86,8 @@ static int | |||
85 | mktime_test (time_t now) | 86 | mktime_test (time_t now) |
86 | { | 87 | { |
87 | return (mktime_test1 (now) | 88 | return (mktime_test1 (now) |
88 | && mktime_test1 ((time_t) (time_t_max - now)) | 89 | && mktime_test1 ((time_t) (time_t_max - now)) |
89 | && mktime_test1 ((time_t) (time_t_min + now))); | 90 | && mktime_test1 ((time_t) (time_t_min + now))); |
90 | } | 91 | } |
91 | 92 | ||
92 | static int | 93 | static int |
@@ -116,17 +117,17 @@ bigtime_test (int j) | |||
116 | { | 117 | { |
117 | struct tm *lt = localtime (&now); | 118 | struct tm *lt = localtime (&now); |
118 | if (! (lt | 119 | if (! (lt |
119 | && lt->tm_year == tm.tm_year | 120 | && lt->tm_year == tm.tm_year |
120 | && lt->tm_mon == tm.tm_mon | 121 | && lt->tm_mon == tm.tm_mon |
121 | && lt->tm_mday == tm.tm_mday | 122 | && lt->tm_mday == tm.tm_mday |
122 | && lt->tm_hour == tm.tm_hour | 123 | && lt->tm_hour == tm.tm_hour |
123 | && lt->tm_min == tm.tm_min | 124 | && lt->tm_min == tm.tm_min |
124 | && lt->tm_sec == tm.tm_sec | 125 | && lt->tm_sec == tm.tm_sec |
125 | && lt->tm_yday == tm.tm_yday | 126 | && lt->tm_yday == tm.tm_yday |
126 | && lt->tm_wday == tm.tm_wday | 127 | && lt->tm_wday == tm.tm_wday |
127 | && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) | 128 | && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) |
128 | == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) | 129 | == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) |
129 | return 0; | 130 | return 0; |
130 | } | 131 | } |
131 | return 1; | 132 | return 1; |
132 | } | 133 | } |
@@ -158,7 +159,7 @@ year_2050_test () | |||
158 | to the correct answer that we can assume the discrepancy is | 159 | to the correct answer that we can assume the discrepancy is |
159 | due to leap seconds. */ | 160 | due to leap seconds. */ |
160 | return (t == (time_t) -1 | 161 | return (t == (time_t) -1 |
161 | || (0 < t && answer - 120 <= t && t <= answer + 120)); | 162 | || (0 < t && answer - 120 <= t && t <= answer + 120)); |
162 | } | 163 | } |
163 | 164 | ||
164 | int | 165 | int |
@@ -176,7 +177,7 @@ main () | |||
176 | { | 177 | { |
177 | t = (time_t_max << 1) + 1; | 178 | t = (time_t_max << 1) + 1; |
178 | if (t <= time_t_max) | 179 | if (t <= time_t_max) |
179 | break; | 180 | break; |
180 | time_t_max = t; | 181 | time_t_max = t; |
181 | } | 182 | } |
182 | time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; | 183 | time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; |
@@ -185,29 +186,29 @@ main () | |||
185 | for (i = 0; i < N_STRINGS; i++) | 186 | for (i = 0; i < N_STRINGS; i++) |
186 | { | 187 | { |
187 | if (tz_strings[i]) | 188 | if (tz_strings[i]) |
188 | putenv (tz_strings[i]); | 189 | putenv (tz_strings[i]); |
189 | 190 | ||
190 | for (t = 0; t <= time_t_max - delta; t += delta) | 191 | for (t = 0; t <= time_t_max - delta; t += delta) |
191 | if (! mktime_test (t)) | 192 | if (! mktime_test (t)) |
192 | return 1; | 193 | return 1; |
193 | if (! (mktime_test ((time_t) 1) | 194 | if (! (mktime_test ((time_t) 1) |
194 | && mktime_test ((time_t) (60 * 60)) | 195 | && mktime_test ((time_t) (60 * 60)) |
195 | && mktime_test ((time_t) (60 * 60 * 24)))) | 196 | && mktime_test ((time_t) (60 * 60 * 24)))) |
196 | return 1; | 197 | return 1; |
197 | 198 | ||
198 | for (j = 1; ; j <<= 1) | 199 | for (j = 1; ; j <<= 1) |
199 | if (! bigtime_test (j)) | 200 | if (! bigtime_test (j)) |
200 | return 1; | 201 | return 1; |
201 | else if (INT_MAX / 2 < j) | 202 | else if (INT_MAX / 2 < j) |
202 | break; | 203 | break; |
203 | if (! bigtime_test (INT_MAX)) | 204 | if (! bigtime_test (INT_MAX)) |
204 | return 1; | 205 | return 1; |
205 | } | 206 | } |
206 | return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); | 207 | return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); |
207 | }]])], | 208 | }]])], |
208 | [ac_cv_func_working_mktime=yes], | 209 | [ac_cv_func_working_mktime=yes], |
209 | [ac_cv_func_working_mktime=no], | 210 | [ac_cv_func_working_mktime=no], |
210 | [ac_cv_func_working_mktime=no])]) | 211 | [ac_cv_func_working_mktime=no])]) |
211 | if test $ac_cv_func_working_mktime = no; then | 212 | if test $ac_cv_func_working_mktime = no; then |
212 | AC_LIBOBJ([mktime]) | 213 | AC_LIBOBJ([mktime]) |
213 | fi | 214 | fi |
@@ -215,12 +216,14 @@ fi | |||
215 | 216 | ||
216 | AC_DEFUN([gl_FUNC_MKTIME], | 217 | AC_DEFUN([gl_FUNC_MKTIME], |
217 | [ | 218 | [ |
219 | AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) | ||
218 | AC_FUNC_MKTIME | 220 | AC_FUNC_MKTIME |
219 | dnl Note: AC_FUNC_MKTIME does AC_LIBOBJ([mktime]). | 221 | dnl Note: AC_FUNC_MKTIME does AC_LIBOBJ([mktime]). |
220 | if test $ac_cv_func_working_mktime = no; then | 222 | if test $ac_cv_func_working_mktime = no; then |
221 | AC_DEFINE([mktime], [rpl_mktime], | 223 | REPLACE_MKTIME=1 |
222 | [Define to rpl_mktime if the replacement function should be used.]) | ||
223 | gl_PREREQ_MKTIME | 224 | gl_PREREQ_MKTIME |
225 | else | ||
226 | REPLACE_MKTIME=0 | ||
224 | fi | 227 | fi |
225 | ]) | 228 | ]) |
226 | 229 | ||
diff --git a/gl/m4/mmap-anon.m4 b/gl/m4/mmap-anon.m4 new file mode 100644 index 00000000..a6b7b9ac --- /dev/null +++ b/gl/m4/mmap-anon.m4 | |||
@@ -0,0 +1,59 @@ | |||
1 | # mmap-anon.m4 serial 8 | ||
2 | dnl Copyright (C) 2005, 2007, 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | # Detect how mmap can be used to create anonymous (not file-backed) memory | ||
8 | # mappings. | ||
9 | # - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS | ||
10 | # and MAP_ANON exist and have the same value. | ||
11 | # - On HP-UX, only MAP_ANONYMOUS exists. | ||
12 | # - On MacOS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists. | ||
13 | # - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be | ||
14 | # used. | ||
15 | |||
16 | AC_DEFUN([gl_FUNC_MMAP_ANON], | ||
17 | [ | ||
18 | dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57. | ||
19 | AC_REQUIRE([AC_PROG_CPP]) | ||
20 | AC_REQUIRE([AC_PROG_EGREP]) | ||
21 | |||
22 | dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS. | ||
23 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | ||
24 | |||
25 | # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it | ||
26 | # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is | ||
27 | # irrelevant for anonymous mappings. | ||
28 | AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no]) | ||
29 | |||
30 | # Try to allow MAP_ANONYMOUS. | ||
31 | gl_have_mmap_anonymous=no | ||
32 | if test $gl_have_mmap = yes; then | ||
33 | AC_MSG_CHECKING([for MAP_ANONYMOUS]) | ||
34 | AC_EGREP_CPP([I cant identify this map.], [ | ||
35 | #include <sys/mman.h> | ||
36 | #ifdef MAP_ANONYMOUS | ||
37 | I cant identify this map. | ||
38 | #endif | ||
39 | ], | ||
40 | [gl_have_mmap_anonymous=yes]) | ||
41 | if test $gl_have_mmap_anonymous != yes; then | ||
42 | AC_EGREP_CPP([I cant identify this map.], [ | ||
43 | #include <sys/mman.h> | ||
44 | #ifdef MAP_ANON | ||
45 | I cant identify this map. | ||
46 | #endif | ||
47 | ], | ||
48 | [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON], | ||
49 | [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.]) | ||
50 | gl_have_mmap_anonymous=yes]) | ||
51 | fi | ||
52 | AC_MSG_RESULT([$gl_have_mmap_anonymous]) | ||
53 | if test $gl_have_mmap_anonymous = yes; then | ||
54 | AC_DEFINE([HAVE_MAP_ANONYMOUS], [1], | ||
55 | [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including | ||
56 | config.h and <sys/mman.h>.]) | ||
57 | fi | ||
58 | fi | ||
59 | ]) | ||
diff --git a/gl/m4/mode_t.m4 b/gl/m4/mode_t.m4 new file mode 100644 index 00000000..3178dfd3 --- /dev/null +++ b/gl/m4/mode_t.m4 | |||
@@ -0,0 +1,26 @@ | |||
1 | # mode_t.m4 serial 2 | ||
2 | dnl Copyright (C) 2009-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | # For using mode_t, it's sufficient to use AC_TYPE_MODE_T and | ||
8 | # include <sys/types.h>. | ||
9 | |||
10 | # Define PROMOTED_MODE_T to the type that is the result of "default argument | ||
11 | # promotion" (ISO C 6.5.2.2.(6)) of the type mode_t. | ||
12 | AC_DEFUN([gl_PROMOTED_TYPE_MODE_T], | ||
13 | [ | ||
14 | AC_REQUIRE([AC_TYPE_MODE_T]) | ||
15 | AC_CACHE_CHECK([for promoted mode_t type], [gl_cv_promoted_mode_t], [ | ||
16 | dnl Assume mode_t promotes to 'int' if and only if it is smaller than 'int', | ||
17 | dnl and to itself otherwise. This assumption is not guaranteed by the ISO C | ||
18 | dnl standard, but we don't know of any real-world counterexamples. | ||
19 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>]], | ||
20 | [[typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];]])], | ||
21 | [gl_cv_promoted_mode_t='int'], | ||
22 | [gl_cv_promoted_mode_t='mode_t']) | ||
23 | ]) | ||
24 | AC_DEFINE_UNQUOTED([PROMOTED_MODE_T], [$gl_cv_promoted_mode_t], | ||
25 | [Define to the type that is the result of default argument promotions of type mode_t.]) | ||
26 | ]) | ||
diff --git a/gl/m4/mountlist.m4 b/gl/m4/mountlist.m4 index f62c57a2..f2d59501 100644 --- a/gl/m4/mountlist.m4 +++ b/gl/m4/mountlist.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # serial 10 | 1 | # serial 10 |
2 | dnl Copyright (C) 2002-2006, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -7,7 +7,7 @@ dnl with or without modifications, as long as this notice is preserved. | |||
7 | AC_DEFUN([gl_MOUNTLIST], | 7 | AC_DEFUN([gl_MOUNTLIST], |
8 | [ | 8 | [ |
9 | gl_LIST_MOUNTED_FILE_SYSTEMS([gl_cv_list_mounted_fs=yes], | 9 | gl_LIST_MOUNTED_FILE_SYSTEMS([gl_cv_list_mounted_fs=yes], |
10 | [gl_cv_list_mounted_fs=no]) | 10 | [gl_cv_list_mounted_fs=no]) |
11 | if test $gl_cv_list_mounted_fs = yes; then | 11 | if test $gl_cv_list_mounted_fs = yes; then |
12 | AC_LIBOBJ([mountlist]) | 12 | AC_LIBOBJ([mountlist]) |
13 | gl_PREREQ_MOUNTLIST_EXTRA | 13 | gl_PREREQ_MOUNTLIST_EXTRA |
diff --git a/gl/m4/multiarch.m4 b/gl/m4/multiarch.m4 index ec377bac..389bd2bb 100644 --- a/gl/m4/multiarch.m4 +++ b/gl/m4/multiarch.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # multiarch.m4 serial 5 | 1 | # multiarch.m4 serial 5 |
2 | dnl Copyright (C) 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/netdb_h.m4 b/gl/m4/netdb_h.m4 index 5a12251f..40ba8f66 100644 --- a/gl/m4/netdb_h.m4 +++ b/gl/m4/netdb_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # netdb_h.m4 serial 5 | 1 | # netdb_h.m4 serial 7 |
2 | dnl Copyright (C) 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -7,6 +7,7 @@ dnl with or without modifications, as long as this notice is preserved. | |||
7 | AC_DEFUN([gl_HEADER_NETDB], | 7 | AC_DEFUN([gl_HEADER_NETDB], |
8 | [ | 8 | [ |
9 | AC_REQUIRE([gl_NETDB_H_DEFAULTS]) | 9 | AC_REQUIRE([gl_NETDB_H_DEFAULTS]) |
10 | AC_CHECK_HEADERS_ONCE([netdb.h]) | ||
10 | gl_CHECK_NEXT_HEADERS([netdb.h]) | 11 | gl_CHECK_NEXT_HEADERS([netdb.h]) |
11 | if test $ac_cv_header_netdb_h = yes; then | 12 | if test $ac_cv_header_netdb_h = yes; then |
12 | AC_COMPILE_IFELSE( | 13 | AC_COMPILE_IFELSE( |
@@ -30,7 +31,7 @@ AC_DEFUN([gl_NETDB_MODULE_INDICATOR], | |||
30 | [ | 31 | [ |
31 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 32 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
32 | AC_REQUIRE([gl_NETDB_H_DEFAULTS]) | 33 | AC_REQUIRE([gl_NETDB_H_DEFAULTS]) |
33 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 34 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
34 | ]) | 35 | ]) |
35 | 36 | ||
36 | AC_DEFUN([gl_NETDB_H_DEFAULTS], | 37 | AC_DEFUN([gl_NETDB_H_DEFAULTS], |
diff --git a/gl/m4/netinet_in_h.m4 b/gl/m4/netinet_in_h.m4 index 47fd9cc3..cc7a44cc 100644 --- a/gl/m4/netinet_in_h.m4 +++ b/gl/m4/netinet_in_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # netinet_in_h.m4 serial 4 | 1 | # netinet_in_h.m4 serial 4 |
2 | dnl Copyright (C) 2006-2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/nl_langinfo.m4 b/gl/m4/nl_langinfo.m4 new file mode 100644 index 00000000..ad456a26 --- /dev/null +++ b/gl/m4/nl_langinfo.m4 | |||
@@ -0,0 +1,25 @@ | |||
1 | # nl_langinfo.m4 serial 3 | ||
2 | dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_FUNC_NL_LANGINFO], | ||
8 | [ | ||
9 | AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) | ||
10 | AC_REQUIRE([gl_LANGINFO_H]) | ||
11 | AC_CHECK_FUNCS_ONCE([nl_langinfo]) | ||
12 | if test $ac_cv_func_nl_langinfo = yes; then | ||
13 | if test $HAVE_LANGINFO_CODESET = 1 && test $HAVE_LANGINFO_ERA = 1; then | ||
14 | : | ||
15 | else | ||
16 | REPLACE_NL_LANGINFO=1 | ||
17 | AC_DEFINE([REPLACE_NL_LANGINFO], [1], | ||
18 | [Define if nl_langinfo exists but is overridden by gnulib.]) | ||
19 | AC_LIBOBJ([nl_langinfo]) | ||
20 | fi | ||
21 | else | ||
22 | HAVE_NL_LANGINFO=0 | ||
23 | AC_LIBOBJ([nl_langinfo]) | ||
24 | fi | ||
25 | ]) | ||
diff --git a/gl/m4/nls.m4 b/gl/m4/nls.m4 index 0b364342..003704c4 100644 --- a/gl/m4/nls.m4 +++ b/gl/m4/nls.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # nls.m4 serial 5 (gettext-0.18) | 1 | # nls.m4 serial 5 (gettext-0.18) |
2 | dnl Copyright (C) 1995-2003, 2005-2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/onceonly.m4 b/gl/m4/onceonly.m4 index 108cd6c1..4a3cd84d 100644 --- a/gl/m4/onceonly.m4 +++ b/gl/m4/onceonly.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # onceonly.m4 serial 6 | 1 | # onceonly.m4 serial 6 |
2 | dnl Copyright (C) 2002-2003, 2005-2006, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2005-2006, 2008-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software, distributed under the terms of the GNU | 4 | dnl This file is free software, distributed under the terms of the GNU |
4 | dnl General Public License. As a special exception to the GNU General | 5 | dnl General Public License. As a special exception to the GNU General |
5 | dnl Public License, this file may be distributed as part of a program | 6 | dnl Public License, this file may be distributed as part of a program |
diff --git a/gl/m4/open.m4 b/gl/m4/open.m4 index 6e286c96..d705b3a1 100644 --- a/gl/m4/open.m4 +++ b/gl/m4/open.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # open.m4 serial 5 | 1 | # open.m4 serial 8 |
2 | dnl Copyright (C) 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -13,10 +13,15 @@ AC_DEFUN([gl_FUNC_OPEN], | |||
13 | ;; | 13 | ;; |
14 | *) | 14 | *) |
15 | dnl open("foo/") should not create a file when the file name has a | 15 | dnl open("foo/") should not create a file when the file name has a |
16 | dnl trailing slash. | 16 | dnl trailing slash. FreeBSD only has the problem on symlinks. |
17 | AC_CHECK_FUNCS_ONCE([lstat]) | ||
17 | AC_CACHE_CHECK([whether open recognizes a trailing slash], | 18 | AC_CACHE_CHECK([whether open recognizes a trailing slash], |
18 | [gl_cv_func_open_slash], | 19 | [gl_cv_func_open_slash], |
19 | [ | 20 | [# Assume that if we have lstat, we can also check symlinks. |
21 | if test $ac_cv_func_lstat = yes; then | ||
22 | touch conftest.tmp | ||
23 | ln -s conftest.tmp conftest.lnk | ||
24 | fi | ||
20 | AC_TRY_RUN([ | 25 | AC_TRY_RUN([ |
21 | #include <fcntl.h> | 26 | #include <fcntl.h> |
22 | #if HAVE_UNISTD_H | 27 | #if HAVE_UNISTD_H |
@@ -24,18 +29,22 @@ AC_DEFUN([gl_FUNC_OPEN], | |||
24 | #endif | 29 | #endif |
25 | int main () | 30 | int main () |
26 | { | 31 | { |
32 | #if HAVE_LSTAT | ||
33 | if (open ("conftest.lnk/", O_RDONLY) != -1) return 2; | ||
34 | #endif | ||
27 | return open ("conftest.sl/", O_CREAT, 0600) >= 0; | 35 | return open ("conftest.sl/", O_CREAT, 0600) >= 0; |
28 | }], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no], | 36 | }], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no], |
29 | [ | 37 | [ |
30 | changequote(,)dnl | 38 | changequote(,)dnl |
31 | case "$host_os" in | 39 | case "$host_os" in |
40 | freebsd*) gl_cv_func_open_slash="guessing no" ;; | ||
32 | solaris2.[0-9]*) gl_cv_func_open_slash="guessing no" ;; | 41 | solaris2.[0-9]*) gl_cv_func_open_slash="guessing no" ;; |
33 | hpux*) gl_cv_func_open_slash="guessing no" ;; | 42 | hpux*) gl_cv_func_open_slash="guessing no" ;; |
34 | *) gl_cv_func_open_slash="guessing yes" ;; | 43 | *) gl_cv_func_open_slash="guessing yes" ;; |
35 | esac | 44 | esac |
36 | changequote([,])dnl | 45 | changequote([,])dnl |
37 | ]) | 46 | ]) |
38 | rm -f conftest.sl | 47 | rm -f conftest.sl conftest.tmp conftest.lnk |
39 | ]) | 48 | ]) |
40 | case "$gl_cv_func_open_slash" in | 49 | case "$gl_cv_func_open_slash" in |
41 | *no) | 50 | *no) |
@@ -51,16 +60,15 @@ changequote([,])dnl | |||
51 | AC_DEFUN([gl_REPLACE_OPEN], | 60 | AC_DEFUN([gl_REPLACE_OPEN], |
52 | [ | 61 | [ |
53 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | 62 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) |
54 | if test $REPLACE_OPEN != 1; then | ||
55 | AC_LIBOBJ([open]) | ||
56 | gl_PREREQ_OPEN | ||
57 | fi | ||
58 | REPLACE_OPEN=1 | 63 | REPLACE_OPEN=1 |
64 | AC_LIBOBJ([open]) | ||
65 | gl_PREREQ_OPEN | ||
59 | ]) | 66 | ]) |
60 | 67 | ||
61 | # Prerequisites of lib/open.c. | 68 | # Prerequisites of lib/open.c. |
62 | AC_DEFUN([gl_PREREQ_OPEN], | 69 | AC_DEFUN([gl_PREREQ_OPEN], |
63 | [ | 70 | [ |
64 | AC_REQUIRE([AC_C_INLINE]) | 71 | AC_REQUIRE([AC_C_INLINE]) |
72 | AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T]) | ||
65 | : | 73 | : |
66 | ]) | 74 | ]) |
diff --git a/gl/m4/po.m4 b/gl/m4/po.m4 index 2284fa50..960efe15 100644 --- a/gl/m4/po.m4 +++ b/gl/m4/po.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # po.m4 serial 17 (gettext-0.18) | 1 | # po.m4 serial 17 (gettext-0.18) |
2 | dnl Copyright (C) 1995-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/printf-posix.m4 b/gl/m4/printf-posix.m4 index 5922d278..1eacf95a 100644 --- a/gl/m4/printf-posix.m4 +++ b/gl/m4/printf-posix.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # printf-posix.m4 serial 5 (gettext-0.18) | 1 | # printf-posix.m4 serial 5 (gettext-0.18) |
2 | dnl Copyright (C) 2003, 2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2007, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/printf.m4 b/gl/m4/printf.m4 index 87aa45c5..ebca5364 100644 --- a/gl/m4/printf.m4 +++ b/gl/m4/printf.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # printf.m4 serial 33 | 1 | # printf.m4 serial 33 |
2 | dnl Copyright (C) 2003, 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/progtest.m4 b/gl/m4/progtest.m4 index e1d445d2..2d804ac9 100644 --- a/gl/m4/progtest.m4 +++ b/gl/m4/progtest.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # progtest.m4 serial 6 (gettext-0.18) | 1 | # progtest.m4 serial 6 (gettext-0.18) |
2 | dnl Copyright (C) 1996-2003, 2005, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/regex.m4 b/gl/m4/regex.m4 index aef53d29..95784e4b 100644 --- a/gl/m4/regex.m4 +++ b/gl/m4/regex.m4 | |||
@@ -1,7 +1,7 @@ | |||
1 | # serial 54 | 1 | # serial 56 |
2 | 2 | ||
3 | # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, | 3 | # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, |
4 | # 2006, 2007, 2008, 2009 Free Software Foundation, Inc. | 4 | # 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
5 | # | 5 | # |
6 | # This file is free software; the Free Software Foundation | 6 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 7 | # gives unlimited permission to copy and/or distribute it, |
@@ -18,146 +18,154 @@ AC_DEFUN([gl_REGEX], | |||
18 | 18 | ||
19 | AC_ARG_WITH([included-regex], | 19 | AC_ARG_WITH([included-regex], |
20 | [AS_HELP_STRING([--without-included-regex], | 20 | [AS_HELP_STRING([--without-included-regex], |
21 | [don't compile regex; this is the default on systems | 21 | [don't compile regex; this is the default on systems |
22 | with recent-enough versions of the GNU C Library | 22 | with recent-enough versions of the GNU C Library |
23 | (use with caution on other systems).])]) | 23 | (use with caution on other systems).])]) |
24 | 24 | ||
25 | case $with_included_regex in #( | 25 | case $with_included_regex in #( |
26 | yes|no) ac_use_included_regex=$with_included_regex | 26 | yes|no) ac_use_included_regex=$with_included_regex |
27 | ;; | 27 | ;; |
28 | '') | 28 | '') |
29 | # If the system regex support is good enough that it passes the | 29 | # If the system regex support is good enough that it passes the |
30 | # following run test, then default to *not* using the included regex.c. | 30 | # following run test, then default to *not* using the included regex.c. |
31 | # If cross compiling, assume the test would fail and use the included | 31 | # If cross compiling, assume the test would fail and use the included |
32 | # regex.c. | 32 | # regex.c. |
33 | AC_CACHE_CHECK([for working re_compile_pattern], | 33 | AC_CACHE_CHECK([for working re_compile_pattern], |
34 | [gl_cv_func_re_compile_pattern_working], | 34 | [gl_cv_func_re_compile_pattern_working], |
35 | [AC_RUN_IFELSE( | 35 | [AC_RUN_IFELSE( |
36 | [AC_LANG_PROGRAM( | 36 | [AC_LANG_PROGRAM( |
37 | [AC_INCLUDES_DEFAULT[ | 37 | [AC_INCLUDES_DEFAULT[ |
38 | #if HAVE_LOCALE_H | 38 | #if HAVE_LOCALE_H |
39 | #include <locale.h> | 39 | #include <locale.h> |
40 | #endif | 40 | #endif |
41 | #include <limits.h> | 41 | #include <limits.h> |
42 | #include <regex.h> | 42 | #include <regex.h> |
43 | ]], | 43 | ]], |
44 | [[static struct re_pattern_buffer regex; | 44 | [[static struct re_pattern_buffer regex; |
45 | unsigned char folded_chars[UCHAR_MAX + 1]; | 45 | unsigned char folded_chars[UCHAR_MAX + 1]; |
46 | int i; | 46 | int i; |
47 | const char *s; | 47 | const char *s; |
48 | struct re_registers regs; | 48 | struct re_registers regs; |
49 | 49 | ||
50 | #if HAVE_LOCALE_H | 50 | #if HAVE_LOCALE_H |
51 | /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html | 51 | /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html |
52 | This test needs valgrind to catch the bug on Debian | 52 | This test needs valgrind to catch the bug on Debian |
53 | GNU/Linux 3.1 x86, but it might catch the bug better | 53 | GNU/Linux 3.1 x86, but it might catch the bug better |
54 | on other platforms and it shouldn't hurt to try the | 54 | on other platforms and it shouldn't hurt to try the |
55 | test here. */ | 55 | test here. */ |
56 | if (setlocale (LC_ALL, "en_US.UTF-8")) | 56 | if (setlocale (LC_ALL, "en_US.UTF-8")) |
57 | { | 57 | { |
58 | static char const pat[] = "insert into"; | 58 | static char const pat[] = "insert into"; |
59 | static char const data[] = | 59 | static char const data[] = |
60 | "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; | 60 | "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; |
61 | re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | 61 | re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE |
62 | | RE_ICASE); | 62 | | RE_ICASE); |
63 | memset (®ex, 0, sizeof regex); | 63 | memset (®ex, 0, sizeof regex); |
64 | s = re_compile_pattern (pat, sizeof pat - 1, ®ex); | 64 | s = re_compile_pattern (pat, sizeof pat - 1, ®ex); |
65 | if (s) | 65 | if (s) |
66 | return 1; | 66 | return 1; |
67 | if (re_search (®ex, data, sizeof data - 1, | 67 | if (re_search (®ex, data, sizeof data - 1, |
68 | 0, sizeof data - 1, ®s) | 68 | 0, sizeof data - 1, ®s) |
69 | != -1) | 69 | != -1) |
70 | return 1; | 70 | return 1; |
71 | if (! setlocale (LC_ALL, "C")) | 71 | if (! setlocale (LC_ALL, "C")) |
72 | return 1; | 72 | return 1; |
73 | } | 73 | } |
74 | #endif | 74 | #endif |
75 | 75 | ||
76 | /* This test is from glibc bug 3957, reported by Andrew Mackey. */ | 76 | /* This test is from glibc bug 3957, reported by Andrew Mackey. */ |
77 | re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); | 77 | re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); |
78 | memset (®ex, 0, sizeof regex); | 78 | memset (®ex, 0, sizeof regex); |
79 | s = re_compile_pattern ("a[^x]b", 6, ®ex); | 79 | s = re_compile_pattern ("a[^x]b", 6, ®ex); |
80 | if (s) | 80 | if (s) |
81 | return 1; | 81 | return 1; |
82 | 82 | ||
83 | /* This should fail, but succeeds for glibc-2.5. */ | 83 | /* This should fail, but succeeds for glibc-2.5. */ |
84 | if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) | 84 | if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) |
85 | return 1; | 85 | return 1; |
86 | 86 | ||
87 | /* This regular expression is from Spencer ere test number 75 | 87 | /* This regular expression is from Spencer ere test number 75 |
88 | in grep-2.3. */ | 88 | in grep-2.3. */ |
89 | re_set_syntax (RE_SYNTAX_POSIX_EGREP); | 89 | re_set_syntax (RE_SYNTAX_POSIX_EGREP); |
90 | memset (®ex, 0, sizeof regex); | 90 | memset (®ex, 0, sizeof regex); |
91 | for (i = 0; i <= UCHAR_MAX; i++) | 91 | for (i = 0; i <= UCHAR_MAX; i++) |
92 | folded_chars[i] = i; | 92 | folded_chars[i] = i; |
93 | regex.translate = folded_chars; | 93 | regex.translate = folded_chars; |
94 | s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); | 94 | s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); |
95 | /* This should fail with _Invalid character class name_ error. */ | 95 | /* This should fail with _Invalid character class name_ error. */ |
96 | if (!s) | 96 | if (!s) |
97 | return 1; | 97 | return 1; |
98 | 98 | ||
99 | /* This should succeed, but does not for glibc-2.1.3. */ | 99 | /* Ensure that [b-a] is diagnosed as invalid, when |
100 | memset (®ex, 0, sizeof regex); | 100 | using RE_NO_EMPTY_RANGES. */ |
101 | s = re_compile_pattern ("{1", 2, ®ex); | 101 | re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES); |
102 | 102 | memset (®ex, 0, sizeof regex); | |
103 | if (s) | 103 | s = re_compile_pattern ("a[b-a]", 6, ®ex); |
104 | return 1; | 104 | if (s == 0) |
105 | 105 | return 1; | |
106 | /* The following example is derived from a problem report | 106 | |
107 | against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ | 107 | /* This should succeed, but does not for glibc-2.1.3. */ |
108 | memset (®ex, 0, sizeof regex); | 108 | memset (®ex, 0, sizeof regex); |
109 | s = re_compile_pattern ("[an\371]*n", 7, ®ex); | 109 | s = re_compile_pattern ("{1", 2, ®ex); |
110 | if (s) | 110 | |
111 | return 1; | 111 | if (s) |
112 | 112 | return 1; | |
113 | /* This should match, but does not for glibc-2.2.1. */ | 113 | |
114 | if (re_match (®ex, "an", 2, 0, ®s) != 2) | 114 | /* The following example is derived from a problem report |
115 | return 1; | 115 | against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ |
116 | 116 | memset (®ex, 0, sizeof regex); | |
117 | memset (®ex, 0, sizeof regex); | 117 | s = re_compile_pattern ("[an\371]*n", 7, ®ex); |
118 | s = re_compile_pattern ("x", 1, ®ex); | 118 | if (s) |
119 | if (s) | 119 | return 1; |
120 | return 1; | 120 | |
121 | 121 | /* This should match, but does not for glibc-2.2.1. */ | |
122 | /* glibc-2.2.93 does not work with a negative RANGE argument. */ | 122 | if (re_match (®ex, "an", 2, 0, ®s) != 2) |
123 | if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) | 123 | return 1; |
124 | return 1; | 124 | |
125 | 125 | memset (®ex, 0, sizeof regex); | |
126 | /* The version of regex.c in older versions of gnulib | 126 | s = re_compile_pattern ("x", 1, ®ex); |
127 | ignored RE_ICASE. Detect that problem too. */ | 127 | if (s) |
128 | re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); | 128 | return 1; |
129 | memset (®ex, 0, sizeof regex); | 129 | |
130 | s = re_compile_pattern ("x", 1, ®ex); | 130 | /* glibc-2.2.93 does not work with a negative RANGE argument. */ |
131 | if (s) | 131 | if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) |
132 | return 1; | 132 | return 1; |
133 | 133 | ||
134 | if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) | 134 | /* The version of regex.c in older versions of gnulib |
135 | return 1; | 135 | ignored RE_ICASE. Detect that problem too. */ |
136 | 136 | re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); | |
137 | /* Catch a bug reported by Vin Shelton in | 137 | memset (®ex, 0, sizeof regex); |
138 | http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html | 138 | s = re_compile_pattern ("x", 1, ®ex); |
139 | */ | 139 | if (s) |
140 | re_set_syntax (RE_SYNTAX_POSIX_BASIC | 140 | return 1; |
141 | & ~RE_CONTEXT_INVALID_DUP | 141 | |
142 | & ~RE_NO_EMPTY_RANGES); | 142 | if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) |
143 | memset (®ex, 0, sizeof regex); | 143 | return 1; |
144 | s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); | 144 | |
145 | if (s) | 145 | /* Catch a bug reported by Vin Shelton in |
146 | return 1; | 146 | http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html |
147 | 147 | */ | |
148 | /* REG_STARTEND was added to glibc on 2004-01-15. | 148 | re_set_syntax (RE_SYNTAX_POSIX_BASIC |
149 | Reject older versions. */ | 149 | & ~RE_CONTEXT_INVALID_DUP |
150 | if (! REG_STARTEND) | 150 | & ~RE_NO_EMPTY_RANGES); |
151 | return 1; | 151 | memset (®ex, 0, sizeof regex); |
152 | 152 | s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); | |
153 | /* Reject hosts whose regoff_t values are too narrow. | 153 | if (s) |
154 | These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t | 154 | return 1; |
155 | and 32-bit int. */ | 155 | |
156 | if (sizeof (regoff_t) < sizeof (ptrdiff_t) | 156 | /* REG_STARTEND was added to glibc on 2004-01-15. |
157 | || sizeof (regoff_t) < sizeof (ssize_t)) | 157 | Reject older versions. */ |
158 | return 1; | 158 | if (! REG_STARTEND) |
159 | 159 | return 1; | |
160 | return 0;]])], | 160 | |
161 | /* Reject hosts whose regoff_t values are too narrow. | ||
162 | These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t | ||
163 | and 32-bit int. */ | ||
164 | if (sizeof (regoff_t) < sizeof (ptrdiff_t) | ||
165 | || sizeof (regoff_t) < sizeof (ssize_t)) | ||
166 | return 1; | ||
167 | |||
168 | return 0;]])], | ||
161 | [gl_cv_func_re_compile_pattern_working=yes], | 169 | [gl_cv_func_re_compile_pattern_working=yes], |
162 | [gl_cv_func_re_compile_pattern_working=no], | 170 | [gl_cv_func_re_compile_pattern_working=no], |
163 | dnl When crosscompiling, assume it is not working. | 171 | dnl When crosscompiling, assume it is not working. |
@@ -213,6 +221,7 @@ AC_DEFUN([gl_REGEX], | |||
213 | AC_DEFUN([gl_PREREQ_REGEX], | 221 | AC_DEFUN([gl_PREREQ_REGEX], |
214 | [ | 222 | [ |
215 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | 223 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) |
224 | AC_REQUIRE([AC_C_INLINE]) | ||
216 | AC_REQUIRE([AC_C_RESTRICT]) | 225 | AC_REQUIRE([AC_C_RESTRICT]) |
217 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) | 226 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) |
218 | AC_CHECK_HEADERS([libintl.h]) | 227 | AC_CHECK_HEADERS([libintl.h]) |
diff --git a/gl/m4/safe-read.m4 b/gl/m4/safe-read.m4 index 7a89d0a6..d087bd30 100644 --- a/gl/m4/safe-read.m4 +++ b/gl/m4/safe-read.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # safe-read.m4 serial 5 | 1 | # safe-read.m4 serial 5 |
2 | dnl Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/safe-write.m4 b/gl/m4/safe-write.m4 index db119ffa..2ff11d27 100644 --- a/gl/m4/safe-write.m4 +++ b/gl/m4/safe-write.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # safe-write.m4 serial 3 | 1 | # safe-write.m4 serial 3 |
2 | dnl Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/servent.m4 b/gl/m4/servent.m4 index 242f9e36..2ed961a4 100644 --- a/gl/m4/servent.m4 +++ b/gl/m4/servent.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # servent.m4 serial 1 | 1 | # servent.m4 serial 1 |
2 | dnl Copyright (C) 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/size_max.m4 b/gl/m4/size_max.m4 index e0e7b3ff..ce992db1 100644 --- a/gl/m4/size_max.m4 +++ b/gl/m4/size_max.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # size_max.m4 serial 7 | 1 | # size_max.m4 serial 9 |
2 | dnl Copyright (C) 2003, 2005-2006, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2005-2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -10,8 +10,7 @@ AC_DEFUN([gl_SIZE_MAX], | |||
10 | [ | 10 | [ |
11 | AC_CHECK_HEADERS([stdint.h]) | 11 | AC_CHECK_HEADERS([stdint.h]) |
12 | dnl First test whether the system already has SIZE_MAX. | 12 | dnl First test whether the system already has SIZE_MAX. |
13 | AC_MSG_CHECKING([for SIZE_MAX]) | 13 | AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [ |
14 | AC_CACHE_VAL([gl_cv_size_max], [ | ||
15 | gl_cv_size_max= | 14 | gl_cv_size_max= |
16 | AC_EGREP_CPP([Found it], [ | 15 | AC_EGREP_CPP([Found it], [ |
17 | #include <limits.h> | 16 | #include <limits.h> |
@@ -54,11 +53,19 @@ Found it | |||
54 | fi | 53 | fi |
55 | fi | 54 | fi |
56 | ]) | 55 | ]) |
57 | AC_MSG_RESULT([$gl_cv_size_max]) | ||
58 | if test "$gl_cv_size_max" != yes; then | 56 | if test "$gl_cv_size_max" != yes; then |
59 | AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], | 57 | AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], |
60 | [Define as the maximum value of type 'size_t', if the system doesn't define it.]) | 58 | [Define as the maximum value of type 'size_t', if the system doesn't define it.]) |
61 | fi | 59 | fi |
60 | dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after | ||
61 | dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with | ||
62 | dnl #define by AC_DEFINE_UNQUOTED. | ||
63 | AH_VERBATIM([SIZE_MAX], | ||
64 | [/* Define as the maximum value of type 'size_t', if the system doesn't define | ||
65 | it. */ | ||
66 | #ifndef SIZE_MAX | ||
67 | # undef SIZE_MAX | ||
68 | #endif]) | ||
62 | ]) | 69 | ]) |
63 | 70 | ||
64 | dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. | 71 | dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. |
diff --git a/gl/m4/snprintf.m4 b/gl/m4/snprintf.m4 index 6021786e..522b107b 100644 --- a/gl/m4/snprintf.m4 +++ b/gl/m4/snprintf.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # snprintf.m4 serial 5 | 1 | # snprintf.m4 serial 5 |
2 | dnl Copyright (C) 2002-2004, 2007-2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2004, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/sockets.m4 b/gl/m4/sockets.m4 new file mode 100644 index 00000000..aefb9360 --- /dev/null +++ b/gl/m4/sockets.m4 | |||
@@ -0,0 +1,90 @@ | |||
1 | # sockets.m4 serial 6 | ||
2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | AC_DEFUN([gl_SOCKETS], | ||
8 | [ | ||
9 | AC_REQUIRE([AC_C_INLINE]) | ||
10 | |||
11 | gl_PREREQ_SYS_H_WINSOCK2 dnl for HAVE_WINSOCK2_H | ||
12 | LIBSOCKET= | ||
13 | if test $HAVE_WINSOCK2_H = 1; then | ||
14 | dnl Native Windows API (not Cygwin). | ||
15 | AC_CACHE_CHECK([if we need to call WSAStartup in winsock2.h and -lws2_32], | ||
16 | [gl_cv_func_wsastartup], [ | ||
17 | gl_save_LIBS="$LIBS" | ||
18 | LIBS="$LIBS -lws2_32" | ||
19 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
20 | #ifdef HAVE_WINSOCK2_H | ||
21 | # include <winsock2.h> | ||
22 | #endif]], [[ | ||
23 | WORD wVersionRequested = MAKEWORD(1, 1); | ||
24 | WSADATA wsaData; | ||
25 | int err = WSAStartup(wVersionRequested, &wsaData); | ||
26 | WSACleanup ();]])], | ||
27 | gl_cv_func_wsastartup=yes, gl_cv_func_wsastartup=no) | ||
28 | LIBS="$gl_save_LIBS" | ||
29 | ]) | ||
30 | if test "$gl_cv_func_wsastartup" = "yes"; then | ||
31 | AC_DEFINE([WINDOWS_SOCKETS], [1], [Define if WSAStartup is needed.]) | ||
32 | LIBSOCKET='-lws2_32' | ||
33 | fi | ||
34 | else | ||
35 | dnl Unix API. | ||
36 | dnl Solaris has most socket functions in libsocket. | ||
37 | dnl Haiku has most socket functions in libnetwork. | ||
38 | dnl BeOS has most socket functions in libnet. | ||
39 | AC_CACHE_CHECK([for library containing setsockopt], [gl_cv_lib_socket], [ | ||
40 | gl_cv_lib_socket= | ||
41 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern | ||
42 | #ifdef __cplusplus | ||
43 | "C" | ||
44 | #endif | ||
45 | char setsockopt();]], [[setsockopt();]])], | ||
46 | [], | ||
47 | [gl_save_LIBS="$LIBS" | ||
48 | LIBS="$gl_save_LIBS -lsocket" | ||
49 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern | ||
50 | #ifdef __cplusplus | ||
51 | "C" | ||
52 | #endif | ||
53 | char setsockopt();]], [[setsockopt();]])], | ||
54 | [gl_cv_lib_socket="-lsocket"]) | ||
55 | if test -z "$gl_cv_lib_socket"; then | ||
56 | LIBS="$gl_save_LIBS -lnetwork" | ||
57 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern | ||
58 | #ifdef __cplusplus | ||
59 | "C" | ||
60 | #endif | ||
61 | char setsockopt();]], [[setsockopt();]])], | ||
62 | [gl_cv_lib_socket="-lnetwork"]) | ||
63 | if test -z "$gl_cv_lib_socket"; then | ||
64 | LIBS="$gl_save_LIBS -lnet" | ||
65 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern | ||
66 | #ifdef __cplusplus | ||
67 | "C" | ||
68 | #endif | ||
69 | char setsockopt();]], [[setsockopt();]])], | ||
70 | [gl_cv_lib_socket="-lnet"]) | ||
71 | fi | ||
72 | fi | ||
73 | LIBS="$gl_save_LIBS" | ||
74 | ]) | ||
75 | if test -z "$gl_cv_lib_socket"; then | ||
76 | gl_cv_lib_socket="none needed" | ||
77 | fi | ||
78 | ]) | ||
79 | if test "$gl_cv_lib_socket" != "none needed"; then | ||
80 | LIBSOCKET="$gl_cv_lib_socket" | ||
81 | fi | ||
82 | fi | ||
83 | AC_SUBST([LIBSOCKET]) | ||
84 | gl_PREREQ_SOCKETS | ||
85 | ]) | ||
86 | |||
87 | # Prerequisites of lib/sockets.c. | ||
88 | AC_DEFUN([gl_PREREQ_SOCKETS], [ | ||
89 | : | ||
90 | ]) | ||
diff --git a/gl/m4/socklen.m4 b/gl/m4/socklen.m4 index b755757b..2933d4b8 100644 --- a/gl/m4/socklen.m4 +++ b/gl/m4/socklen.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # socklen.m4 serial 6 | 1 | # socklen.m4 serial 7 |
2 | dnl Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -20,30 +20,30 @@ AC_DEFUN([gl_TYPE_SOCKLEN_T], | |||
20 | AC_CHECK_TYPE([socklen_t], , | 20 | AC_CHECK_TYPE([socklen_t], , |
21 | [AC_MSG_CHECKING([for socklen_t equivalent]) | 21 | [AC_MSG_CHECKING([for socklen_t equivalent]) |
22 | AC_CACHE_VAL([gl_cv_socklen_t_equiv], | 22 | AC_CACHE_VAL([gl_cv_socklen_t_equiv], |
23 | [# Systems have either "struct sockaddr *" or | 23 | [# Systems have either "struct sockaddr *" or |
24 | # "void *" as the second argument to getpeername | 24 | # "void *" as the second argument to getpeername |
25 | gl_cv_socklen_t_equiv= | 25 | gl_cv_socklen_t_equiv= |
26 | for arg2 in "struct sockaddr" void; do | 26 | for arg2 in "struct sockaddr" void; do |
27 | for t in int size_t "unsigned int" "long int" "unsigned long int"; do | 27 | for t in int size_t "unsigned int" "long int" "unsigned long int"; do |
28 | AC_TRY_COMPILE( | 28 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM( |
29 | [#include <sys/types.h> | 29 | [[#include <sys/types.h> |
30 | #include <sys/socket.h> | 30 | #include <sys/socket.h> |
31 | 31 | ||
32 | int getpeername (int, $arg2 *, $t *);], | 32 | int getpeername (int, $arg2 *, $t *);]], |
33 | [$t len; | 33 | [[$t len; |
34 | getpeername (0, 0, &len);], | 34 | getpeername (0, 0, &len);]])], |
35 | [gl_cv_socklen_t_equiv="$t"]) | 35 | [gl_cv_socklen_t_equiv="$t"]) |
36 | test "$gl_cv_socklen_t_equiv" != "" && break | 36 | test "$gl_cv_socklen_t_equiv" != "" && break |
37 | done | 37 | done |
38 | test "$gl_cv_socklen_t_equiv" != "" && break | 38 | test "$gl_cv_socklen_t_equiv" != "" && break |
39 | done | 39 | done |
40 | ]) | 40 | ]) |
41 | if test "$gl_cv_socklen_t_equiv" = ""; then | 41 | if test "$gl_cv_socklen_t_equiv" = ""; then |
42 | AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | 42 | AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) |
43 | fi | 43 | fi |
44 | AC_MSG_RESULT([$gl_cv_socklen_t_equiv]) | 44 | AC_MSG_RESULT([$gl_cv_socklen_t_equiv]) |
45 | AC_DEFINE_UNQUOTED([socklen_t], [$gl_cv_socklen_t_equiv], | 45 | AC_DEFINE_UNQUOTED([socklen_t], [$gl_cv_socklen_t_equiv], |
46 | [type to use in place of socklen_t if not defined])], | 46 | [type to use in place of socklen_t if not defined])], |
47 | [#include <sys/types.h> | 47 | [#include <sys/types.h> |
48 | #if HAVE_SYS_SOCKET_H | 48 | #if HAVE_SYS_SOCKET_H |
49 | # include <sys/socket.h> | 49 | # include <sys/socket.h> |
diff --git a/gl/m4/sockpfaf.m4 b/gl/m4/sockpfaf.m4 index 99ea06f9..8a0c2360 100644 --- a/gl/m4/sockpfaf.m4 +++ b/gl/m4/sockpfaf.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # sockpfaf.m4 serial 6 | 1 | # sockpfaf.m4 serial 7 |
2 | dnl Copyright (C) 2004, 2006, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2004, 2006, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -18,7 +18,7 @@ AC_DEFUN([gl_SOCKET_FAMILIES], | |||
18 | 18 | ||
19 | AC_MSG_CHECKING([for IPv4 sockets]) | 19 | AC_MSG_CHECKING([for IPv4 sockets]) |
20 | AC_CACHE_VAL([gl_cv_socket_ipv4], | 20 | AC_CACHE_VAL([gl_cv_socket_ipv4], |
21 | [AC_TRY_COMPILE([#include <sys/types.h> | 21 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> |
22 | #ifdef HAVE_SYS_SOCKET_H | 22 | #ifdef HAVE_SYS_SOCKET_H |
23 | #include <sys/socket.h> | 23 | #include <sys/socket.h> |
24 | #endif | 24 | #endif |
@@ -27,9 +27,9 @@ AC_DEFUN([gl_SOCKET_FAMILIES], | |||
27 | #endif | 27 | #endif |
28 | #ifdef HAVE_WINSOCK2_H | 28 | #ifdef HAVE_WINSOCK2_H |
29 | #include <winsock2.h> | 29 | #include <winsock2.h> |
30 | #endif], | 30 | #endif]], |
31 | [int x = AF_INET; struct in_addr y; struct sockaddr_in z; | 31 | [[int x = AF_INET; struct in_addr y; struct sockaddr_in z; |
32 | if (&x && &y && &z) return 0;], | 32 | if (&x && &y && &z) return 0;]])], |
33 | gl_cv_socket_ipv4=yes, gl_cv_socket_ipv4=no)]) | 33 | gl_cv_socket_ipv4=yes, gl_cv_socket_ipv4=no)]) |
34 | AC_MSG_RESULT([$gl_cv_socket_ipv4]) | 34 | AC_MSG_RESULT([$gl_cv_socket_ipv4]) |
35 | if test $gl_cv_socket_ipv4 = yes; then | 35 | if test $gl_cv_socket_ipv4 = yes; then |
@@ -38,7 +38,7 @@ AC_DEFUN([gl_SOCKET_FAMILIES], | |||
38 | 38 | ||
39 | AC_MSG_CHECKING([for IPv6 sockets]) | 39 | AC_MSG_CHECKING([for IPv6 sockets]) |
40 | AC_CACHE_VAL([gl_cv_socket_ipv6], | 40 | AC_CACHE_VAL([gl_cv_socket_ipv6], |
41 | [AC_TRY_COMPILE([#include <sys/types.h> | 41 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> |
42 | #ifdef HAVE_SYS_SOCKET_H | 42 | #ifdef HAVE_SYS_SOCKET_H |
43 | #include <sys/socket.h> | 43 | #include <sys/socket.h> |
44 | #endif | 44 | #endif |
@@ -47,9 +47,9 @@ AC_DEFUN([gl_SOCKET_FAMILIES], | |||
47 | #endif | 47 | #endif |
48 | #ifdef HAVE_WINSOCK2_H | 48 | #ifdef HAVE_WINSOCK2_H |
49 | #include <winsock2.h> | 49 | #include <winsock2.h> |
50 | #endif], | 50 | #endif]], |
51 | [int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z; | 51 | [[int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z; |
52 | if (&x && &y && &z) return 0;], | 52 | if (&x && &y && &z) return 0;]])], |
53 | gl_cv_socket_ipv6=yes, gl_cv_socket_ipv6=no)]) | 53 | gl_cv_socket_ipv6=yes, gl_cv_socket_ipv6=no)]) |
54 | AC_MSG_RESULT([$gl_cv_socket_ipv6]) | 54 | AC_MSG_RESULT([$gl_cv_socket_ipv6]) |
55 | if test $gl_cv_socket_ipv6 = yes; then | 55 | if test $gl_cv_socket_ipv6 = yes; then |
diff --git a/gl/m4/ssize_t.m4 b/gl/m4/ssize_t.m4 index 4eaef93c..e0ccee3a 100644 --- a/gl/m4/ssize_t.m4 +++ b/gl/m4/ssize_t.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # ssize_t.m4 serial 4 (gettext-0.15) | 1 | # ssize_t.m4 serial 4 (gettext-0.15) |
2 | dnl Copyright (C) 2001-2003, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2001-2003, 2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/stat.m4 b/gl/m4/stat.m4 new file mode 100644 index 00000000..acd32d86 --- /dev/null +++ b/gl/m4/stat.m4 | |||
@@ -0,0 +1,63 @@ | |||
1 | # serial 4 | ||
2 | |||
3 | # Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
4 | # | ||
5 | # This file is free software; the Free Software Foundation | ||
6 | # gives unlimited permission to copy and/or distribute it, | ||
7 | # with or without modifications, as long as this notice is preserved. | ||
8 | |||
9 | AC_DEFUN([gl_FUNC_STAT], | ||
10 | [ | ||
11 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | ||
12 | AC_REQUIRE([gl_AC_DOS]) | ||
13 | AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) | ||
14 | AC_CHECK_FUNCS_ONCE([lstat]) | ||
15 | dnl mingw is the only known platform where stat(".") and stat("./") differ | ||
16 | AC_CACHE_CHECK([whether stat handles trailing slashes on directories], | ||
17 | [gl_cv_func_stat_dir_slash], | ||
18 | [AC_RUN_IFELSE( | ||
19 | [AC_LANG_PROGRAM( | ||
20 | [[#include <sys/stat.h> | ||
21 | ]], [[struct stat st; return stat (".", &st) != stat ("./", &st);]])], | ||
22 | [gl_cv_func_stat_dir_slash=yes], [gl_cv_func_stat_dir_slash=no], | ||
23 | [case $host_os in | ||
24 | mingw*) gl_cv_func_stat_dir_slash="guessing no";; | ||
25 | *) gl_cv_func_stat_dir_slash="guessing yes";; | ||
26 | esac])]) | ||
27 | dnl Solaris 9 mistakenly succeeds on stat("file/") | ||
28 | dnl FreeBSD 7.2 mistakenly succeeds on stat("link-to-file/") | ||
29 | AC_CACHE_CHECK([whether stat handles trailing slashes on files], | ||
30 | [gl_cv_func_stat_file_slash], | ||
31 | [touch conftest.tmp | ||
32 | # Assume that if we have lstat, we can also check symlinks. | ||
33 | if test $ac_cv_func_lstat = yes; then | ||
34 | ln -s conftest.tmp conftest.lnk | ||
35 | fi | ||
36 | AC_RUN_IFELSE( | ||
37 | [AC_LANG_PROGRAM( | ||
38 | [[#include <sys/stat.h> | ||
39 | ]], [[struct stat st; | ||
40 | if (!stat ("conftest.tmp/", &st)) return 1; | ||
41 | #if HAVE_LSTAT | ||
42 | if (!stat ("conftest.lnk/", &st)) return 2; | ||
43 | #endif | ||
44 | ]])], | ||
45 | [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no], | ||
46 | [gl_cv_func_stat_file_slash="guessing no"]) | ||
47 | rm -f conftest.tmp conftest.lnk]) | ||
48 | case $gl_cv_func_stat_dir_slash in | ||
49 | *no) REPLACE_STAT=1 | ||
50 | AC_DEFINE([REPLACE_FUNC_STAT_DIR], [1], [Define to 1 if stat needs | ||
51 | help when passed a directory name with a trailing slash]);; | ||
52 | esac | ||
53 | case $gl_cv_func_stat_file_slash in | ||
54 | *no) REPLACE_STAT=1 | ||
55 | AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs | ||
56 | help when passed a file name with a trailing slash]);; | ||
57 | esac | ||
58 | if test $REPLACE_STAT = 1; then | ||
59 | AC_LIBOBJ([stat]) | ||
60 | dnl Prerequisites of lib/stat.c. | ||
61 | AC_REQUIRE([AC_C_INLINE]) | ||
62 | fi | ||
63 | ]) | ||
diff --git a/gl/m4/stdbool.m4 b/gl/m4/stdbool.m4 index 57c804a8..3d672d74 100644 --- a/gl/m4/stdbool.m4 +++ b/gl/m4/stdbool.m4 | |||
@@ -1,6 +1,6 @@ | |||
1 | # Check for stdbool.h that conforms to C99. | 1 | # Check for stdbool.h that conforms to C99. |
2 | 2 | ||
3 | dnl Copyright (C) 2002-2006, 2009 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc. |
4 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
5 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
6 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
@@ -38,77 +38,77 @@ AC_DEFUN([AC_HEADER_STDBOOL], | |||
38 | [AC_CACHE_CHECK([for stdbool.h that conforms to C99], | 38 | [AC_CACHE_CHECK([for stdbool.h that conforms to C99], |
39 | [ac_cv_header_stdbool_h], | 39 | [ac_cv_header_stdbool_h], |
40 | [AC_TRY_COMPILE( | 40 | [AC_TRY_COMPILE( |
41 | [ | 41 | [ |
42 | #include <stdbool.h> | 42 | #include <stdbool.h> |
43 | #ifndef bool | 43 | #ifndef bool |
44 | "error: bool is not defined" | 44 | "error: bool is not defined" |
45 | #endif | 45 | #endif |
46 | #ifndef false | 46 | #ifndef false |
47 | "error: false is not defined" | 47 | "error: false is not defined" |
48 | #endif | 48 | #endif |
49 | #if false | 49 | #if false |
50 | "error: false is not 0" | 50 | "error: false is not 0" |
51 | #endif | 51 | #endif |
52 | #ifndef true | 52 | #ifndef true |
53 | "error: true is not defined" | 53 | "error: true is not defined" |
54 | #endif | 54 | #endif |
55 | #if true != 1 | 55 | #if true != 1 |
56 | "error: true is not 1" | 56 | "error: true is not 1" |
57 | #endif | 57 | #endif |
58 | #ifndef __bool_true_false_are_defined | 58 | #ifndef __bool_true_false_are_defined |
59 | "error: __bool_true_false_are_defined is not defined" | 59 | "error: __bool_true_false_are_defined is not defined" |
60 | #endif | 60 | #endif |
61 | 61 | ||
62 | struct s { _Bool s: 1; _Bool t; } s; | 62 | struct s { _Bool s: 1; _Bool t; } s; |
63 | 63 | ||
64 | char a[true == 1 ? 1 : -1]; | 64 | char a[true == 1 ? 1 : -1]; |
65 | char b[false == 0 ? 1 : -1]; | 65 | char b[false == 0 ? 1 : -1]; |
66 | char c[__bool_true_false_are_defined == 1 ? 1 : -1]; | 66 | char c[__bool_true_false_are_defined == 1 ? 1 : -1]; |
67 | char d[(bool) 0.5 == true ? 1 : -1]; | 67 | char d[(bool) 0.5 == true ? 1 : -1]; |
68 | bool e = &s; | 68 | bool e = &s; |
69 | char f[(_Bool) 0.0 == false ? 1 : -1]; | 69 | char f[(_Bool) 0.0 == false ? 1 : -1]; |
70 | char g[true]; | 70 | char g[true]; |
71 | char h[sizeof (_Bool)]; | 71 | char h[sizeof (_Bool)]; |
72 | char i[sizeof s.t]; | 72 | char i[sizeof s.t]; |
73 | enum { j = false, k = true, l = false * true, m = true * 256 }; | 73 | enum { j = false, k = true, l = false * true, m = true * 256 }; |
74 | _Bool n[m]; | 74 | _Bool n[m]; |
75 | char o[sizeof n == m * sizeof n[0] ? 1 : -1]; | 75 | char o[sizeof n == m * sizeof n[0] ? 1 : -1]; |
76 | char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; | 76 | char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; |
77 | #if defined __xlc__ || defined __GNUC__ | 77 | #if defined __xlc__ || defined __GNUC__ |
78 | /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 | 78 | /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 |
79 | reported by James Lemley on 2005-10-05; see | 79 | reported by James Lemley on 2005-10-05; see |
80 | http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html | 80 | http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html |
81 | This test is not quite right, since xlc is allowed to | 81 | This test is not quite right, since xlc is allowed to |
82 | reject this program, as the initializer for xlcbug is | 82 | reject this program, as the initializer for xlcbug is |
83 | not one of the forms that C requires support for. | 83 | not one of the forms that C requires support for. |
84 | However, doing the test right would require a run-time | 84 | However, doing the test right would require a run-time |
85 | test, and that would make cross-compilation harder. | 85 | test, and that would make cross-compilation harder. |
86 | Let us hope that IBM fixes the xlc bug, and also adds | 86 | Let us hope that IBM fixes the xlc bug, and also adds |
87 | support for this kind of constant expression. In the | 87 | support for this kind of constant expression. In the |
88 | meantime, this test will reject xlc, which is OK, since | 88 | meantime, this test will reject xlc, which is OK, since |
89 | our stdbool.h substitute should suffice. We also test | 89 | our stdbool.h substitute should suffice. We also test |
90 | this with GCC, where it should work, to detect more | 90 | this with GCC, where it should work, to detect more |
91 | quickly whether someone messes up the test in the | 91 | quickly whether someone messes up the test in the |
92 | future. */ | 92 | future. */ |
93 | char digs[] = "0123456789"; | 93 | char digs[] = "0123456789"; |
94 | int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); | 94 | int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); |
95 | #endif | 95 | #endif |
96 | /* Catch a bug in an HP-UX C compiler. See | 96 | /* Catch a bug in an HP-UX C compiler. See |
97 | http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html | 97 | http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html |
98 | http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html | 98 | http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html |
99 | */ | 99 | */ |
100 | _Bool q = true; | 100 | _Bool q = true; |
101 | _Bool *pq = &q; | 101 | _Bool *pq = &q; |
102 | ], | 102 | ], |
103 | [ | 103 | [ |
104 | *pq |= q; | 104 | *pq |= q; |
105 | *pq |= ! q; | 105 | *pq |= ! q; |
106 | /* Refer to every declared value, to avoid compiler optimizations. */ | 106 | /* Refer to every declared value, to avoid compiler optimizations. */ |
107 | return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l | 107 | return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l |
108 | + !m + !n + !o + !p + !q + !pq); | 108 | + !m + !n + !o + !p + !q + !pq); |
109 | ], | 109 | ], |
110 | [ac_cv_header_stdbool_h=yes], | 110 | [ac_cv_header_stdbool_h=yes], |
111 | [ac_cv_header_stdbool_h=no])]) | 111 | [ac_cv_header_stdbool_h=no])]) |
112 | AC_CHECK_TYPES([_Bool]) | 112 | AC_CHECK_TYPES([_Bool]) |
113 | if test $ac_cv_header_stdbool_h = yes; then | 113 | if test $ac_cv_header_stdbool_h = yes; then |
114 | AC_DEFINE([HAVE_STDBOOL_H], [1], [Define to 1 if stdbool.h conforms to C99.]) | 114 | AC_DEFINE([HAVE_STDBOOL_H], [1], [Define to 1 if stdbool.h conforms to C99.]) |
diff --git a/gl/m4/stddef_h.m4 b/gl/m4/stddef_h.m4 new file mode 100644 index 00000000..c3ae5694 --- /dev/null +++ b/gl/m4/stddef_h.m4 | |||
@@ -0,0 +1,45 @@ | |||
1 | dnl A placeholder for POSIX 2008 <stddef.h>, for platforms that have issues. | ||
2 | # stddef_h.m4 serial 2 | ||
3 | dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
4 | dnl This file is free software; the Free Software Foundation | ||
5 | dnl gives unlimited permission to copy and/or distribute it, | ||
6 | dnl with or without modifications, as long as this notice is preserved. | ||
7 | |||
8 | AC_DEFUN([gl_STDDEF_H], | ||
9 | [ | ||
10 | AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) | ||
11 | AC_REQUIRE([gt_TYPE_WCHAR_T]) | ||
12 | if test $gt_cv_c_wchar_t = no; then | ||
13 | HAVE_WCHAR_T=0 | ||
14 | STDDEF_H=stddef.h | ||
15 | fi | ||
16 | AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions], | ||
17 | [gl_cv_decl_null_works], | ||
18 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h> | ||
19 | int test[2 * (sizeof NULL == sizeof (void *)) -1]; | ||
20 | ]])], | ||
21 | [gl_cv_decl_null_works=yes], | ||
22 | [gl_cv_decl_null_works=no])]) | ||
23 | if test $gl_cv_decl_null_works = no; then | ||
24 | REPLACE_NULL=1 | ||
25 | STDDEF_H=stddef.h | ||
26 | fi | ||
27 | if test -n "$STDDEF_H"; then | ||
28 | gl_CHECK_NEXT_HEADERS([stddef.h]) | ||
29 | fi | ||
30 | ]) | ||
31 | |||
32 | AC_DEFUN([gl_STDDEF_MODULE_INDICATOR], | ||
33 | [ | ||
34 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | ||
35 | AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) | ||
36 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) | ||
37 | ]) | ||
38 | |||
39 | AC_DEFUN([gl_STDDEF_H_DEFAULTS], | ||
40 | [ | ||
41 | dnl Assume proper GNU behavior unless another module says otherwise. | ||
42 | REPLACE_NULL=0; AC_SUBST([REPLACE_NULL]) | ||
43 | HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T]) | ||
44 | STDDEF_H=''; AC_SUBST([STDDEF_H]) | ||
45 | ]) | ||
diff --git a/gl/m4/stdint.m4 b/gl/m4/stdint.m4 index a2e8bdd6..1cc57e6e 100644 --- a/gl/m4/stdint.m4 +++ b/gl/m4/stdint.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # stdint.m4 serial 34 | 1 | # stdint.m4 serial 34 |
2 | dnl Copyright (C) 2001-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -396,12 +396,12 @@ AC_DEFUN([gl_INTEGER_TYPE_SUFFIX], | |||
396 | for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do | 396 | for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do |
397 | case $glsuf in | 397 | case $glsuf in |
398 | '') gltype1='int';; | 398 | '') gltype1='int';; |
399 | l) gltype1='long int';; | 399 | l) gltype1='long int';; |
400 | ll) gltype1='long long int';; | 400 | ll) gltype1='long long int';; |
401 | i64) gltype1='__int64';; | 401 | i64) gltype1='__int64';; |
402 | u) gltype1='unsigned int';; | 402 | u) gltype1='unsigned int';; |
403 | ul) gltype1='unsigned long int';; | 403 | ul) gltype1='unsigned long int';; |
404 | ull) gltype1='unsigned long long int';; | 404 | ull) gltype1='unsigned long long int';; |
405 | ui64)gltype1='unsigned __int64';; | 405 | ui64)gltype1='unsigned __int64';; |
406 | esac | 406 | esac |
407 | AC_COMPILE_IFELSE( | 407 | AC_COMPILE_IFELSE( |
diff --git a/gl/m4/stdint_h.m4 b/gl/m4/stdint_h.m4 index 82f0c244..b8e3c6cc 100644 --- a/gl/m4/stdint_h.m4 +++ b/gl/m4/stdint_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # stdint_h.m4 serial 8 | 1 | # stdint_h.m4 serial 8 |
2 | dnl Copyright (C) 1997-2004, 2006, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/stdio_h.m4 b/gl/m4/stdio_h.m4 index 846b65d3..1d1d95e5 100644 --- a/gl/m4/stdio_h.m4 +++ b/gl/m4/stdio_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # stdio_h.m4 serial 15 | 1 | # stdio_h.m4 serial 30 |
2 | dnl Copyright (C) 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -7,6 +7,7 @@ dnl with or without modifications, as long as this notice is preserved. | |||
7 | AC_DEFUN([gl_STDIO_H], | 7 | AC_DEFUN([gl_STDIO_H], |
8 | [ | 8 | [ |
9 | AC_REQUIRE([gl_STDIO_H_DEFAULTS]) | 9 | AC_REQUIRE([gl_STDIO_H_DEFAULTS]) |
10 | AC_REQUIRE([AC_C_INLINE]) | ||
10 | gl_CHECK_NEXT_HEADERS([stdio.h]) | 11 | gl_CHECK_NEXT_HEADERS([stdio.h]) |
11 | dnl No need to create extra modules for these functions. Everyone who uses | 12 | dnl No need to create extra modules for these functions. Everyone who uses |
12 | dnl <stdio.h> likely needs them. | 13 | dnl <stdio.h> likely needs them. |
@@ -30,86 +31,110 @@ AC_DEFUN([gl_STDIO_H], | |||
30 | AC_LIBOBJ([stdio-write]) | 31 | AC_LIBOBJ([stdio-write]) |
31 | fi | 32 | fi |
32 | ]) | 33 | ]) |
34 | |||
35 | dnl Check for declarations of anything we want to poison if the | ||
36 | dnl corresponding gnulib module is not in use, and which is not | ||
37 | dnl guaranteed by C89. | ||
38 | gl_WARN_ON_USE_PREPARE([[#include <stdio.h> | ||
39 | ]], [dprintf fpurge fseeko ftello getdelim getline popen renameat | ||
40 | snprintf tmpfile vdprintf vsnprintf]) | ||
33 | ]) | 41 | ]) |
34 | 42 | ||
35 | AC_DEFUN([gl_STDIO_MODULE_INDICATOR], | 43 | AC_DEFUN([gl_STDIO_MODULE_INDICATOR], |
36 | [ | 44 | [ |
37 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 45 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
38 | AC_REQUIRE([gl_STDIO_H_DEFAULTS]) | 46 | AC_REQUIRE([gl_STDIO_H_DEFAULTS]) |
39 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 47 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
48 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
49 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
40 | ]) | 50 | ]) |
41 | 51 | ||
42 | AC_DEFUN([gl_STDIO_H_DEFAULTS], | 52 | AC_DEFUN([gl_STDIO_H_DEFAULTS], |
43 | [ | 53 | [ |
44 | GNULIB_FPRINTF=0; AC_SUBST([GNULIB_FPRINTF]) | ||
45 | GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX]) | ||
46 | GNULIB_PRINTF=0; AC_SUBST([GNULIB_PRINTF]) | ||
47 | GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX]) | ||
48 | GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF]) | ||
49 | GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX]) | ||
50 | GNULIB_VFPRINTF=0; AC_SUBST([GNULIB_VFPRINTF]) | ||
51 | GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX]) | ||
52 | GNULIB_VPRINTF=0; AC_SUBST([GNULIB_VPRINTF]) | ||
53 | GNULIB_VPRINTF_POSIX=0; AC_SUBST([GNULIB_VPRINTF_POSIX]) | ||
54 | GNULIB_VSNPRINTF=0; AC_SUBST([GNULIB_VSNPRINTF]) | ||
55 | GNULIB_VSPRINTF_POSIX=0; AC_SUBST([GNULIB_VSPRINTF_POSIX]) | ||
56 | GNULIB_DPRINTF=0; AC_SUBST([GNULIB_DPRINTF]) | 54 | GNULIB_DPRINTF=0; AC_SUBST([GNULIB_DPRINTF]) |
57 | GNULIB_VDPRINTF=0; AC_SUBST([GNULIB_VDPRINTF]) | 55 | GNULIB_FCLOSE=0; AC_SUBST([GNULIB_FCLOSE]) |
58 | GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF]) | 56 | GNULIB_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH]) |
59 | GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF]) | ||
60 | GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX]) | ||
61 | GNULIB_FOPEN=0; AC_SUBST([GNULIB_FOPEN]) | 57 | GNULIB_FOPEN=0; AC_SUBST([GNULIB_FOPEN]) |
58 | GNULIB_FPRINTF=0; AC_SUBST([GNULIB_FPRINTF]) | ||
59 | GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX]) | ||
60 | GNULIB_FPURGE=0; AC_SUBST([GNULIB_FPURGE]) | ||
61 | GNULIB_FPUTC=0; AC_SUBST([GNULIB_FPUTC]) | ||
62 | GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS]) | ||
62 | GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN]) | 63 | GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN]) |
63 | GNULIB_FSEEK=0; AC_SUBST([GNULIB_FSEEK]) | 64 | GNULIB_FSEEK=0; AC_SUBST([GNULIB_FSEEK]) |
64 | GNULIB_FSEEKO=0; AC_SUBST([GNULIB_FSEEKO]) | 65 | GNULIB_FSEEKO=0; AC_SUBST([GNULIB_FSEEKO]) |
65 | GNULIB_FTELL=0; AC_SUBST([GNULIB_FTELL]) | 66 | GNULIB_FTELL=0; AC_SUBST([GNULIB_FTELL]) |
66 | GNULIB_FTELLO=0; AC_SUBST([GNULIB_FTELLO]) | 67 | GNULIB_FTELLO=0; AC_SUBST([GNULIB_FTELLO]) |
67 | GNULIB_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH]) | ||
68 | GNULIB_FCLOSE=0; AC_SUBST([GNULIB_FCLOSE]) | ||
69 | GNULIB_FPUTC=0; AC_SUBST([GNULIB_FPUTC]) | ||
70 | GNULIB_PUTC=0; AC_SUBST([GNULIB_PUTC]) | ||
71 | GNULIB_PUTCHAR=0; AC_SUBST([GNULIB_PUTCHAR]) | ||
72 | GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS]) | ||
73 | GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS]) | ||
74 | GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE]) | 68 | GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE]) |
75 | GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM]) | 69 | GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM]) |
76 | GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE]) | 70 | GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE]) |
71 | GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF]) | ||
72 | GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX]) | ||
77 | GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR]) | 73 | GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR]) |
74 | GNULIB_POPEN=0; AC_SUBST([GNULIB_POPEN]) | ||
75 | GNULIB_PRINTF=0; AC_SUBST([GNULIB_PRINTF]) | ||
76 | GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX]) | ||
77 | GNULIB_PUTC=0; AC_SUBST([GNULIB_PUTC]) | ||
78 | GNULIB_PUTCHAR=0; AC_SUBST([GNULIB_PUTCHAR]) | ||
79 | GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS]) | ||
80 | GNULIB_REMOVE=0; AC_SUBST([GNULIB_REMOVE]) | ||
81 | GNULIB_RENAME=0; AC_SUBST([GNULIB_RENAME]) | ||
82 | GNULIB_RENAMEAT=0; AC_SUBST([GNULIB_RENAMEAT]) | ||
83 | GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF]) | ||
84 | GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX]) | ||
78 | GNULIB_STDIO_H_SIGPIPE=0; AC_SUBST([GNULIB_STDIO_H_SIGPIPE]) | 85 | GNULIB_STDIO_H_SIGPIPE=0; AC_SUBST([GNULIB_STDIO_H_SIGPIPE]) |
86 | GNULIB_TMPFILE=0; AC_SUBST([GNULIB_TMPFILE]) | ||
87 | GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF]) | ||
88 | GNULIB_VDPRINTF=0; AC_SUBST([GNULIB_VDPRINTF]) | ||
89 | GNULIB_VFPRINTF=0; AC_SUBST([GNULIB_VFPRINTF]) | ||
90 | GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX]) | ||
91 | GNULIB_VPRINTF=0; AC_SUBST([GNULIB_VPRINTF]) | ||
92 | GNULIB_VPRINTF_POSIX=0; AC_SUBST([GNULIB_VPRINTF_POSIX]) | ||
93 | GNULIB_VSNPRINTF=0; AC_SUBST([GNULIB_VSNPRINTF]) | ||
94 | GNULIB_VSPRINTF_POSIX=0; AC_SUBST([GNULIB_VSPRINTF_POSIX]) | ||
79 | dnl Assume proper GNU behavior unless another module says otherwise. | 95 | dnl Assume proper GNU behavior unless another module says otherwise. |
80 | REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS]) | 96 | HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE]) |
81 | REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF]) | 97 | HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) |
82 | REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF]) | 98 | HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) |
83 | REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF]) | 99 | HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF]) |
84 | REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF]) | ||
85 | REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF]) | ||
86 | HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF]) | 100 | HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF]) |
87 | REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF]) | ||
88 | HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF]) | 101 | HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF]) |
89 | REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF]) | ||
90 | REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF]) | ||
91 | HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF]) | 102 | HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF]) |
92 | REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF]) | 103 | HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO]) |
93 | HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF]) | 104 | HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO]) |
94 | REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF]) | 105 | HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT]) |
95 | HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF]) | 106 | HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF]) |
96 | REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF]) | 107 | HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF]) |
97 | HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF]) | 108 | REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF]) |
98 | REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF]) | 109 | REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE]) |
110 | REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH]) | ||
99 | REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN]) | 111 | REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN]) |
112 | REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF]) | ||
113 | REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE]) | ||
100 | REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN]) | 114 | REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN]) |
101 | HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO]) | ||
102 | REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO]) | ||
103 | REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK]) | 115 | REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK]) |
104 | HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO]) | 116 | REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO]) |
105 | REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO]) | ||
106 | REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL]) | 117 | REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL]) |
107 | REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH]) | 118 | REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO]) |
108 | REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE]) | 119 | REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM]) |
109 | HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) | ||
110 | HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) | ||
111 | REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) | 120 | REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) |
121 | REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF]) | ||
112 | REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR]) | 122 | REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR]) |
123 | REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN]) | ||
124 | REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF]) | ||
125 | REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE]) | ||
126 | REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME]) | ||
127 | REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT]) | ||
128 | REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF]) | ||
129 | REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF]) | ||
130 | REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS]) | ||
131 | REPLACE_TMPFILE=0; AC_SUBST([REPLACE_TMPFILE]) | ||
132 | REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF]) | ||
133 | REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF]) | ||
134 | REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF]) | ||
135 | REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF]) | ||
136 | REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF]) | ||
137 | REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF]) | ||
113 | ]) | 138 | ]) |
114 | 139 | ||
115 | dnl Code shared by fseeko and ftello. Determine if large files are supported, | 140 | dnl Code shared by fseeko and ftello. Determine if large files are supported, |
@@ -128,6 +153,6 @@ AC_DEFUN([gl_STDIN_LARGE_OFFSET], | |||
128 | choke me | 153 | choke me |
129 | # endif | 154 | # endif |
130 | #endif]])], | 155 | #endif]])], |
131 | [gl_cv_var_stdin_large_offset=yes], | 156 | [gl_cv_var_stdin_large_offset=yes], |
132 | [gl_cv_var_stdin_large_offset=no])]) | 157 | [gl_cv_var_stdin_large_offset=no])]) |
133 | ]) | 158 | ]) |
diff --git a/gl/m4/stdlib_h.m4 b/gl/m4/stdlib_h.m4 index b295f16b..dd84796d 100644 --- a/gl/m4/stdlib_h.m4 +++ b/gl/m4/stdlib_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # stdlib_h.m4 serial 15 | 1 | # stdlib_h.m4 serial 28 |
2 | dnl Copyright (C) 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -22,41 +22,75 @@ AC_DEFUN([gl_STDLIB_H], | |||
22 | # include <random.h> | 22 | # include <random.h> |
23 | #endif | 23 | #endif |
24 | ]]) | 24 | ]]) |
25 | |||
26 | dnl Check for declarations of anything we want to poison if the | ||
27 | dnl corresponding gnulib module is not in use, and which is not | ||
28 | dnl guaranteed by C89. | ||
29 | gl_WARN_ON_USE_PREPARE([[#include <stdlib.h> | ||
30 | #if HAVE_SYS_LOADAVG_H | ||
31 | # include <sys/loadavg.h> | ||
32 | #endif | ||
33 | #if HAVE_RANDOM_H | ||
34 | # include <random.h> | ||
35 | #endif | ||
36 | ]], [atoll canonicalize_file_name getloadavg getsubopt grantpt mkdtemp | ||
37 | mkostemp mkostemps mkstemp mkstemps ptsname random_r initstat_r srandom_r | ||
38 | setstate_r realpath rpmatch setenv strtod strtoll strtoull unlockpt | ||
39 | unsetenv]) | ||
25 | ]) | 40 | ]) |
26 | 41 | ||
27 | AC_DEFUN([gl_STDLIB_MODULE_INDICATOR], | 42 | AC_DEFUN([gl_STDLIB_MODULE_INDICATOR], |
28 | [ | 43 | [ |
29 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 44 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
30 | AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) | 45 | AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) |
31 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 46 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
47 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
48 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
32 | ]) | 49 | ]) |
33 | 50 | ||
34 | AC_DEFUN([gl_STDLIB_H_DEFAULTS], | 51 | AC_DEFUN([gl_STDLIB_H_DEFAULTS], |
35 | [ | 52 | [ |
36 | GNULIB_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX]) | ||
37 | GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX]) | ||
38 | GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) | ||
39 | GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL]) | 53 | GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL]) |
54 | GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) | ||
55 | GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME]) | ||
40 | GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG]) | 56 | GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG]) |
41 | GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) | 57 | GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) |
58 | GNULIB_GRANTPT=0; AC_SUBST([GNULIB_GRANTPT]) | ||
59 | GNULIB_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX]) | ||
42 | GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) | 60 | GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) |
61 | GNULIB_MKOSTEMP=0; AC_SUBST([GNULIB_MKOSTEMP]) | ||
62 | GNULIB_MKOSTEMPS=0; AC_SUBST([GNULIB_MKOSTEMPS]) | ||
43 | GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) | 63 | GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) |
64 | GNULIB_MKSTEMPS=0; AC_SUBST([GNULIB_MKSTEMPS]) | ||
65 | GNULIB_PTSNAME=0; AC_SUBST([GNULIB_PTSNAME]) | ||
44 | GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV]) | 66 | GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV]) |
45 | GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R]) | 67 | GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R]) |
68 | GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX]) | ||
69 | GNULIB_REALPATH=0; AC_SUBST([GNULIB_REALPATH]) | ||
46 | GNULIB_RPMATCH=0; AC_SUBST([GNULIB_RPMATCH]) | 70 | GNULIB_RPMATCH=0; AC_SUBST([GNULIB_RPMATCH]) |
47 | GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV]) | 71 | GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV]) |
48 | GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD]) | 72 | GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD]) |
49 | GNULIB_STRTOLL=0; AC_SUBST([GNULIB_STRTOLL]) | 73 | GNULIB_STRTOLL=0; AC_SUBST([GNULIB_STRTOLL]) |
50 | GNULIB_STRTOULL=0; AC_SUBST([GNULIB_STRTOULL]) | 74 | GNULIB_STRTOULL=0; AC_SUBST([GNULIB_STRTOULL]) |
75 | GNULIB_UNLOCKPT=0; AC_SUBST([GNULIB_UNLOCKPT]) | ||
51 | GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV]) | 76 | GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV]) |
52 | dnl Assume proper GNU behavior unless another module says otherwise. | 77 | dnl Assume proper GNU behavior unless another module says otherwise. |
53 | HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL]) | 78 | HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL]) |
54 | HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX]) | 79 | HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX]) |
80 | HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME]) | ||
81 | HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG]) | ||
55 | HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) | 82 | HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) |
83 | HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT]) | ||
56 | HAVE_MALLOC_POSIX=1; AC_SUBST([HAVE_MALLOC_POSIX]) | 84 | HAVE_MALLOC_POSIX=1; AC_SUBST([HAVE_MALLOC_POSIX]) |
57 | HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) | 85 | HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) |
58 | HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX]) | 86 | HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP]) |
87 | HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS]) | ||
88 | HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP]) | ||
89 | HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS]) | ||
90 | HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME]) | ||
59 | HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R]) | 91 | HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R]) |
92 | HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX]) | ||
93 | HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH]) | ||
60 | HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH]) | 94 | HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH]) |
61 | HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) | 95 | HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) |
62 | HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD]) | 96 | HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD]) |
@@ -64,10 +98,13 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS], | |||
64 | HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL]) | 98 | HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL]) |
65 | HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA]) | 99 | HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA]) |
66 | HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H]) | 100 | HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H]) |
101 | HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT]) | ||
67 | HAVE_UNSETENV=1; AC_SUBST([HAVE_UNSETENV]) | 102 | HAVE_UNSETENV=1; AC_SUBST([HAVE_UNSETENV]) |
68 | HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG]) | 103 | REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME]) |
69 | REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) | 104 | REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) |
70 | REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) | 105 | REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) |
106 | REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH]) | ||
107 | REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV]) | ||
71 | REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) | 108 | REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) |
72 | VOID_UNSETENV=0; AC_SUBST([VOID_UNSETENV]) | 109 | REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV]) |
73 | ]) | 110 | ]) |
diff --git a/gl/m4/strdup.m4 b/gl/m4/strdup.m4 index d7daac2b..ce40c215 100644 --- a/gl/m4/strdup.m4 +++ b/gl/m4/strdup.m4 | |||
@@ -1,6 +1,6 @@ | |||
1 | # strdup.m4 serial 11 | 1 | # strdup.m4 serial 12 |
2 | 2 | ||
3 | dnl Copyright (C) 2002-2009 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2002-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | dnl This file is free software; the Free Software Foundation | 5 | dnl This file is free software; the Free Software Foundation |
6 | dnl gives unlimited permission to copy and/or distribute it, | 6 | dnl gives unlimited permission to copy and/or distribute it, |
@@ -9,29 +9,36 @@ dnl with or without modifications, as long as this notice is preserved. | |||
9 | AC_DEFUN([gl_FUNC_STRDUP], | 9 | AC_DEFUN([gl_FUNC_STRDUP], |
10 | [ | 10 | [ |
11 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | 11 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
12 | AC_REPLACE_FUNCS([strdup]) | 12 | AC_CHECK_FUNCS_ONCE([strdup]) |
13 | if test $ac_cv_func_strdup != yes; then | ||
14 | AC_LIBOBJ([strdup]) | ||
15 | gl_PREREQ_STRDUP | ||
16 | fi | ||
13 | AC_CHECK_DECLS_ONCE([strdup]) | 17 | AC_CHECK_DECLS_ONCE([strdup]) |
14 | if test $ac_cv_have_decl_strdup = no; then | 18 | if test $ac_cv_have_decl_strdup = no; then |
15 | HAVE_DECL_STRDUP=0 | 19 | HAVE_DECL_STRDUP=0 |
16 | fi | 20 | fi |
17 | gl_PREREQ_STRDUP | ||
18 | ]) | 21 | ]) |
19 | 22 | ||
20 | AC_DEFUN([gl_FUNC_STRDUP_POSIX], | 23 | AC_DEFUN([gl_FUNC_STRDUP_POSIX], |
21 | [ | 24 | [ |
22 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | 25 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
23 | AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) | 26 | AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) |
24 | if test $gl_cv_func_malloc_posix != yes; then | 27 | AC_CHECK_FUNCS_ONCE([strdup]) |
25 | REPLACE_STRDUP=1 | 28 | if test $ac_cv_func_strdup = yes; then |
26 | AC_LIBOBJ([strdup]) | 29 | if test $gl_cv_func_malloc_posix != yes; then |
30 | REPLACE_STRDUP=1 | ||
31 | AC_LIBOBJ([strdup]) | ||
32 | gl_PREREQ_STRDUP | ||
33 | fi | ||
27 | else | 34 | else |
28 | AC_REPLACE_FUNCS([strdup]) | 35 | AC_LIBOBJ([strdup]) |
36 | gl_PREREQ_STRDUP | ||
29 | fi | 37 | fi |
30 | AC_CHECK_DECLS_ONCE([strdup]) | 38 | AC_CHECK_DECLS_ONCE([strdup]) |
31 | if test $ac_cv_have_decl_strdup = no; then | 39 | if test $ac_cv_have_decl_strdup = no; then |
32 | HAVE_DECL_STRDUP=0 | 40 | HAVE_DECL_STRDUP=0 |
33 | fi | 41 | fi |
34 | gl_PREREQ_STRDUP | ||
35 | ]) | 42 | ]) |
36 | 43 | ||
37 | # Prerequisites of lib/strdup.c. | 44 | # Prerequisites of lib/strdup.c. |
diff --git a/gl/m4/strerror.m4 b/gl/m4/strerror.m4 index 8c16ca9a..1649b245 100644 --- a/gl/m4/strerror.m4 +++ b/gl/m4/strerror.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # strerror.m4 serial 9 | 1 | # strerror.m4 serial 9 |
2 | dnl Copyright (C) 2002, 2007-2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/string_h.m4 b/gl/m4/string_h.m4 index 2d5553c3..cf26123e 100644 --- a/gl/m4/string_h.m4 +++ b/gl/m4/string_h.m4 | |||
@@ -1,11 +1,11 @@ | |||
1 | # Configure a GNU-like replacement for <string.h>. | 1 | # Configure a GNU-like replacement for <string.h>. |
2 | 2 | ||
3 | # Copyright (C) 2007, 2008 Free Software Foundation, Inc. | 3 | # Copyright (C) 2007-2010 Free Software Foundation, Inc. |
4 | # This file is free software; the Free Software Foundation | 4 | # This file is free software; the Free Software Foundation |
5 | # gives unlimited permission to copy and/or distribute it, | 5 | # gives unlimited permission to copy and/or distribute it, |
6 | # with or without modifications, as long as this notice is preserved. | 6 | # with or without modifications, as long as this notice is preserved. |
7 | 7 | ||
8 | # serial 6 | 8 | # serial 16 |
9 | 9 | ||
10 | # Written by Paul Eggert. | 10 | # Written by Paul Eggert. |
11 | 11 | ||
@@ -21,17 +21,29 @@ AC_DEFUN([gl_HEADER_STRING_H_BODY], | |||
21 | AC_REQUIRE([AC_C_RESTRICT]) | 21 | AC_REQUIRE([AC_C_RESTRICT]) |
22 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | 22 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
23 | gl_CHECK_NEXT_HEADERS([string.h]) | 23 | gl_CHECK_NEXT_HEADERS([string.h]) |
24 | |||
25 | dnl Check for declarations of anything we want to poison if the | ||
26 | dnl corresponding gnulib module is not in use, and which is not | ||
27 | dnl guaranteed by C89. | ||
28 | gl_WARN_ON_USE_PREPARE([[#include <string.h> | ||
29 | ]], | ||
30 | [memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul strdup | ||
31 | strncat strndup strnlen strpbrk strsep strcasestr strtok_r strsignal | ||
32 | strverscmp]) | ||
24 | ]) | 33 | ]) |
25 | 34 | ||
26 | AC_DEFUN([gl_STRING_MODULE_INDICATOR], | 35 | AC_DEFUN([gl_STRING_MODULE_INDICATOR], |
27 | [ | 36 | [ |
28 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 37 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
29 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | 38 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
30 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 39 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
40 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
41 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
31 | ]) | 42 | ]) |
32 | 43 | ||
33 | AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], | 44 | AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], |
34 | [ | 45 | [ |
46 | GNULIB_MEMCHR=0; AC_SUBST([GNULIB_MEMCHR]) | ||
35 | GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM]) | 47 | GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM]) |
36 | GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY]) | 48 | GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY]) |
37 | GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR]) | 49 | GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR]) |
@@ -40,6 +52,7 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], | |||
40 | GNULIB_STPNCPY=0; AC_SUBST([GNULIB_STPNCPY]) | 52 | GNULIB_STPNCPY=0; AC_SUBST([GNULIB_STPNCPY]) |
41 | GNULIB_STRCHRNUL=0; AC_SUBST([GNULIB_STRCHRNUL]) | 53 | GNULIB_STRCHRNUL=0; AC_SUBST([GNULIB_STRCHRNUL]) |
42 | GNULIB_STRDUP=0; AC_SUBST([GNULIB_STRDUP]) | 54 | GNULIB_STRDUP=0; AC_SUBST([GNULIB_STRDUP]) |
55 | GNULIB_STRNCAT=0; AC_SUBST([GNULIB_STRNCAT]) | ||
43 | GNULIB_STRNDUP=0; AC_SUBST([GNULIB_STRNDUP]) | 56 | GNULIB_STRNDUP=0; AC_SUBST([GNULIB_STRNDUP]) |
44 | GNULIB_STRNLEN=0; AC_SUBST([GNULIB_STRNLEN]) | 57 | GNULIB_STRNLEN=0; AC_SUBST([GNULIB_STRNLEN]) |
45 | GNULIB_STRPBRK=0; AC_SUBST([GNULIB_STRPBRK]) | 58 | GNULIB_STRPBRK=0; AC_SUBST([GNULIB_STRPBRK]) |
@@ -63,30 +76,36 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], | |||
63 | GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R]) | 76 | GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R]) |
64 | GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR]) | 77 | GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR]) |
65 | GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL]) | 78 | GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL]) |
66 | GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP]) | 79 | GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP]) |
80 | HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN]) | ||
67 | dnl Assume proper GNU behavior unless another module says otherwise. | 81 | dnl Assume proper GNU behavior unless another module says otherwise. |
68 | HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM]) | 82 | HAVE_MEMCHR=1; AC_SUBST([HAVE_MEMCHR]) |
69 | HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY]) | 83 | HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM]) |
70 | HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR]) | 84 | HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY]) |
71 | HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR]) | 85 | HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR]) |
72 | HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY]) | 86 | HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR]) |
73 | HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY]) | 87 | HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY]) |
74 | HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL]) | 88 | HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY]) |
75 | HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP]) | 89 | HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL]) |
76 | HAVE_STRNDUP=1; AC_SUBST([HAVE_STRNDUP]) | 90 | HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP]) |
77 | HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP]) | 91 | HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP]) |
78 | HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN]) | 92 | HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN]) |
79 | HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK]) | 93 | HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK]) |
80 | HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP]) | 94 | HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP]) |
81 | HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR]) | 95 | HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR]) |
82 | HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R]) | 96 | HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R]) |
83 | HAVE_DECL_STRERROR=1; AC_SUBST([HAVE_DECL_STRERROR]) | 97 | HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) |
84 | HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) | 98 | HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP]) |
85 | HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP]) | 99 | REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR]) |
86 | REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) | 100 | REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) |
87 | REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP]) | 101 | REPLACE_STPNCPY=0; AC_SUBST([REPLACE_STPNCPY]) |
88 | REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) | 102 | REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP]) |
89 | REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR]) | 103 | REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) |
90 | REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) | 104 | REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR]) |
91 | REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) | 105 | REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) |
106 | REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT]) | ||
107 | REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP]) | ||
108 | REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) | ||
109 | REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R]) | ||
110 | UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R]) | ||
92 | ]) | 111 | ]) |
diff --git a/gl/m4/strndup.m4 b/gl/m4/strndup.m4 index 4fa7d5a7..810313cd 100644 --- a/gl/m4/strndup.m4 +++ b/gl/m4/strndup.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # strndup.m4 serial 16 | 1 | # strndup.m4 serial 17 |
2 | dnl Copyright (C) 2002-2003, 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -9,17 +9,20 @@ AC_DEFUN([gl_FUNC_STRNDUP], | |||
9 | dnl Persuade glibc <string.h> to declare strndup(). | 9 | dnl Persuade glibc <string.h> to declare strndup(). |
10 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) | 10 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) |
11 | 11 | ||
12 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | ||
12 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | 13 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
13 | AC_CHECK_DECLS_ONCE([strndup]) | 14 | AC_CHECK_DECLS_ONCE([strndup]) |
15 | AC_CHECK_FUNCS_ONCE([strndup]) | ||
14 | if test $ac_cv_have_decl_strndup = no; then | 16 | if test $ac_cv_have_decl_strndup = no; then |
15 | HAVE_DECL_STRNDUP=0 | 17 | HAVE_DECL_STRNDUP=0 |
16 | fi | 18 | fi |
17 | 19 | ||
18 | # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. | 20 | if test $ac_cv_func_strndup = yes; then |
19 | AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup], | 21 | # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. |
20 | [AC_RUN_IFELSE([ | 22 | AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works], |
21 | AC_LANG_PROGRAM([[#include <string.h> | 23 | [AC_RUN_IFELSE([ |
22 | #include <stdlib.h>]], [[ | 24 | AC_LANG_PROGRAM([[#include <string.h> |
25 | #include <stdlib.h>]], [[ | ||
23 | #ifndef HAVE_DECL_STRNDUP | 26 | #ifndef HAVE_DECL_STRNDUP |
24 | extern char *strndup (const char *, size_t); | 27 | extern char *strndup (const char *, size_t); |
25 | #endif | 28 | #endif |
@@ -28,26 +31,19 @@ AC_DEFUN([gl_FUNC_STRNDUP], | |||
28 | free (s); | 31 | free (s); |
29 | s = strndup ("shorter string", 13); | 32 | s = strndup ("shorter string", 13); |
30 | return s[13] != '\0';]])], | 33 | return s[13] != '\0';]])], |
31 | [gl_cv_func_strndup=yes], | 34 | [gl_cv_func_strndup_works=yes], |
32 | [gl_cv_func_strndup=no], | 35 | [gl_cv_func_strndup_works=no], |
33 | [AC_CHECK_FUNC([strndup], | 36 | [case $host_os in |
34 | [AC_EGREP_CPP([too risky], [ | 37 | aix*) gl_cv_func_strndup_works="guessing no";; |
35 | #ifdef _AIX | 38 | *) gl_cv_func_strndup_works="guessing yes";; |
36 | too risky | 39 | esac])]) |
37 | #endif | 40 | case $gl_cv_func_strndup_works in |
38 | ], | 41 | *no) |
39 | [gl_cv_func_strndup=no], | 42 | REPLACE_STRNDUP=1 |
40 | [gl_cv_func_strndup=yes])], | 43 | AC_LIBOBJ([strndup]) |
41 | [gl_cv_func_strndup=no])])]) | 44 | ;; |
42 | if test $gl_cv_func_strndup = yes; then | 45 | esac |
43 | AC_DEFINE([HAVE_STRNDUP], [1], | ||
44 | [Define if you have the strndup() function and it works.]) | ||
45 | else | 46 | else |
46 | HAVE_STRNDUP=0 | ||
47 | AC_LIBOBJ([strndup]) | 47 | AC_LIBOBJ([strndup]) |
48 | gl_PREREQ_STRNDUP | ||
49 | fi | 48 | fi |
50 | ]) | 49 | ]) |
51 | |||
52 | # Prerequisites of lib/strndup.c. | ||
53 | AC_DEFUN([gl_PREREQ_STRNDUP], [:]) | ||
diff --git a/gl/m4/strnlen.m4 b/gl/m4/strnlen.m4 index 1c97859d..cd48948f 100644 --- a/gl/m4/strnlen.m4 +++ b/gl/m4/strnlen.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # strnlen.m4 serial 10 | 1 | # strnlen.m4 serial 10 |
2 | dnl Copyright (C) 2002-2003, 2005-2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/strstr.m4 b/gl/m4/strstr.m4 new file mode 100644 index 00000000..779957aa --- /dev/null +++ b/gl/m4/strstr.m4 | |||
@@ -0,0 +1,79 @@ | |||
1 | # strstr.m4 serial 7 | ||
2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | dnl Check that strstr works. | ||
8 | AC_DEFUN([gl_FUNC_STRSTR_SIMPLE], | ||
9 | [ | ||
10 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | ||
11 | AC_REQUIRE([gl_FUNC_MEMCHR]) | ||
12 | if test "$gl_cv_func_memchr_works" != yes; then | ||
13 | REPLACE_STRSTR=1 | ||
14 | AC_LIBOBJ([strstr]) | ||
15 | fi | ||
16 | ]) # gl_FUNC_STRSTR_SIMPLE | ||
17 | |||
18 | dnl Additionally, check that strstr is efficient. | ||
19 | AC_DEFUN([gl_FUNC_STRSTR], | ||
20 | [ | ||
21 | AC_REQUIRE([gl_FUNC_STRSTR_SIMPLE]) | ||
22 | if test $REPLACE_STRSTR = 0; then | ||
23 | AC_CACHE_CHECK([whether strstr works in linear time], | ||
24 | [gl_cv_func_strstr_linear], | ||
25 | [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | ||
26 | #include <signal.h> /* for signal */ | ||
27 | #include <string.h> /* for memmem */ | ||
28 | #include <stdlib.h> /* for malloc */ | ||
29 | #include <unistd.h> /* for alarm */ | ||
30 | ]], [[size_t m = 1000000; | ||
31 | char *haystack = (char *) malloc (2 * m + 2); | ||
32 | char *needle = (char *) malloc (m + 2); | ||
33 | void *result = 0; | ||
34 | /* Failure to compile this test due to missing alarm is okay, | ||
35 | since all such platforms (mingw) also have quadratic strstr. */ | ||
36 | signal (SIGALRM, SIG_DFL); | ||
37 | alarm (5); | ||
38 | /* Check for quadratic performance. */ | ||
39 | if (haystack && needle) | ||
40 | { | ||
41 | memset (haystack, 'A', 2 * m); | ||
42 | haystack[2 * m] = 'B'; | ||
43 | haystack[2 * m + 1] = 0; | ||
44 | memset (needle, 'A', m); | ||
45 | needle[m] = 'B'; | ||
46 | needle[m + 1] = 0; | ||
47 | result = strstr (haystack, needle); | ||
48 | } | ||
49 | return !result;]])], | ||
50 | [gl_cv_func_strstr_linear=yes], [gl_cv_func_strstr_linear=no], | ||
51 | [dnl Only glibc >= 2.9 and cygwin >= 1.7.0 are known to have a | ||
52 | dnl strstr that works in linear time. | ||
53 | AC_EGREP_CPP([Lucky user], | ||
54 | [ | ||
55 | #include <features.h> | ||
56 | #ifdef __GNU_LIBRARY__ | ||
57 | #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2) | ||
58 | Lucky user | ||
59 | #endif | ||
60 | #endif | ||
61 | #ifdef __CYGWIN__ | ||
62 | #include <cygwin/version.h> | ||
63 | #if CYGWIN_VERSION_DLL_MAJOR >= 1007 | ||
64 | Lucky user | ||
65 | #endif | ||
66 | #endif | ||
67 | ], | ||
68 | [gl_cv_func_strstr_linear=yes], | ||
69 | [gl_cv_func_strstr_linear="guessing no"]) | ||
70 | ]) | ||
71 | ]) | ||
72 | if test "$gl_cv_func_strstr_linear" != yes; then | ||
73 | REPLACE_STRSTR=1 | ||
74 | fi | ||
75 | fi | ||
76 | if test $REPLACE_STRSTR = 1; then | ||
77 | AC_LIBOBJ([strstr]) | ||
78 | fi | ||
79 | ]) # gl_FUNC_STRSTR | ||
diff --git a/gl/m4/sys_socket_h.m4 b/gl/m4/sys_socket_h.m4 index d1cb9c20..9f4db562 100644 --- a/gl/m4/sys_socket_h.m4 +++ b/gl/m4/sys_socket_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # sys_socket_h.m4 serial 12 | 1 | # sys_socket_h.m4 serial 17 |
2 | dnl Copyright (C) 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -19,7 +19,6 @@ AC_DEFUN([gl_HEADER_SYS_SOCKET], | |||
19 | [gl_cv_header_sys_socket_h_selfcontained=no]) | 19 | [gl_cv_header_sys_socket_h_selfcontained=no]) |
20 | ]) | 20 | ]) |
21 | if test $gl_cv_header_sys_socket_h_selfcontained = yes; then | 21 | if test $gl_cv_header_sys_socket_h_selfcontained = yes; then |
22 | SYS_SOCKET_H='' | ||
23 | dnl If the shutdown function exists, <sys/socket.h> should define | 22 | dnl If the shutdown function exists, <sys/socket.h> should define |
24 | dnl SHUT_RD, SHUT_WR, SHUT_RDWR. | 23 | dnl SHUT_RD, SHUT_WR, SHUT_RDWR. |
25 | AC_CHECK_FUNCS([shutdown]) | 24 | AC_CHECK_FUNCS([shutdown]) |
@@ -37,12 +36,10 @@ AC_DEFUN([gl_HEADER_SYS_SOCKET], | |||
37 | SYS_SOCKET_H='sys/socket.h' | 36 | SYS_SOCKET_H='sys/socket.h' |
38 | fi | 37 | fi |
39 | fi | 38 | fi |
40 | else | ||
41 | SYS_SOCKET_H='sys/socket.h' | ||
42 | fi | 39 | fi |
43 | # We need to check for ws2tcpip.h now. | 40 | # We need to check for ws2tcpip.h now. |
44 | gl_PREREQ_SYS_H_SOCKET | 41 | gl_PREREQ_SYS_H_SOCKET |
45 | AC_CHECK_TYPES([struct sockaddr_storage],,,[ | 42 | AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[ |
46 | /* sys/types.h is not needed according to POSIX, but the | 43 | /* sys/types.h is not needed according to POSIX, but the |
47 | sys/socket.h in i386-unknown-freebsd4.10 and | 44 | sys/socket.h in i386-unknown-freebsd4.10 and |
48 | powerpc-apple-darwin5.5 required it. */ | 45 | powerpc-apple-darwin5.5 required it. */ |
@@ -56,12 +53,23 @@ AC_DEFUN([gl_HEADER_SYS_SOCKET], | |||
56 | ]) | 53 | ]) |
57 | if test $ac_cv_type_struct_sockaddr_storage = no; then | 54 | if test $ac_cv_type_struct_sockaddr_storage = no; then |
58 | HAVE_STRUCT_SOCKADDR_STORAGE=0 | 55 | HAVE_STRUCT_SOCKADDR_STORAGE=0 |
59 | SYS_SOCKET_H='sys/socket.h' | ||
60 | fi | 56 | fi |
61 | if test -n "$SYS_SOCKET_H"; then | 57 | if test $ac_cv_type_sa_family_t = no; then |
62 | gl_PREREQ_SYS_H_WINSOCK2 | 58 | HAVE_SA_FAMILY_T=0 |
63 | fi | 59 | fi |
64 | AC_SUBST([SYS_SOCKET_H]) | 60 | gl_PREREQ_SYS_H_WINSOCK2 |
61 | |||
62 | dnl Check for declarations of anything we want to poison if the | ||
63 | dnl corresponding gnulib module is not in use. | ||
64 | gl_WARN_ON_USE_PREPARE([[ | ||
65 | /* Some systems require prerequisite headers. */ | ||
66 | #include <sys/types.h> | ||
67 | #if !defined __GLIBC__ && HAVE_SYS_TIME_H | ||
68 | # include <sys/time.h> | ||
69 | #endif | ||
70 | #include <sys/select.h> | ||
71 | ]], [socket connect accept bind getpeername getsockname getsockopt | ||
72 | listen recv send recvfrom sendto setsockopt shutdown accept4]) | ||
65 | ]) | 73 | ]) |
66 | 74 | ||
67 | AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], | 75 | AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], |
@@ -88,7 +96,7 @@ AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], | |||
88 | AC_SUBST([HAVE_WS2TCPIP_H]) | 96 | AC_SUBST([HAVE_WS2TCPIP_H]) |
89 | ]) | 97 | ]) |
90 | 98 | ||
91 | # Common prerequisites of of the <sys/socket.h> replacement and of the | 99 | # Common prerequisites of the <sys/socket.h> replacement and of the |
92 | # <sys/select.h> replacement. | 100 | # <sys/select.h> replacement. |
93 | # Sets and substitutes HAVE_WINSOCK2_H. | 101 | # Sets and substitutes HAVE_WINSOCK2_H. |
94 | AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2], | 102 | AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2], |
@@ -117,7 +125,9 @@ AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR], | |||
117 | [ | 125 | [ |
118 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 126 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
119 | AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) | 127 | AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) |
120 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 128 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
129 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
130 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
121 | ]) | 131 | ]) |
122 | 132 | ||
123 | AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS], | 133 | AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS], |
@@ -136,5 +146,8 @@ AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS], | |||
136 | GNULIB_SENDTO=0; AC_SUBST([GNULIB_SENDTO]) | 146 | GNULIB_SENDTO=0; AC_SUBST([GNULIB_SENDTO]) |
137 | GNULIB_SETSOCKOPT=0; AC_SUBST([GNULIB_SETSOCKOPT]) | 147 | GNULIB_SETSOCKOPT=0; AC_SUBST([GNULIB_SETSOCKOPT]) |
138 | GNULIB_SHUTDOWN=0; AC_SUBST([GNULIB_SHUTDOWN]) | 148 | GNULIB_SHUTDOWN=0; AC_SUBST([GNULIB_SHUTDOWN]) |
149 | GNULIB_ACCEPT4=0; AC_SUBST([GNULIB_ACCEPT4]) | ||
139 | HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE]) | 150 | HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE]) |
151 | HAVE_SA_FAMILY_T=1; AC_SUBST([HAVE_SA_FAMILY_T]) | ||
152 | HAVE_ACCEPT4=1; AC_SUBST([HAVE_ACCEPT4]) | ||
140 | ]) | 153 | ]) |
diff --git a/gl/m4/sys_stat_h.m4 b/gl/m4/sys_stat_h.m4 new file mode 100644 index 00000000..7181c253 --- /dev/null +++ b/gl/m4/sys_stat_h.m4 | |||
@@ -0,0 +1,82 @@ | |||
1 | # sys_stat_h.m4 serial 24 -*- Autoconf -*- | ||
2 | dnl Copyright (C) 2006-2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | dnl From Eric Blake. | ||
8 | dnl Provide a GNU-like <sys/stat.h>. | ||
9 | |||
10 | AC_DEFUN([gl_HEADER_SYS_STAT_H], | ||
11 | [ | ||
12 | AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) | ||
13 | |||
14 | dnl For the mkdir substitute. | ||
15 | AC_REQUIRE([AC_C_INLINE]) | ||
16 | |||
17 | dnl Check for broken stat macros. | ||
18 | AC_REQUIRE([AC_HEADER_STAT]) | ||
19 | |||
20 | gl_CHECK_NEXT_HEADERS([sys/stat.h]) | ||
21 | |||
22 | dnl Define types that are supposed to be defined in <sys/types.h> or | ||
23 | dnl <sys/stat.h>. | ||
24 | AC_CHECK_TYPE([nlink_t], [], | ||
25 | [AC_DEFINE([nlink_t], [int], | ||
26 | [Define to the type of st_nlink in struct stat, or a supertype.])], | ||
27 | [#include <sys/types.h> | ||
28 | #include <sys/stat.h>]) | ||
29 | |||
30 | dnl Check for declarations of anything we want to poison if the | ||
31 | dnl corresponding gnulib module is not in use. | ||
32 | gl_WARN_ON_USE_PREPARE([[#include <sys/stat.h> | ||
33 | ]], [fchmodat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat | ||
34 | mknod mknodat stat utimensat]) | ||
35 | ]) # gl_HEADER_SYS_STAT_H | ||
36 | |||
37 | AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR], | ||
38 | [ | ||
39 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | ||
40 | AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) | ||
41 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) | ||
42 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
43 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
44 | ]) | ||
45 | |||
46 | AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], | ||
47 | [ | ||
48 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR | ||
49 | GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT]) | ||
50 | GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT]) | ||
51 | GNULIB_FUTIMENS=0; AC_SUBST([GNULIB_FUTIMENS]) | ||
52 | GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) | ||
53 | GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) | ||
54 | GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT]) | ||
55 | GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO]) | ||
56 | GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT]) | ||
57 | GNULIB_MKNOD=0; AC_SUBST([GNULIB_MKNOD]) | ||
58 | GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT]) | ||
59 | GNULIB_STAT=0; AC_SUBST([GNULIB_STAT]) | ||
60 | GNULIB_UTIMENSAT=0; AC_SUBST([GNULIB_UTIMENSAT]) | ||
61 | dnl Assume proper GNU behavior unless another module says otherwise. | ||
62 | HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) | ||
63 | HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) | ||
64 | HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS]) | ||
65 | HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) | ||
66 | HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT]) | ||
67 | HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) | ||
68 | HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO]) | ||
69 | HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT]) | ||
70 | HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD]) | ||
71 | HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT]) | ||
72 | HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT]) | ||
73 | REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT]) | ||
74 | REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) | ||
75 | REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS]) | ||
76 | REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) | ||
77 | REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) | ||
78 | REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO]) | ||
79 | REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD]) | ||
80 | REPLACE_STAT=0; AC_SUBST([REPLACE_STAT]) | ||
81 | REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT]) | ||
82 | ]) | ||
diff --git a/gl/m4/threadlib.m4 b/gl/m4/threadlib.m4 index 3dd38aa8..05cc4ffa 100644 --- a/gl/m4/threadlib.m4 +++ b/gl/m4/threadlib.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # threadlib.m4 serial 3 (gettext-0.18) | 1 | # threadlib.m4 serial 5 (gettext-0.18) |
2 | dnl Copyright (C) 2005-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -52,13 +52,24 @@ AC_HELP_STRING([--disable-threads], [build without multithread safety]), | |||
52 | [if test -n "$gl_use_threads_default"; then | 52 | [if test -n "$gl_use_threads_default"; then |
53 | gl_use_threads="$gl_use_threads_default" | 53 | gl_use_threads="$gl_use_threads_default" |
54 | else | 54 | else |
55 | changequote(,)dnl | ||
55 | case "$host_os" in | 56 | case "$host_os" in |
56 | dnl Disable multithreading by default on OSF/1, because it interferes | 57 | dnl Disable multithreading by default on OSF/1, because it interferes |
57 | dnl with fork()/exec(): When msgexec is linked with -lpthread, its | 58 | dnl with fork()/exec(): When msgexec is linked with -lpthread, its |
58 | dnl child process gets an endless segmentation fault inside execvp(). | 59 | dnl child process gets an endless segmentation fault inside execvp(). |
60 | dnl Disable multithreading by default on Cygwin 1.5.x, because it has | ||
61 | dnl bugs that lead to endless loops or crashes. See | ||
62 | dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>. | ||
59 | osf*) gl_use_threads=no ;; | 63 | osf*) gl_use_threads=no ;; |
64 | cygwin*) | ||
65 | case `uname -r` in | ||
66 | 1.[0-5].*) gl_use_threads=no ;; | ||
67 | *) gl_use_threads=yes ;; | ||
68 | esac | ||
69 | ;; | ||
60 | *) gl_use_threads=yes ;; | 70 | *) gl_use_threads=yes ;; |
61 | esac | 71 | esac |
72 | changequote([,])dnl | ||
62 | fi | 73 | fi |
63 | ]) | 74 | ]) |
64 | if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then | 75 | if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then |
@@ -96,11 +107,34 @@ AC_DEFUN([gl_THREADLIB_BODY], | |||
96 | LTLIBMULTITHREAD= | 107 | LTLIBMULTITHREAD= |
97 | if test "$gl_use_threads" != no; then | 108 | if test "$gl_use_threads" != no; then |
98 | dnl Check whether the compiler and linker support weak declarations. | 109 | dnl Check whether the compiler and linker support weak declarations. |
99 | AC_MSG_CHECKING([whether imported symbols can be declared weak]) | 110 | AC_CACHE_CHECK([whether imported symbols can be declared weak], |
100 | gl_have_weak=no | 111 | [gl_cv_have_weak], |
101 | AC_TRY_LINK([extern void xyzzy (); | 112 | [gl_cv_have_weak=no |
102 | #pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes]) | 113 | dnl First, test whether the compiler accepts it syntactically. |
103 | AC_MSG_RESULT([$gl_have_weak]) | 114 | AC_TRY_LINK([extern void xyzzy (); |
115 | #pragma weak xyzzy], [xyzzy();], [gl_cv_have_weak=maybe]) | ||
116 | if test $gl_cv_have_weak = maybe; then | ||
117 | dnl Second, test whether it actually works. On Cygwin 1.7.2, with | ||
118 | dnl gcc 4.3, symbols declared weak always evaluate to the address 0. | ||
119 | AC_TRY_RUN([ | ||
120 | #include <stdio.h> | ||
121 | #pragma weak fputs | ||
122 | int main () | ||
123 | { | ||
124 | return (fputs == NULL); | ||
125 | }], [gl_cv_have_weak=yes], [gl_cv_have_weak=no], | ||
126 | [dnl When cross-compiling, assume that only ELF platforms support | ||
127 | dnl weak symbols. | ||
128 | AC_EGREP_CPP([Extensible Linking Format], | ||
129 | [#ifdef __ELF__ | ||
130 | Extensible Linking Format | ||
131 | #endif | ||
132 | ], | ||
133 | [gl_cv_have_weak="guessing yes"], | ||
134 | [gl_cv_have_weak="guessing no"]) | ||
135 | ]) | ||
136 | fi | ||
137 | ]) | ||
104 | if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then | 138 | if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then |
105 | # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that | 139 | # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that |
106 | # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY. | 140 | # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY. |
@@ -154,7 +188,7 @@ AC_DEFUN([gl_THREADLIB_BODY], | |||
154 | AC_DEFINE([USE_POSIX_THREADS], [1], | 188 | AC_DEFINE([USE_POSIX_THREADS], [1], |
155 | [Define if the POSIX multithreading library can be used.]) | 189 | [Define if the POSIX multithreading library can be used.]) |
156 | if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then | 190 | if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then |
157 | if test $gl_have_weak = yes; then | 191 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then |
158 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], | 192 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], |
159 | [Define if references to the POSIX multithreading library should be made weak.]) | 193 | [Define if references to the POSIX multithreading library should be made weak.]) |
160 | LIBTHREAD= | 194 | LIBTHREAD= |
@@ -182,7 +216,7 @@ AC_DEFUN([gl_THREADLIB_BODY], | |||
182 | LTLIBMULTITHREAD="$LTLIBTHREAD" | 216 | LTLIBMULTITHREAD="$LTLIBTHREAD" |
183 | AC_DEFINE([USE_SOLARIS_THREADS], [1], | 217 | AC_DEFINE([USE_SOLARIS_THREADS], [1], |
184 | [Define if the old Solaris multithreading library can be used.]) | 218 | [Define if the old Solaris multithreading library can be used.]) |
185 | if test $gl_have_weak = yes; then | 219 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then |
186 | AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1], | 220 | AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1], |
187 | [Define if references to the old Solaris multithreading library should be made weak.]) | 221 | [Define if references to the old Solaris multithreading library should be made weak.]) |
188 | LIBTHREAD= | 222 | LIBTHREAD= |
@@ -208,7 +242,7 @@ AC_DEFUN([gl_THREADLIB_BODY], | |||
208 | AC_DEFINE([USE_PTH_THREADS], [1], | 242 | AC_DEFINE([USE_PTH_THREADS], [1], |
209 | [Define if the GNU Pth multithreading library can be used.]) | 243 | [Define if the GNU Pth multithreading library can be used.]) |
210 | if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then | 244 | if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then |
211 | if test $gl_have_weak = yes; then | 245 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then |
212 | AC_DEFINE([USE_PTH_THREADS_WEAK], [1], | 246 | AC_DEFINE([USE_PTH_THREADS_WEAK], [1], |
213 | [Define if references to the GNU Pth multithreading library should be made weak.]) | 247 | [Define if references to the GNU Pth multithreading library should be made weak.]) |
214 | LIBTHREAD= | 248 | LIBTHREAD= |
diff --git a/gl/m4/time_h.m4 b/gl/m4/time_h.m4 index d42a635e..b88ba94d 100644 --- a/gl/m4/time_h.m4 +++ b/gl/m4/time_h.m4 | |||
@@ -1,7 +1,6 @@ | |||
1 | # Configure a more-standard replacement for <time.h>. | 1 | # Configure a more-standard replacement for <time.h>. |
2 | 2 | ||
3 | # Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007 Free Software | 3 | # Copyright (C) 2000-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc. |
4 | # Foundation, Inc. | ||
5 | 4 | ||
6 | # This file is free software; the Free Software Foundation | 5 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 6 | # gives unlimited permission to copy and/or distribute it, |
@@ -24,17 +23,6 @@ AC_DEFUN([gl_HEADER_TIME_H_BODY], | |||
24 | AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC]) | 23 | AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC]) |
25 | ]) | 24 | ]) |
26 | 25 | ||
27 | AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS], | ||
28 | [ | ||
29 | dnl If another module says to replace or to not replace, do that. | ||
30 | dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; | ||
31 | dnl this lets maintainers check for portability. | ||
32 | REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) | ||
33 | REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) | ||
34 | REPLACE_STRPTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_STRPTIME]) | ||
35 | REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM]) | ||
36 | ]) | ||
37 | |||
38 | dnl Define HAVE_STRUCT_TIMESPEC if `struct timespec' is declared | 26 | dnl Define HAVE_STRUCT_TIMESPEC if `struct timespec' is declared |
39 | dnl in time.h or sys/time.h. | 27 | dnl in time.h or sys/time.h. |
40 | 28 | ||
@@ -45,9 +33,9 @@ AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], | |||
45 | [gl_cv_sys_struct_timespec_in_time_h], | 33 | [gl_cv_sys_struct_timespec_in_time_h], |
46 | [AC_COMPILE_IFELSE( | 34 | [AC_COMPILE_IFELSE( |
47 | [AC_LANG_PROGRAM( | 35 | [AC_LANG_PROGRAM( |
48 | [[#include <time.h> | 36 | [[#include <time.h> |
49 | ]], | 37 | ]], |
50 | [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], | 38 | [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], |
51 | [gl_cv_sys_struct_timespec_in_time_h=yes], | 39 | [gl_cv_sys_struct_timespec_in_time_h=yes], |
52 | [gl_cv_sys_struct_timespec_in_time_h=no])]) | 40 | [gl_cv_sys_struct_timespec_in_time_h=no])]) |
53 | 41 | ||
@@ -59,12 +47,12 @@ AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], | |||
59 | AC_CACHE_CHECK([for struct timespec in <sys/time.h>], | 47 | AC_CACHE_CHECK([for struct timespec in <sys/time.h>], |
60 | [gl_cv_sys_struct_timespec_in_sys_time_h], | 48 | [gl_cv_sys_struct_timespec_in_sys_time_h], |
61 | [AC_COMPILE_IFELSE( | 49 | [AC_COMPILE_IFELSE( |
62 | [AC_LANG_PROGRAM( | 50 | [AC_LANG_PROGRAM( |
63 | [[#include <sys/time.h> | 51 | [[#include <sys/time.h> |
64 | ]], | 52 | ]], |
65 | [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], | 53 | [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], |
66 | [gl_cv_sys_struct_timespec_in_sys_time_h=yes], | 54 | [gl_cv_sys_struct_timespec_in_sys_time_h=yes], |
67 | [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) | 55 | [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) |
68 | if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then | 56 | if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then |
69 | SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 | 57 | SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 |
70 | fi | 58 | fi |
@@ -72,3 +60,33 @@ AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], | |||
72 | AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC]) | 60 | AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC]) |
73 | AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC]) | 61 | AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC]) |
74 | ]) | 62 | ]) |
63 | |||
64 | AC_DEFUN([gl_TIME_MODULE_INDICATOR], | ||
65 | [ | ||
66 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | ||
67 | AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) | ||
68 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) | ||
69 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
70 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
71 | ]) | ||
72 | |||
73 | AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS], | ||
74 | [ | ||
75 | GNULIB_MKTIME=0; AC_SUBST([GNULIB_MKTIME]) | ||
76 | GNULIB_NANOSLEEP=0; AC_SUBST([GNULIB_NANOSLEEP]) | ||
77 | GNULIB_STRPTIME=0; AC_SUBST([GNULIB_STRPTIME]) | ||
78 | GNULIB_TIMEGM=0; AC_SUBST([GNULIB_TIMEGM]) | ||
79 | GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R]) | ||
80 | dnl Assume proper GNU behavior unless another module says otherwise. | ||
81 | HAVE_LOCALTIME_R=1; AC_SUBST([HAVE_LOCALTIME_R]) | ||
82 | HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP]) | ||
83 | HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME]) | ||
84 | HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM]) | ||
85 | dnl If another module says to replace or to not replace, do that. | ||
86 | dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; | ||
87 | dnl this lets maintainers check for portability. | ||
88 | REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) | ||
89 | REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME]) | ||
90 | REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) | ||
91 | REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM]) | ||
92 | ]) | ||
diff --git a/gl/m4/time_r.m4 b/gl/m4/time_r.m4 index c871b56d..9e82d39f 100644 --- a/gl/m4/time_r.m4 +++ b/gl/m4/time_r.m4 | |||
@@ -1,6 +1,6 @@ | |||
1 | dnl Reentrant time functions like localtime_r. | 1 | dnl Reentrant time functions: localtime_r, gmtime_r. |
2 | 2 | ||
3 | dnl Copyright (C) 2003, 2006, 2007, 2008 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2003, 2006-2010 Free Software Foundation, Inc. |
4 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
5 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
6 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
@@ -9,29 +9,40 @@ dnl Written by Paul Eggert. | |||
9 | 9 | ||
10 | AC_DEFUN([gl_TIME_R], | 10 | AC_DEFUN([gl_TIME_R], |
11 | [ | 11 | [ |
12 | dnl Persuade glibc and Solaris <time.h> to declare localtime_r. | 12 | dnl Persuade glibc and Solaris <time.h> to declare localtime_r. |
13 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | 13 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) |
14 | 14 | ||
15 | AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) | 15 | AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) |
16 | AC_REQUIRE([AC_C_RESTRICT]) | 16 | AC_REQUIRE([AC_C_RESTRICT]) |
17 | 17 | ||
18 | AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature], | 18 | AC_CHECK_FUNCS_ONCE([localtime_r]) |
19 | [gl_cv_time_r_posix], | 19 | if test $ac_cv_func_localtime_r = yes; then |
20 | [AC_TRY_COMPILE( | 20 | AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature], |
21 | [#include <time.h>], | 21 | [gl_cv_time_r_posix], |
22 | [/* We don't need to append 'restrict's to the argument types, | 22 | [AC_COMPILE_IFELSE( |
23 | even though the POSIX signature has the 'restrict's, | 23 | [AC_LANG_PROGRAM( |
24 | since C99 says they can't affect type compatibility. */ | 24 | [[#include <time.h>]], |
25 | struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; | 25 | [[/* We don't need to append 'restrict's to the argument types, |
26 | if (ptr) return 0; | 26 | even though the POSIX signature has the 'restrict's, |
27 | /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ | 27 | since C99 says they can't affect type compatibility. */ |
28 | *localtime_r (0, 0);], | 28 | struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; |
29 | [gl_cv_time_r_posix=yes], | 29 | if (ptr) return 0; |
30 | [gl_cv_time_r_posix=no])]) | 30 | /* Check the return type is a pointer. |
31 | if test $gl_cv_time_r_posix = yes; then | 31 | On HP-UX 10 it is 'int'. */ |
32 | REPLACE_LOCALTIME_R=0 | 32 | *localtime_r (0, 0);]]) |
33 | ], | ||
34 | [gl_cv_time_r_posix=yes], | ||
35 | [gl_cv_time_r_posix=no]) | ||
36 | ]) | ||
37 | if test $gl_cv_time_r_posix = yes; then | ||
38 | REPLACE_LOCALTIME_R=0 | ||
39 | else | ||
40 | REPLACE_LOCALTIME_R=1 | ||
41 | fi | ||
33 | else | 42 | else |
34 | REPLACE_LOCALTIME_R=1 | 43 | HAVE_LOCALTIME_R=0 |
44 | fi | ||
45 | if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then | ||
35 | AC_LIBOBJ([time_r]) | 46 | AC_LIBOBJ([time_r]) |
36 | gl_PREREQ_TIME_R | 47 | gl_PREREQ_TIME_R |
37 | fi | 48 | fi |
diff --git a/gl/m4/timegm.m4 b/gl/m4/timegm.m4 index be323c9b..bdaafbff 100644 --- a/gl/m4/timegm.m4 +++ b/gl/m4/timegm.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # timegm.m4 serial 6 | 1 | # timegm.m4 serial 8 |
2 | dnl Copyright (C) 2003, 2007, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -8,18 +8,18 @@ AC_DEFUN([gl_FUNC_TIMEGM], | |||
8 | [ | 8 | [ |
9 | AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) | 9 | AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) |
10 | AC_REQUIRE([gl_FUNC_MKTIME]) | 10 | AC_REQUIRE([gl_FUNC_MKTIME]) |
11 | if test $ac_cv_func_working_mktime = no; then | 11 | REPLACE_TIMEGM=0 |
12 | # Assume that timegm is buggy if mktime is. | 12 | AC_CHECK_FUNCS_ONCE([timegm]) |
13 | AC_LIBOBJ([timegm]) | ||
14 | ac_cv_func_timegm=no | ||
15 | else | ||
16 | AC_REPLACE_FUNCS([timegm]) | ||
17 | fi | ||
18 | REPLACE_TIMEGM=1 | ||
19 | if test $ac_cv_func_timegm = yes; then | 13 | if test $ac_cv_func_timegm = yes; then |
20 | AC_CHECK_DECLS([timegm], [REPLACE_TIMEGM=0], [], [#include <time.h>]) | 14 | if test $ac_cv_func_working_mktime = no; then |
15 | # Assume that timegm is buggy if mktime is. | ||
16 | REPLACE_TIMEGM=1 | ||
17 | fi | ||
18 | else | ||
19 | HAVE_TIMEGM=0 | ||
21 | fi | 20 | fi |
22 | if test $REPLACE_TIMEGM = 1; then | 21 | if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then |
22 | AC_LIBOBJ([timegm]) | ||
23 | gl_PREREQ_TIMEGM | 23 | gl_PREREQ_TIMEGM |
24 | fi | 24 | fi |
25 | ]) | 25 | ]) |
@@ -34,7 +34,7 @@ AC_DEFUN([gl_PREREQ_TIMEGM], [ | |||
34 | # so we need to substitute our own mktime implementation. | 34 | # so we need to substitute our own mktime implementation. |
35 | AC_LIBOBJ([mktime]) | 35 | AC_LIBOBJ([mktime]) |
36 | AC_DEFINE([mktime], [rpl_mktime], | 36 | AC_DEFINE([mktime], [rpl_mktime], |
37 | [Define to rpl_mktime if the replacement function should be used.]) | 37 | [Define to rpl_mktime if the replacement function should be used.]) |
38 | gl_PREREQ_MKTIME]) | 38 | gl_PREREQ_MKTIME]) |
39 | fi | 39 | fi |
40 | ]) | 40 | ]) |
diff --git a/gl/m4/uintmax_t.m4 b/gl/m4/uintmax_t.m4 index 734b6933..03b51bcf 100644 --- a/gl/m4/uintmax_t.m4 +++ b/gl/m4/uintmax_t.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # uintmax_t.m4 serial 12 | 1 | # uintmax_t.m4 serial 12 |
2 | dnl Copyright (C) 1997-2004, 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 1997-2004, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/unistd-safer.m4 b/gl/m4/unistd-safer.m4 index 09adf931..74c3ce60 100644 --- a/gl/m4/unistd-safer.m4 +++ b/gl/m4/unistd-safer.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | #serial 8 | 1 | #serial 8 |
2 | dnl Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/unistd_h.m4 b/gl/m4/unistd_h.m4 index ff9a4ea0..8c2eec64 100644 --- a/gl/m4/unistd_h.m4 +++ b/gl/m4/unistd_h.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # unistd_h.m4 serial 17 | 1 | # unistd_h.m4 serial 45 |
2 | dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -11,6 +11,7 @@ AC_DEFUN([gl_UNISTD_H], | |||
11 | dnl Use AC_REQUIRE here, so that the default behavior below is expanded | 11 | dnl Use AC_REQUIRE here, so that the default behavior below is expanded |
12 | dnl once only, before all statements that occur in other macros. | 12 | dnl once only, before all statements that occur in other macros. |
13 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | 13 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) |
14 | AC_REQUIRE([AC_C_INLINE]) | ||
14 | 15 | ||
15 | gl_CHECK_NEXT_HEADERS([unistd.h]) | 16 | gl_CHECK_NEXT_HEADERS([unistd.h]) |
16 | 17 | ||
@@ -21,13 +22,33 @@ AC_DEFUN([gl_UNISTD_H], | |||
21 | HAVE_UNISTD_H=0 | 22 | HAVE_UNISTD_H=0 |
22 | fi | 23 | fi |
23 | AC_SUBST([HAVE_UNISTD_H]) | 24 | AC_SUBST([HAVE_UNISTD_H]) |
25 | |||
26 | dnl Check for declarations of anything we want to poison if the | ||
27 | dnl corresponding gnulib module is not in use. | ||
28 | gl_WARN_ON_USE_PREPARE([[#include <unistd.h> | ||
29 | /* Some systems declare various items in the wrong headers. */ | ||
30 | #ifndef __GLIBC__ | ||
31 | # include <fcntl.h> | ||
32 | # include <stdio.h> | ||
33 | # include <stdlib.h> | ||
34 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
35 | # include <io.h> | ||
36 | # endif | ||
37 | #endif | ||
38 | ]], [chown dup2 dup3 environ euidaccess faccessat fchdir fchownat | ||
39 | fsync ftruncate getcwd getdomainname getdtablesize getgroups | ||
40 | gethostname getlogin getlogin_r getpagesize getusershell setusershell | ||
41 | endusershell lchown link linkat lseek pipe2 pread readlink readlinkat | ||
42 | rmdir sleep symlink symlinkat ttyname_r unlink unlinkat usleep]) | ||
24 | ]) | 43 | ]) |
25 | 44 | ||
26 | AC_DEFUN([gl_UNISTD_MODULE_INDICATOR], | 45 | AC_DEFUN([gl_UNISTD_MODULE_INDICATOR], |
27 | [ | 46 | [ |
28 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 47 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
29 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) | 48 | AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) |
30 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 49 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
50 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
51 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
31 | ]) | 52 | ]) |
32 | 53 | ||
33 | AC_DEFUN([gl_UNISTD_H_DEFAULTS], | 54 | AC_DEFUN([gl_UNISTD_H_DEFAULTS], |
@@ -35,49 +56,99 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS], | |||
35 | GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) | 56 | GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN]) |
36 | GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE]) | 57 | GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE]) |
37 | GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) | 58 | GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2]) |
59 | GNULIB_DUP3=0; AC_SUBST([GNULIB_DUP3]) | ||
38 | GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON]) | 60 | GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON]) |
39 | GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS]) | 61 | GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS]) |
62 | GNULIB_FACCESSAT=0; AC_SUBST([GNULIB_FACCESSAT]) | ||
40 | GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) | 63 | GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR]) |
64 | GNULIB_FCHOWNAT=0; AC_SUBST([GNULIB_FCHOWNAT]) | ||
41 | GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC]) | 65 | GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC]) |
42 | GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) | 66 | GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE]) |
43 | GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) | 67 | GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD]) |
44 | GNULIB_GETDOMAINNAME=0; AC_SUBST([GNULIB_GETDOMAINNAME]) | 68 | GNULIB_GETDOMAINNAME=0; AC_SUBST([GNULIB_GETDOMAINNAME]) |
45 | GNULIB_GETDTABLESIZE=0; AC_SUBST([GNULIB_GETDTABLESIZE]) | 69 | GNULIB_GETDTABLESIZE=0; AC_SUBST([GNULIB_GETDTABLESIZE]) |
70 | GNULIB_GETGROUPS=0; AC_SUBST([GNULIB_GETGROUPS]) | ||
46 | GNULIB_GETHOSTNAME=0; AC_SUBST([GNULIB_GETHOSTNAME]) | 71 | GNULIB_GETHOSTNAME=0; AC_SUBST([GNULIB_GETHOSTNAME]) |
72 | GNULIB_GETLOGIN=0; AC_SUBST([GNULIB_GETLOGIN]) | ||
47 | GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) | 73 | GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R]) |
48 | GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE]) | 74 | GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE]) |
49 | GNULIB_GETUSERSHELL=0; AC_SUBST([GNULIB_GETUSERSHELL]) | 75 | GNULIB_GETUSERSHELL=0; AC_SUBST([GNULIB_GETUSERSHELL]) |
50 | GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) | 76 | GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) |
51 | GNULIB_LINK=0; AC_SUBST([GNULIB_LINK]) | 77 | GNULIB_LINK=0; AC_SUBST([GNULIB_LINK]) |
78 | GNULIB_LINKAT=0; AC_SUBST([GNULIB_LINKAT]) | ||
52 | GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK]) | 79 | GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK]) |
80 | GNULIB_PIPE2=0; AC_SUBST([GNULIB_PIPE2]) | ||
81 | GNULIB_PREAD=0; AC_SUBST([GNULIB_PREAD]) | ||
53 | GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) | 82 | GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK]) |
83 | GNULIB_READLINKAT=0; AC_SUBST([GNULIB_READLINKAT]) | ||
84 | GNULIB_RMDIR=0; AC_SUBST([GNULIB_RMDIR]) | ||
54 | GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) | 85 | GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP]) |
86 | GNULIB_SYMLINK=0; AC_SUBST([GNULIB_SYMLINK]) | ||
87 | GNULIB_SYMLINKAT=0; AC_SUBST([GNULIB_SYMLINKAT]) | ||
88 | GNULIB_TTYNAME_R=0; AC_SUBST([GNULIB_TTYNAME_R]) | ||
89 | GNULIB_UNISTD_H_GETOPT=0; AC_SUBST([GNULIB_UNISTD_H_GETOPT]) | ||
55 | GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE]) | 90 | GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE]) |
91 | GNULIB_UNLINK=0; AC_SUBST([GNULIB_UNLINK]) | ||
92 | GNULIB_UNLINKAT=0; AC_SUBST([GNULIB_UNLINKAT]) | ||
93 | GNULIB_USLEEP=0; AC_SUBST([GNULIB_USLEEP]) | ||
56 | GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE]) | 94 | GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE]) |
57 | dnl Assume proper GNU behavior unless another module says otherwise. | 95 | dnl Assume proper GNU behavior unless another module says otherwise. |
96 | HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN]) | ||
58 | HAVE_DUP2=1; AC_SUBST([HAVE_DUP2]) | 97 | HAVE_DUP2=1; AC_SUBST([HAVE_DUP2]) |
98 | HAVE_DUP3=1; AC_SUBST([HAVE_DUP3]) | ||
59 | HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS]) | 99 | HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS]) |
100 | HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT]) | ||
101 | HAVE_FCHDIR=1; AC_SUBST([HAVE_FCHDIR]) | ||
102 | HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT]) | ||
60 | HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC]) | 103 | HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC]) |
61 | HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) | 104 | HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) |
62 | HAVE_GETDOMAINNAME=1; AC_SUBST([HAVE_GETDOMAINNAME]) | 105 | HAVE_GETDOMAINNAME=1; AC_SUBST([HAVE_GETDOMAINNAME]) |
63 | HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE]) | 106 | HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE]) |
107 | HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS]) | ||
64 | HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME]) | 108 | HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME]) |
109 | HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN]) | ||
65 | HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) | 110 | HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) |
66 | HAVE_GETUSERSHELL=1; AC_SUBST([HAVE_GETUSERSHELL]) | 111 | HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN]) |
67 | HAVE_LINK=1; AC_SUBST([HAVE_LINK]) | 112 | HAVE_LINK=1; AC_SUBST([HAVE_LINK]) |
113 | HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT]) | ||
114 | HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2]) | ||
115 | HAVE_PREAD=1; AC_SUBST([HAVE_PREAD]) | ||
68 | HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) | 116 | HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) |
117 | HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT]) | ||
69 | HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) | 118 | HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) |
119 | HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK]) | ||
120 | HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT]) | ||
121 | HAVE_TTYNAME_R=1; AC_SUBST([HAVE_TTYNAME_R]) | ||
122 | HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT]) | ||
123 | HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP]) | ||
70 | HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) | 124 | HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) |
71 | HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) | 125 | HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) |
126 | HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE]) | ||
127 | HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL]) | ||
72 | HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) | 128 | HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) |
73 | HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) | 129 | HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) |
74 | REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) | 130 | REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) |
75 | REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE]) | 131 | REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE]) |
76 | REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR]) | 132 | REPLACE_DUP=0; AC_SUBST([REPLACE_DUP]) |
133 | REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2]) | ||
134 | REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT]) | ||
77 | REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) | 135 | REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) |
136 | REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS]) | ||
78 | REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) | 137 | REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) |
79 | REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) | 138 | REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) |
139 | REPLACE_LINK=0; AC_SUBST([REPLACE_LINK]) | ||
140 | REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT]) | ||
80 | REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) | 141 | REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) |
142 | REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD]) | ||
143 | REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK]) | ||
144 | REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR]) | ||
145 | REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP]) | ||
146 | REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK]) | ||
147 | REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK]) | ||
148 | REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT]) | ||
149 | REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP]) | ||
81 | REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE]) | 150 | REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE]) |
82 | UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H]) | 151 | UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H]) |
152 | UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; | ||
153 | AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS]) | ||
83 | ]) | 154 | ]) |
diff --git a/gl/m4/vasnprintf.m4 b/gl/m4/vasnprintf.m4 index 3a1d1e01..50a20cca 100644 --- a/gl/m4/vasnprintf.m4 +++ b/gl/m4/vasnprintf.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # vasnprintf.m4 serial 29 | 1 | # vasnprintf.m4 serial 29 |
2 | dnl Copyright (C) 2002-2004, 2006-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2004, 2006-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/vasprintf.m4 b/gl/m4/vasprintf.m4 index 074b03cf..b142bc0f 100644 --- a/gl/m4/vasprintf.m4 +++ b/gl/m4/vasprintf.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # vasprintf.m4 serial 6 | 1 | # vasprintf.m4 serial 6 |
2 | dnl Copyright (C) 2002-2003, 2006-2007 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2006-2007, 2009-2010 Free Software Foundation, |
3 | dnl Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/visibility.m4 b/gl/m4/visibility.m4 index 70bca564..6d3f9c9d 100644 --- a/gl/m4/visibility.m4 +++ b/gl/m4/visibility.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # visibility.m4 serial 2 (gettext-0.18) | 1 | # visibility.m4 serial 2 (gettext-0.18) |
2 | dnl Copyright (C) 2005, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2005, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/vsnprintf.m4 b/gl/m4/vsnprintf.m4 index 3b37d460..ed189c23 100644 --- a/gl/m4/vsnprintf.m4 +++ b/gl/m4/vsnprintf.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # vsnprintf.m4 serial 5 | 1 | # vsnprintf.m4 serial 5 |
2 | dnl Copyright (C) 2002-2004, 2007-2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2004, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/warn-on-use.m4 b/gl/m4/warn-on-use.m4 new file mode 100644 index 00000000..42daae87 --- /dev/null +++ b/gl/m4/warn-on-use.m4 | |||
@@ -0,0 +1,45 @@ | |||
1 | # warn-on-use.m4 serial 2 | ||
2 | dnl Copyright (C) 2010 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | # gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES) | ||
8 | # --------------------------------------- | ||
9 | # For each whitespace-separated element in the list of NAMES, define | ||
10 | # HAVE_RAW_DECL_name if the function has a declaration among INCLUDES | ||
11 | # even after being undefined as a macro. | ||
12 | # | ||
13 | # See warn-on-use.h for some hints on how to poison function names, as | ||
14 | # well as ideas on poisoning global variables and macros. NAMES may | ||
15 | # include global variables, but remember that only functions work with | ||
16 | # _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single | ||
17 | # header, but if the replacement header pulls in other headers because | ||
18 | # some systems declare functions in the wrong header, then INCLUDES | ||
19 | # should do likewise. | ||
20 | # | ||
21 | # If you assume C89, then it is generally safe to assume declarations | ||
22 | # for functions declared in that standard (such as gets) without | ||
23 | # needing gl_WARN_ON_USE_PREPARE. | ||
24 | AC_DEFUN([gl_WARN_ON_USE_PREPARE], | ||
25 | [ | ||
26 | m4_foreach_w([gl_decl], [$2], | ||
27 | [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])), | ||
28 | [Define to 1 if ]m4_defn([gl_decl])[ is declared even after | ||
29 | undefining macros.])])dnl | ||
30 | for gl_func in m4_flatten([$2]); do | ||
31 | AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl | ||
32 | AC_CACHE_CHECK([whether $gl_func is declared without a macro], | ||
33 | gl_Symbol, | ||
34 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1], | ||
35 | [@%:@undef $gl_func | ||
36 | (void) $gl_func;])], | ||
37 | [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])]) | ||
38 | AS_VAR_IF(gl_Symbol, [yes], | ||
39 | [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1]) | ||
40 | dnl shortcut - if the raw declaration exists, then set a cache | ||
41 | dnl variable to allow skipping any later AC_CHECK_DECL efforts | ||
42 | eval ac_cv_have_decl_$gl_func=yes]) | ||
43 | AS_VAR_POPDEF([gl_Symbol])dnl | ||
44 | done | ||
45 | ]) | ||
diff --git a/gl/m4/wchar.m4 b/gl/m4/wchar_h.m4 index 2e52a82a..8cae82dd 100644 --- a/gl/m4/wchar.m4 +++ b/gl/m4/wchar_h.m4 | |||
@@ -1,23 +1,30 @@ | |||
1 | dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues. | 1 | dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues. |
2 | 2 | ||
3 | dnl Copyright (C) 2007-2009 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
4 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
5 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
6 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
7 | 7 | ||
8 | dnl Written by Eric Blake. | 8 | dnl Written by Eric Blake. |
9 | 9 | ||
10 | # wchar.m4 serial 23 | 10 | # wchar_h.m4 serial 33 |
11 | 11 | ||
12 | AC_DEFUN([gl_WCHAR_H], | 12 | AC_DEFUN([gl_WCHAR_H], |
13 | [ | 13 | [ |
14 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) | 14 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) |
15 | AC_CACHE_CHECK([whether <wchar.h> is standalone], | 15 | AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) |
16 | [gl_cv_header_wchar_h_standalone], | 16 | dnl Prepare for creating substitute <wchar.h>. |
17 | [AC_COMPILE_IFELSE([[#include <wchar.h> | 17 | dnl Check for <wchar.h> (missing in Linux uClibc when built without wide |
18 | wchar_t w;]], | 18 | dnl character support). |
19 | [gl_cv_header_wchar_h_standalone=yes], | 19 | dnl <wchar.h> is always overridden, because of GNULIB_POSIXCHECK. |
20 | [gl_cv_header_wchar_h_standalone=no])]) | 20 | AC_CHECK_HEADERS_ONCE([wchar.h]) |
21 | gl_CHECK_NEXT_HEADERS([wchar.h]) | ||
22 | if test $ac_cv_header_wchar_h = yes; then | ||
23 | HAVE_WCHAR_H=1 | ||
24 | else | ||
25 | HAVE_WCHAR_H=0 | ||
26 | fi | ||
27 | AC_SUBST([HAVE_WCHAR_H]) | ||
21 | 28 | ||
22 | AC_REQUIRE([gt_TYPE_WINT_T]) | 29 | AC_REQUIRE([gt_TYPE_WINT_T]) |
23 | if test $gt_cv_c_wint_t = yes; then | 30 | if test $gt_cv_c_wint_t = yes; then |
@@ -27,36 +34,82 @@ wchar_t w;]], | |||
27 | fi | 34 | fi |
28 | AC_SUBST([HAVE_WINT_T]) | 35 | AC_SUBST([HAVE_WINT_T]) |
29 | 36 | ||
30 | if test $gl_cv_header_wchar_h_standalone != yes || test $gt_cv_c_wint_t != yes; then | 37 | dnl Check for declarations of anything we want to poison if the |
31 | WCHAR_H=wchar.h | 38 | dnl corresponding gnulib module is not in use. |
32 | fi | 39 | gl_WARN_ON_USE_PREPARE([[ |
40 | /* Some systems require additional headers. */ | ||
41 | #ifndef __GLIBC__ | ||
42 | # include <stddef.h> | ||
43 | # include <stdio.h> | ||
44 | # include <time.h> | ||
45 | #endif | ||
46 | #include <wchar.h> | ||
47 | ]], [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb | ||
48 | wcsrtombs wcsnrtombs wcwidth]) | ||
49 | ]) | ||
33 | 50 | ||
34 | dnl Prepare for creating substitute <wchar.h>. | 51 | dnl Check whether <wchar.h> is usable at all. |
35 | dnl Do it always: WCHAR_H may be empty here but can be set later. | 52 | AC_DEFUN([gl_WCHAR_H_INLINE_OK], |
36 | dnl Check for <wchar.h> (missing in Linux uClibc when built without wide | 53 | [ |
37 | dnl character support). | 54 | dnl Test whether <wchar.h> suffers due to the transition from '__inline' to |
38 | AC_CHECK_HEADERS_ONCE([wchar.h]) | 55 | dnl 'gnu_inline'. See <http://sourceware.org/bugzilla/show_bug.cgi?id=4022> |
39 | if test $ac_cv_header_wchar_h = yes; then | 56 | dnl and <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary, |
40 | HAVE_WCHAR_H=1 | 57 | dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and |
41 | else | 58 | dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>. |
42 | HAVE_WCHAR_H=0 | 59 | AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly], |
60 | [gl_cv_header_wchar_h_correct_inline], | ||
61 | [gl_cv_header_wchar_h_correct_inline=yes | ||
62 | AC_LANG_CONFTEST([ | ||
63 | AC_LANG_SOURCE([[#define wcstod renamed_wcstod | ||
64 | #include <wchar.h> | ||
65 | extern int zero (void); | ||
66 | int main () { return zero(); } | ||
67 | ]])]) | ||
68 | if AC_TRY_EVAL([ac_compile]); then | ||
69 | mv conftest.$ac_objext conftest1.$ac_objext | ||
70 | AC_LANG_CONFTEST([ | ||
71 | AC_LANG_SOURCE([[#define wcstod renamed_wcstod | ||
72 | #include <wchar.h> | ||
73 | int zero (void) { return 0; } | ||
74 | ]])]) | ||
75 | if AC_TRY_EVAL([ac_compile]); then | ||
76 | mv conftest.$ac_objext conftest2.$ac_objext | ||
77 | if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then | ||
78 | : | ||
79 | else | ||
80 | gl_cv_header_wchar_h_correct_inline=no | ||
81 | fi | ||
82 | fi | ||
83 | fi | ||
84 | rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext | ||
85 | ]) | ||
86 | if test $gl_cv_header_wchar_h_correct_inline = no; then | ||
87 | AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). | ||
88 | This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in | ||
89 | C99 mode. You have four options: | ||
90 | - Add the flag -fgnu89-inline to CC and reconfigure, or | ||
91 | - Fix your include files, using parts of | ||
92 | <http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or | ||
93 | - Use a gcc version older than 4.3, or | ||
94 | - Don't use the flags -std=c99 or -std=gnu99. | ||
95 | Configuration aborted.]) | ||
43 | fi | 96 | fi |
44 | AC_SUBST([HAVE_WCHAR_H]) | ||
45 | gl_CHECK_NEXT_HEADERS([wchar.h]) | ||
46 | ]) | 97 | ]) |
47 | 98 | ||
48 | dnl Unconditionally enables the replacement of <wchar.h>. | 99 | dnl Unconditionally enables the replacement of <wchar.h>. |
49 | AC_DEFUN([gl_REPLACE_WCHAR_H], | 100 | AC_DEFUN([gl_REPLACE_WCHAR_H], |
50 | [ | 101 | [ |
51 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) | 102 | dnl This is a no-op, because <wchar.h> is always overridden. |
52 | WCHAR_H=wchar.h | 103 | : |
53 | ]) | 104 | ]) |
54 | 105 | ||
55 | AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], | 106 | AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], |
56 | [ | 107 | [ |
57 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | 108 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. |
58 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) | 109 | AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) |
59 | GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 | 110 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) |
111 | dnl Define it also as a C macro, for the benefit of the unit tests. | ||
112 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | ||
60 | ]) | 113 | ]) |
61 | 114 | ||
62 | AC_DEFUN([gl_WCHAR_H_DEFAULTS], | 115 | AC_DEFUN([gl_WCHAR_H_DEFAULTS], |
@@ -96,5 +149,4 @@ AC_DEFUN([gl_WCHAR_H_DEFAULTS], | |||
96 | REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) | 149 | REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) |
97 | REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) | 150 | REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) |
98 | REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) | 151 | REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) |
99 | WCHAR_H=''; AC_SUBST([WCHAR_H]) | ||
100 | ]) | 152 | ]) |
diff --git a/gl/m4/wchar_t.m4 b/gl/m4/wchar_t.m4 index fb27a7f6..ed804e66 100644 --- a/gl/m4/wchar_t.m4 +++ b/gl/m4/wchar_t.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # wchar_t.m4 serial 3 (gettext-0.18) | 1 | # wchar_t.m4 serial 3 (gettext-0.18) |
2 | dnl Copyright (C) 2002-2003, 2008, 2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/wcrtomb.m4 b/gl/m4/wcrtomb.m4 index cb7d9263..6a2d772a 100644 --- a/gl/m4/wcrtomb.m4 +++ b/gl/m4/wcrtomb.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # wcrtomb.m4 serial 4 | 1 | # wcrtomb.m4 serial 5 |
2 | dnl Copyright (C) 2008-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
@@ -10,37 +10,37 @@ AC_DEFUN([gl_FUNC_WCRTOMB], | |||
10 | 10 | ||
11 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) | 11 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) |
12 | gl_MBSTATE_T_BROKEN | 12 | gl_MBSTATE_T_BROKEN |
13 | if test $REPLACE_MBSTATE_T = 1; then | 13 | |
14 | REPLACE_WCRTOMB=1 | ||
15 | fi | ||
16 | AC_CHECK_FUNCS_ONCE([wcrtomb]) | 14 | AC_CHECK_FUNCS_ONCE([wcrtomb]) |
17 | if test $ac_cv_func_wcrtomb = no; then | 15 | if test $ac_cv_func_wcrtomb = no; then |
18 | HAVE_WCRTOMB=0 | 16 | HAVE_WCRTOMB=0 |
19 | fi | 17 | else |
20 | if test $HAVE_WCRTOMB != 0 && test $REPLACE_WCRTOMB != 1; then | 18 | if test $REPLACE_MBSTATE_T = 1; then |
21 | dnl On AIX 4.3, OSF/1 5.1 and Solaris 10, wcrtomb (NULL, 0, NULL) sometimes | 19 | REPLACE_WCRTOMB=1 |
22 | dnl returns 0 instead of 1. | 20 | else |
23 | AC_REQUIRE([AC_PROG_CC]) | 21 | dnl On AIX 4.3, OSF/1 5.1 and Solaris 10, wcrtomb (NULL, 0, NULL) sometimes |
24 | AC_REQUIRE([gt_LOCALE_FR]) | 22 | dnl returns 0 instead of 1. |
25 | AC_REQUIRE([gt_LOCALE_FR_UTF8]) | 23 | AC_REQUIRE([AC_PROG_CC]) |
26 | AC_REQUIRE([gt_LOCALE_JA]) | 24 | AC_REQUIRE([gt_LOCALE_FR]) |
27 | AC_REQUIRE([gt_LOCALE_ZH_CN]) | 25 | AC_REQUIRE([gt_LOCALE_FR_UTF8]) |
28 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | 26 | AC_REQUIRE([gt_LOCALE_JA]) |
29 | AC_CACHE_CHECK([whether wcrtomb return value is correct], | 27 | AC_REQUIRE([gt_LOCALE_ZH_CN]) |
30 | [gl_cv_func_wcrtomb_retval], | 28 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles |
31 | [ | 29 | AC_CACHE_CHECK([whether wcrtomb return value is correct], |
32 | dnl Initial guess, used when cross-compiling or when no suitable locale | 30 | [gl_cv_func_wcrtomb_retval], |
33 | dnl is present. | 31 | [ |
32 | dnl Initial guess, used when cross-compiling or when no suitable locale | ||
33 | dnl is present. | ||
34 | changequote(,)dnl | 34 | changequote(,)dnl |
35 | case "$host_os" in | 35 | case "$host_os" in |
36 | # Guess no on AIX 4, OSF/1 and Solaris. | 36 | # Guess no on AIX 4, OSF/1 and Solaris. |
37 | aix4* | osf* | solaris*) gl_cv_func_wcrtomb_retval="guessing no" ;; | 37 | aix4* | osf* | solaris*) gl_cv_func_wcrtomb_retval="guessing no" ;; |
38 | # Guess yes otherwise. | 38 | # Guess yes otherwise. |
39 | *) gl_cv_func_wcrtomb_retval="guessing yes" ;; | 39 | *) gl_cv_func_wcrtomb_retval="guessing yes" ;; |
40 | esac | 40 | esac |
41 | changequote([,])dnl | 41 | changequote([,])dnl |
42 | if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then | 42 | if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then |
43 | AC_TRY_RUN([ | 43 | AC_TRY_RUN([ |
44 | #include <locale.h> | 44 | #include <locale.h> |
45 | #include <stdio.h> | 45 | #include <stdio.h> |
46 | #include <string.h> | 46 | #include <string.h> |
@@ -69,15 +69,16 @@ int main () | |||
69 | } | 69 | } |
70 | return 0; | 70 | return 0; |
71 | }], | 71 | }], |
72 | [gl_cv_func_wcrtomb_retval=yes], | 72 | [gl_cv_func_wcrtomb_retval=yes], |
73 | [gl_cv_func_wcrtomb_retval=no], | 73 | [gl_cv_func_wcrtomb_retval=no], |
74 | [:]) | 74 | [:]) |
75 | fi | 75 | fi |
76 | ]) | 76 | ]) |
77 | case "$gl_cv_func_wcrtomb_retval" in | 77 | case "$gl_cv_func_wcrtomb_retval" in |
78 | *yes) ;; | 78 | *yes) ;; |
79 | *) REPLACE_WCRTOMB=1 ;; | 79 | *) REPLACE_WCRTOMB=1 ;; |
80 | esac | 80 | esac |
81 | fi | ||
81 | fi | 82 | fi |
82 | if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then | 83 | if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then |
83 | gl_REPLACE_WCHAR_H | 84 | gl_REPLACE_WCHAR_H |
diff --git a/gl/m4/wctype.m4 b/gl/m4/wctype_h.m4 index 6a1b6f07..32924514 100644 --- a/gl/m4/wctype.m4 +++ b/gl/m4/wctype_h.m4 | |||
@@ -1,8 +1,8 @@ | |||
1 | # wctype.m4 serial 2 | 1 | # wctype_h.m4 serial 6 |
2 | 2 | ||
3 | dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it. | 3 | dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it. |
4 | 4 | ||
5 | dnl Copyright (C) 2006-2008 Free Software Foundation, Inc. | 5 | dnl Copyright (C) 2006-2010 Free Software Foundation, Inc. |
6 | dnl This file is free software; the Free Software Foundation | 6 | dnl This file is free software; the Free Software Foundation |
7 | dnl gives unlimited permission to copy and/or distribute it, | 7 | dnl gives unlimited permission to copy and/or distribute it, |
8 | dnl with or without modifications, as long as this notice is preserved. | 8 | dnl with or without modifications, as long as this notice is preserved. |
@@ -12,6 +12,7 @@ dnl Written by Paul Eggert. | |||
12 | AC_DEFUN([gl_WCTYPE_H], | 12 | AC_DEFUN([gl_WCTYPE_H], |
13 | [ | 13 | [ |
14 | AC_REQUIRE([AC_PROG_CC]) | 14 | AC_REQUIRE([AC_PROG_CC]) |
15 | AC_REQUIRE([AC_CANONICAL_HOST]) | ||
15 | AC_CHECK_FUNCS_ONCE([iswcntrl]) | 16 | AC_CHECK_FUNCS_ONCE([iswcntrl]) |
16 | if test $ac_cv_func_iswcntrl = yes; then | 17 | if test $ac_cv_func_iswcntrl = yes; then |
17 | HAVE_ISWCNTRL=1 | 18 | HAVE_ISWCNTRL=1 |
@@ -19,6 +20,13 @@ AC_DEFUN([gl_WCTYPE_H], | |||
19 | HAVE_ISWCNTRL=0 | 20 | HAVE_ISWCNTRL=0 |
20 | fi | 21 | fi |
21 | AC_SUBST([HAVE_ISWCNTRL]) | 22 | AC_SUBST([HAVE_ISWCNTRL]) |
23 | AC_CHECK_FUNCS_ONCE([iswblank]) | ||
24 | if test $ac_cv_func_iswblank = yes; then | ||
25 | HAVE_ISWBLANK=1 | ||
26 | else | ||
27 | HAVE_ISWBLANK=0 | ||
28 | fi | ||
29 | AC_SUBST([HAVE_ISWBLANK]) | ||
22 | AC_CHECK_HEADERS_ONCE([wctype.h]) | 30 | AC_CHECK_HEADERS_ONCE([wctype.h]) |
23 | AC_REQUIRE([AC_C_INLINE]) | 31 | AC_REQUIRE([AC_C_INLINE]) |
24 | 32 | ||
@@ -30,40 +38,34 @@ AC_DEFUN([gl_WCTYPE_H], | |||
30 | fi | 38 | fi |
31 | AC_SUBST([HAVE_WINT_T]) | 39 | AC_SUBST([HAVE_WINT_T]) |
32 | 40 | ||
33 | WCTYPE_H=wctype.h | ||
34 | if test $ac_cv_header_wctype_h = yes; then | 41 | if test $ac_cv_header_wctype_h = yes; then |
35 | if test $ac_cv_func_iswcntrl = yes; then | 42 | if test $ac_cv_func_iswcntrl = yes; then |
36 | dnl Linux libc5 has an iswprint function that returns 0 for all arguments. | 43 | dnl Linux libc5 has an iswprint function that returns 0 for all arguments. |
37 | dnl The other functions are likely broken in the same way. | 44 | dnl The other functions are likely broken in the same way. |
38 | AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works], | 45 | AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works], |
39 | [ | 46 | [ |
40 | AC_TRY_RUN([#include <stddef.h> | 47 | AC_RUN_IFELSE([AC_LANG_SOURCE([[ |
41 | #include <stdio.h> | 48 | #include <stddef.h> |
42 | #include <time.h> | 49 | #include <stdio.h> |
43 | #include <wchar.h> | 50 | #include <time.h> |
44 | #include <wctype.h> | 51 | #include <wchar.h> |
45 | int main () { return iswprint ('x') == 0; }], | 52 | #include <wctype.h> |
53 | int main () { return iswprint ('x') == 0; }]])], | ||
46 | [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no], | 54 | [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no], |
47 | [AC_TRY_COMPILE([#include <stdlib.h> | 55 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h> |
48 | #if __GNU_LIBRARY__ == 1 | 56 | #if __GNU_LIBRARY__ == 1 |
49 | Linux libc5 i18n is broken. | 57 | Linux libc5 i18n is broken. |
50 | #endif], [], | 58 | #endif]], [])], |
51 | [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no]) | 59 | [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no]) |
52 | ]) | 60 | ]) |
53 | ]) | 61 | ]) |
54 | if test $gl_cv_func_iswcntrl_works = yes; then | ||
55 | WCTYPE_H= | ||
56 | fi | ||
57 | fi | 62 | fi |
58 | dnl Compute NEXT_WCTYPE_H even if WCTYPE_H is empty, | ||
59 | dnl for the benefit of builds from non-distclean directories. | ||
60 | gl_CHECK_NEXT_HEADERS([wctype.h]) | 63 | gl_CHECK_NEXT_HEADERS([wctype.h]) |
61 | HAVE_WCTYPE_H=1 | 64 | HAVE_WCTYPE_H=1 |
62 | else | 65 | else |
63 | HAVE_WCTYPE_H=0 | 66 | HAVE_WCTYPE_H=0 |
64 | fi | 67 | fi |
65 | AC_SUBST([HAVE_WCTYPE_H]) | 68 | AC_SUBST([HAVE_WCTYPE_H]) |
66 | AC_SUBST([WCTYPE_H]) | ||
67 | 69 | ||
68 | if test "$gl_cv_func_iswcntrl_works" = no; then | 70 | if test "$gl_cv_func_iswcntrl_works" = no; then |
69 | REPLACE_ISWCNTRL=1 | 71 | REPLACE_ISWCNTRL=1 |
diff --git a/gl/m4/wint_t.m4 b/gl/m4/wint_t.m4 index 47a4363d..a6c7d15c 100644 --- a/gl/m4/wint_t.m4 +++ b/gl/m4/wint_t.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # wint_t.m4 serial 4 (gettext-0.18) | 1 | # wint_t.m4 serial 4 (gettext-0.18) |
2 | dnl Copyright (C) 2003, 2007-2009 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/write.m4 b/gl/m4/write.m4 index 812b19b3..56325aba 100644 --- a/gl/m4/write.m4 +++ b/gl/m4/write.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # write.m4 serial 1 | 1 | # write.m4 serial 1 |
2 | dnl Copyright (C) 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/xalloc.m4 b/gl/m4/xalloc.m4 index 837a948c..83247fe3 100644 --- a/gl/m4/xalloc.m4 +++ b/gl/m4/xalloc.m4 | |||
@@ -1,5 +1,6 @@ | |||
1 | # xalloc.m4 serial 16 | 1 | # xalloc.m4 serial 16 |
2 | dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 Free Software |
3 | dnl Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/xsize.m4 b/gl/m4/xsize.m4 index 631893cf..b653693a 100644 --- a/gl/m4/xsize.m4 +++ b/gl/m4/xsize.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # xsize.m4 serial 4 | 1 | # xsize.m4 serial 4 |
2 | dnl Copyright (C) 2003-2004, 2008 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003-2004, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/m4/xstrndup.m4 b/gl/m4/xstrndup.m4 index 8a30ab15..74302cc9 100644 --- a/gl/m4/xstrndup.m4 +++ b/gl/m4/xstrndup.m4 | |||
@@ -1,5 +1,5 @@ | |||
1 | # xstrndup.m4 serial 2 | 1 | # xstrndup.m4 serial 2 |
2 | dnl Copyright (C) 2003 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
diff --git a/gl/malloc.c b/gl/malloc.c index f2f66637..a3095c17 100644 --- a/gl/malloc.c +++ b/gl/malloc.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* malloc() function that is glibc compatible. | 1 | /* malloc() function that is glibc compatible. |
2 | 2 | ||
3 | Copyright (C) 1997, 1998, 2006, 2007 Free Software Foundation, Inc. | 3 | Copyright (C) 1997-1998, 2006-2007, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/math.in.h b/gl/math.in.h index a0efefda..fbc29184 100644 --- a/gl/math.in.h +++ b/gl/math.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A GNU-like <math.h>. | 1 | /* A GNU-like <math.h>. |
2 | 2 | ||
3 | Copyright (C) 2002-2003, 2007-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2002-2003, 2007-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -22,18 +22,48 @@ | |||
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | /* The include_next requires a split double-inclusion guard. */ | 24 | /* The include_next requires a split double-inclusion guard. */ |
25 | #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_MATH_H@ | 25 | #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ |
26 | 26 | ||
27 | #ifndef _GL_MATH_H | 27 | #ifndef _GL_MATH_H |
28 | #define _GL_MATH_H | 28 | #define _GL_MATH_H |
29 | 29 | ||
30 | 30 | ||
31 | /* The definition of GL_LINK_WARNING is copied here. */ | 31 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
32 | 32 | ||
33 | 33 | /* The definition of _GL_ARG_NONNULL is copied here. */ | |
34 | #ifdef __cplusplus | 34 | |
35 | extern "C" { | 35 | /* The definition of _GL_WARN_ON_USE is copied here. */ |
36 | #endif | 36 | |
37 | /* Helper macros to define a portability warning for the | ||
38 | classification macro FUNC called with VALUE. POSIX declares the | ||
39 | classification macros with an argument of real-floating (that is, | ||
40 | one of float, double, or long double). */ | ||
41 | #define _GL_WARN_REAL_FLOATING_DECL(func) \ | ||
42 | static inline int \ | ||
43 | rpl_ ## func ## f (float f) \ | ||
44 | { \ | ||
45 | return func (f); \ | ||
46 | } \ | ||
47 | static inline int \ | ||
48 | rpl_ ## func ## d (double d) \ | ||
49 | { \ | ||
50 | return func (d); \ | ||
51 | } \ | ||
52 | static inline int \ | ||
53 | rpl_ ## func ## l (long double l) \ | ||
54 | { \ | ||
55 | return func (l); \ | ||
56 | } \ | ||
57 | _GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - " \ | ||
58 | "use gnulib module " #func " for portability"); \ | ||
59 | _GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - " \ | ||
60 | "use gnulib module " #func " for portability"); \ | ||
61 | _GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - " \ | ||
62 | "use gnulib module " #func " for portability") | ||
63 | #define _GL_WARN_REAL_FLOATING_IMPL(func, value) \ | ||
64 | (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \ | ||
65 | : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \ | ||
66 | : rpl_ ## func ## l (value)) | ||
37 | 67 | ||
38 | 68 | ||
39 | /* POSIX allows platforms that don't support NAN. But all major | 69 | /* POSIX allows platforms that don't support NAN. But all major |
@@ -64,6 +94,7 @@ _NaN () | |||
64 | # define HUGE_VAL (1.0 / 0.0) | 94 | # define HUGE_VAL (1.0 / 0.0) |
65 | #endif | 95 | #endif |
66 | 96 | ||
97 | |||
67 | /* Write x as | 98 | /* Write x as |
68 | x = mantissa * 2^exp | 99 | x = mantissa * 2^exp |
69 | where | 100 | where |
@@ -73,129 +104,198 @@ _NaN () | |||
73 | Store exp in *EXPPTR and return mantissa. */ | 104 | Store exp in *EXPPTR and return mantissa. */ |
74 | #if @GNULIB_FREXP@ | 105 | #if @GNULIB_FREXP@ |
75 | # if @REPLACE_FREXP@ | 106 | # if @REPLACE_FREXP@ |
76 | # define frexp rpl_frexp | 107 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
77 | extern double frexp (double x, int *expptr); | 108 | # define frexp rpl_frexp |
109 | # endif | ||
110 | _GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2))); | ||
111 | _GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr)); | ||
112 | # else | ||
113 | _GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr)); | ||
78 | # endif | 114 | # endif |
115 | _GL_CXXALIASWARN (frexp); | ||
79 | #elif defined GNULIB_POSIXCHECK | 116 | #elif defined GNULIB_POSIXCHECK |
80 | # undef frexp | 117 | # undef frexp |
81 | # define frexp(x,e) \ | 118 | /* Assume frexp is always declared. */ |
82 | (GL_LINK_WARNING ("frexp is unportable - " \ | 119 | _GL_WARN_ON_USE (frexp, "frexp is unportable - " |
83 | "use gnulib module frexp for portability"), \ | 120 | "use gnulib module frexp for portability"); |
84 | frexp (x, e)) | ||
85 | #endif | 121 | #endif |
86 | 122 | ||
87 | 123 | ||
88 | #if @GNULIB_MATHL@ || !@HAVE_DECL_ACOSL@ | 124 | #if @GNULIB_LOGB@ |
89 | extern long double acosl (long double x); | 125 | # if !@HAVE_DECL_LOGB@ |
126 | _GL_EXTERN_C double logb (double x); | ||
127 | # endif | ||
128 | #elif defined GNULIB_POSIXCHECK | ||
129 | # undef logb | ||
130 | # if HAVE_RAW_DECL_LOGB | ||
131 | _GL_WARN_ON_USE (logb, "logb is unportable - " | ||
132 | "use gnulib module logb for portability"); | ||
133 | # endif | ||
90 | #endif | 134 | #endif |
91 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 135 | |
136 | |||
137 | #if @GNULIB_ACOSL@ | ||
138 | # if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@ | ||
139 | _GL_FUNCDECL_SYS (acosl, long double, (long double x)); | ||
140 | # endif | ||
141 | _GL_CXXALIAS_SYS (acosl, long double, (long double x)); | ||
142 | _GL_CXXALIASWARN (acosl); | ||
143 | #elif defined GNULIB_POSIXCHECK | ||
92 | # undef acosl | 144 | # undef acosl |
93 | # define acosl(x) \ | 145 | # if HAVE_RAW_DECL_ACOSL |
94 | (GL_LINK_WARNING ("acosl is unportable - " \ | 146 | _GL_WARN_ON_USE (acosl, "acosl is unportable - " |
95 | "use gnulib module mathl for portability"), \ | 147 | "use gnulib module mathl for portability"); |
96 | acosl (x)) | 148 | # endif |
97 | #endif | 149 | #endif |
98 | 150 | ||
99 | 151 | ||
100 | #if @GNULIB_MATHL@ || !@HAVE_DECL_ASINL@ | 152 | #if @GNULIB_ASINL@ |
101 | extern long double asinl (long double x); | 153 | # if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@ |
102 | #endif | 154 | _GL_FUNCDECL_SYS (asinl, long double, (long double x)); |
103 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 155 | # endif |
156 | _GL_CXXALIAS_SYS (asinl, long double, (long double x)); | ||
157 | _GL_CXXALIASWARN (asinl); | ||
158 | #elif defined GNULIB_POSIXCHECK | ||
104 | # undef asinl | 159 | # undef asinl |
105 | # define asinl(x) \ | 160 | # if HAVE_RAW_DECL_ASINL |
106 | (GL_LINK_WARNING ("asinl is unportable - " \ | 161 | _GL_WARN_ON_USE (asinl, "asinl is unportable - " |
107 | "use gnulib module mathl for portability"), \ | 162 | "use gnulib module mathl for portability"); |
108 | asinl (x)) | 163 | # endif |
109 | #endif | 164 | #endif |
110 | 165 | ||
111 | 166 | ||
112 | #if @GNULIB_MATHL@ || !@HAVE_DECL_ATANL@ | 167 | #if @GNULIB_ATANL@ |
113 | extern long double atanl (long double x); | 168 | # if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@ |
114 | #endif | 169 | _GL_FUNCDECL_SYS (atanl, long double, (long double x)); |
115 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 170 | # endif |
171 | _GL_CXXALIAS_SYS (atanl, long double, (long double x)); | ||
172 | _GL_CXXALIASWARN (atanl); | ||
173 | #elif defined GNULIB_POSIXCHECK | ||
116 | # undef atanl | 174 | # undef atanl |
117 | # define atanl(x) \ | 175 | # if HAVE_RAW_DECL_ATANL |
118 | (GL_LINK_WARNING ("atanl is unportable - " \ | 176 | _GL_WARN_ON_USE (atanl, "atanl is unportable - " |
119 | "use gnulib module mathl for portability"), \ | 177 | "use gnulib module mathl for portability"); |
120 | atanl (x)) | 178 | # endif |
121 | #endif | 179 | #endif |
122 | 180 | ||
123 | 181 | ||
124 | #if @GNULIB_CEILF@ | 182 | #if @GNULIB_CEILF@ |
125 | # if @REPLACE_CEILF@ | 183 | # if @REPLACE_CEILF@ |
126 | # define ceilf rpl_ceilf | 184 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
127 | extern float ceilf (float x); | 185 | # define ceilf rpl_ceilf |
186 | # endif | ||
187 | _GL_FUNCDECL_RPL (ceilf, float, (float x)); | ||
188 | _GL_CXXALIAS_RPL (ceilf, float, (float x)); | ||
189 | # else | ||
190 | # if !@HAVE_DECL_CEILF@ | ||
191 | _GL_FUNCDECL_SYS (ceilf, float, (float x)); | ||
192 | # endif | ||
193 | _GL_CXXALIAS_SYS (ceilf, float, (float x)); | ||
128 | # endif | 194 | # endif |
195 | _GL_CXXALIASWARN (ceilf); | ||
129 | #elif defined GNULIB_POSIXCHECK | 196 | #elif defined GNULIB_POSIXCHECK |
130 | # undef ceilf | 197 | # undef ceilf |
131 | # define ceilf(x) \ | 198 | # if HAVE_RAW_DECL_CEILF |
132 | (GL_LINK_WARNING ("ceilf is unportable - " \ | 199 | _GL_WARN_ON_USE (ceilf, "ceilf is unportable - " |
133 | "use gnulib module ceilf for portability"), \ | 200 | "use gnulib module ceilf for portability"); |
134 | ceilf (x)) | 201 | # endif |
135 | #endif | 202 | #endif |
136 | 203 | ||
137 | #if @GNULIB_CEILL@ | 204 | #if @GNULIB_CEILL@ |
138 | # if @REPLACE_CEILL@ | 205 | # if @REPLACE_CEILL@ |
139 | # define ceill rpl_ceill | 206 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
140 | extern long double ceill (long double x); | 207 | # define ceill rpl_ceill |
208 | # endif | ||
209 | _GL_FUNCDECL_RPL (ceill, long double, (long double x)); | ||
210 | _GL_CXXALIAS_RPL (ceill, long double, (long double x)); | ||
211 | # else | ||
212 | # if !@HAVE_DECL_CEILL@ | ||
213 | _GL_FUNCDECL_SYS (ceill, long double, (long double x)); | ||
214 | # endif | ||
215 | _GL_CXXALIAS_SYS (ceill, long double, (long double x)); | ||
141 | # endif | 216 | # endif |
217 | _GL_CXXALIASWARN (ceill); | ||
142 | #elif defined GNULIB_POSIXCHECK | 218 | #elif defined GNULIB_POSIXCHECK |
143 | # undef ceill | 219 | # undef ceill |
144 | # define ceill(x) \ | 220 | # if HAVE_RAW_DECL_CEILL |
145 | (GL_LINK_WARNING ("ceill is unportable - " \ | 221 | _GL_WARN_ON_USE (ceill, "ceill is unportable - " |
146 | "use gnulib module ceill for portability"), \ | 222 | "use gnulib module ceill for portability"); |
147 | ceill (x)) | 223 | # endif |
148 | #endif | 224 | #endif |
149 | 225 | ||
150 | 226 | ||
151 | #if @GNULIB_MATHL@ || !@HAVE_DECL_COSL@ | 227 | #if @GNULIB_COSL@ |
152 | extern long double cosl (long double x); | 228 | # if !@HAVE_COSL@ || !@HAVE_DECL_COSL@ |
153 | #endif | 229 | _GL_FUNCDECL_SYS (cosl, long double, (long double x)); |
154 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 230 | # endif |
231 | _GL_CXXALIAS_SYS (cosl, long double, (long double x)); | ||
232 | _GL_CXXALIASWARN (cosl); | ||
233 | #elif defined GNULIB_POSIXCHECK | ||
155 | # undef cosl | 234 | # undef cosl |
156 | # define cosl(x) \ | 235 | # if HAVE_RAW_DECL_COSL |
157 | (GL_LINK_WARNING ("cosl is unportable - " \ | 236 | _GL_WARN_ON_USE (cosl, "cosl is unportable - " |
158 | "use gnulib module mathl for portability"), \ | 237 | "use gnulib module mathl for portability"); |
159 | cosl (x)) | 238 | # endif |
160 | #endif | 239 | #endif |
161 | 240 | ||
162 | 241 | ||
163 | #if @GNULIB_MATHL@ || !@HAVE_DECL_EXPL@ | 242 | #if @GNULIB_EXPL@ |
164 | extern long double expl (long double x); | 243 | # if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@ |
165 | #endif | 244 | _GL_FUNCDECL_SYS (expl, long double, (long double x)); |
166 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 245 | # endif |
246 | _GL_CXXALIAS_SYS (expl, long double, (long double x)); | ||
247 | _GL_CXXALIASWARN (expl); | ||
248 | #elif defined GNULIB_POSIXCHECK | ||
167 | # undef expl | 249 | # undef expl |
168 | # define expl(x) \ | 250 | # if HAVE_RAW_DECL_EXPL |
169 | (GL_LINK_WARNING ("expl is unportable - " \ | 251 | _GL_WARN_ON_USE (expl, "expl is unportable - " |
170 | "use gnulib module mathl for portability"), \ | 252 | "use gnulib module mathl for portability"); |
171 | expl (x)) | 253 | # endif |
172 | #endif | 254 | #endif |
173 | 255 | ||
174 | 256 | ||
175 | #if @GNULIB_FLOORF@ | 257 | #if @GNULIB_FLOORF@ |
176 | # if @REPLACE_FLOORF@ | 258 | # if @REPLACE_FLOORF@ |
177 | # define floorf rpl_floorf | 259 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
178 | extern float floorf (float x); | 260 | # define floorf rpl_floorf |
261 | # endif | ||
262 | _GL_FUNCDECL_RPL (floorf, float, (float x)); | ||
263 | _GL_CXXALIAS_RPL (floorf, float, (float x)); | ||
264 | #else | ||
265 | # if !@HAVE_DECL_FLOORF@ | ||
266 | _GL_FUNCDECL_SYS (floorf, float, (float x)); | ||
267 | # endif | ||
268 | _GL_CXXALIAS_SYS (floorf, float, (float x)); | ||
179 | # endif | 269 | # endif |
270 | _GL_CXXALIASWARN (floorf); | ||
180 | #elif defined GNULIB_POSIXCHECK | 271 | #elif defined GNULIB_POSIXCHECK |
181 | # undef floorf | 272 | # undef floorf |
182 | # define floorf(x) \ | 273 | # if HAVE_RAW_DECL_FLOORF |
183 | (GL_LINK_WARNING ("floorf is unportable - " \ | 274 | _GL_WARN_ON_USE (floorf, "floorf is unportable - " |
184 | "use gnulib module floorf for portability"), \ | 275 | "use gnulib module floorf for portability"); |
185 | floorf (x)) | 276 | # endif |
186 | #endif | 277 | #endif |
187 | 278 | ||
188 | #if @GNULIB_FLOORL@ | 279 | #if @GNULIB_FLOORL@ |
189 | # if @REPLACE_FLOORL@ | 280 | # if @REPLACE_FLOORL@ |
190 | # define floorl rpl_floorl | 281 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
191 | extern long double floorl (long double x); | 282 | # define floorl rpl_floorl |
283 | # endif | ||
284 | _GL_FUNCDECL_RPL (floorl, long double, (long double x)); | ||
285 | _GL_CXXALIAS_RPL (floorl, long double, (long double x)); | ||
286 | # else | ||
287 | # if !@HAVE_DECL_FLOORL@ | ||
288 | _GL_FUNCDECL_SYS (floorl, long double, (long double x)); | ||
289 | # endif | ||
290 | _GL_CXXALIAS_SYS (floorl, long double, (long double x)); | ||
192 | # endif | 291 | # endif |
292 | _GL_CXXALIASWARN (floorl); | ||
193 | #elif defined GNULIB_POSIXCHECK | 293 | #elif defined GNULIB_POSIXCHECK |
194 | # undef floorl | 294 | # undef floorl |
195 | # define floorl(x) \ | 295 | # if HAVE_RAW_DECL_FLOORL |
196 | (GL_LINK_WARNING ("floorl is unportable - " \ | 296 | _GL_WARN_ON_USE (floorl, "floorl is unportable - " |
197 | "use gnulib module floorl for portability"), \ | 297 | "use gnulib module floorl for portability"); |
198 | floorl (x)) | 298 | # endif |
199 | #endif | 299 | #endif |
200 | 300 | ||
201 | 301 | ||
@@ -207,173 +307,247 @@ extern long double floorl (long double x); | |||
207 | If x is infinite or NaN: mantissa = x, exp unspecified. | 307 | If x is infinite or NaN: mantissa = x, exp unspecified. |
208 | Store exp in *EXPPTR and return mantissa. */ | 308 | Store exp in *EXPPTR and return mantissa. */ |
209 | #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@ | 309 | #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@ |
210 | # define frexpl rpl_frexpl | 310 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
311 | # define frexpl rpl_frexpl | ||
312 | # endif | ||
313 | _GL_FUNCDECL_RPL (frexpl, long double, | ||
314 | (long double x, int *expptr) _GL_ARG_NONNULL ((2))); | ||
315 | _GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr)); | ||
316 | #else | ||
317 | # if !@HAVE_DECL_FREXPL@ | ||
318 | _GL_FUNCDECL_SYS (frexpl, long double, | ||
319 | (long double x, int *expptr) _GL_ARG_NONNULL ((2))); | ||
320 | # endif | ||
321 | # if @GNULIB_FREXPL@ | ||
322 | _GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr)); | ||
323 | # endif | ||
211 | #endif | 324 | #endif |
212 | #if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || !@HAVE_DECL_FREXPL@ | 325 | #if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@) |
213 | extern long double frexpl (long double x, int *expptr); | 326 | _GL_CXXALIASWARN (frexpl); |
214 | #endif | 327 | #endif |
215 | #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK | 328 | #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK |
216 | # undef frexpl | 329 | # undef frexpl |
217 | # define frexpl(x,e) \ | 330 | # if HAVE_RAW_DECL_FREXPL |
218 | (GL_LINK_WARNING ("frexpl is unportable - " \ | 331 | _GL_WARN_ON_USE (frexpl, "frexpl is unportable - " |
219 | "use gnulib module frexpl for portability"), \ | 332 | "use gnulib module frexpl for portability"); |
220 | frexpl (x, e)) | 333 | # endif |
221 | #endif | 334 | #endif |
222 | 335 | ||
223 | 336 | ||
224 | /* Return x * 2^exp. */ | 337 | /* Return x * 2^exp. */ |
225 | #if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@ | 338 | #if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@ |
226 | # define ldexpl rpl_ldexpl | 339 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
340 | # define ldexpl rpl_ldexpl | ||
341 | # endif | ||
342 | _GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp)); | ||
343 | _GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp)); | ||
344 | #else | ||
345 | # if !@HAVE_DECL_LDEXPL@ | ||
346 | _GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp)); | ||
347 | # endif | ||
348 | # if @GNULIB_LDEXPL@ | ||
349 | _GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp)); | ||
350 | # endif | ||
227 | #endif | 351 | #endif |
228 | #if (@GNULIB_LDEXPL@ && @REPLACE_LDEXPL@) || !@HAVE_DECL_LDEXPL@ | 352 | #if @GNULIB_LDEXPL@ |
229 | extern long double ldexpl (long double x, int exp); | 353 | _GL_CXXALIASWARN (ldexpl); |
230 | #endif | 354 | #endif |
231 | #if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK | 355 | #if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK |
232 | # undef ldexpl | 356 | # undef ldexpl |
233 | # define ldexpl(x,e) \ | 357 | # if HAVE_RAW_DECL_LDEXPL |
234 | (GL_LINK_WARNING ("ldexpl is unportable - " \ | 358 | _GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - " |
235 | "use gnulib module ldexpl for portability"), \ | 359 | "use gnulib module ldexpl for portability"); |
236 | ldexpl (x, e)) | 360 | # endif |
237 | #endif | 361 | #endif |
238 | 362 | ||
239 | 363 | ||
240 | #if @GNULIB_MATHL@ || !@HAVE_DECL_LOGL@ | 364 | #if @GNULIB_LOGL@ |
241 | extern long double logl (long double x); | 365 | # if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ |
242 | #endif | 366 | _GL_FUNCDECL_SYS (logl, long double, (long double x)); |
243 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 367 | # endif |
368 | _GL_CXXALIAS_SYS (logl, long double, (long double x)); | ||
369 | _GL_CXXALIASWARN (logl); | ||
370 | #elif defined GNULIB_POSIXCHECK | ||
244 | # undef logl | 371 | # undef logl |
245 | # define logl(x) \ | 372 | # if HAVE_RAW_DECL_LOGL |
246 | (GL_LINK_WARNING ("logl is unportable - " \ | 373 | _GL_WARN_ON_USE (logl, "logl is unportable - " |
247 | "use gnulib module mathl for portability"), \ | 374 | "use gnulib module mathl for portability"); |
248 | logl (x)) | 375 | # endif |
249 | #endif | 376 | #endif |
250 | 377 | ||
251 | 378 | ||
252 | #if @GNULIB_ROUNDF@ | 379 | #if @GNULIB_ROUNDF@ |
253 | # if @REPLACE_ROUNDF@ | 380 | # if @REPLACE_ROUNDF@ |
254 | # undef roundf | 381 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
255 | # define roundf rpl_roundf | 382 | # undef roundf |
256 | extern float roundf (float x); | 383 | # define roundf rpl_roundf |
384 | # endif | ||
385 | _GL_FUNCDECL_RPL (roundf, float, (float x)); | ||
386 | _GL_CXXALIAS_RPL (roundf, float, (float x)); | ||
387 | # else | ||
388 | # if !@HAVE_DECL_ROUNDF@ | ||
389 | _GL_FUNCDECL_SYS (roundf, float, (float x)); | ||
390 | # endif | ||
391 | _GL_CXXALIAS_SYS (roundf, float, (float x)); | ||
257 | # endif | 392 | # endif |
393 | _GL_CXXALIASWARN (roundf); | ||
258 | #elif defined GNULIB_POSIXCHECK | 394 | #elif defined GNULIB_POSIXCHECK |
259 | # undef roundf | 395 | # undef roundf |
260 | # define roundf(x) \ | 396 | # if HAVE_RAW_DECL_ROUNDF |
261 | (GL_LINK_WARNING ("roundf is unportable - " \ | 397 | _GL_WARN_ON_USE (roundf, "roundf is unportable - " |
262 | "use gnulib module roundf for portability"), \ | 398 | "use gnulib module roundf for portability"); |
263 | roundf (x)) | 399 | # endif |
264 | #endif | 400 | #endif |
265 | 401 | ||
266 | #if @GNULIB_ROUND@ | 402 | #if @GNULIB_ROUND@ |
267 | # if @REPLACE_ROUND@ | 403 | # if @REPLACE_ROUND@ |
268 | # undef round | 404 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
269 | # define round rpl_round | 405 | # undef round |
270 | extern double round (double x); | 406 | # define round rpl_round |
407 | # endif | ||
408 | _GL_FUNCDECL_RPL (round, double, (double x)); | ||
409 | _GL_CXXALIAS_RPL (round, double, (double x)); | ||
410 | # else | ||
411 | # if !@HAVE_DECL_ROUND@ | ||
412 | _GL_FUNCDECL_SYS (round, double, (double x)); | ||
413 | # endif | ||
414 | _GL_CXXALIAS_SYS (round, double, (double x)); | ||
271 | # endif | 415 | # endif |
416 | _GL_CXXALIASWARN (round); | ||
272 | #elif defined GNULIB_POSIXCHECK | 417 | #elif defined GNULIB_POSIXCHECK |
273 | # undef round | 418 | # undef round |
274 | # define round(x) \ | 419 | # if HAVE_RAW_DECL_ROUND |
275 | (GL_LINK_WARNING ("round is unportable - " \ | 420 | _GL_WARN_ON_USE (round, "round is unportable - " |
276 | "use gnulib module round for portability"), \ | 421 | "use gnulib module round for portability"); |
277 | round (x)) | 422 | # endif |
278 | #endif | 423 | #endif |
279 | 424 | ||
280 | #if @GNULIB_ROUNDL@ | 425 | #if @GNULIB_ROUNDL@ |
281 | # if @REPLACE_ROUNDL@ | 426 | # if @REPLACE_ROUNDL@ |
282 | # undef roundl | 427 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
283 | # define roundl rpl_roundl | 428 | # undef roundl |
284 | extern long double roundl (long double x); | 429 | # define roundl rpl_roundl |
430 | # endif | ||
431 | _GL_FUNCDECL_RPL (roundl, long double, (long double x)); | ||
432 | _GL_CXXALIAS_RPL (roundl, long double, (long double x)); | ||
433 | # else | ||
434 | # if !@HAVE_DECL_ROUNDL@ | ||
435 | _GL_FUNCDECL_SYS (roundl, long double, (long double x)); | ||
436 | # endif | ||
437 | _GL_CXXALIAS_SYS (roundl, long double, (long double x)); | ||
285 | # endif | 438 | # endif |
439 | _GL_CXXALIASWARN (roundl); | ||
286 | #elif defined GNULIB_POSIXCHECK | 440 | #elif defined GNULIB_POSIXCHECK |
287 | # undef roundl | 441 | # undef roundl |
288 | # define roundl(x) \ | 442 | # if HAVE_RAW_DECL_ROUNDL |
289 | (GL_LINK_WARNING ("roundl is unportable - " \ | 443 | _GL_WARN_ON_USE (roundl, "roundl is unportable - " |
290 | "use gnulib module roundl for portability"), \ | 444 | "use gnulib module roundl for portability"); |
291 | roundl (x)) | 445 | # endif |
292 | #endif | 446 | #endif |
293 | 447 | ||
294 | 448 | ||
295 | #if @GNULIB_MATHL@ || !@HAVE_DECL_SINL@ | 449 | #if @GNULIB_SINL@ |
296 | extern long double sinl (long double x); | 450 | # if !@HAVE_SINL@ || !@HAVE_DECL_SINL@ |
297 | #endif | 451 | _GL_FUNCDECL_SYS (sinl, long double, (long double x)); |
298 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 452 | # endif |
453 | _GL_CXXALIAS_SYS (sinl, long double, (long double x)); | ||
454 | _GL_CXXALIASWARN (sinl); | ||
455 | #elif defined GNULIB_POSIXCHECK | ||
299 | # undef sinl | 456 | # undef sinl |
300 | # define sinl(x) \ | 457 | # if HAVE_RAW_DECL_SINL |
301 | (GL_LINK_WARNING ("sinl is unportable - " \ | 458 | _GL_WARN_ON_USE (sinl, "sinl is unportable - " |
302 | "use gnulib module mathl for portability"), \ | 459 | "use gnulib module mathl for portability"); |
303 | sinl (x)) | 460 | # endif |
304 | #endif | 461 | #endif |
305 | 462 | ||
306 | 463 | ||
307 | #if @GNULIB_MATHL@ || !@HAVE_DECL_SQRTL@ | 464 | #if @GNULIB_SQRTL@ |
308 | extern long double sqrtl (long double x); | 465 | # if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@ |
309 | #endif | 466 | _GL_FUNCDECL_SYS (sqrtl, long double, (long double x)); |
310 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 467 | # endif |
468 | _GL_CXXALIAS_SYS (sqrtl, long double, (long double x)); | ||
469 | _GL_CXXALIASWARN (sqrtl); | ||
470 | #elif defined GNULIB_POSIXCHECK | ||
311 | # undef sqrtl | 471 | # undef sqrtl |
312 | # define sqrtl(x) \ | 472 | # if HAVE_RAW_DECL_SQRTL |
313 | (GL_LINK_WARNING ("sqrtl is unportable - " \ | 473 | _GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - " |
314 | "use gnulib module mathl for portability"), \ | 474 | "use gnulib module mathl for portability"); |
315 | sqrtl (x)) | 475 | # endif |
316 | #endif | 476 | #endif |
317 | 477 | ||
318 | 478 | ||
319 | #if @GNULIB_MATHL@ || !@HAVE_DECL_TANL@ | 479 | #if @GNULIB_TANL@ |
320 | extern long double tanl (long double x); | 480 | # if !@HAVE_TANL@ || !@HAVE_DECL_TANL@ |
321 | #endif | 481 | _GL_FUNCDECL_SYS (tanl, long double, (long double x)); |
322 | #if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK | 482 | # endif |
483 | _GL_CXXALIAS_SYS (tanl, long double, (long double x)); | ||
484 | _GL_CXXALIASWARN (tanl); | ||
485 | #elif defined GNULIB_POSIXCHECK | ||
323 | # undef tanl | 486 | # undef tanl |
324 | # define tanl(x) \ | 487 | # if HAVE_RAW_DECL_TANL |
325 | (GL_LINK_WARNING ("tanl is unportable - " \ | 488 | _GL_WARN_ON_USE (tanl, "tanl is unportable - " |
326 | "use gnulib module mathl for portability"), \ | 489 | "use gnulib module mathl for portability"); |
327 | tanl (x)) | 490 | # endif |
328 | #endif | 491 | #endif |
329 | 492 | ||
330 | 493 | ||
331 | #if @GNULIB_TRUNCF@ | 494 | #if @GNULIB_TRUNCF@ |
332 | # if !@HAVE_DECL_TRUNCF@ | 495 | # if !@HAVE_DECL_TRUNCF@ |
333 | # define truncf rpl_truncf | 496 | _GL_FUNCDECL_SYS (truncf, float, (float x)); |
334 | extern float truncf (float x); | ||
335 | # endif | 497 | # endif |
498 | _GL_CXXALIAS_SYS (truncf, float, (float x)); | ||
499 | _GL_CXXALIASWARN (truncf); | ||
336 | #elif defined GNULIB_POSIXCHECK | 500 | #elif defined GNULIB_POSIXCHECK |
337 | # undef truncf | 501 | # undef truncf |
338 | # define truncf(x) \ | 502 | # if HAVE_RAW_DECL_TRUNCF |
339 | (GL_LINK_WARNING ("truncf is unportable - " \ | 503 | _GL_WARN_ON_USE (truncf, "truncf is unportable - " |
340 | "use gnulib module truncf for portability"), \ | 504 | "use gnulib module truncf for portability"); |
341 | truncf (x)) | 505 | # endif |
342 | #endif | 506 | #endif |
343 | 507 | ||
344 | #if @GNULIB_TRUNC@ | 508 | #if @GNULIB_TRUNC@ |
345 | # if !@HAVE_DECL_TRUNC@ | 509 | # if !@HAVE_DECL_TRUNC@ |
346 | # define trunc rpl_trunc | 510 | _GL_FUNCDECL_SYS (trunc, double, (double x)); |
347 | extern double trunc (double x); | ||
348 | # endif | 511 | # endif |
512 | _GL_CXXALIAS_SYS (trunc, double, (double x)); | ||
513 | _GL_CXXALIASWARN (trunc); | ||
349 | #elif defined GNULIB_POSIXCHECK | 514 | #elif defined GNULIB_POSIXCHECK |
350 | # undef trunc | 515 | # undef trunc |
351 | # define trunc(x) \ | 516 | # if HAVE_RAW_DECL_TRUNC |
352 | (GL_LINK_WARNING ("trunc is unportable - " \ | 517 | _GL_WARN_ON_USE (trunc, "trunc is unportable - " |
353 | "use gnulib module trunc for portability"), \ | 518 | "use gnulib module trunc for portability"); |
354 | trunc (x)) | 519 | # endif |
355 | #endif | 520 | #endif |
356 | 521 | ||
357 | #if @GNULIB_TRUNCL@ | 522 | #if @GNULIB_TRUNCL@ |
358 | # if @REPLACE_TRUNCL@ | 523 | # if @REPLACE_TRUNCL@ |
359 | # undef truncl | 524 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
360 | # define truncl rpl_truncl | 525 | # undef truncl |
361 | extern long double truncl (long double x); | 526 | # define truncl rpl_truncl |
527 | # endif | ||
528 | _GL_FUNCDECL_RPL (truncl, long double, (long double x)); | ||
529 | _GL_CXXALIAS_RPL (truncl, long double, (long double x)); | ||
530 | # else | ||
531 | # if !@HAVE_DECL_TRUNCL@ | ||
532 | _GL_FUNCDECL_SYS (truncl, long double, (long double x)); | ||
533 | # endif | ||
534 | _GL_CXXALIAS_SYS (truncl, long double, (long double x)); | ||
362 | # endif | 535 | # endif |
536 | _GL_CXXALIASWARN (truncl); | ||
363 | #elif defined GNULIB_POSIXCHECK | 537 | #elif defined GNULIB_POSIXCHECK |
364 | # undef truncl | 538 | # undef truncl |
365 | # define truncl(x) \ | 539 | # if HAVE_RAW_DECL_TRUNCL |
366 | (GL_LINK_WARNING ("truncl is unportable - " \ | 540 | _GL_WARN_ON_USE (truncl, "truncl is unportable - " |
367 | "use gnulib module truncl for portability"), \ | 541 | "use gnulib module truncl for portability"); |
368 | truncl (x)) | 542 | # endif |
369 | #endif | 543 | #endif |
370 | 544 | ||
371 | 545 | ||
372 | #if @GNULIB_ISFINITE@ | 546 | #if @GNULIB_ISFINITE@ |
373 | # if @REPLACE_ISFINITE@ | 547 | # if @REPLACE_ISFINITE@ |
374 | extern int gl_isfinitef (float x); | 548 | _GL_EXTERN_C int gl_isfinitef (float x); |
375 | extern int gl_isfinited (double x); | 549 | _GL_EXTERN_C int gl_isfinited (double x); |
376 | extern int gl_isfinitel (long double x); | 550 | _GL_EXTERN_C int gl_isfinitel (long double x); |
377 | # undef isfinite | 551 | # undef isfinite |
378 | # define isfinite(x) \ | 552 | # define isfinite(x) \ |
379 | (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \ | 553 | (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \ |
@@ -381,15 +555,19 @@ extern int gl_isfinitel (long double x); | |||
381 | gl_isfinitef (x)) | 555 | gl_isfinitef (x)) |
382 | # endif | 556 | # endif |
383 | #elif defined GNULIB_POSIXCHECK | 557 | #elif defined GNULIB_POSIXCHECK |
384 | /* How to override a macro? */ | 558 | # if defined isfinite |
559 | _GL_WARN_REAL_FLOATING_DECL (isfinite); | ||
560 | # undef isfinite | ||
561 | # define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x) | ||
562 | # endif | ||
385 | #endif | 563 | #endif |
386 | 564 | ||
387 | 565 | ||
388 | #if @GNULIB_ISINF@ | 566 | #if @GNULIB_ISINF@ |
389 | # if @REPLACE_ISINF@ | 567 | # if @REPLACE_ISINF@ |
390 | extern int gl_isinff (float x); | 568 | _GL_EXTERN_C int gl_isinff (float x); |
391 | extern int gl_isinfd (double x); | 569 | _GL_EXTERN_C int gl_isinfd (double x); |
392 | extern int gl_isinfl (long double x); | 570 | _GL_EXTERN_C int gl_isinfl (long double x); |
393 | # undef isinf | 571 | # undef isinf |
394 | # define isinf(x) \ | 572 | # define isinf(x) \ |
395 | (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \ | 573 | (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \ |
@@ -397,7 +575,11 @@ extern int gl_isinfl (long double x); | |||
397 | gl_isinff (x)) | 575 | gl_isinff (x)) |
398 | # endif | 576 | # endif |
399 | #elif defined GNULIB_POSIXCHECK | 577 | #elif defined GNULIB_POSIXCHECK |
400 | /* How to override a macro? */ | 578 | # if defined isinf |
579 | _GL_WARN_REAL_FLOATING_DECL (isinf); | ||
580 | # undef isinf | ||
581 | # define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x) | ||
582 | # endif | ||
401 | #endif | 583 | #endif |
402 | 584 | ||
403 | 585 | ||
@@ -406,7 +588,6 @@ extern int gl_isinfl (long double x); | |||
406 | # if @HAVE_ISNANF@ | 588 | # if @HAVE_ISNANF@ |
407 | /* The original <math.h> included above provides a declaration of isnan macro | 589 | /* The original <math.h> included above provides a declaration of isnan macro |
408 | or (older) isnanf function. */ | 590 | or (older) isnanf function. */ |
409 | # include <math.h> | ||
410 | # if __GNUC__ >= 4 | 591 | # if __GNUC__ >= 4 |
411 | /* GCC 4.0 and newer provides three built-ins for isnan. */ | 592 | /* GCC 4.0 and newer provides three built-ins for isnan. */ |
412 | # undef isnanf | 593 | # undef isnanf |
@@ -419,7 +600,7 @@ extern int gl_isinfl (long double x); | |||
419 | /* Test whether X is a NaN. */ | 600 | /* Test whether X is a NaN. */ |
420 | # undef isnanf | 601 | # undef isnanf |
421 | # define isnanf rpl_isnanf | 602 | # define isnanf rpl_isnanf |
422 | extern int isnanf (float x); | 603 | _GL_EXTERN_C int isnanf (float x); |
423 | # endif | 604 | # endif |
424 | #endif | 605 | #endif |
425 | 606 | ||
@@ -429,7 +610,6 @@ extern int isnanf (float x); | |||
429 | to 'double' numbers earlier but now is a type-generic macro. */ | 610 | to 'double' numbers earlier but now is a type-generic macro. */ |
430 | # if @HAVE_ISNAND@ | 611 | # if @HAVE_ISNAND@ |
431 | /* The original <math.h> included above provides a declaration of isnan macro. */ | 612 | /* The original <math.h> included above provides a declaration of isnan macro. */ |
432 | # include <math.h> | ||
433 | # if __GNUC__ >= 4 | 613 | # if __GNUC__ >= 4 |
434 | /* GCC 4.0 and newer provides three built-ins for isnan. */ | 614 | /* GCC 4.0 and newer provides three built-ins for isnan. */ |
435 | # undef isnand | 615 | # undef isnand |
@@ -442,7 +622,7 @@ extern int isnanf (float x); | |||
442 | /* Test whether X is a NaN. */ | 622 | /* Test whether X is a NaN. */ |
443 | # undef isnand | 623 | # undef isnand |
444 | # define isnand rpl_isnand | 624 | # define isnand rpl_isnand |
445 | extern int isnand (double x); | 625 | _GL_EXTERN_C int isnand (double x); |
446 | # endif | 626 | # endif |
447 | #endif | 627 | #endif |
448 | 628 | ||
@@ -450,7 +630,6 @@ extern int isnand (double x); | |||
450 | /* Test for NaN for 'long double' numbers. */ | 630 | /* Test for NaN for 'long double' numbers. */ |
451 | # if @HAVE_ISNANL@ | 631 | # if @HAVE_ISNANL@ |
452 | /* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function. */ | 632 | /* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function. */ |
453 | # include <math.h> | ||
454 | # if __GNUC__ >= 4 | 633 | # if __GNUC__ >= 4 |
455 | /* GCC 4.0 and newer provides three built-ins for isnan. */ | 634 | /* GCC 4.0 and newer provides three built-ins for isnan. */ |
456 | # undef isnanl | 635 | # undef isnanl |
@@ -463,7 +642,7 @@ extern int isnand (double x); | |||
463 | /* Test whether X is a NaN. */ | 642 | /* Test whether X is a NaN. */ |
464 | # undef isnanl | 643 | # undef isnanl |
465 | # define isnanl rpl_isnanl | 644 | # define isnanl rpl_isnanl |
466 | extern int isnanl (long double x); | 645 | _GL_EXTERN_C int isnanl (long double x); |
467 | # endif | 646 | # endif |
468 | #endif | 647 | #endif |
469 | 648 | ||
@@ -477,19 +656,19 @@ extern int isnanl (long double x); | |||
477 | # if @HAVE_ISNANF@ && __GNUC__ >= 4 | 656 | # if @HAVE_ISNANF@ && __GNUC__ >= 4 |
478 | # define gl_isnan_f(x) __builtin_isnan ((float)(x)) | 657 | # define gl_isnan_f(x) __builtin_isnan ((float)(x)) |
479 | # else | 658 | # else |
480 | extern int rpl_isnanf (float x); | 659 | _GL_EXTERN_C int rpl_isnanf (float x); |
481 | # define gl_isnan_f(x) rpl_isnanf (x) | 660 | # define gl_isnan_f(x) rpl_isnanf (x) |
482 | # endif | 661 | # endif |
483 | # if @HAVE_ISNAND@ && __GNUC__ >= 4 | 662 | # if @HAVE_ISNAND@ && __GNUC__ >= 4 |
484 | # define gl_isnan_d(x) __builtin_isnan ((double)(x)) | 663 | # define gl_isnan_d(x) __builtin_isnan ((double)(x)) |
485 | # else | 664 | # else |
486 | extern int rpl_isnand (double x); | 665 | _GL_EXTERN_C int rpl_isnand (double x); |
487 | # define gl_isnan_d(x) rpl_isnand (x) | 666 | # define gl_isnan_d(x) rpl_isnand (x) |
488 | # endif | 667 | # endif |
489 | # if @HAVE_ISNANL@ && __GNUC__ >= 4 | 668 | # if @HAVE_ISNANL@ && __GNUC__ >= 4 |
490 | # define gl_isnan_l(x) __builtin_isnan ((long double)(x)) | 669 | # define gl_isnan_l(x) __builtin_isnan ((long double)(x)) |
491 | # else | 670 | # else |
492 | extern int rpl_isnanl (long double x); | 671 | _GL_EXTERN_C int rpl_isnanl (long double x); |
493 | # define gl_isnan_l(x) rpl_isnanl (x) | 672 | # define gl_isnan_l(x) rpl_isnanl (x) |
494 | # endif | 673 | # endif |
495 | # undef isnan | 674 | # undef isnan |
@@ -499,7 +678,11 @@ extern int rpl_isnanl (long double x); | |||
499 | gl_isnan_f (x)) | 678 | gl_isnan_f (x)) |
500 | # endif | 679 | # endif |
501 | #elif defined GNULIB_POSIXCHECK | 680 | #elif defined GNULIB_POSIXCHECK |
502 | /* How to override a macro? */ | 681 | # if defined isnan |
682 | _GL_WARN_REAL_FLOATING_DECL (isnan); | ||
683 | # undef isnan | ||
684 | # define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x) | ||
685 | # endif | ||
503 | #endif | 686 | #endif |
504 | 687 | ||
505 | 688 | ||
@@ -514,38 +697,38 @@ extern int rpl_isnanl (long double x); | |||
514 | # endif | 697 | # endif |
515 | # if @REPLACE_SIGNBIT@ | 698 | # if @REPLACE_SIGNBIT@ |
516 | # undef signbit | 699 | # undef signbit |
517 | extern int gl_signbitf (float arg); | 700 | _GL_EXTERN_C int gl_signbitf (float arg); |
518 | extern int gl_signbitd (double arg); | 701 | _GL_EXTERN_C int gl_signbitd (double arg); |
519 | extern int gl_signbitl (long double arg); | 702 | _GL_EXTERN_C int gl_signbitl (long double arg); |
520 | # if __GNUC__ >= 2 && !__STRICT_ANSI__ | 703 | # if __GNUC__ >= 2 && !__STRICT_ANSI__ |
521 | # if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf | 704 | # if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf |
522 | # define gl_signbitf_OPTIMIZED_MACRO | 705 | # define gl_signbitf_OPTIMIZED_MACRO |
523 | # define gl_signbitf(arg) \ | 706 | # define gl_signbitf(arg) \ |
524 | ({ union { float _value; \ | 707 | ({ union { float _value; \ |
525 | unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ | 708 | unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ |
526 | } _m; \ | 709 | } _m; \ |
527 | _m._value = (arg); \ | 710 | _m._value = (arg); \ |
528 | (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ | 711 | (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ |
529 | }) | 712 | }) |
530 | # endif | 713 | # endif |
531 | # if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd | 714 | # if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd |
532 | # define gl_signbitd_OPTIMIZED_MACRO | 715 | # define gl_signbitd_OPTIMIZED_MACRO |
533 | # define gl_signbitd(arg) \ | 716 | # define gl_signbitd(arg) \ |
534 | ({ union { double _value; \ | 717 | ({ union { double _value; \ |
535 | unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ | 718 | unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ |
536 | } _m; \ | 719 | } _m; \ |
537 | _m._value = (arg); \ | 720 | _m._value = (arg); \ |
538 | (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ | 721 | (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ |
539 | }) | 722 | }) |
540 | # endif | 723 | # endif |
541 | # if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl | 724 | # if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl |
542 | # define gl_signbitl_OPTIMIZED_MACRO | 725 | # define gl_signbitl_OPTIMIZED_MACRO |
543 | # define gl_signbitl(arg) \ | 726 | # define gl_signbitl(arg) \ |
544 | ({ union { long double _value; \ | 727 | ({ union { long double _value; \ |
545 | unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ | 728 | unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ |
546 | } _m; \ | 729 | } _m; \ |
547 | _m._value = (arg); \ | 730 | _m._value = (arg); \ |
548 | (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ | 731 | (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ |
549 | }) | 732 | }) |
550 | # endif | 733 | # endif |
551 | # endif | 734 | # endif |
@@ -555,13 +738,13 @@ extern int gl_signbitl (long double arg); | |||
555 | gl_signbitf (x)) | 738 | gl_signbitf (x)) |
556 | # endif | 739 | # endif |
557 | #elif defined GNULIB_POSIXCHECK | 740 | #elif defined GNULIB_POSIXCHECK |
558 | /* How to override a macro? */ | 741 | # if defined signbit |
742 | _GL_WARN_REAL_FLOATING_DECL (signbit); | ||
743 | # undef signbit | ||
744 | # define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x) | ||
745 | # endif | ||
559 | #endif | 746 | #endif |
560 | 747 | ||
561 | 748 | ||
562 | #ifdef __cplusplus | ||
563 | } | ||
564 | #endif | ||
565 | |||
566 | #endif /* _GL_MATH_H */ | 749 | #endif /* _GL_MATH_H */ |
567 | #endif /* _GL_MATH_H */ | 750 | #endif /* _GL_MATH_H */ |
diff --git a/gl/mbrtowc.c b/gl/mbrtowc.c index 0fec5f1c..5c2650e9 100644 --- a/gl/mbrtowc.c +++ b/gl/mbrtowc.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Convert multibyte character to wide character. | 1 | /* Convert multibyte character to wide character. |
2 | Copyright (C) 1999-2002, 2005-2009 Free Software Foundation, Inc. | 2 | Copyright (C) 1999-2002, 2005-2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2008. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
@@ -63,30 +63,30 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) | |||
63 | switch (nstate) | 63 | switch (nstate) |
64 | { | 64 | { |
65 | case 0: | 65 | case 0: |
66 | p = s; | 66 | p = s; |
67 | m = n; | 67 | m = n; |
68 | break; | 68 | break; |
69 | case 3: | 69 | case 3: |
70 | buf[2] = pstate[3]; | 70 | buf[2] = pstate[3]; |
71 | /*FALLTHROUGH*/ | 71 | /*FALLTHROUGH*/ |
72 | case 2: | 72 | case 2: |
73 | buf[1] = pstate[2]; | 73 | buf[1] = pstate[2]; |
74 | /*FALLTHROUGH*/ | 74 | /*FALLTHROUGH*/ |
75 | case 1: | 75 | case 1: |
76 | buf[0] = pstate[1]; | 76 | buf[0] = pstate[1]; |
77 | p = buf; | 77 | p = buf; |
78 | m = nstate; | 78 | m = nstate; |
79 | buf[m++] = s[0]; | 79 | buf[m++] = s[0]; |
80 | if (n >= 2 && m < 4) | 80 | if (n >= 2 && m < 4) |
81 | { | 81 | { |
82 | buf[m++] = s[1]; | 82 | buf[m++] = s[1]; |
83 | if (n >= 3 && m < 4) | 83 | if (n >= 3 && m < 4) |
84 | buf[m++] = s[2]; | 84 | buf[m++] = s[2]; |
85 | } | 85 | } |
86 | break; | 86 | break; |
87 | default: | 87 | default: |
88 | errno = EINVAL; | 88 | errno = EINVAL; |
89 | return (size_t)(-1); | 89 | return (size_t)(-1); |
90 | } | 90 | } |
91 | 91 | ||
92 | /* Here m > 0. */ | 92 | /* Here m > 0. */ |
@@ -99,208 +99,208 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) | |||
99 | int res = mbtowc (pwc, p, m); | 99 | int res = mbtowc (pwc, p, m); |
100 | 100 | ||
101 | if (res >= 0) | 101 | if (res >= 0) |
102 | { | 102 | { |
103 | if (pwc != NULL && ((*pwc == 0) != (res == 0))) | 103 | if (pwc != NULL && ((*pwc == 0) != (res == 0))) |
104 | abort (); | 104 | abort (); |
105 | if (nstate >= (res > 0 ? res : 1)) | 105 | if (nstate >= (res > 0 ? res : 1)) |
106 | abort (); | 106 | abort (); |
107 | res -= nstate; | 107 | res -= nstate; |
108 | pstate[0] = 0; | 108 | pstate[0] = 0; |
109 | return res; | 109 | return res; |
110 | } | 110 | } |
111 | 111 | ||
112 | /* mbtowc does not distinguish between invalid and incomplete multibyte | 112 | /* mbtowc does not distinguish between invalid and incomplete multibyte |
113 | sequences. But mbrtowc needs to make this distinction. | 113 | sequences. But mbrtowc needs to make this distinction. |
114 | There are two possible approaches: | 114 | There are two possible approaches: |
115 | - Use iconv() and its return value. | 115 | - Use iconv() and its return value. |
116 | - Use built-in knowledge about the possible encodings. | 116 | - Use built-in knowledge about the possible encodings. |
117 | Given the low quality of implementation of iconv() on the systems that | 117 | Given the low quality of implementation of iconv() on the systems that |
118 | lack mbrtowc(), we use the second approach. | 118 | lack mbrtowc(), we use the second approach. |
119 | The possible encodings are: | 119 | The possible encodings are: |
120 | - 8-bit encodings, | 120 | - 8-bit encodings, |
121 | - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS, | 121 | - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS, |
122 | - UTF-8. | 122 | - UTF-8. |
123 | Use specialized code for each. */ | 123 | Use specialized code for each. */ |
124 | if (m >= 4 || m >= MB_CUR_MAX) | 124 | if (m >= 4 || m >= MB_CUR_MAX) |
125 | goto invalid; | 125 | goto invalid; |
126 | /* Here MB_CUR_MAX > 1 and 0 < m < 4. */ | 126 | /* Here MB_CUR_MAX > 1 and 0 < m < 4. */ |
127 | { | 127 | { |
128 | const char *encoding = locale_charset (); | 128 | const char *encoding = locale_charset (); |
129 | 129 | ||
130 | if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0)) | 130 | if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0)) |
131 | { | 131 | { |
132 | /* Cf. unistr/u8-mblen.c. */ | 132 | /* Cf. unistr/u8-mblen.c. */ |
133 | unsigned char c = (unsigned char) p[0]; | 133 | unsigned char c = (unsigned char) p[0]; |
134 | 134 | ||
135 | if (c >= 0xc2) | 135 | if (c >= 0xc2) |
136 | { | 136 | { |
137 | if (c < 0xe0) | 137 | if (c < 0xe0) |
138 | { | 138 | { |
139 | if (m == 1) | 139 | if (m == 1) |
140 | goto incomplete; | 140 | goto incomplete; |
141 | } | 141 | } |
142 | else if (c < 0xf0) | 142 | else if (c < 0xf0) |
143 | { | 143 | { |
144 | if (m == 1) | 144 | if (m == 1) |
145 | goto incomplete; | 145 | goto incomplete; |
146 | if (m == 2) | 146 | if (m == 2) |
147 | { | 147 | { |
148 | unsigned char c2 = (unsigned char) p[1]; | 148 | unsigned char c2 = (unsigned char) p[1]; |
149 | 149 | ||
150 | if ((c2 ^ 0x80) < 0x40 | 150 | if ((c2 ^ 0x80) < 0x40 |
151 | && (c >= 0xe1 || c2 >= 0xa0) | 151 | && (c >= 0xe1 || c2 >= 0xa0) |
152 | && (c != 0xed || c2 < 0xa0)) | 152 | && (c != 0xed || c2 < 0xa0)) |
153 | goto incomplete; | 153 | goto incomplete; |
154 | } | 154 | } |
155 | } | 155 | } |
156 | else if (c <= 0xf4) | 156 | else if (c <= 0xf4) |
157 | { | 157 | { |
158 | if (m == 1) | 158 | if (m == 1) |
159 | goto incomplete; | 159 | goto incomplete; |
160 | else /* m == 2 || m == 3 */ | 160 | else /* m == 2 || m == 3 */ |
161 | { | 161 | { |
162 | unsigned char c2 = (unsigned char) p[1]; | 162 | unsigned char c2 = (unsigned char) p[1]; |
163 | 163 | ||
164 | if ((c2 ^ 0x80) < 0x40 | 164 | if ((c2 ^ 0x80) < 0x40 |
165 | && (c >= 0xf1 || c2 >= 0x90) | 165 | && (c >= 0xf1 || c2 >= 0x90) |
166 | && (c < 0xf4 || (c == 0xf4 && c2 < 0x90))) | 166 | && (c < 0xf4 || (c == 0xf4 && c2 < 0x90))) |
167 | { | 167 | { |
168 | if (m == 2) | 168 | if (m == 2) |
169 | goto incomplete; | 169 | goto incomplete; |
170 | else /* m == 3 */ | 170 | else /* m == 3 */ |
171 | { | 171 | { |
172 | unsigned char c3 = (unsigned char) p[2]; | 172 | unsigned char c3 = (unsigned char) p[2]; |
173 | 173 | ||
174 | if ((c3 ^ 0x80) < 0x40) | 174 | if ((c3 ^ 0x80) < 0x40) |
175 | goto incomplete; | 175 | goto incomplete; |
176 | } | 176 | } |
177 | } | 177 | } |
178 | } | 178 | } |
179 | } | 179 | } |
180 | } | 180 | } |
181 | goto invalid; | 181 | goto invalid; |
182 | } | 182 | } |
183 | 183 | ||
184 | /* As a reference for this code, you can use the GNU libiconv | 184 | /* As a reference for this code, you can use the GNU libiconv |
185 | implementation. Look for uses of the RET_TOOFEW macro. */ | 185 | implementation. Look for uses of the RET_TOOFEW macro. */ |
186 | 186 | ||
187 | if (STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)) | 187 | if (STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)) |
188 | { | 188 | { |
189 | if (m == 1) | 189 | if (m == 1) |
190 | { | 190 | { |
191 | unsigned char c = (unsigned char) p[0]; | 191 | unsigned char c = (unsigned char) p[0]; |
192 | 192 | ||
193 | if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f) | 193 | if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f) |
194 | goto incomplete; | 194 | goto incomplete; |
195 | } | 195 | } |
196 | if (m == 2) | 196 | if (m == 2) |
197 | { | 197 | { |
198 | unsigned char c = (unsigned char) p[0]; | 198 | unsigned char c = (unsigned char) p[0]; |
199 | 199 | ||
200 | if (c == 0x8f) | 200 | if (c == 0x8f) |
201 | { | 201 | { |
202 | unsigned char c2 = (unsigned char) p[1]; | 202 | unsigned char c2 = (unsigned char) p[1]; |
203 | 203 | ||
204 | if (c2 >= 0xa1 && c2 < 0xff) | 204 | if (c2 >= 0xa1 && c2 < 0xff) |
205 | goto incomplete; | 205 | goto incomplete; |
206 | } | 206 | } |
207 | } | 207 | } |
208 | goto invalid; | 208 | goto invalid; |
209 | } | 209 | } |
210 | if (STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) | 210 | if (STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) |
211 | || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) | 211 | || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) |
212 | || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)) | 212 | || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)) |
213 | { | 213 | { |
214 | if (m == 1) | 214 | if (m == 1) |
215 | { | 215 | { |
216 | unsigned char c = (unsigned char) p[0]; | 216 | unsigned char c = (unsigned char) p[0]; |
217 | 217 | ||
218 | if (c >= 0xa1 && c < 0xff) | 218 | if (c >= 0xa1 && c < 0xff) |
219 | goto incomplete; | 219 | goto incomplete; |
220 | } | 220 | } |
221 | goto invalid; | 221 | goto invalid; |
222 | } | 222 | } |
223 | if (STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)) | 223 | if (STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)) |
224 | { | 224 | { |
225 | if (m == 1) | 225 | if (m == 1) |
226 | { | 226 | { |
227 | unsigned char c = (unsigned char) p[0]; | 227 | unsigned char c = (unsigned char) p[0]; |
228 | 228 | ||
229 | if ((c >= 0xa1 && c < 0xff) || c == 0x8e) | 229 | if ((c >= 0xa1 && c < 0xff) || c == 0x8e) |
230 | goto incomplete; | 230 | goto incomplete; |
231 | } | 231 | } |
232 | else /* m == 2 || m == 3 */ | 232 | else /* m == 2 || m == 3 */ |
233 | { | 233 | { |
234 | unsigned char c = (unsigned char) p[0]; | 234 | unsigned char c = (unsigned char) p[0]; |
235 | 235 | ||
236 | if (c == 0x8e) | 236 | if (c == 0x8e) |
237 | goto incomplete; | 237 | goto incomplete; |
238 | } | 238 | } |
239 | goto invalid; | 239 | goto invalid; |
240 | } | 240 | } |
241 | if (STREQ (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0)) | 241 | if (STREQ (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0)) |
242 | { | 242 | { |
243 | if (m == 1) | 243 | if (m == 1) |
244 | { | 244 | { |
245 | unsigned char c = (unsigned char) p[0]; | 245 | unsigned char c = (unsigned char) p[0]; |
246 | 246 | ||
247 | if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe)) | 247 | if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe)) |
248 | goto incomplete; | 248 | goto incomplete; |
249 | } | 249 | } |
250 | else /* m == 2 || m == 3 */ | 250 | else /* m == 2 || m == 3 */ |
251 | { | 251 | { |
252 | unsigned char c = (unsigned char) p[0]; | 252 | unsigned char c = (unsigned char) p[0]; |
253 | 253 | ||
254 | if (c >= 0x90 && c <= 0xe3) | 254 | if (c >= 0x90 && c <= 0xe3) |
255 | { | 255 | { |
256 | unsigned char c2 = (unsigned char) p[1]; | 256 | unsigned char c2 = (unsigned char) p[1]; |
257 | 257 | ||
258 | if (c2 >= 0x30 && c2 <= 0x39) | 258 | if (c2 >= 0x30 && c2 <= 0x39) |
259 | { | 259 | { |
260 | if (m == 2) | 260 | if (m == 2) |
261 | goto incomplete; | 261 | goto incomplete; |
262 | else /* m == 3 */ | 262 | else /* m == 3 */ |
263 | { | 263 | { |
264 | unsigned char c3 = (unsigned char) p[2]; | 264 | unsigned char c3 = (unsigned char) p[2]; |
265 | 265 | ||
266 | if (c3 >= 0x81 && c3 <= 0xfe) | 266 | if (c3 >= 0x81 && c3 <= 0xfe) |
267 | goto incomplete; | 267 | goto incomplete; |
268 | } | 268 | } |
269 | } | 269 | } |
270 | } | 270 | } |
271 | } | 271 | } |
272 | goto invalid; | 272 | goto invalid; |
273 | } | 273 | } |
274 | if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0)) | 274 | if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0)) |
275 | { | 275 | { |
276 | if (m == 1) | 276 | if (m == 1) |
277 | { | 277 | { |
278 | unsigned char c = (unsigned char) p[0]; | 278 | unsigned char c = (unsigned char) p[0]; |
279 | 279 | ||
280 | if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea) | 280 | if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea) |
281 | || (c >= 0xf0 && c <= 0xf9)) | 281 | || (c >= 0xf0 && c <= 0xf9)) |
282 | goto incomplete; | 282 | goto incomplete; |
283 | } | 283 | } |
284 | goto invalid; | 284 | goto invalid; |
285 | } | 285 | } |
286 | 286 | ||
287 | /* An unknown multibyte encoding. */ | 287 | /* An unknown multibyte encoding. */ |
288 | goto incomplete; | 288 | goto incomplete; |
289 | } | 289 | } |
290 | 290 | ||
291 | incomplete: | 291 | incomplete: |
292 | { | 292 | { |
293 | size_t k = nstate; | 293 | size_t k = nstate; |
294 | /* Here 0 <= k < m < 4. */ | 294 | /* Here 0 <= k < m < 4. */ |
295 | pstate[++k] = s[0]; | 295 | pstate[++k] = s[0]; |
296 | if (k < m) | 296 | if (k < m) |
297 | { | 297 | { |
298 | pstate[++k] = s[1]; | 298 | pstate[++k] = s[1]; |
299 | if (k < m) | 299 | if (k < m) |
300 | pstate[++k] = s[2]; | 300 | pstate[++k] = s[2]; |
301 | } | 301 | } |
302 | if (k != m) | 302 | if (k != m) |
303 | abort (); | 303 | abort (); |
304 | } | 304 | } |
305 | pstate[0] = m; | 305 | pstate[0] = m; |
306 | return (size_t)(-2); | 306 | return (size_t)(-2); |
@@ -341,25 +341,25 @@ rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) | |||
341 | 341 | ||
342 | if (!mbsinit (ps)) | 342 | if (!mbsinit (ps)) |
343 | { | 343 | { |
344 | /* Parse the rest of the multibyte character byte for byte. */ | 344 | /* Parse the rest of the multibyte character byte for byte. */ |
345 | size_t count = 0; | 345 | size_t count = 0; |
346 | for (; n > 0; s++, n--) | 346 | for (; n > 0; s++, n--) |
347 | { | 347 | { |
348 | wchar_t wc; | 348 | wchar_t wc; |
349 | size_t ret = mbrtowc (&wc, s, 1, ps); | 349 | size_t ret = mbrtowc (&wc, s, 1, ps); |
350 | 350 | ||
351 | if (ret == (size_t)(-1)) | 351 | if (ret == (size_t)(-1)) |
352 | return (size_t)(-1); | 352 | return (size_t)(-1); |
353 | count++; | 353 | count++; |
354 | if (ret != (size_t)(-2)) | 354 | if (ret != (size_t)(-2)) |
355 | { | 355 | { |
356 | /* The multibyte character has been completed. */ | 356 | /* The multibyte character has been completed. */ |
357 | if (pwc != NULL) | 357 | if (pwc != NULL) |
358 | *pwc = wc; | 358 | *pwc = wc; |
359 | return (wc == 0 ? 0 : count); | 359 | return (wc == 0 ? 0 : count); |
360 | } | 360 | } |
361 | } | 361 | } |
362 | return (size_t)(-2); | 362 | return (size_t)(-2); |
363 | } | 363 | } |
364 | } | 364 | } |
365 | # endif | 365 | # endif |
@@ -371,10 +371,10 @@ rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) | |||
371 | 371 | ||
372 | if (ret != (size_t)(-1) && ret != (size_t)(-2)) | 372 | if (ret != (size_t)(-1) && ret != (size_t)(-2)) |
373 | { | 373 | { |
374 | if (pwc != NULL) | 374 | if (pwc != NULL) |
375 | *pwc = wc; | 375 | *pwc = wc; |
376 | if (wc == 0) | 376 | if (wc == 0) |
377 | ret = 0; | 377 | ret = 0; |
378 | } | 378 | } |
379 | return ret; | 379 | return ret; |
380 | } | 380 | } |
diff --git a/gl/mbsinit.c b/gl/mbsinit.c index 81fed5a1..066ddfe5 100644 --- a/gl/mbsinit.c +++ b/gl/mbsinit.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Test for initial conversion state. | 1 | /* Test for initial conversion state. |
2 | Copyright (C) 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2008. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
diff --git a/gl/memchr.c b/gl/memchr.c new file mode 100644 index 00000000..6c2b2d6c --- /dev/null +++ b/gl/memchr.c | |||
@@ -0,0 +1,172 @@ | |||
1 | /* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2010 | ||
2 | Free Software Foundation, Inc. | ||
3 | |||
4 | Based on strlen implementation by Torbjorn Granlund (tege@sics.se), | ||
5 | with help from Dan Sahlin (dan@sics.se) and | ||
6 | commentary by Jim Blandy (jimb@ai.mit.edu); | ||
7 | adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), | ||
8 | and implemented by Roland McGrath (roland@ai.mit.edu). | ||
9 | |||
10 | NOTE: The canonical source of this file is maintained with the GNU C Library. | ||
11 | Bugs can be reported to bug-glibc@prep.ai.mit.edu. | ||
12 | |||
13 | This program is free software: you can redistribute it and/or modify it | ||
14 | under the terms of the GNU General Public License as published by the | ||
15 | Free Software Foundation; either version 3 of the License, or any | ||
16 | later version. | ||
17 | |||
18 | This program is distributed in the hope that it will be useful, | ||
19 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | GNU General Public License for more details. | ||
22 | |||
23 | You should have received a copy of the GNU General Public License | ||
24 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
25 | |||
26 | #ifndef _LIBC | ||
27 | # include <config.h> | ||
28 | #endif | ||
29 | |||
30 | #include <string.h> | ||
31 | |||
32 | #include <stddef.h> | ||
33 | |||
34 | #if defined _LIBC | ||
35 | # include <memcopy.h> | ||
36 | #else | ||
37 | # define reg_char char | ||
38 | #endif | ||
39 | |||
40 | #include <limits.h> | ||
41 | |||
42 | #if HAVE_BP_SYM_H || defined _LIBC | ||
43 | # include <bp-sym.h> | ||
44 | #else | ||
45 | # define BP_SYM(sym) sym | ||
46 | #endif | ||
47 | |||
48 | #undef __memchr | ||
49 | #ifdef _LIBC | ||
50 | # undef memchr | ||
51 | #endif | ||
52 | |||
53 | #ifndef weak_alias | ||
54 | # define __memchr memchr | ||
55 | #endif | ||
56 | |||
57 | /* Search no more than N bytes of S for C. */ | ||
58 | void * | ||
59 | __memchr (void const *s, int c_in, size_t n) | ||
60 | { | ||
61 | /* On 32-bit hardware, choosing longword to be a 32-bit unsigned | ||
62 | long instead of a 64-bit uintmax_t tends to give better | ||
63 | performance. On 64-bit hardware, unsigned long is generally 64 | ||
64 | bits already. Change this typedef to experiment with | ||
65 | performance. */ | ||
66 | typedef unsigned long int longword; | ||
67 | |||
68 | const unsigned char *char_ptr; | ||
69 | const longword *longword_ptr; | ||
70 | longword repeated_one; | ||
71 | longword repeated_c; | ||
72 | unsigned reg_char c; | ||
73 | |||
74 | c = (unsigned char) c_in; | ||
75 | |||
76 | /* Handle the first few bytes by reading one byte at a time. | ||
77 | Do this until CHAR_PTR is aligned on a longword boundary. */ | ||
78 | for (char_ptr = (const unsigned char *) s; | ||
79 | n > 0 && (size_t) char_ptr % sizeof (longword) != 0; | ||
80 | --n, ++char_ptr) | ||
81 | if (*char_ptr == c) | ||
82 | return (void *) char_ptr; | ||
83 | |||
84 | longword_ptr = (const longword *) char_ptr; | ||
85 | |||
86 | /* All these elucidatory comments refer to 4-byte longwords, | ||
87 | but the theory applies equally well to any size longwords. */ | ||
88 | |||
89 | /* Compute auxiliary longword values: | ||
90 | repeated_one is a value which has a 1 in every byte. | ||
91 | repeated_c has c in every byte. */ | ||
92 | repeated_one = 0x01010101; | ||
93 | repeated_c = c | (c << 8); | ||
94 | repeated_c |= repeated_c << 16; | ||
95 | if (0xffffffffU < (longword) -1) | ||
96 | { | ||
97 | repeated_one |= repeated_one << 31 << 1; | ||
98 | repeated_c |= repeated_c << 31 << 1; | ||
99 | if (8 < sizeof (longword)) | ||
100 | { | ||
101 | size_t i; | ||
102 | |||
103 | for (i = 64; i < sizeof (longword) * 8; i *= 2) | ||
104 | { | ||
105 | repeated_one |= repeated_one << i; | ||
106 | repeated_c |= repeated_c << i; | ||
107 | } | ||
108 | } | ||
109 | } | ||
110 | |||
111 | /* Instead of the traditional loop which tests each byte, we will test a | ||
112 | longword at a time. The tricky part is testing if *any of the four* | ||
113 | bytes in the longword in question are equal to c. We first use an xor | ||
114 | with repeated_c. This reduces the task to testing whether *any of the | ||
115 | four* bytes in longword1 is zero. | ||
116 | |||
117 | We compute tmp = | ||
118 | ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). | ||
119 | That is, we perform the following operations: | ||
120 | 1. Subtract repeated_one. | ||
121 | 2. & ~longword1. | ||
122 | 3. & a mask consisting of 0x80 in every byte. | ||
123 | Consider what happens in each byte: | ||
124 | - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, | ||
125 | and step 3 transforms it into 0x80. A carry can also be propagated | ||
126 | to more significant bytes. | ||
127 | - If a byte of longword1 is nonzero, let its lowest 1 bit be at | ||
128 | position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, | ||
129 | the byte ends in a single bit of value 0 and k bits of value 1. | ||
130 | After step 2, the result is just k bits of value 1: 2^k - 1. After | ||
131 | step 3, the result is 0. And no carry is produced. | ||
132 | So, if longword1 has only non-zero bytes, tmp is zero. | ||
133 | Whereas if longword1 has a zero byte, call j the position of the least | ||
134 | significant zero byte. Then the result has a zero at positions 0, ..., | ||
135 | j-1 and a 0x80 at position j. We cannot predict the result at the more | ||
136 | significant bytes (positions j+1..3), but it does not matter since we | ||
137 | already have a non-zero bit at position 8*j+7. | ||
138 | |||
139 | So, the test whether any byte in longword1 is zero is equivalent to | ||
140 | testing whether tmp is nonzero. */ | ||
141 | |||
142 | while (n >= sizeof (longword)) | ||
143 | { | ||
144 | longword longword1 = *longword_ptr ^ repeated_c; | ||
145 | |||
146 | if ((((longword1 - repeated_one) & ~longword1) | ||
147 | & (repeated_one << 7)) != 0) | ||
148 | break; | ||
149 | longword_ptr++; | ||
150 | n -= sizeof (longword); | ||
151 | } | ||
152 | |||
153 | char_ptr = (const unsigned char *) longword_ptr; | ||
154 | |||
155 | /* At this point, we know that either n < sizeof (longword), or one of the | ||
156 | sizeof (longword) bytes starting at char_ptr is == c. On little-endian | ||
157 | machines, we could determine the first such byte without any further | ||
158 | memory accesses, just by looking at the tmp result from the last loop | ||
159 | iteration. But this does not work on big-endian machines. Choose code | ||
160 | that works in both cases. */ | ||
161 | |||
162 | for (; n > 0; --n, ++char_ptr) | ||
163 | { | ||
164 | if (*char_ptr == c) | ||
165 | return (void *) char_ptr; | ||
166 | } | ||
167 | |||
168 | return NULL; | ||
169 | } | ||
170 | #ifdef weak_alias | ||
171 | weak_alias (__memchr, BP_SYM (memchr)) | ||
172 | #endif | ||
diff --git a/gl/memchr.valgrind b/gl/memchr.valgrind new file mode 100644 index 00000000..60f247e1 --- /dev/null +++ b/gl/memchr.valgrind | |||
@@ -0,0 +1,14 @@ | |||
1 | # Suppress a valgrind message about use of uninitialized memory in memchr(). | ||
2 | # POSIX states that when the character is found, memchr must not read extra | ||
3 | # bytes in an overestimated length (for example, where memchr is used to | ||
4 | # implement strnlen). However, we use a safe word read to provide a speedup. | ||
5 | { | ||
6 | memchr-value4 | ||
7 | Memcheck:Value4 | ||
8 | fun:rpl_memchr | ||
9 | } | ||
10 | { | ||
11 | memchr-value8 | ||
12 | Memcheck:Value8 | ||
13 | fun:rpl_memchr | ||
14 | } | ||
diff --git a/gl/mktime-internal.h b/gl/mktime-internal.h new file mode 100644 index 00000000..4287acf4 --- /dev/null +++ b/gl/mktime-internal.h | |||
@@ -0,0 +1,4 @@ | |||
1 | #include <time.h> | ||
2 | time_t mktime_internal (struct tm *, | ||
3 | struct tm * (*) (time_t const *, struct tm *), | ||
4 | time_t *); | ||
diff --git a/gl/mktime.c b/gl/mktime.c index 0f30d43f..b0324b82 100644 --- a/gl/mktime.c +++ b/gl/mktime.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Convert a `struct tm' to a time_t value. | 1 | /* Convert a `struct tm' to a time_t value. |
2 | Copyright (C) 1993-1999, 2002-2005, 2006, 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 1993-1999, 2002-2007, 2009-2010 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. | 3 | This file is part of the GNU C Library. |
4 | Contributed by Paul Eggert <eggert@twinsun.com>. | 4 | Contributed by Paul Eggert <eggert@twinsun.com>. |
5 | 5 | ||
@@ -36,7 +36,7 @@ | |||
36 | 36 | ||
37 | #include <limits.h> | 37 | #include <limits.h> |
38 | 38 | ||
39 | #include <string.h> /* For the real memcpy prototype. */ | 39 | #include <string.h> /* For the real memcpy prototype. */ |
40 | 40 | ||
41 | #if DEBUG | 41 | #if DEBUG |
42 | # include <stdio.h> | 42 | # include <stdio.h> |
@@ -55,9 +55,9 @@ | |||
55 | implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift | 55 | implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift |
56 | right in the usual way when A < 0, so SHR falls back on division if | 56 | right in the usual way when A < 0, so SHR falls back on division if |
57 | ordinary A >> B doesn't seem to be the usual signed shift. */ | 57 | ordinary A >> B doesn't seem to be the usual signed shift. */ |
58 | #define SHR(a, b) \ | 58 | #define SHR(a, b) \ |
59 | (-1 >> 1 == -1 \ | 59 | (-1 >> 1 == -1 \ |
60 | ? (a) >> (b) \ | 60 | ? (a) >> (b) \ |
61 | : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) | 61 | : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) |
62 | 62 | ||
63 | /* The extra casts in the following macros work around compiler bugs, | 63 | /* The extra casts in the following macros work around compiler bugs, |
@@ -84,14 +84,14 @@ | |||
84 | your host. */ | 84 | your host. */ |
85 | #define TYPE_MINIMUM(t) \ | 85 | #define TYPE_MINIMUM(t) \ |
86 | ((t) (! TYPE_SIGNED (t) \ | 86 | ((t) (! TYPE_SIGNED (t) \ |
87 | ? (t) 0 \ | 87 | ? (t) 0 \ |
88 | : TYPE_SIGNED_MAGNITUDE (t) \ | 88 | : TYPE_SIGNED_MAGNITUDE (t) \ |
89 | ? ~ (t) 0 \ | 89 | ? ~ (t) 0 \ |
90 | : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) | 90 | : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) |
91 | #define TYPE_MAXIMUM(t) \ | 91 | #define TYPE_MAXIMUM(t) \ |
92 | ((t) (! TYPE_SIGNED (t) \ | 92 | ((t) (! TYPE_SIGNED (t) \ |
93 | ? (t) -1 \ | 93 | ? (t) -1 \ |
94 | : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) | 94 | : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) |
95 | 95 | ||
96 | #ifndef TIME_T_MIN | 96 | #ifndef TIME_T_MIN |
97 | # define TIME_T_MIN TYPE_MINIMUM (time_t) | 97 | # define TIME_T_MIN TYPE_MINIMUM (time_t) |
@@ -123,7 +123,7 @@ leapyear (long int year) | |||
123 | return | 123 | return |
124 | ((year & 3) == 0 | 124 | ((year & 3) == 0 |
125 | && (year % 100 != 0 | 125 | && (year % 100 != 0 |
126 | || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3))); | 126 | || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3))); |
127 | } | 127 | } |
128 | 128 | ||
129 | /* How many days come before each month (0-12). */ | 129 | /* How many days come before each month (0-12). */ |
@@ -147,6 +147,7 @@ const unsigned short int __mon_yday[2][13] = | |||
147 | # undef __localtime_r | 147 | # undef __localtime_r |
148 | # define __localtime_r localtime_r | 148 | # define __localtime_r localtime_r |
149 | # define __mktime_internal mktime_internal | 149 | # define __mktime_internal mktime_internal |
150 | # include "mktime-internal.h" | ||
150 | #endif | 151 | #endif |
151 | 152 | ||
152 | /* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) - | 153 | /* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) - |
@@ -162,11 +163,14 @@ const unsigned short int __mon_yday[2][13] = | |||
162 | 163 | ||
163 | static inline time_t | 164 | static inline time_t |
164 | ydhms_diff (long int year1, long int yday1, int hour1, int min1, int sec1, | 165 | ydhms_diff (long int year1, long int yday1, int hour1, int min1, int sec1, |
165 | int year0, int yday0, int hour0, int min0, int sec0) | 166 | int year0, int yday0, int hour0, int min0, int sec0) |
166 | { | 167 | { |
167 | verify (C99_integer_division, -1 / 2 == 0); | 168 | verify (C99_integer_division, -1 / 2 == 0); |
169 | #if 0 /* This assertion fails on 32-bit systems with 64-bit time_t, such as | ||
170 | NetBSD 5 on i386. */ | ||
168 | verify (long_int_year_and_yday_are_wide_enough, | 171 | verify (long_int_year_and_yday_are_wide_enough, |
169 | INT_MAX <= LONG_MAX / 2 || TIME_T_MAX <= UINT_MAX); | 172 | INT_MAX <= LONG_MAX / 2 || TIME_T_MAX <= UINT_MAX); |
173 | #endif | ||
170 | 174 | ||
171 | /* Compute intervening leap days correctly even if year is negative. | 175 | /* Compute intervening leap days correctly even if year is negative. |
172 | Take care to avoid integer overflow here. */ | 176 | Take care to avoid integer overflow here. */ |
@@ -198,16 +202,16 @@ ydhms_diff (long int year1, long int yday1, int hour1, int min1, int sec1, | |||
198 | yield a value equal to *T. */ | 202 | yield a value equal to *T. */ |
199 | static time_t | 203 | static time_t |
200 | guess_time_tm (long int year, long int yday, int hour, int min, int sec, | 204 | guess_time_tm (long int year, long int yday, int hour, int min, int sec, |
201 | const time_t *t, const struct tm *tp) | 205 | const time_t *t, const struct tm *tp) |
202 | { | 206 | { |
203 | if (tp) | 207 | if (tp) |
204 | { | 208 | { |
205 | time_t d = ydhms_diff (year, yday, hour, min, sec, | 209 | time_t d = ydhms_diff (year, yday, hour, min, sec, |
206 | tp->tm_year, tp->tm_yday, | 210 | tp->tm_year, tp->tm_yday, |
207 | tp->tm_hour, tp->tm_min, tp->tm_sec); | 211 | tp->tm_hour, tp->tm_min, tp->tm_sec); |
208 | time_t t1 = *t + d; | 212 | time_t t1 = *t + d; |
209 | if ((t1 < *t) == (TYPE_SIGNED (time_t) ? d < 0 : TIME_T_MAX / 2 < d)) | 213 | if ((t1 < *t) == (TYPE_SIGNED (time_t) ? d < 0 : TIME_T_MAX / 2 < d)) |
210 | return t1; | 214 | return t1; |
211 | } | 215 | } |
212 | 216 | ||
213 | /* Overflow occurred one way or another. Return the nearest result | 217 | /* Overflow occurred one way or another. Return the nearest result |
@@ -216,8 +220,8 @@ guess_time_tm (long int year, long int yday, int hour, int min, int sec, | |||
216 | match; and don't oscillate between two values, as that would | 220 | match; and don't oscillate between two values, as that would |
217 | confuse the spring-forward gap detector. */ | 221 | confuse the spring-forward gap detector. */ |
218 | return (*t < TIME_T_MIDPOINT | 222 | return (*t < TIME_T_MIDPOINT |
219 | ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN) | 223 | ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN) |
220 | : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX)); | 224 | : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX)); |
221 | } | 225 | } |
222 | 226 | ||
223 | /* Use CONVERT to convert *T to a broken down time in *TP. | 227 | /* Use CONVERT to convert *T to a broken down time in *TP. |
@@ -225,7 +229,7 @@ guess_time_tm (long int year, long int yday, int hour, int min, int sec, | |||
225 | it is the nearest in-range value and then convert that. */ | 229 | it is the nearest in-range value and then convert that. */ |
226 | static struct tm * | 230 | static struct tm * |
227 | ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), | 231 | ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), |
228 | time_t *t, struct tm *tp) | 232 | time_t *t, struct tm *tp) |
229 | { | 233 | { |
230 | struct tm *r = convert (t, tp); | 234 | struct tm *r = convert (t, tp); |
231 | 235 | ||
@@ -235,27 +239,27 @@ ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), | |||
235 | time_t ok = 0; | 239 | time_t ok = 0; |
236 | 240 | ||
237 | /* BAD is a known unconvertible time_t, and OK is a known good one. | 241 | /* BAD is a known unconvertible time_t, and OK is a known good one. |
238 | Use binary search to narrow the range between BAD and OK until | 242 | Use binary search to narrow the range between BAD and OK until |
239 | they differ by 1. */ | 243 | they differ by 1. */ |
240 | while (bad != ok + (bad < 0 ? -1 : 1)) | 244 | while (bad != ok + (bad < 0 ? -1 : 1)) |
241 | { | 245 | { |
242 | time_t mid = *t = (bad < 0 | 246 | time_t mid = *t = (bad < 0 |
243 | ? bad + ((ok - bad) >> 1) | 247 | ? bad + ((ok - bad) >> 1) |
244 | : ok + ((bad - ok) >> 1)); | 248 | : ok + ((bad - ok) >> 1)); |
245 | r = convert (t, tp); | 249 | r = convert (t, tp); |
246 | if (r) | 250 | if (r) |
247 | ok = mid; | 251 | ok = mid; |
248 | else | 252 | else |
249 | bad = mid; | 253 | bad = mid; |
250 | } | 254 | } |
251 | 255 | ||
252 | if (!r && ok) | 256 | if (!r && ok) |
253 | { | 257 | { |
254 | /* The last conversion attempt failed; | 258 | /* The last conversion attempt failed; |
255 | revert to the most recent successful attempt. */ | 259 | revert to the most recent successful attempt. */ |
256 | *t = ok; | 260 | *t = ok; |
257 | r = convert (t, tp); | 261 | r = convert (t, tp); |
258 | } | 262 | } |
259 | } | 263 | } |
260 | 264 | ||
261 | return r; | 265 | return r; |
@@ -270,8 +274,8 @@ ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), | |||
270 | This function is external because it is used also by timegm.c. */ | 274 | This function is external because it is used also by timegm.c. */ |
271 | time_t | 275 | time_t |
272 | __mktime_internal (struct tm *tp, | 276 | __mktime_internal (struct tm *tp, |
273 | struct tm *(*convert) (const time_t *, struct tm *), | 277 | struct tm *(*convert) (const time_t *, struct tm *), |
274 | time_t *offset) | 278 | time_t *offset) |
275 | { | 279 | { |
276 | time_t t, gt, t0, t1, t2; | 280 | time_t t, gt, t0, t1, t2; |
277 | struct tm tm; | 281 | struct tm tm; |
@@ -292,7 +296,7 @@ __mktime_internal (struct tm *tp, | |||
292 | int year_requested = tp->tm_year; | 296 | int year_requested = tp->tm_year; |
293 | /* Normalize the value. */ | 297 | /* Normalize the value. */ |
294 | int isdst = ((tp->tm_isdst >> (8 * sizeof (tp->tm_isdst) - 1)) | 298 | int isdst = ((tp->tm_isdst >> (8 * sizeof (tp->tm_isdst) - 1)) |
295 | | (tp->tm_isdst != 0)); | 299 | | (tp->tm_isdst != 0)); |
296 | 300 | ||
297 | /* 1 if the previous probe was DST. */ | 301 | /* 1 if the previous probe was DST. */ |
298 | int dst2; | 302 | int dst2; |
@@ -312,8 +316,8 @@ __mktime_internal (struct tm *tp, | |||
312 | /* Calculate day of year from year, month, and day of month. | 316 | /* Calculate day of year from year, month, and day of month. |
313 | The result need not be in range. */ | 317 | The result need not be in range. */ |
314 | int mon_yday = ((__mon_yday[leapyear (year)] | 318 | int mon_yday = ((__mon_yday[leapyear (year)] |
315 | [mon_remainder + 12 * negative_mon_remainder]) | 319 | [mon_remainder + 12 * negative_mon_remainder]) |
316 | - 1); | 320 | - 1); |
317 | long int lmday = mday; | 321 | long int lmday = mday; |
318 | long int yday = mon_yday + lmday; | 322 | long int yday = mon_yday + lmday; |
319 | 323 | ||
@@ -324,33 +328,33 @@ __mktime_internal (struct tm *tp, | |||
324 | if (LEAP_SECONDS_POSSIBLE) | 328 | if (LEAP_SECONDS_POSSIBLE) |
325 | { | 329 | { |
326 | /* Handle out-of-range seconds specially, | 330 | /* Handle out-of-range seconds specially, |
327 | since ydhms_tm_diff assumes every minute has 60 seconds. */ | 331 | since ydhms_tm_diff assumes every minute has 60 seconds. */ |
328 | if (sec < 0) | 332 | if (sec < 0) |
329 | sec = 0; | 333 | sec = 0; |
330 | if (59 < sec) | 334 | if (59 < sec) |
331 | sec = 59; | 335 | sec = 59; |
332 | } | 336 | } |
333 | 337 | ||
334 | /* Invert CONVERT by probing. First assume the same offset as last | 338 | /* Invert CONVERT by probing. First assume the same offset as last |
335 | time. */ | 339 | time. */ |
336 | 340 | ||
337 | t0 = ydhms_diff (year, yday, hour, min, sec, | 341 | t0 = ydhms_diff (year, yday, hour, min, sec, |
338 | EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset); | 342 | EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset); |
339 | 343 | ||
340 | if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3) | 344 | if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3) |
341 | { | 345 | { |
342 | /* time_t isn't large enough to rule out overflows, so check | 346 | /* time_t isn't large enough to rule out overflows, so check |
343 | for major overflows. A gross check suffices, since if t0 | 347 | for major overflows. A gross check suffices, since if t0 |
344 | has overflowed, it is off by a multiple of TIME_T_MAX - | 348 | has overflowed, it is off by a multiple of TIME_T_MAX - |
345 | TIME_T_MIN + 1. So ignore any component of the difference | 349 | TIME_T_MIN + 1. So ignore any component of the difference |
346 | that is bounded by a small value. */ | 350 | that is bounded by a small value. */ |
347 | 351 | ||
348 | /* Approximate log base 2 of the number of time units per | 352 | /* Approximate log base 2 of the number of time units per |
349 | biennium. A biennium is 2 years; use this unit instead of | 353 | biennium. A biennium is 2 years; use this unit instead of |
350 | years to avoid integer overflow. For example, 2 average | 354 | years to avoid integer overflow. For example, 2 average |
351 | Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds, | 355 | Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds, |
352 | which is 63113904 seconds, and rint (log2 (63113904)) is | 356 | which is 63113904 seconds, and rint (log2 (63113904)) is |
353 | 26. */ | 357 | 26. */ |
354 | int ALOG2_SECONDS_PER_BIENNIUM = 26; | 358 | int ALOG2_SECONDS_PER_BIENNIUM = 26; |
355 | int ALOG2_MINUTES_PER_BIENNIUM = 20; | 359 | int ALOG2_MINUTES_PER_BIENNIUM = 20; |
356 | int ALOG2_HOURS_PER_BIENNIUM = 14; | 360 | int ALOG2_HOURS_PER_BIENNIUM = 14; |
@@ -358,64 +362,64 @@ __mktime_internal (struct tm *tp, | |||
358 | int LOG2_YEARS_PER_BIENNIUM = 1; | 362 | int LOG2_YEARS_PER_BIENNIUM = 1; |
359 | 363 | ||
360 | int approx_requested_biennia = | 364 | int approx_requested_biennia = |
361 | (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM) | 365 | (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM) |
362 | - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM) | 366 | - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM) |
363 | + SHR (mday, ALOG2_DAYS_PER_BIENNIUM) | 367 | + SHR (mday, ALOG2_DAYS_PER_BIENNIUM) |
364 | + SHR (hour, ALOG2_HOURS_PER_BIENNIUM) | 368 | + SHR (hour, ALOG2_HOURS_PER_BIENNIUM) |
365 | + SHR (min, ALOG2_MINUTES_PER_BIENNIUM) | 369 | + SHR (min, ALOG2_MINUTES_PER_BIENNIUM) |
366 | + (LEAP_SECONDS_POSSIBLE | 370 | + (LEAP_SECONDS_POSSIBLE |
367 | ? 0 | 371 | ? 0 |
368 | : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM))); | 372 | : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM))); |
369 | 373 | ||
370 | int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM); | 374 | int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM); |
371 | int diff = approx_biennia - approx_requested_biennia; | 375 | int diff = approx_biennia - approx_requested_biennia; |
372 | int abs_diff = diff < 0 ? - diff : diff; | 376 | int abs_diff = diff < 0 ? - diff : diff; |
373 | 377 | ||
374 | /* IRIX 4.0.5 cc miscaculates TIME_T_MIN / 3: it erroneously | 378 | /* IRIX 4.0.5 cc miscaculates TIME_T_MIN / 3: it erroneously |
375 | gives a positive value of 715827882. Setting a variable | 379 | gives a positive value of 715827882. Setting a variable |
376 | first then doing math on it seems to work. | 380 | first then doing math on it seems to work. |
377 | (ghazi@caip.rutgers.edu) */ | 381 | (ghazi@caip.rutgers.edu) */ |
378 | time_t time_t_max = TIME_T_MAX; | 382 | time_t time_t_max = TIME_T_MAX; |
379 | time_t time_t_min = TIME_T_MIN; | 383 | time_t time_t_min = TIME_T_MIN; |
380 | time_t overflow_threshold = | 384 | time_t overflow_threshold = |
381 | (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM; | 385 | (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM; |
382 | 386 | ||
383 | if (overflow_threshold < abs_diff) | 387 | if (overflow_threshold < abs_diff) |
384 | { | 388 | { |
385 | /* Overflow occurred. Try repairing it; this might work if | 389 | /* Overflow occurred. Try repairing it; this might work if |
386 | the time zone offset is enough to undo the overflow. */ | 390 | the time zone offset is enough to undo the overflow. */ |
387 | time_t repaired_t0 = -1 - t0; | 391 | time_t repaired_t0 = -1 - t0; |
388 | approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM); | 392 | approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM); |
389 | diff = approx_biennia - approx_requested_biennia; | 393 | diff = approx_biennia - approx_requested_biennia; |
390 | abs_diff = diff < 0 ? - diff : diff; | 394 | abs_diff = diff < 0 ? - diff : diff; |
391 | if (overflow_threshold < abs_diff) | 395 | if (overflow_threshold < abs_diff) |
392 | return -1; | 396 | return -1; |
393 | guessed_offset += repaired_t0 - t0; | 397 | guessed_offset += repaired_t0 - t0; |
394 | t0 = repaired_t0; | 398 | t0 = repaired_t0; |
395 | } | 399 | } |
396 | } | 400 | } |
397 | 401 | ||
398 | /* Repeatedly use the error to improve the guess. */ | 402 | /* Repeatedly use the error to improve the guess. */ |
399 | 403 | ||
400 | for (t = t1 = t2 = t0, dst2 = 0; | 404 | for (t = t1 = t2 = t0, dst2 = 0; |
401 | (gt = guess_time_tm (year, yday, hour, min, sec, &t, | 405 | (gt = guess_time_tm (year, yday, hour, min, sec, &t, |
402 | ranged_convert (convert, &t, &tm)), | 406 | ranged_convert (convert, &t, &tm)), |
403 | t != gt); | 407 | t != gt); |
404 | t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0) | 408 | t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0) |
405 | if (t == t1 && t != t2 | 409 | if (t == t1 && t != t2 |
406 | && (tm.tm_isdst < 0 | 410 | && (tm.tm_isdst < 0 |
407 | || (isdst < 0 | 411 | || (isdst < 0 |
408 | ? dst2 <= (tm.tm_isdst != 0) | 412 | ? dst2 <= (tm.tm_isdst != 0) |
409 | : (isdst != 0) != (tm.tm_isdst != 0)))) | 413 | : (isdst != 0) != (tm.tm_isdst != 0)))) |
410 | /* We can't possibly find a match, as we are oscillating | 414 | /* We can't possibly find a match, as we are oscillating |
411 | between two values. The requested time probably falls | 415 | between two values. The requested time probably falls |
412 | within a spring-forward gap of size GT - T. Follow the common | 416 | within a spring-forward gap of size GT - T. Follow the common |
413 | practice in this case, which is to return a time that is GT - T | 417 | practice in this case, which is to return a time that is GT - T |
414 | away from the requested time, preferring a time whose | 418 | away from the requested time, preferring a time whose |
415 | tm_isdst differs from the requested value. (If no tm_isdst | 419 | tm_isdst differs from the requested value. (If no tm_isdst |
416 | was requested and only one of the two values has a nonzero | 420 | was requested and only one of the two values has a nonzero |
417 | tm_isdst, prefer that value.) In practice, this is more | 421 | tm_isdst, prefer that value.) In practice, this is more |
418 | useful than returning -1. */ | 422 | useful than returning -1. */ |
419 | goto offset_found; | 423 | goto offset_found; |
420 | else if (--remaining_probes == 0) | 424 | else if (--remaining_probes == 0) |
421 | return -1; | 425 | return -1; |
@@ -425,52 +429,52 @@ __mktime_internal (struct tm *tp, | |||
425 | if (isdst != tm.tm_isdst && 0 <= isdst && 0 <= tm.tm_isdst) | 429 | if (isdst != tm.tm_isdst && 0 <= isdst && 0 <= tm.tm_isdst) |
426 | { | 430 | { |
427 | /* tm.tm_isdst has the wrong value. Look for a neighboring | 431 | /* tm.tm_isdst has the wrong value. Look for a neighboring |
428 | time with the right value, and use its UTC offset. | 432 | time with the right value, and use its UTC offset. |
429 | 433 | ||
430 | Heuristic: probe the adjacent timestamps in both directions, | 434 | Heuristic: probe the adjacent timestamps in both directions, |
431 | looking for the desired isdst. This should work for all real | 435 | looking for the desired isdst. This should work for all real |
432 | time zone histories in the tz database. */ | 436 | time zone histories in the tz database. */ |
433 | 437 | ||
434 | /* Distance between probes when looking for a DST boundary. In | 438 | /* Distance between probes when looking for a DST boundary. In |
435 | tzdata2003a, the shortest period of DST is 601200 seconds | 439 | tzdata2003a, the shortest period of DST is 601200 seconds |
436 | (e.g., America/Recife starting 2000-10-08 01:00), and the | 440 | (e.g., America/Recife starting 2000-10-08 01:00), and the |
437 | shortest period of non-DST surrounded by DST is 694800 | 441 | shortest period of non-DST surrounded by DST is 694800 |
438 | seconds (Africa/Tunis starting 1943-04-17 01:00). Use the | 442 | seconds (Africa/Tunis starting 1943-04-17 01:00). Use the |
439 | minimum of these two values, so we don't miss these short | 443 | minimum of these two values, so we don't miss these short |
440 | periods when probing. */ | 444 | periods when probing. */ |
441 | int stride = 601200; | 445 | int stride = 601200; |
442 | 446 | ||
443 | /* The longest period of DST in tzdata2003a is 536454000 seconds | 447 | /* The longest period of DST in tzdata2003a is 536454000 seconds |
444 | (e.g., America/Jujuy starting 1946-10-01 01:00). The longest | 448 | (e.g., America/Jujuy starting 1946-10-01 01:00). The longest |
445 | period of non-DST is much longer, but it makes no real sense | 449 | period of non-DST is much longer, but it makes no real sense |
446 | to search for more than a year of non-DST, so use the DST | 450 | to search for more than a year of non-DST, so use the DST |
447 | max. */ | 451 | max. */ |
448 | int duration_max = 536454000; | 452 | int duration_max = 536454000; |
449 | 453 | ||
450 | /* Search in both directions, so the maximum distance is half | 454 | /* Search in both directions, so the maximum distance is half |
451 | the duration; add the stride to avoid off-by-1 problems. */ | 455 | the duration; add the stride to avoid off-by-1 problems. */ |
452 | int delta_bound = duration_max / 2 + stride; | 456 | int delta_bound = duration_max / 2 + stride; |
453 | 457 | ||
454 | int delta, direction; | 458 | int delta, direction; |
455 | 459 | ||
456 | for (delta = stride; delta < delta_bound; delta += stride) | 460 | for (delta = stride; delta < delta_bound; delta += stride) |
457 | for (direction = -1; direction <= 1; direction += 2) | 461 | for (direction = -1; direction <= 1; direction += 2) |
458 | { | 462 | { |
459 | time_t ot = t + delta * direction; | 463 | time_t ot = t + delta * direction; |
460 | if ((ot < t) == (direction < 0)) | 464 | if ((ot < t) == (direction < 0)) |
461 | { | 465 | { |
462 | struct tm otm; | 466 | struct tm otm; |
463 | ranged_convert (convert, &ot, &otm); | 467 | ranged_convert (convert, &ot, &otm); |
464 | if (otm.tm_isdst == isdst) | 468 | if (otm.tm_isdst == isdst) |
465 | { | 469 | { |
466 | /* We found the desired tm_isdst. | 470 | /* We found the desired tm_isdst. |
467 | Extrapolate back to the desired time. */ | 471 | Extrapolate back to the desired time. */ |
468 | t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm); | 472 | t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm); |
469 | ranged_convert (convert, &t, &tm); | 473 | ranged_convert (convert, &t, &tm); |
470 | goto offset_found; | 474 | goto offset_found; |
471 | } | 475 | } |
472 | } | 476 | } |
473 | } | 477 | } |
474 | } | 478 | } |
475 | 479 | ||
476 | offset_found: | 480 | offset_found: |
@@ -479,14 +483,14 @@ __mktime_internal (struct tm *tp, | |||
479 | if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec) | 483 | if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec) |
480 | { | 484 | { |
481 | /* Adjust time to reflect the tm_sec requested, not the normalized value. | 485 | /* Adjust time to reflect the tm_sec requested, not the normalized value. |
482 | Also, repair any damage from a false match due to a leap second. */ | 486 | Also, repair any damage from a false match due to a leap second. */ |
483 | int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec; | 487 | int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec; |
484 | t1 = t + sec_requested; | 488 | t1 = t + sec_requested; |
485 | t2 = t1 + sec_adjustment; | 489 | t2 = t1 + sec_adjustment; |
486 | if (((t1 < t) != (sec_requested < 0)) | 490 | if (((t1 < t) != (sec_requested < 0)) |
487 | | ((t2 < t1) != (sec_adjustment < 0)) | 491 | | ((t2 < t1) != (sec_adjustment < 0)) |
488 | | ! convert (&t2, &tm)) | 492 | | ! convert (&t2, &tm)) |
489 | return -1; | 493 | return -1; |
490 | t = t2; | 494 | t = t2; |
491 | } | 495 | } |
492 | 496 | ||
@@ -530,13 +534,13 @@ static int | |||
530 | not_equal_tm (const struct tm *a, const struct tm *b) | 534 | not_equal_tm (const struct tm *a, const struct tm *b) |
531 | { | 535 | { |
532 | return ((a->tm_sec ^ b->tm_sec) | 536 | return ((a->tm_sec ^ b->tm_sec) |
533 | | (a->tm_min ^ b->tm_min) | 537 | | (a->tm_min ^ b->tm_min) |
534 | | (a->tm_hour ^ b->tm_hour) | 538 | | (a->tm_hour ^ b->tm_hour) |
535 | | (a->tm_mday ^ b->tm_mday) | 539 | | (a->tm_mday ^ b->tm_mday) |
536 | | (a->tm_mon ^ b->tm_mon) | 540 | | (a->tm_mon ^ b->tm_mon) |
537 | | (a->tm_year ^ b->tm_year) | 541 | | (a->tm_year ^ b->tm_year) |
538 | | (a->tm_yday ^ b->tm_yday) | 542 | | (a->tm_yday ^ b->tm_yday) |
539 | | (a->tm_isdst ^ b->tm_isdst)); | 543 | | (a->tm_isdst ^ b->tm_isdst)); |
540 | } | 544 | } |
541 | 545 | ||
542 | static void | 546 | static void |
@@ -544,9 +548,9 @@ print_tm (const struct tm *tp) | |||
544 | { | 548 | { |
545 | if (tp) | 549 | if (tp) |
546 | printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d", | 550 | printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d", |
547 | tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday, | 551 | tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday, |
548 | tp->tm_hour, tp->tm_min, tp->tm_sec, | 552 | tp->tm_hour, tp->tm_min, tp->tm_sec, |
549 | tp->tm_yday, tp->tm_wday, tp->tm_isdst); | 553 | tp->tm_yday, tp->tm_wday, tp->tm_isdst); |
550 | else | 554 | else |
551 | printf ("0"); | 555 | printf ("0"); |
552 | } | 556 | } |
@@ -578,11 +582,11 @@ main (int argc, char **argv) | |||
578 | 582 | ||
579 | if ((argc == 3 || argc == 4) | 583 | if ((argc == 3 || argc == 4) |
580 | && (sscanf (argv[1], "%d-%d-%d%c", | 584 | && (sscanf (argv[1], "%d-%d-%d%c", |
581 | &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer) | 585 | &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer) |
582 | == 3) | 586 | == 3) |
583 | && (sscanf (argv[2], "%d:%d:%d%c", | 587 | && (sscanf (argv[2], "%d:%d:%d%c", |
584 | &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer) | 588 | &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer) |
585 | == 3)) | 589 | == 3)) |
586 | { | 590 | { |
587 | tm.tm_year -= TM_YEAR_BASE; | 591 | tm.tm_year -= TM_YEAR_BASE; |
588 | tm.tm_mon--; | 592 | tm.tm_mon--; |
@@ -591,10 +595,10 @@ main (int argc, char **argv) | |||
591 | tl = mktime (&tmk); | 595 | tl = mktime (&tmk); |
592 | lt = localtime (&tl); | 596 | lt = localtime (&tl); |
593 | if (lt) | 597 | if (lt) |
594 | { | 598 | { |
595 | tml = *lt; | 599 | tml = *lt; |
596 | lt = &tml; | 600 | lt = &tml; |
597 | } | 601 | } |
598 | printf ("mktime returns %ld == ", (long int) tl); | 602 | printf ("mktime returns %ld == ", (long int) tl); |
599 | print_tm (&tmk); | 603 | print_tm (&tmk); |
600 | printf ("\n"); | 604 | printf ("\n"); |
@@ -607,51 +611,51 @@ main (int argc, char **argv) | |||
607 | time_t to = atol (argv[3]); | 611 | time_t to = atol (argv[3]); |
608 | 612 | ||
609 | if (argc == 4) | 613 | if (argc == 4) |
610 | for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) | 614 | for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) |
611 | { | 615 | { |
612 | lt = localtime (&tl); | 616 | lt = localtime (&tl); |
613 | if (lt) | 617 | if (lt) |
614 | { | 618 | { |
615 | tmk = tml = *lt; | 619 | tmk = tml = *lt; |
616 | tk = mktime (&tmk); | 620 | tk = mktime (&tmk); |
617 | status |= check_result (tk, tmk, tl, &tml); | 621 | status |= check_result (tk, tmk, tl, &tml); |
618 | } | 622 | } |
619 | else | 623 | else |
620 | { | 624 | { |
621 | printf ("localtime (%ld) yields 0\n", (long int) tl); | 625 | printf ("localtime (%ld) yields 0\n", (long int) tl); |
622 | status = 1; | 626 | status = 1; |
623 | } | 627 | } |
624 | tl1 = tl + by; | 628 | tl1 = tl + by; |
625 | if ((tl1 < tl) != (by < 0)) | 629 | if ((tl1 < tl) != (by < 0)) |
626 | break; | 630 | break; |
627 | } | 631 | } |
628 | else | 632 | else |
629 | for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) | 633 | for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) |
630 | { | 634 | { |
631 | /* Null benchmark. */ | 635 | /* Null benchmark. */ |
632 | lt = localtime (&tl); | 636 | lt = localtime (&tl); |
633 | if (lt) | 637 | if (lt) |
634 | { | 638 | { |
635 | tmk = tml = *lt; | 639 | tmk = tml = *lt; |
636 | tk = tl; | 640 | tk = tl; |
637 | status |= check_result (tk, tmk, tl, &tml); | 641 | status |= check_result (tk, tmk, tl, &tml); |
638 | } | 642 | } |
639 | else | 643 | else |
640 | { | 644 | { |
641 | printf ("localtime (%ld) yields 0\n", (long int) tl); | 645 | printf ("localtime (%ld) yields 0\n", (long int) tl); |
642 | status = 1; | 646 | status = 1; |
643 | } | 647 | } |
644 | tl1 = tl + by; | 648 | tl1 = tl + by; |
645 | if ((tl1 < tl) != (by < 0)) | 649 | if ((tl1 < tl) != (by < 0)) |
646 | break; | 650 | break; |
647 | } | 651 | } |
648 | } | 652 | } |
649 | else | 653 | else |
650 | printf ("Usage:\ | 654 | printf ("Usage:\ |
651 | \t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\ | 655 | \t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\ |
652 | \t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\ | 656 | \t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\ |
653 | \t%s FROM BY TO - # Do not test those values (for benchmark).\n", | 657 | \t%s FROM BY TO - # Do not test those values (for benchmark).\n", |
654 | argv[0], argv[0], argv[0]); | 658 | argv[0], argv[0], argv[0]); |
655 | 659 | ||
656 | return status; | 660 | return status; |
657 | } | 661 | } |
diff --git a/gl/mountlist.c b/gl/mountlist.c index 50e90eed..996b71a1 100644 --- a/gl/mountlist.c +++ b/gl/mountlist.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* mountlist.c -- return a list of mounted file systems | 1 | /* mountlist.c -- return a list of mounted file systems |
2 | 2 | ||
3 | Copyright (C) 1991, 1992, 1997-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 1991-1992, 1997-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -37,10 +37,10 @@ | |||
37 | # include <sys/param.h> | 37 | # include <sys/param.h> |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | #if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */ | 40 | #if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */ |
41 | # if HAVE_SYS_UCRED_H | 41 | # if HAVE_SYS_UCRED_H |
42 | # include <grp.h> /* needed on OSF V4.0 for definition of NGROUPS, | 42 | # include <grp.h> /* needed on OSF V4.0 for definition of NGROUPS, |
43 | NGROUPS is used as an array dimension in ucred.h */ | 43 | NGROUPS is used as an array dimension in ucred.h */ |
44 | # include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */ | 44 | # include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */ |
45 | # endif | 45 | # endif |
46 | # if HAVE_SYS_MOUNT_H | 46 | # if HAVE_SYS_MOUNT_H |
@@ -56,44 +56,44 @@ | |||
56 | # endif | 56 | # endif |
57 | #endif /* MOUNTED_GETFSSTAT */ | 57 | #endif /* MOUNTED_GETFSSTAT */ |
58 | 58 | ||
59 | #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ | 59 | #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ |
60 | # include <mntent.h> | 60 | # include <mntent.h> |
61 | # if !defined MOUNTED | 61 | # if !defined MOUNTED |
62 | # if defined _PATH_MOUNTED /* GNU libc */ | 62 | # if defined _PATH_MOUNTED /* GNU libc */ |
63 | # define MOUNTED _PATH_MOUNTED | 63 | # define MOUNTED _PATH_MOUNTED |
64 | # endif | 64 | # endif |
65 | # if defined MNT_MNTTAB /* HP-UX. */ | 65 | # if defined MNT_MNTTAB /* HP-UX. */ |
66 | # define MOUNTED MNT_MNTTAB | 66 | # define MOUNTED MNT_MNTTAB |
67 | # endif | 67 | # endif |
68 | # if defined MNTTABNAME /* Dynix. */ | 68 | # if defined MNTTABNAME /* Dynix. */ |
69 | # define MOUNTED MNTTABNAME | 69 | # define MOUNTED MNTTABNAME |
70 | # endif | 70 | # endif |
71 | # endif | 71 | # endif |
72 | #endif | 72 | #endif |
73 | 73 | ||
74 | #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ | 74 | #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ |
75 | # include <sys/mount.h> | 75 | # include <sys/mount.h> |
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | #ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */ | 78 | #ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */ |
79 | # include <sys/statvfs.h> | 79 | # include <sys/statvfs.h> |
80 | #endif | 80 | #endif |
81 | 81 | ||
82 | #ifdef MOUNTED_GETMNT /* Ultrix. */ | 82 | #ifdef MOUNTED_GETMNT /* Ultrix. */ |
83 | # include <sys/mount.h> | 83 | # include <sys/mount.h> |
84 | # include <sys/fs_types.h> | 84 | # include <sys/fs_types.h> |
85 | #endif | 85 | #endif |
86 | 86 | ||
87 | #ifdef MOUNTED_FS_STAT_DEV /* BeOS. */ | 87 | #ifdef MOUNTED_FS_STAT_DEV /* BeOS. */ |
88 | # include <fs_info.h> | 88 | # include <fs_info.h> |
89 | # include <dirent.h> | 89 | # include <dirent.h> |
90 | #endif | 90 | #endif |
91 | 91 | ||
92 | #ifdef MOUNTED_FREAD /* SVR2. */ | 92 | #ifdef MOUNTED_FREAD /* SVR2. */ |
93 | # include <mnttab.h> | 93 | # include <mnttab.h> |
94 | #endif | 94 | #endif |
95 | 95 | ||
96 | #ifdef MOUNTED_FREAD_FSTYP /* SVR3. */ | 96 | #ifdef MOUNTED_FREAD_FSTYP /* SVR3. */ |
97 | # include <mnttab.h> | 97 | # include <mnttab.h> |
98 | # include <sys/fstyp.h> | 98 | # include <sys/fstyp.h> |
99 | # include <sys/statfs.h> | 99 | # include <sys/statfs.h> |
@@ -103,11 +103,11 @@ | |||
103 | # include <mntent.h> | 103 | # include <mntent.h> |
104 | #endif | 104 | #endif |
105 | 105 | ||
106 | #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ | 106 | #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ |
107 | # include <sys/mnttab.h> | 107 | # include <sys/mnttab.h> |
108 | #endif | 108 | #endif |
109 | 109 | ||
110 | #ifdef MOUNTED_VMOUNT /* AIX. */ | 110 | #ifdef MOUNTED_VMOUNT /* AIX. */ |
111 | # include <fshelp.h> | 111 | # include <fshelp.h> |
112 | # include <sys/vfs.h> | 112 | # include <sys/vfs.h> |
113 | #endif | 113 | #endif |
@@ -125,7 +125,7 @@ | |||
125 | 125 | ||
126 | #undef MNT_IGNORE | 126 | #undef MNT_IGNORE |
127 | #if defined MNTOPT_IGNORE && defined HAVE_HASMNTOPT | 127 | #if defined MNTOPT_IGNORE && defined HAVE_HASMNTOPT |
128 | # define MNT_IGNORE(M) hasmntopt ((M), MNTOPT_IGNORE) | 128 | # define MNT_IGNORE(M) hasmntopt (M, MNTOPT_IGNORE) |
129 | #else | 129 | #else |
130 | # define MNT_IGNORE(M) 0 | 130 | # define MNT_IGNORE(M) 0 |
131 | #endif | 131 | #endif |
@@ -145,26 +145,26 @@ | |||
145 | #undef closedir | 145 | #undef closedir |
146 | 146 | ||
147 | #ifndef ME_DUMMY | 147 | #ifndef ME_DUMMY |
148 | # define ME_DUMMY(Fs_name, Fs_type) \ | 148 | # define ME_DUMMY(Fs_name, Fs_type) \ |
149 | (strcmp (Fs_type, "autofs") == 0 \ | 149 | (strcmp (Fs_type, "autofs") == 0 \ |
150 | || strcmp (Fs_type, "none") == 0 \ | 150 | || strcmp (Fs_type, "none") == 0 \ |
151 | || strcmp (Fs_type, "proc") == 0 \ | 151 | || strcmp (Fs_type, "proc") == 0 \ |
152 | || strcmp (Fs_type, "subfs") == 0 \ | 152 | || strcmp (Fs_type, "subfs") == 0 \ |
153 | /* for NetBSD 3.0 */ \ | 153 | /* for NetBSD 3.0 */ \ |
154 | || strcmp (Fs_type, "kernfs") == 0 \ | 154 | || strcmp (Fs_type, "kernfs") == 0 \ |
155 | /* for Irix 6.5 */ \ | 155 | /* for Irix 6.5 */ \ |
156 | || strcmp (Fs_type, "ignore") == 0) | 156 | || strcmp (Fs_type, "ignore") == 0) |
157 | #endif | 157 | #endif |
158 | 158 | ||
159 | #ifndef ME_REMOTE | 159 | #ifndef ME_REMOTE |
160 | /* A file system is `remote' if its Fs_name contains a `:' | 160 | /* A file system is `remote' if its Fs_name contains a `:' |
161 | or if (it is of type (smbfs or cifs) and its Fs_name starts with `//'). */ | 161 | or if (it is of type (smbfs or cifs) and its Fs_name starts with `//'). */ |
162 | # define ME_REMOTE(Fs_name, Fs_type) \ | 162 | # define ME_REMOTE(Fs_name, Fs_type) \ |
163 | (strchr (Fs_name, ':') != NULL \ | 163 | (strchr (Fs_name, ':') != NULL \ |
164 | || ((Fs_name)[0] == '/' \ | 164 | || ((Fs_name)[0] == '/' \ |
165 | && (Fs_name)[1] == '/' \ | 165 | && (Fs_name)[1] == '/' \ |
166 | && (strcmp (Fs_type, "smbfs") == 0 \ | 166 | && (strcmp (Fs_type, "smbfs") == 0 \ |
167 | || strcmp (Fs_type, "cifs") == 0))) | 167 | || strcmp (Fs_type, "cifs") == 0))) |
168 | #endif | 168 | #endif |
169 | 169 | ||
170 | #if MOUNTED_GETMNTINFO | 170 | #if MOUNTED_GETMNTINFO |
@@ -277,7 +277,7 @@ fsp_to_string (const struct statfs *fsp) | |||
277 | 277 | ||
278 | #endif /* MOUNTED_GETMNTINFO */ | 278 | #endif /* MOUNTED_GETMNTINFO */ |
279 | 279 | ||
280 | #ifdef MOUNTED_VMOUNT /* AIX. */ | 280 | #ifdef MOUNTED_VMOUNT /* AIX. */ |
281 | static char * | 281 | static char * |
282 | fstype_to_string (int t) | 282 | fstype_to_string (int t) |
283 | { | 283 | { |
@@ -315,10 +315,10 @@ dev_from_mount_options (char const *mount_options) | |||
315 | errno = 0; | 315 | errno = 0; |
316 | dev = strtoul (optval, &optvalend, 16); | 316 | dev = strtoul (optval, &optvalend, 16); |
317 | if (optval != optvalend | 317 | if (optval != optvalend |
318 | && (*optvalend == '\0' || *optvalend == ',') | 318 | && (*optvalend == '\0' || *optvalend == ',') |
319 | && ! (dev == ULONG_MAX && errno == ERANGE) | 319 | && ! (dev == ULONG_MAX && errno == ERANGE) |
320 | && dev == (dev_t) dev) | 320 | && dev == (dev_t) dev) |
321 | return dev; | 321 | return dev; |
322 | } | 322 | } |
323 | 323 | ||
324 | # endif | 324 | # endif |
@@ -383,18 +383,18 @@ read_file_system_list (bool need_fs_type) | |||
383 | 383 | ||
384 | while ((mnt = getmntent (fp))) | 384 | while ((mnt = getmntent (fp))) |
385 | { | 385 | { |
386 | me = xmalloc (sizeof *me); | 386 | me = xmalloc (sizeof *me); |
387 | me->me_devname = xstrdup (mnt->mnt_fsname); | 387 | me->me_devname = xstrdup (mnt->mnt_fsname); |
388 | me->me_mountdir = xstrdup (mnt->mnt_dir); | 388 | me->me_mountdir = xstrdup (mnt->mnt_dir); |
389 | me->me_type = xstrdup (mnt->mnt_type); | 389 | me->me_type = xstrdup (mnt->mnt_type); |
390 | me->me_type_malloced = 1; | 390 | me->me_type_malloced = 1; |
391 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 391 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
392 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 392 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
393 | me->me_dev = dev_from_mount_options (mnt->mnt_opts); | 393 | me->me_dev = dev_from_mount_options (mnt->mnt_opts); |
394 | 394 | ||
395 | /* Add to the linked list. */ | 395 | /* Add to the linked list. */ |
396 | *mtail = me; | 396 | *mtail = me; |
397 | mtail = &me->me_next; | 397 | mtail = &me->me_next; |
398 | } | 398 | } |
399 | 399 | ||
400 | if (endmntent (fp) == 0) | 400 | if (endmntent (fp) == 0) |
@@ -402,7 +402,7 @@ read_file_system_list (bool need_fs_type) | |||
402 | } | 402 | } |
403 | #endif /* MOUNTED_GETMNTENT1. */ | 403 | #endif /* MOUNTED_GETMNTENT1. */ |
404 | 404 | ||
405 | #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ | 405 | #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ |
406 | { | 406 | { |
407 | struct statfs *fsp; | 407 | struct statfs *fsp; |
408 | int entries; | 408 | int entries; |
@@ -412,25 +412,25 @@ read_file_system_list (bool need_fs_type) | |||
412 | return NULL; | 412 | return NULL; |
413 | for (; entries-- > 0; fsp++) | 413 | for (; entries-- > 0; fsp++) |
414 | { | 414 | { |
415 | char *fs_type = fsp_to_string (fsp); | 415 | char *fs_type = fsp_to_string (fsp); |
416 | 416 | ||
417 | me = xmalloc (sizeof *me); | 417 | me = xmalloc (sizeof *me); |
418 | me->me_devname = xstrdup (fsp->f_mntfromname); | 418 | me->me_devname = xstrdup (fsp->f_mntfromname); |
419 | me->me_mountdir = xstrdup (fsp->f_mntonname); | 419 | me->me_mountdir = xstrdup (fsp->f_mntonname); |
420 | me->me_type = fs_type; | 420 | me->me_type = fs_type; |
421 | me->me_type_malloced = 0; | 421 | me->me_type_malloced = 0; |
422 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 422 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
423 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 423 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
424 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ | 424 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
425 | 425 | ||
426 | /* Add to the linked list. */ | 426 | /* Add to the linked list. */ |
427 | *mtail = me; | 427 | *mtail = me; |
428 | mtail = &me->me_next; | 428 | mtail = &me->me_next; |
429 | } | 429 | } |
430 | } | 430 | } |
431 | #endif /* MOUNTED_GETMNTINFO */ | 431 | #endif /* MOUNTED_GETMNTINFO */ |
432 | 432 | ||
433 | #ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */ | 433 | #ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */ |
434 | { | 434 | { |
435 | struct statvfs *fsp; | 435 | struct statvfs *fsp; |
436 | int entries; | 436 | int entries; |
@@ -440,44 +440,44 @@ read_file_system_list (bool need_fs_type) | |||
440 | return NULL; | 440 | return NULL; |
441 | for (; entries-- > 0; fsp++) | 441 | for (; entries-- > 0; fsp++) |
442 | { | 442 | { |
443 | me = xmalloc (sizeof *me); | 443 | me = xmalloc (sizeof *me); |
444 | me->me_devname = xstrdup (fsp->f_mntfromname); | 444 | me->me_devname = xstrdup (fsp->f_mntfromname); |
445 | me->me_mountdir = xstrdup (fsp->f_mntonname); | 445 | me->me_mountdir = xstrdup (fsp->f_mntonname); |
446 | me->me_type = xstrdup (fsp->f_fstypename); | 446 | me->me_type = xstrdup (fsp->f_fstypename); |
447 | me->me_type_malloced = 1; | 447 | me->me_type_malloced = 1; |
448 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 448 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
449 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 449 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
450 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ | 450 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
451 | 451 | ||
452 | /* Add to the linked list. */ | 452 | /* Add to the linked list. */ |
453 | *mtail = me; | 453 | *mtail = me; |
454 | mtail = &me->me_next; | 454 | mtail = &me->me_next; |
455 | } | 455 | } |
456 | } | 456 | } |
457 | #endif /* MOUNTED_GETMNTINFO2 */ | 457 | #endif /* MOUNTED_GETMNTINFO2 */ |
458 | 458 | ||
459 | #ifdef MOUNTED_GETMNT /* Ultrix. */ | 459 | #ifdef MOUNTED_GETMNT /* Ultrix. */ |
460 | { | 460 | { |
461 | int offset = 0; | 461 | int offset = 0; |
462 | int val; | 462 | int val; |
463 | struct fs_data fsd; | 463 | struct fs_data fsd; |
464 | 464 | ||
465 | while (errno = 0, | 465 | while (errno = 0, |
466 | 0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY, | 466 | 0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY, |
467 | (char *) 0))) | 467 | (char *) 0))) |
468 | { | 468 | { |
469 | me = xmalloc (sizeof *me); | 469 | me = xmalloc (sizeof *me); |
470 | me->me_devname = xstrdup (fsd.fd_req.devname); | 470 | me->me_devname = xstrdup (fsd.fd_req.devname); |
471 | me->me_mountdir = xstrdup (fsd.fd_req.path); | 471 | me->me_mountdir = xstrdup (fsd.fd_req.path); |
472 | me->me_type = gt_names[fsd.fd_req.fstype]; | 472 | me->me_type = gt_names[fsd.fd_req.fstype]; |
473 | me->me_type_malloced = 0; | 473 | me->me_type_malloced = 0; |
474 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 474 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
475 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 475 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
476 | me->me_dev = fsd.fd_req.dev; | 476 | me->me_dev = fsd.fd_req.dev; |
477 | 477 | ||
478 | /* Add to the linked list. */ | 478 | /* Add to the linked list. */ |
479 | *mtail = me; | 479 | *mtail = me; |
480 | mtail = &me->me_next; | 480 | mtail = &me->me_next; |
481 | } | 481 | } |
482 | if (val < 0) | 482 | if (val < 0) |
483 | goto free_then_fail; | 483 | goto free_then_fail; |
@@ -537,7 +537,7 @@ read_file_system_list (bool need_fs_type) | |||
537 | 537 | ||
538 | if (lstat (name, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode)) | 538 | if (lstat (name, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode)) |
539 | { | 539 | { |
540 | struct rootdir_entry *re = xmalloc (sizeof *re); | 540 | struct rootdir_entry *re = xmalloc (sizeof *re); |
541 | re->name = name; | 541 | re->name = name; |
542 | re->dev = statbuf.st_dev; | 542 | re->dev = statbuf.st_dev; |
543 | re->ino = statbuf.st_ino; | 543 | re->ino = statbuf.st_ino; |
@@ -563,11 +563,11 @@ read_file_system_list (bool need_fs_type) | |||
563 | if (re->dev == fi.dev && re->ino == fi.root) | 563 | if (re->dev == fi.dev && re->ino == fi.root) |
564 | break; | 564 | break; |
565 | 565 | ||
566 | me = xmalloc (sizeof *me); | 566 | me = xmalloc (sizeof *me); |
567 | me->me_devname = xstrdup (fi.device_name[0] != '\0' ? fi.device_name : fi.fsh_name); | 567 | me->me_devname = xstrdup (fi.device_name[0] != '\0' ? fi.device_name : fi.fsh_name); |
568 | me->me_mountdir = xstrdup (re != NULL ? re->name : fi.fsh_name); | 568 | me->me_mountdir = xstrdup (re != NULL ? re->name : fi.fsh_name); |
569 | me->me_type = xstrdup (fi.fsh_name); | 569 | me->me_type = xstrdup (fi.fsh_name); |
570 | me->me_type_malloced = 1; | 570 | me->me_type_malloced = 1; |
571 | me->me_dev = fi.dev; | 571 | me->me_dev = fi.dev; |
572 | me->me_dummy = 0; | 572 | me->me_dummy = 0; |
573 | me->me_remote = (fi.flags & B_FS_IS_SHARED) != 0; | 573 | me->me_remote = (fi.flags & B_FS_IS_SHARED) != 0; |
@@ -588,7 +588,7 @@ read_file_system_list (bool need_fs_type) | |||
588 | } | 588 | } |
589 | #endif /* MOUNTED_FS_STAT_DEV */ | 589 | #endif /* MOUNTED_FS_STAT_DEV */ |
590 | 590 | ||
591 | #if defined MOUNTED_GETFSSTAT /* __alpha running OSF_1 */ | 591 | #if defined MOUNTED_GETFSSTAT /* __alpha running OSF_1 */ |
592 | { | 592 | { |
593 | int numsys, counter; | 593 | int numsys, counter; |
594 | size_t bufsize; | 594 | size_t bufsize; |
@@ -606,24 +606,24 @@ read_file_system_list (bool need_fs_type) | |||
606 | 606 | ||
607 | if (numsys < 0) | 607 | if (numsys < 0) |
608 | { | 608 | { |
609 | free (stats); | 609 | free (stats); |
610 | return (NULL); | 610 | return (NULL); |
611 | } | 611 | } |
612 | 612 | ||
613 | for (counter = 0; counter < numsys; counter++) | 613 | for (counter = 0; counter < numsys; counter++) |
614 | { | 614 | { |
615 | me = xmalloc (sizeof *me); | 615 | me = xmalloc (sizeof *me); |
616 | me->me_devname = xstrdup (stats[counter].f_mntfromname); | 616 | me->me_devname = xstrdup (stats[counter].f_mntfromname); |
617 | me->me_mountdir = xstrdup (stats[counter].f_mntonname); | 617 | me->me_mountdir = xstrdup (stats[counter].f_mntonname); |
618 | me->me_type = xstrdup (FS_TYPE (stats[counter])); | 618 | me->me_type = xstrdup (FS_TYPE (stats[counter])); |
619 | me->me_type_malloced = 1; | 619 | me->me_type_malloced = 1; |
620 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 620 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
621 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 621 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
622 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ | 622 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
623 | 623 | ||
624 | /* Add to the linked list. */ | 624 | /* Add to the linked list. */ |
625 | *mtail = me; | 625 | *mtail = me; |
626 | mtail = &me->me_next; | 626 | mtail = &me->me_next; |
627 | } | 627 | } |
628 | 628 | ||
629 | free (stats); | 629 | free (stats); |
@@ -642,47 +642,47 @@ read_file_system_list (bool need_fs_type) | |||
642 | 642 | ||
643 | while (fread (&mnt, sizeof mnt, 1, fp) > 0) | 643 | while (fread (&mnt, sizeof mnt, 1, fp) > 0) |
644 | { | 644 | { |
645 | me = xmalloc (sizeof *me); | 645 | me = xmalloc (sizeof *me); |
646 | # ifdef GETFSTYP /* SVR3. */ | 646 | # ifdef GETFSTYP /* SVR3. */ |
647 | me->me_devname = xstrdup (mnt.mt_dev); | 647 | me->me_devname = xstrdup (mnt.mt_dev); |
648 | # else | 648 | # else |
649 | me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6); | 649 | me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6); |
650 | strcpy (me->me_devname, "/dev/"); | 650 | strcpy (me->me_devname, "/dev/"); |
651 | strcpy (me->me_devname + 5, mnt.mt_dev); | 651 | strcpy (me->me_devname + 5, mnt.mt_dev); |
652 | # endif | 652 | # endif |
653 | me->me_mountdir = xstrdup (mnt.mt_filsys); | 653 | me->me_mountdir = xstrdup (mnt.mt_filsys); |
654 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ | 654 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
655 | me->me_type = ""; | 655 | me->me_type = ""; |
656 | me->me_type_malloced = 0; | 656 | me->me_type_malloced = 0; |
657 | # ifdef GETFSTYP /* SVR3. */ | 657 | # ifdef GETFSTYP /* SVR3. */ |
658 | if (need_fs_type) | 658 | if (need_fs_type) |
659 | { | 659 | { |
660 | struct statfs fsd; | 660 | struct statfs fsd; |
661 | char typebuf[FSTYPSZ]; | 661 | char typebuf[FSTYPSZ]; |
662 | 662 | ||
663 | if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1 | 663 | if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1 |
664 | && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1) | 664 | && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1) |
665 | { | 665 | { |
666 | me->me_type = xstrdup (typebuf); | 666 | me->me_type = xstrdup (typebuf); |
667 | me->me_type_malloced = 1; | 667 | me->me_type_malloced = 1; |
668 | } | 668 | } |
669 | } | 669 | } |
670 | # endif | 670 | # endif |
671 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 671 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
672 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 672 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
673 | 673 | ||
674 | /* Add to the linked list. */ | 674 | /* Add to the linked list. */ |
675 | *mtail = me; | 675 | *mtail = me; |
676 | mtail = &me->me_next; | 676 | mtail = &me->me_next; |
677 | } | 677 | } |
678 | 678 | ||
679 | if (ferror (fp)) | 679 | if (ferror (fp)) |
680 | { | 680 | { |
681 | /* The last fread() call must have failed. */ | 681 | /* The last fread() call must have failed. */ |
682 | int saved_errno = errno; | 682 | int saved_errno = errno; |
683 | fclose (fp); | 683 | fclose (fp); |
684 | errno = saved_errno; | 684 | errno = saved_errno; |
685 | goto free_then_fail; | 685 | goto free_then_fail; |
686 | } | 686 | } |
687 | 687 | ||
688 | if (fclose (fp) == EOF) | 688 | if (fclose (fp) == EOF) |
@@ -690,29 +690,29 @@ read_file_system_list (bool need_fs_type) | |||
690 | } | 690 | } |
691 | #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */ | 691 | #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */ |
692 | 692 | ||
693 | #ifdef MOUNTED_GETMNTTBL /* DolphinOS goes its own way. */ | 693 | #ifdef MOUNTED_GETMNTTBL /* DolphinOS goes its own way. */ |
694 | { | 694 | { |
695 | struct mntent **mnttbl = getmnttbl (), **ent; | 695 | struct mntent **mnttbl = getmnttbl (), **ent; |
696 | for (ent=mnttbl;*ent;ent++) | 696 | for (ent=mnttbl;*ent;ent++) |
697 | { | 697 | { |
698 | me = xmalloc (sizeof *me); | 698 | me = xmalloc (sizeof *me); |
699 | me->me_devname = xstrdup ( (*ent)->mt_resource); | 699 | me->me_devname = xstrdup ( (*ent)->mt_resource); |
700 | me->me_mountdir = xstrdup ( (*ent)->mt_directory); | 700 | me->me_mountdir = xstrdup ( (*ent)->mt_directory); |
701 | me->me_type = xstrdup ((*ent)->mt_fstype); | 701 | me->me_type = xstrdup ((*ent)->mt_fstype); |
702 | me->me_type_malloced = 1; | 702 | me->me_type_malloced = 1; |
703 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); | 703 | me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); |
704 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 704 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
705 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ | 705 | me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
706 | 706 | ||
707 | /* Add to the linked list. */ | 707 | /* Add to the linked list. */ |
708 | *mtail = me; | 708 | *mtail = me; |
709 | mtail = &me->me_next; | 709 | mtail = &me->me_next; |
710 | } | 710 | } |
711 | endmnttbl (); | 711 | endmnttbl (); |
712 | } | 712 | } |
713 | #endif | 713 | #endif |
714 | 714 | ||
715 | #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ | 715 | #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ |
716 | { | 716 | { |
717 | struct mnttab mnt; | 717 | struct mnttab mnt; |
718 | char *table = MNTTAB; | 718 | char *table = MNTTAB; |
@@ -731,19 +731,19 @@ read_file_system_list (bool need_fs_type) | |||
731 | lockfd = open (MNTTAB_LOCK, O_RDONLY); | 731 | lockfd = open (MNTTAB_LOCK, O_RDONLY); |
732 | if (0 <= lockfd) | 732 | if (0 <= lockfd) |
733 | { | 733 | { |
734 | struct flock flock; | 734 | struct flock flock; |
735 | flock.l_type = F_RDLCK; | 735 | flock.l_type = F_RDLCK; |
736 | flock.l_whence = SEEK_SET; | 736 | flock.l_whence = SEEK_SET; |
737 | flock.l_start = 0; | 737 | flock.l_start = 0; |
738 | flock.l_len = 0; | 738 | flock.l_len = 0; |
739 | while (fcntl (lockfd, F_SETLKW, &flock) == -1) | 739 | while (fcntl (lockfd, F_SETLKW, &flock) == -1) |
740 | if (errno != EINTR) | 740 | if (errno != EINTR) |
741 | { | 741 | { |
742 | int saved_errno = errno; | 742 | int saved_errno = errno; |
743 | close (lockfd); | 743 | close (lockfd); |
744 | errno = saved_errno; | 744 | errno = saved_errno; |
745 | return NULL; | 745 | return NULL; |
746 | } | 746 | } |
747 | } | 747 | } |
748 | else if (errno != ENOENT) | 748 | else if (errno != ENOENT) |
749 | return NULL; | 749 | return NULL; |
@@ -755,23 +755,23 @@ read_file_system_list (bool need_fs_type) | |||
755 | ret = errno; | 755 | ret = errno; |
756 | else | 756 | else |
757 | { | 757 | { |
758 | while ((ret = getmntent (fp, &mnt)) == 0) | 758 | while ((ret = getmntent (fp, &mnt)) == 0) |
759 | { | 759 | { |
760 | me = xmalloc (sizeof *me); | 760 | me = xmalloc (sizeof *me); |
761 | me->me_devname = xstrdup (mnt.mnt_special); | 761 | me->me_devname = xstrdup (mnt.mnt_special); |
762 | me->me_mountdir = xstrdup (mnt.mnt_mountp); | 762 | me->me_mountdir = xstrdup (mnt.mnt_mountp); |
763 | me->me_type = xstrdup (mnt.mnt_fstype); | 763 | me->me_type = xstrdup (mnt.mnt_fstype); |
764 | me->me_type_malloced = 1; | 764 | me->me_type_malloced = 1; |
765 | me->me_dummy = MNT_IGNORE (&mnt) != 0; | 765 | me->me_dummy = MNT_IGNORE (&mnt) != 0; |
766 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); | 766 | me->me_remote = ME_REMOTE (me->me_devname, me->me_type); |
767 | me->me_dev = dev_from_mount_options (mnt.mnt_mntopts); | 767 | me->me_dev = dev_from_mount_options (mnt.mnt_mntopts); |
768 | 768 | ||
769 | /* Add to the linked list. */ | 769 | /* Add to the linked list. */ |
770 | *mtail = me; | 770 | *mtail = me; |
771 | mtail = &me->me_next; | 771 | mtail = &me->me_next; |
772 | } | 772 | } |
773 | 773 | ||
774 | ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1; | 774 | ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1; |
775 | } | 775 | } |
776 | 776 | ||
777 | if (0 <= lockfd && close (lockfd) != 0) | 777 | if (0 <= lockfd && close (lockfd) != 0) |
@@ -779,13 +779,13 @@ read_file_system_list (bool need_fs_type) | |||
779 | 779 | ||
780 | if (0 <= ret) | 780 | if (0 <= ret) |
781 | { | 781 | { |
782 | errno = ret; | 782 | errno = ret; |
783 | goto free_then_fail; | 783 | goto free_then_fail; |
784 | } | 784 | } |
785 | } | 785 | } |
786 | #endif /* MOUNTED_GETMNTENT2. */ | 786 | #endif /* MOUNTED_GETMNTENT2. */ |
787 | 787 | ||
788 | #ifdef MOUNTED_VMOUNT /* AIX. */ | 788 | #ifdef MOUNTED_VMOUNT /* AIX. */ |
789 | { | 789 | { |
790 | int bufsize; | 790 | int bufsize; |
791 | char *entries, *thisent; | 791 | char *entries, *thisent; |
@@ -802,53 +802,53 @@ read_file_system_list (bool need_fs_type) | |||
802 | n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries); | 802 | n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries); |
803 | if (n_entries < 0) | 803 | if (n_entries < 0) |
804 | { | 804 | { |
805 | int saved_errno = errno; | 805 | int saved_errno = errno; |
806 | free (entries); | 806 | free (entries); |
807 | errno = saved_errno; | 807 | errno = saved_errno; |
808 | return NULL; | 808 | return NULL; |
809 | } | 809 | } |
810 | 810 | ||
811 | for (i = 0, thisent = entries; | 811 | for (i = 0, thisent = entries; |
812 | i < n_entries; | 812 | i < n_entries; |
813 | i++, thisent += vmp->vmt_length) | 813 | i++, thisent += vmp->vmt_length) |
814 | { | 814 | { |
815 | char *options, *ignore; | 815 | char *options, *ignore; |
816 | 816 | ||
817 | vmp = (struct vmount *) thisent; | 817 | vmp = (struct vmount *) thisent; |
818 | me = xmalloc (sizeof *me); | 818 | me = xmalloc (sizeof *me); |
819 | if (vmp->vmt_flags & MNT_REMOTE) | 819 | if (vmp->vmt_flags & MNT_REMOTE) |
820 | { | 820 | { |
821 | char *host, *dir; | 821 | char *host, *dir; |
822 | 822 | ||
823 | me->me_remote = 1; | 823 | me->me_remote = 1; |
824 | /* Prepend the remote dirname. */ | 824 | /* Prepend the remote dirname. */ |
825 | host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off; | 825 | host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off; |
826 | dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off; | 826 | dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off; |
827 | me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2); | 827 | me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2); |
828 | strcpy (me->me_devname, host); | 828 | strcpy (me->me_devname, host); |
829 | strcat (me->me_devname, ":"); | 829 | strcat (me->me_devname, ":"); |
830 | strcat (me->me_devname, dir); | 830 | strcat (me->me_devname, dir); |
831 | } | 831 | } |
832 | else | 832 | else |
833 | { | 833 | { |
834 | me->me_remote = 0; | 834 | me->me_remote = 0; |
835 | me->me_devname = xstrdup (thisent + | 835 | me->me_devname = xstrdup (thisent + |
836 | vmp->vmt_data[VMT_OBJECT].vmt_off); | 836 | vmp->vmt_data[VMT_OBJECT].vmt_off); |
837 | } | 837 | } |
838 | me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off); | 838 | me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off); |
839 | me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype)); | 839 | me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype)); |
840 | me->me_type_malloced = 1; | 840 | me->me_type_malloced = 1; |
841 | options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off; | 841 | options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off; |
842 | ignore = strstr (options, "ignore"); | 842 | ignore = strstr (options, "ignore"); |
843 | me->me_dummy = (ignore | 843 | me->me_dummy = (ignore |
844 | && (ignore == options || ignore[-1] == ',') | 844 | && (ignore == options || ignore[-1] == ',') |
845 | && (ignore[sizeof "ignore" - 1] == ',' | 845 | && (ignore[sizeof "ignore" - 1] == ',' |
846 | || ignore[sizeof "ignore" - 1] == '\0')); | 846 | || ignore[sizeof "ignore" - 1] == '\0')); |
847 | me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */ | 847 | me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */ |
848 | 848 | ||
849 | /* Add to the linked list. */ | 849 | /* Add to the linked list. */ |
850 | *mtail = me; | 850 | *mtail = me; |
851 | mtail = &me->me_next; | 851 | mtail = &me->me_next; |
852 | } | 852 | } |
853 | free (entries); | 853 | free (entries); |
854 | } | 854 | } |
@@ -865,13 +865,13 @@ read_file_system_list (bool need_fs_type) | |||
865 | 865 | ||
866 | while (mount_list) | 866 | while (mount_list) |
867 | { | 867 | { |
868 | me = mount_list->me_next; | 868 | me = mount_list->me_next; |
869 | free (mount_list->me_devname); | 869 | free (mount_list->me_devname); |
870 | free (mount_list->me_mountdir); | 870 | free (mount_list->me_mountdir); |
871 | if (mount_list->me_type_malloced) | 871 | if (mount_list->me_type_malloced) |
872 | free (mount_list->me_type); | 872 | free (mount_list->me_type); |
873 | free (mount_list); | 873 | free (mount_list); |
874 | mount_list = me; | 874 | mount_list = me; |
875 | } | 875 | } |
876 | 876 | ||
877 | errno = saved_errno; | 877 | errno = saved_errno; |
diff --git a/gl/mountlist.h b/gl/mountlist.h index e54bb49e..ad66def5 100644 --- a/gl/mountlist.h +++ b/gl/mountlist.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* mountlist.h -- declarations for list of mounted file systems | 1 | /* mountlist.h -- declarations for list of mounted file systems |
2 | 2 | ||
3 | Copyright (C) 1991, 1992, 1998, 2000, 2001, 2002, 2003, 2004, 2005 | 3 | Copyright (C) 1991-1992, 1998, 2000-2005, 2009-2010 Free Software |
4 | Free Software Foundation, Inc. | 4 | Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -25,12 +25,12 @@ | |||
25 | /* A mount table entry. */ | 25 | /* A mount table entry. */ |
26 | struct mount_entry | 26 | struct mount_entry |
27 | { | 27 | { |
28 | char *me_devname; /* Device node name, including "/dev/". */ | 28 | char *me_devname; /* Device node name, including "/dev/". */ |
29 | char *me_mountdir; /* Mount point directory name. */ | 29 | char *me_mountdir; /* Mount point directory name. */ |
30 | char *me_type; /* "nfs", "4.2", etc. */ | 30 | char *me_type; /* "nfs", "4.2", etc. */ |
31 | dev_t me_dev; /* Device number of me_mountdir. */ | 31 | dev_t me_dev; /* Device number of me_mountdir. */ |
32 | unsigned int me_dummy : 1; /* Nonzero for dummy file systems. */ | 32 | unsigned int me_dummy : 1; /* Nonzero for dummy file systems. */ |
33 | unsigned int me_remote : 1; /* Nonzero for remote fileystems. */ | 33 | unsigned int me_remote : 1; /* Nonzero for remote fileystems. */ |
34 | unsigned int me_type_malloced : 1; /* Nonzero if me_type was malloced. */ | 34 | unsigned int me_type_malloced : 1; /* Nonzero if me_type was malloced. */ |
35 | struct mount_entry *me_next; | 35 | struct mount_entry *me_next; |
36 | }; | 36 | }; |
diff --git a/gl/netdb.in.h b/gl/netdb.in.h index 363206d3..73db46a5 100644 --- a/gl/netdb.in.h +++ b/gl/netdb.in.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Provide a netdb.h header file for systems lacking it (read: MinGW). | 1 | /* Provide a netdb.h header file for systems lacking it (read: MinGW). |
2 | Copyright (C) 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2008-2010 Free Software Foundation, Inc. |
3 | Written by Simon Josefsson. | 3 | Written by Simon Josefsson. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -22,11 +22,11 @@ | |||
22 | 22 | ||
23 | #ifndef _GL_NETDB_H | 23 | #ifndef _GL_NETDB_H |
24 | 24 | ||
25 | #if @HAVE_NETDB_H@ | 25 | #if __GNUC__ >= 3 |
26 | |||
27 | # if __GNUC__ >= 3 | ||
28 | @PRAGMA_SYSTEM_HEADER@ | 26 | @PRAGMA_SYSTEM_HEADER@ |
29 | # endif | 27 | #endif |
28 | |||
29 | #if @HAVE_NETDB_H@ | ||
30 | 30 | ||
31 | /* The include_next requires a split double-inclusion guard. */ | 31 | /* The include_next requires a split double-inclusion guard. */ |
32 | # @INCLUDE_NEXT@ @NEXT_NETDB_H@ | 32 | # @INCLUDE_NEXT@ @NEXT_NETDB_H@ |
@@ -39,6 +39,8 @@ | |||
39 | /* Get netdb.h definitions such as struct hostent for MinGW. */ | 39 | /* Get netdb.h definitions such as struct hostent for MinGW. */ |
40 | #include <sys/socket.h> | 40 | #include <sys/socket.h> |
41 | 41 | ||
42 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
43 | |||
42 | /* Declarations for a platform that lacks <netdb.h>, or where it is | 44 | /* Declarations for a platform that lacks <netdb.h>, or where it is |
43 | incomplete. */ | 45 | incomplete. */ |
44 | 46 | ||
@@ -49,53 +51,59 @@ | |||
49 | /* Structure to contain information about address of a service provider. */ | 51 | /* Structure to contain information about address of a service provider. */ |
50 | struct addrinfo | 52 | struct addrinfo |
51 | { | 53 | { |
52 | int ai_flags; /* Input flags. */ | 54 | int ai_flags; /* Input flags. */ |
53 | int ai_family; /* Protocol family for socket. */ | 55 | int ai_family; /* Protocol family for socket. */ |
54 | int ai_socktype; /* Socket type. */ | 56 | int ai_socktype; /* Socket type. */ |
55 | int ai_protocol; /* Protocol for socket. */ | 57 | int ai_protocol; /* Protocol for socket. */ |
56 | socklen_t ai_addrlen; /* Length of socket address. */ | 58 | socklen_t ai_addrlen; /* Length of socket address. */ |
57 | struct sockaddr *ai_addr; /* Socket address for socket. */ | 59 | struct sockaddr *ai_addr; /* Socket address for socket. */ |
58 | char *ai_canonname; /* Canonical name for service location. */ | 60 | char *ai_canonname; /* Canonical name for service location. */ |
59 | struct addrinfo *ai_next; /* Pointer to next in list. */ | 61 | struct addrinfo *ai_next; /* Pointer to next in list. */ |
60 | }; | 62 | }; |
61 | # endif | 63 | # endif |
62 | 64 | ||
63 | /* Possible values for `ai_flags' field in `addrinfo' structure. */ | 65 | /* Possible values for `ai_flags' field in `addrinfo' structure. */ |
64 | # ifndef AI_PASSIVE | 66 | # ifndef AI_PASSIVE |
65 | # define AI_PASSIVE 0x0001 /* Socket address is intended for `bind'. */ | 67 | # define AI_PASSIVE 0x0001 /* Socket address is intended for `bind'. */ |
66 | # endif | 68 | # endif |
67 | # ifndef AI_CANONNAME | 69 | # ifndef AI_CANONNAME |
68 | # define AI_CANONNAME 0x0002 /* Request for canonical name. */ | 70 | # define AI_CANONNAME 0x0002 /* Request for canonical name. */ |
69 | # endif | 71 | # endif |
70 | # ifndef AI_NUMERICSERV | 72 | # ifndef AI_NUMERICSERV |
71 | # define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */ | 73 | # define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */ |
72 | # endif | 74 | # endif |
73 | 75 | ||
74 | # if 0 | 76 | # if 0 |
75 | /* The commented out definitions below are not yet implemented in the | 77 | # define AI_NUMERICHOST 0x0004 /* Don't use name resolution. */ |
76 | GNULIB getaddrinfo() replacement, so are not yet needed and may, in fact, | 78 | # endif |
77 | cause conflicts on systems with a getaddrinfo() function which does not | ||
78 | define them. | ||
79 | 79 | ||
80 | If they are restored, be sure to protect the definitions with #ifndef. */ | 80 | /* These symbolic constants are required to be present by POSIX, but |
81 | # define AI_NUMERICHOST 0x0004 /* Don't use name resolution. */ | 81 | our getaddrinfo replacement doesn't use them (yet). Setting them |
82 | # define AI_V4MAPPED 0x0008 /* IPv4 mapped addresses are acceptable. */ | 82 | to 0 on systems that doesn't have them avoids causing problems for |
83 | # define AI_ALL 0x0010 /* Return IPv4 mapped and IPv6 addresses. */ | 83 | system getaddrinfo implementations that would be confused by |
84 | # define AI_ADDRCONFIG 0x0020 /* Use configuration of this host to choose | 84 | unknown values. */ |
85 | returned address type.. */ | 85 | # ifndef AI_V4MAPPED |
86 | # endif /* 0 */ | 86 | # define AI_V4MAPPED 0 /* 0x0008: IPv4 mapped addresses are acceptable. */ |
87 | # endif | ||
88 | # ifndef AI_ALL | ||
89 | # define AI_ALL 0 /* 0x0010: Return IPv4 mapped and IPv6 addresses. */ | ||
90 | # endif | ||
91 | # ifndef AI_ADDRCONFIG | ||
92 | # define AI_ADDRCONFIG 0 /* 0x0020: Use configuration of this host to choose | ||
93 | returned address type. */ | ||
94 | # endif | ||
87 | 95 | ||
88 | /* Error values for `getaddrinfo' function. */ | 96 | /* Error values for `getaddrinfo' function. */ |
89 | # ifndef EAI_BADFLAGS | 97 | # ifndef EAI_BADFLAGS |
90 | # define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */ | 98 | # define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */ |
91 | # define EAI_NONAME -2 /* NAME or SERVICE is unknown. */ | 99 | # define EAI_NONAME -2 /* NAME or SERVICE is unknown. */ |
92 | # define EAI_AGAIN -3 /* Temporary failure in name resolution. */ | 100 | # define EAI_AGAIN -3 /* Temporary failure in name resolution. */ |
93 | # define EAI_FAIL -4 /* Non-recoverable failure in name res. */ | 101 | # define EAI_FAIL -4 /* Non-recoverable failure in name res. */ |
94 | # define EAI_NODATA -5 /* No address associated with NAME. */ | 102 | # define EAI_NODATA -5 /* No address associated with NAME. */ |
95 | # define EAI_FAMILY -6 /* `ai_family' not supported. */ | 103 | # define EAI_FAMILY -6 /* `ai_family' not supported. */ |
96 | # define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */ | 104 | # define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */ |
97 | # define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */ | 105 | # define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */ |
98 | # define EAI_MEMORY -10 /* Memory allocation failure. */ | 106 | # define EAI_MEMORY -10 /* Memory allocation failure. */ |
99 | # endif | 107 | # endif |
100 | 108 | ||
101 | /* Since EAI_NODATA is deprecated by RFC3493, some systems (at least | 109 | /* Since EAI_NODATA is deprecated by RFC3493, some systems (at least |
@@ -107,15 +115,15 @@ struct addrinfo | |||
107 | 115 | ||
108 | # ifndef EAI_OVERFLOW | 116 | # ifndef EAI_OVERFLOW |
109 | /* Not defined on mingw32 and Haiku. */ | 117 | /* Not defined on mingw32 and Haiku. */ |
110 | # define EAI_OVERFLOW -12 /* Argument buffer overflow. */ | 118 | # define EAI_OVERFLOW -12 /* Argument buffer overflow. */ |
111 | # endif | 119 | # endif |
112 | # ifndef EAI_ADDRFAMILY | 120 | # ifndef EAI_ADDRFAMILY |
113 | /* Not defined on mingw32. */ | 121 | /* Not defined on mingw32. */ |
114 | # define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */ | 122 | # define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */ |
115 | # endif | 123 | # endif |
116 | # ifndef EAI_SYSTEM | 124 | # ifndef EAI_SYSTEM |
117 | /* Not defined on mingw32. */ | 125 | /* Not defined on mingw32. */ |
118 | # define EAI_SYSTEM -11 /* System error returned in `errno'. */ | 126 | # define EAI_SYSTEM -11 /* System error returned in `errno'. */ |
119 | # endif | 127 | # endif |
120 | 128 | ||
121 | # if 0 | 129 | # if 0 |
@@ -124,12 +132,12 @@ struct addrinfo | |||
124 | 132 | ||
125 | If they are restored, be sure to protect the definitions with #ifndef. */ | 133 | If they are restored, be sure to protect the definitions with #ifndef. */ |
126 | # ifndef EAI_INPROGRESS | 134 | # ifndef EAI_INPROGRESS |
127 | # define EAI_INPROGRESS -100 /* Processing request in progress. */ | 135 | # define EAI_INPROGRESS -100 /* Processing request in progress. */ |
128 | # define EAI_CANCELED -101 /* Request canceled. */ | 136 | # define EAI_CANCELED -101 /* Request canceled. */ |
129 | # define EAI_NOTCANCELED -102 /* Request not canceled. */ | 137 | # define EAI_NOTCANCELED -102 /* Request not canceled. */ |
130 | # define EAI_ALLDONE -103 /* All requests done. */ | 138 | # define EAI_ALLDONE -103 /* All requests done. */ |
131 | # define EAI_INTR -104 /* Interrupted by a signal. */ | 139 | # define EAI_INTR -104 /* Interrupted by a signal. */ |
132 | # define EAI_IDN_ENCODE -105 /* IDN encoding failed. */ | 140 | # define EAI_IDN_ENCODE -105 /* IDN encoding failed. */ |
133 | # endif | 141 | # endif |
134 | # endif | 142 | # endif |
135 | 143 | ||
@@ -139,16 +147,17 @@ struct addrinfo | |||
139 | For more details, see the POSIX:2001 specification | 147 | For more details, see the POSIX:2001 specification |
140 | <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */ | 148 | <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */ |
141 | extern int getaddrinfo (const char *restrict nodename, | 149 | extern int getaddrinfo (const char *restrict nodename, |
142 | const char *restrict servname, | 150 | const char *restrict servname, |
143 | const struct addrinfo *restrict hints, | 151 | const struct addrinfo *restrict hints, |
144 | struct addrinfo **restrict res); | 152 | struct addrinfo **restrict res) |
153 | _GL_ARG_NONNULL ((4)); | ||
145 | # endif | 154 | # endif |
146 | 155 | ||
147 | # if !@HAVE_DECL_FREEADDRINFO@ | 156 | # if !@HAVE_DECL_FREEADDRINFO@ |
148 | /* Free `addrinfo' structure AI including associated storage. | 157 | /* Free `addrinfo' structure AI including associated storage. |
149 | For more details, see the POSIX:2001 specification | 158 | For more details, see the POSIX:2001 specification |
150 | <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */ | 159 | <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */ |
151 | extern void freeaddrinfo (struct addrinfo *ai); | 160 | extern void freeaddrinfo (struct addrinfo *ai) _GL_ARG_NONNULL ((1)); |
152 | # endif | 161 | # endif |
153 | 162 | ||
154 | # if !@HAVE_DECL_GAI_STRERROR@ | 163 | # if !@HAVE_DECL_GAI_STRERROR@ |
@@ -162,10 +171,11 @@ extern const char *gai_strerror (int ecode); | |||
162 | /* Convert socket address to printable node and service names. | 171 | /* Convert socket address to printable node and service names. |
163 | For more details, see the POSIX:2001 specification | 172 | For more details, see the POSIX:2001 specification |
164 | <http://www.opengroup.org/susv3xsh/getnameinfo.html>. */ | 173 | <http://www.opengroup.org/susv3xsh/getnameinfo.html>. */ |
165 | extern int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, | 174 | extern int getnameinfo (const struct sockaddr *restrict sa, socklen_t salen, |
166 | char *restrict node, socklen_t nodelen, | 175 | char *restrict node, socklen_t nodelen, |
167 | char *restrict service, socklen_t servicelen, | 176 | char *restrict service, socklen_t servicelen, |
168 | int flags); | 177 | int flags) |
178 | _GL_ARG_NONNULL ((1)); | ||
169 | # endif | 179 | # endif |
170 | 180 | ||
171 | /* Possible flags for getnameinfo. */ | 181 | /* Possible flags for getnameinfo. */ |
diff --git a/gl/netinet_in.in.h b/gl/netinet_in.in.h index 97e11a7e..7f0ff421 100644 --- a/gl/netinet_in.in.h +++ b/gl/netinet_in.in.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Substitute for <netinet/in.h>. | 1 | /* Substitute for <netinet/in.h>. |
2 | Copyright (C) 2007-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -17,11 +17,11 @@ | |||
17 | 17 | ||
18 | #ifndef _GL_NETINET_IN_H | 18 | #ifndef _GL_NETINET_IN_H |
19 | 19 | ||
20 | #if @HAVE_NETINET_IN_H@ | 20 | #if __GNUC__ >= 3 |
21 | |||
22 | # if __GNUC__ >= 3 | ||
23 | @PRAGMA_SYSTEM_HEADER@ | 21 | @PRAGMA_SYSTEM_HEADER@ |
24 | # endif | 22 | #endif |
23 | |||
24 | #if @HAVE_NETINET_IN_H@ | ||
25 | 25 | ||
26 | /* On many platforms, <netinet/in.h> assumes prior inclusion of | 26 | /* On many platforms, <netinet/in.h> assumes prior inclusion of |
27 | <sys/types.h>. */ | 27 | <sys/types.h>. */ |
diff --git a/gl/nl_langinfo.c b/gl/nl_langinfo.c new file mode 100644 index 00000000..e81c81e7 --- /dev/null +++ b/gl/nl_langinfo.c | |||
@@ -0,0 +1,260 @@ | |||
1 | /* nl_langinfo() replacement: query locale dependent information. | ||
2 | |||
3 | Copyright (C) 2007-2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | #include <config.h> | ||
19 | |||
20 | /* Specification. */ | ||
21 | #include <langinfo.h> | ||
22 | |||
23 | #if REPLACE_NL_LANGINFO | ||
24 | |||
25 | /* Override nl_langinfo with support for added nl_item values. */ | ||
26 | |||
27 | # include <locale.h> | ||
28 | # include <string.h> | ||
29 | |||
30 | # undef nl_langinfo | ||
31 | |||
32 | char * | ||
33 | rpl_nl_langinfo (nl_item item) | ||
34 | { | ||
35 | switch (item) | ||
36 | { | ||
37 | # if GNULIB_defined_CODESET | ||
38 | case CODESET: | ||
39 | { | ||
40 | const char *locale; | ||
41 | static char buf[2 + 10 + 1]; | ||
42 | |||
43 | locale = setlocale (LC_CTYPE, NULL); | ||
44 | if (locale != NULL && locale[0] != '\0') | ||
45 | { | ||
46 | /* If the locale name contains an encoding after the dot, return | ||
47 | it. */ | ||
48 | const char *dot = strchr (locale, '.'); | ||
49 | |||
50 | if (dot != NULL) | ||
51 | { | ||
52 | const char *modifier; | ||
53 | |||
54 | dot++; | ||
55 | /* Look for the possible @... trailer and remove it, if any. */ | ||
56 | modifier = strchr (dot, '@'); | ||
57 | if (modifier == NULL) | ||
58 | return dot; | ||
59 | if (modifier - dot < sizeof (buf)) | ||
60 | { | ||
61 | memcpy (buf, dot, modifier - dot); | ||
62 | buf [modifier - dot] = '\0'; | ||
63 | return buf; | ||
64 | } | ||
65 | } | ||
66 | } | ||
67 | return ""; | ||
68 | } | ||
69 | # endif | ||
70 | # if GNULIB_defined_ERA | ||
71 | case ERA: | ||
72 | /* The format is not standardized. In glibc it is a sequence of strings | ||
73 | of the form "direction:offset:start_date:end_date:era_name:era_format" | ||
74 | with an empty string at the end. */ | ||
75 | return ""; | ||
76 | case ERA_D_FMT: | ||
77 | /* The %Ex conversion in strftime behaves like %x if the locale does not | ||
78 | have an alternative time format. */ | ||
79 | item = D_FMT; | ||
80 | break; | ||
81 | case ERA_D_T_FMT: | ||
82 | /* The %Ec conversion in strftime behaves like %c if the locale does not | ||
83 | have an alternative time format. */ | ||
84 | item = D_T_FMT; | ||
85 | break; | ||
86 | case ERA_T_FMT: | ||
87 | /* The %EX conversion in strftime behaves like %X if the locale does not | ||
88 | have an alternative time format. */ | ||
89 | item = T_FMT; | ||
90 | break; | ||
91 | case ALT_DIGITS: | ||
92 | /* The format is not standardized. In glibc it is a sequence of 10 | ||
93 | strings, appended in memory. */ | ||
94 | return "\0\0\0\0\0\0\0\0\0\0"; | ||
95 | # endif | ||
96 | default: | ||
97 | break; | ||
98 | } | ||
99 | return nl_langinfo (item); | ||
100 | } | ||
101 | |||
102 | #else | ||
103 | |||
104 | /* Provide nl_langinfo from scratch. */ | ||
105 | |||
106 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
107 | |||
108 | /* Native Windows platforms. */ | ||
109 | |||
110 | # define WIN32_LEAN_AND_MEAN /* avoid including junk */ | ||
111 | # include <windows.h> | ||
112 | |||
113 | # include <stdio.h> | ||
114 | |||
115 | # else | ||
116 | |||
117 | /* An old Unix platform without locales, such as Linux libc5 or BeOS. */ | ||
118 | |||
119 | # endif | ||
120 | |||
121 | # include <locale.h> | ||
122 | |||
123 | char * | ||
124 | nl_langinfo (nl_item item) | ||
125 | { | ||
126 | switch (item) | ||
127 | { | ||
128 | /* nl_langinfo items of the LC_CTYPE category */ | ||
129 | case CODESET: | ||
130 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
131 | { | ||
132 | static char buf[2 + 10 + 1]; | ||
133 | |||
134 | /* Woe32 has a function returning the locale's codepage as a number. */ | ||
135 | sprintf (buf, "CP%u", GetACP ()); | ||
136 | return buf; | ||
137 | } | ||
138 | # elif defined __BEOS__ | ||
139 | return "UTF-8"; | ||
140 | # else | ||
141 | return "ISO-8859-1"; | ||
142 | # endif | ||
143 | /* nl_langinfo items of the LC_NUMERIC category */ | ||
144 | case RADIXCHAR: | ||
145 | return localeconv () ->decimal_point; | ||
146 | case THOUSEP: | ||
147 | return localeconv () ->thousands_sep; | ||
148 | /* nl_langinfo items of the LC_TIME category. | ||
149 | TODO: Really use the locale. */ | ||
150 | case D_T_FMT: | ||
151 | case ERA_D_T_FMT: | ||
152 | return "%a %b %e %H:%M:%S %Y"; | ||
153 | case D_FMT: | ||
154 | case ERA_D_FMT: | ||
155 | return "%m/%d/%y"; | ||
156 | case T_FMT: | ||
157 | case ERA_T_FMT: | ||
158 | return "%H:%M:%S"; | ||
159 | case T_FMT_AMPM: | ||
160 | return "%I:%M:%S %p"; | ||
161 | case AM_STR: | ||
162 | return "AM"; | ||
163 | case PM_STR: | ||
164 | return "PM"; | ||
165 | case DAY_1: | ||
166 | return "Sunday"; | ||
167 | case DAY_2: | ||
168 | return "Monday"; | ||
169 | case DAY_3: | ||
170 | return "Tuesday"; | ||
171 | case DAY_4: | ||
172 | return "Wednesday"; | ||
173 | case DAY_5: | ||
174 | return "Thursday"; | ||
175 | case DAY_6: | ||
176 | return "Friday"; | ||
177 | case DAY_7: | ||
178 | return "Saturday"; | ||
179 | case ABDAY_1: | ||
180 | return "Sun"; | ||
181 | case ABDAY_2: | ||
182 | return "Mon"; | ||
183 | case ABDAY_3: | ||
184 | return "Tue"; | ||
185 | case ABDAY_4: | ||
186 | return "Wed"; | ||
187 | case ABDAY_5: | ||
188 | return "Thu"; | ||
189 | case ABDAY_6: | ||
190 | return "Fri"; | ||
191 | case ABDAY_7: | ||
192 | return "Sat"; | ||
193 | case MON_1: | ||
194 | return "January"; | ||
195 | case MON_2: | ||
196 | return "February"; | ||
197 | case MON_3: | ||
198 | return "March"; | ||
199 | case MON_4: | ||
200 | return "April"; | ||
201 | case MON_5: | ||
202 | return "May"; | ||
203 | case MON_6: | ||
204 | return "June"; | ||
205 | case MON_7: | ||
206 | return "July"; | ||
207 | case MON_8: | ||
208 | return "August"; | ||
209 | case MON_9: | ||
210 | return "September"; | ||
211 | case MON_10: | ||
212 | return "October"; | ||
213 | case MON_11: | ||
214 | return "November"; | ||
215 | case MON_12: | ||
216 | return "December"; | ||
217 | case ABMON_1: | ||
218 | return "Jan"; | ||
219 | case ABMON_2: | ||
220 | return "Feb"; | ||
221 | case ABMON_3: | ||
222 | return "Mar"; | ||
223 | case ABMON_4: | ||
224 | return "Apr"; | ||
225 | case ABMON_5: | ||
226 | return "May"; | ||
227 | case ABMON_6: | ||
228 | return "Jun"; | ||
229 | case ABMON_7: | ||
230 | return "Jul"; | ||
231 | case ABMON_8: | ||
232 | return "Aug"; | ||
233 | case ABMON_9: | ||
234 | return "Sep"; | ||
235 | case ABMON_10: | ||
236 | return "Oct"; | ||
237 | case ABMON_11: | ||
238 | return "Nov"; | ||
239 | case ABMON_12: | ||
240 | return "Dec"; | ||
241 | case ERA: | ||
242 | return ""; | ||
243 | case ALT_DIGITS: | ||
244 | return "\0\0\0\0\0\0\0\0\0\0"; | ||
245 | /* nl_langinfo items of the LC_MONETARY category | ||
246 | TODO: Really use the locale. */ | ||
247 | case CRNCYSTR: | ||
248 | return "-"; | ||
249 | /* nl_langinfo items of the LC_MESSAGES category | ||
250 | TODO: Really use the locale. */ | ||
251 | case YESEXPR: | ||
252 | return "^[yY]"; | ||
253 | case NOEXPR: | ||
254 | return "^[nN]"; | ||
255 | default: | ||
256 | return ""; | ||
257 | } | ||
258 | } | ||
259 | |||
260 | #endif | ||
diff --git a/gl/open-safer.c b/gl/open-safer.c index 15bf6a65..3b36471f 100644 --- a/gl/open-safer.c +++ b/gl/open-safer.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Invoke open, but avoid some glitches. | 1 | /* Invoke open, but avoid some glitches. |
2 | 2 | ||
3 | Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2008-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -35,13 +35,9 @@ open_safer (char const *file, int flags, ...) | |||
35 | va_list ap; | 35 | va_list ap; |
36 | va_start (ap, flags); | 36 | va_start (ap, flags); |
37 | 37 | ||
38 | /* Assume mode_t promotes to int if and only if it is smaller. | 38 | /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4 |
39 | This assumption isn't guaranteed by the C standard, but we | 39 | creates crashing code when 'mode_t' is smaller than 'int'. */ |
40 | don't know of any real-world counterexamples. */ | 40 | mode = va_arg (ap, PROMOTED_MODE_T); |
41 | if (sizeof (mode_t) < sizeof (int)) | ||
42 | mode = va_arg (ap, int); | ||
43 | else | ||
44 | mode = va_arg (ap, mode_t); | ||
45 | 41 | ||
46 | va_end (ap); | 42 | va_end (ap); |
47 | } | 43 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* Open a descriptor to a file. | 1 | /* Open a descriptor to a file. |
2 | Copyright (C) 2007-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2007-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -38,6 +38,11 @@ orig_open (const char *filename, int flags, mode_t mode) | |||
38 | #include <string.h> | 38 | #include <string.h> |
39 | #include <sys/types.h> | 39 | #include <sys/types.h> |
40 | #include <sys/stat.h> | 40 | #include <sys/stat.h> |
41 | #include <unistd.h> | ||
42 | |||
43 | #ifndef REPLACE_OPEN_DIRECTORY | ||
44 | # define REPLACE_OPEN_DIRECTORY 0 | ||
45 | #endif | ||
41 | 46 | ||
42 | int | 47 | int |
43 | open (const char *filename, int flags, ...) | 48 | open (const char *filename, int flags, ...) |
@@ -51,12 +56,9 @@ open (const char *filename, int flags, ...) | |||
51 | va_list arg; | 56 | va_list arg; |
52 | va_start (arg, flags); | 57 | va_start (arg, flags); |
53 | 58 | ||
54 | /* If mode_t is narrower than int, use the promoted type (int), | 59 | /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4 |
55 | not mode_t. Use sizeof to guess whether mode_t is narrower; | 60 | creates crashing code when 'mode_t' is smaller than 'int'. */ |
56 | we don't know of any practical counterexamples. */ | 61 | mode = va_arg (arg, PROMOTED_MODE_T); |
57 | mode = (sizeof (mode_t) < sizeof (int) | ||
58 | ? va_arg (arg, int) | ||
59 | : va_arg (arg, mode_t)); | ||
60 | 62 | ||
61 | va_end (arg); | 63 | va_end (arg); |
62 | } | 64 | } |
@@ -92,15 +94,38 @@ open (const char *filename, int flags, ...) | |||
92 | { | 94 | { |
93 | size_t len = strlen (filename); | 95 | size_t len = strlen (filename); |
94 | if (len > 0 && filename[len - 1] == '/') | 96 | if (len > 0 && filename[len - 1] == '/') |
95 | { | 97 | { |
96 | errno = EISDIR; | 98 | errno = EISDIR; |
97 | return -1; | 99 | return -1; |
98 | } | 100 | } |
99 | } | 101 | } |
100 | #endif | 102 | #endif |
101 | 103 | ||
102 | fd = orig_open (filename, flags, mode); | 104 | fd = orig_open (filename, flags, mode); |
103 | 105 | ||
106 | #if REPLACE_FCHDIR | ||
107 | /* Implementing fchdir and fdopendir requires the ability to open a | ||
108 | directory file descriptor. If open doesn't support that (as on | ||
109 | mingw), we use a dummy file that behaves the same as directories | ||
110 | on Linux (ie. always reports EOF on attempts to read()), and | ||
111 | override fstat() in fchdir.c to hide the fact that we have a | ||
112 | dummy. */ | ||
113 | if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES | ||
114 | && (flags & O_ACCMODE) == O_RDONLY) | ||
115 | { | ||
116 | struct stat statbuf; | ||
117 | if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)) | ||
118 | { | ||
119 | /* Maximum recursion depth of 1. */ | ||
120 | fd = open ("/dev/null", flags, mode); | ||
121 | if (0 <= fd) | ||
122 | fd = _gl_register_fd (fd, filename); | ||
123 | } | ||
124 | else | ||
125 | errno = EACCES; | ||
126 | } | ||
127 | #endif | ||
128 | |||
104 | #if OPEN_TRAILING_SLASH_BUG | 129 | #if OPEN_TRAILING_SLASH_BUG |
105 | /* If the filename ends in a slash and fd does not refer to a directory, | 130 | /* If the filename ends in a slash and fd does not refer to a directory, |
106 | then fail. | 131 | then fail. |
@@ -116,24 +141,25 @@ open (const char *filename, int flags, ...) | |||
116 | with ENOTDIR. */ | 141 | with ENOTDIR. */ |
117 | if (fd >= 0) | 142 | if (fd >= 0) |
118 | { | 143 | { |
144 | /* We know len is positive, since open did not fail with ENOENT. */ | ||
119 | size_t len = strlen (filename); | 145 | size_t len = strlen (filename); |
120 | if (len > 0 && filename[len - 1] == '/') | 146 | if (filename[len - 1] == '/') |
121 | { | 147 | { |
122 | struct stat statbuf; | 148 | struct stat statbuf; |
123 | 149 | ||
124 | if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode)) | 150 | if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode)) |
125 | { | 151 | { |
126 | close (fd); | 152 | close (fd); |
127 | errno = ENOTDIR; | 153 | errno = ENOTDIR; |
128 | return -1; | 154 | return -1; |
129 | } | 155 | } |
130 | } | 156 | } |
131 | } | 157 | } |
132 | #endif | 158 | #endif |
133 | 159 | ||
134 | #ifdef FCHDIR_REPLACEMENT | 160 | #if REPLACE_FCHDIR |
135 | if (fd >= 0) | 161 | if (!REPLACE_OPEN_DIRECTORY && 0 <= fd) |
136 | _gl_register_fd (fd, filename); | 162 | fd = _gl_register_fd (fd, filename); |
137 | #endif | 163 | #endif |
138 | 164 | ||
139 | return fd; | 165 | return fd; |
diff --git a/gl/pipe-safer.c b/gl/pipe-safer.c index 0fc68505..ae9f2e3e 100644 --- a/gl/pipe-safer.c +++ b/gl/pipe-safer.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Invoke pipe, but avoid some glitches. | 1 | /* Invoke pipe, but avoid some glitches. |
2 | Copyright (C) 2005, 2006 Free Software Foundation, Inc. | 2 | Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -35,16 +35,16 @@ pipe_safer (int fd[2]) | |||
35 | { | 35 | { |
36 | int i; | 36 | int i; |
37 | for (i = 0; i < 2; i++) | 37 | for (i = 0; i < 2; i++) |
38 | { | 38 | { |
39 | fd[i] = fd_safer (fd[i]); | 39 | fd[i] = fd_safer (fd[i]); |
40 | if (fd[i] < 0) | 40 | if (fd[i] < 0) |
41 | { | 41 | { |
42 | int e = errno; | 42 | int e = errno; |
43 | close (fd[1 - i]); | 43 | close (fd[1 - i]); |
44 | errno = e; | 44 | errno = e; |
45 | return -1; | 45 | return -1; |
46 | } | 46 | } |
47 | } | 47 | } |
48 | 48 | ||
49 | return 0; | 49 | return 0; |
50 | } | 50 | } |
diff --git a/gl/printf-args.c b/gl/printf-args.c index 871c720a..46c03a21 100644 --- a/gl/printf-args.c +++ b/gl/printf-args.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* Decomposed printf argument list. | 1 | /* Decomposed printf argument list. |
2 | Copyright (C) 1999, 2002-2003, 2005-2007 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2010 Free Software |
3 | Foundation, Inc. | ||
3 | 4 | ||
4 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -42,146 +43,146 @@ PRINTF_FETCHARGS (va_list args, arguments *a) | |||
42 | switch (ap->type) | 43 | switch (ap->type) |
43 | { | 44 | { |
44 | case TYPE_SCHAR: | 45 | case TYPE_SCHAR: |
45 | ap->a.a_schar = va_arg (args, /*signed char*/ int); | 46 | ap->a.a_schar = va_arg (args, /*signed char*/ int); |
46 | break; | 47 | break; |
47 | case TYPE_UCHAR: | 48 | case TYPE_UCHAR: |
48 | ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); | 49 | ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); |
49 | break; | 50 | break; |
50 | case TYPE_SHORT: | 51 | case TYPE_SHORT: |
51 | ap->a.a_short = va_arg (args, /*short*/ int); | 52 | ap->a.a_short = va_arg (args, /*short*/ int); |
52 | break; | 53 | break; |
53 | case TYPE_USHORT: | 54 | case TYPE_USHORT: |
54 | ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); | 55 | ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); |
55 | break; | 56 | break; |
56 | case TYPE_INT: | 57 | case TYPE_INT: |
57 | ap->a.a_int = va_arg (args, int); | 58 | ap->a.a_int = va_arg (args, int); |
58 | break; | 59 | break; |
59 | case TYPE_UINT: | 60 | case TYPE_UINT: |
60 | ap->a.a_uint = va_arg (args, unsigned int); | 61 | ap->a.a_uint = va_arg (args, unsigned int); |
61 | break; | 62 | break; |
62 | case TYPE_LONGINT: | 63 | case TYPE_LONGINT: |
63 | ap->a.a_longint = va_arg (args, long int); | 64 | ap->a.a_longint = va_arg (args, long int); |
64 | break; | 65 | break; |
65 | case TYPE_ULONGINT: | 66 | case TYPE_ULONGINT: |
66 | ap->a.a_ulongint = va_arg (args, unsigned long int); | 67 | ap->a.a_ulongint = va_arg (args, unsigned long int); |
67 | break; | 68 | break; |
68 | #if HAVE_LONG_LONG_INT | 69 | #if HAVE_LONG_LONG_INT |
69 | case TYPE_LONGLONGINT: | 70 | case TYPE_LONGLONGINT: |
70 | ap->a.a_longlongint = va_arg (args, long long int); | 71 | ap->a.a_longlongint = va_arg (args, long long int); |
71 | break; | 72 | break; |
72 | case TYPE_ULONGLONGINT: | 73 | case TYPE_ULONGLONGINT: |
73 | ap->a.a_ulonglongint = va_arg (args, unsigned long long int); | 74 | ap->a.a_ulonglongint = va_arg (args, unsigned long long int); |
74 | break; | 75 | break; |
75 | #endif | 76 | #endif |
76 | case TYPE_DOUBLE: | 77 | case TYPE_DOUBLE: |
77 | ap->a.a_double = va_arg (args, double); | 78 | ap->a.a_double = va_arg (args, double); |
78 | break; | 79 | break; |
79 | case TYPE_LONGDOUBLE: | 80 | case TYPE_LONGDOUBLE: |
80 | ap->a.a_longdouble = va_arg (args, long double); | 81 | ap->a.a_longdouble = va_arg (args, long double); |
81 | break; | 82 | break; |
82 | case TYPE_CHAR: | 83 | case TYPE_CHAR: |
83 | ap->a.a_char = va_arg (args, int); | 84 | ap->a.a_char = va_arg (args, int); |
84 | break; | 85 | break; |
85 | #if HAVE_WINT_T | 86 | #if HAVE_WINT_T |
86 | case TYPE_WIDE_CHAR: | 87 | case TYPE_WIDE_CHAR: |
87 | /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by | 88 | /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by |
88 | default argument promotions", this is not the case in mingw32, | 89 | default argument promotions", this is not the case in mingw32, |
89 | where wint_t is 'unsigned short'. */ | 90 | where wint_t is 'unsigned short'. */ |
90 | ap->a.a_wide_char = | 91 | ap->a.a_wide_char = |
91 | (sizeof (wint_t) < sizeof (int) | 92 | (sizeof (wint_t) < sizeof (int) |
92 | ? va_arg (args, int) | 93 | ? (wint_t) va_arg (args, int) |
93 | : va_arg (args, wint_t)); | 94 | : va_arg (args, wint_t)); |
94 | break; | 95 | break; |
95 | #endif | 96 | #endif |
96 | case TYPE_STRING: | 97 | case TYPE_STRING: |
97 | ap->a.a_string = va_arg (args, const char *); | 98 | ap->a.a_string = va_arg (args, const char *); |
98 | /* A null pointer is an invalid argument for "%s", but in practice | 99 | /* A null pointer is an invalid argument for "%s", but in practice |
99 | it occurs quite frequently in printf statements that produce | 100 | it occurs quite frequently in printf statements that produce |
100 | debug output. Use a fallback in this case. */ | 101 | debug output. Use a fallback in this case. */ |
101 | if (ap->a.a_string == NULL) | 102 | if (ap->a.a_string == NULL) |
102 | ap->a.a_string = "(NULL)"; | 103 | ap->a.a_string = "(NULL)"; |
103 | break; | 104 | break; |
104 | #if HAVE_WCHAR_T | 105 | #if HAVE_WCHAR_T |
105 | case TYPE_WIDE_STRING: | 106 | case TYPE_WIDE_STRING: |
106 | ap->a.a_wide_string = va_arg (args, const wchar_t *); | 107 | ap->a.a_wide_string = va_arg (args, const wchar_t *); |
107 | /* A null pointer is an invalid argument for "%ls", but in practice | 108 | /* A null pointer is an invalid argument for "%ls", but in practice |
108 | it occurs quite frequently in printf statements that produce | 109 | it occurs quite frequently in printf statements that produce |
109 | debug output. Use a fallback in this case. */ | 110 | debug output. Use a fallback in this case. */ |
110 | if (ap->a.a_wide_string == NULL) | 111 | if (ap->a.a_wide_string == NULL) |
111 | { | 112 | { |
112 | static const wchar_t wide_null_string[] = | 113 | static const wchar_t wide_null_string[] = |
113 | { | 114 | { |
114 | (wchar_t)'(', | 115 | (wchar_t)'(', |
115 | (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', | 116 | (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', |
116 | (wchar_t)')', | 117 | (wchar_t)')', |
117 | (wchar_t)0 | 118 | (wchar_t)0 |
118 | }; | 119 | }; |
119 | ap->a.a_wide_string = wide_null_string; | 120 | ap->a.a_wide_string = wide_null_string; |
120 | } | 121 | } |
121 | break; | 122 | break; |
122 | #endif | 123 | #endif |
123 | case TYPE_POINTER: | 124 | case TYPE_POINTER: |
124 | ap->a.a_pointer = va_arg (args, void *); | 125 | ap->a.a_pointer = va_arg (args, void *); |
125 | break; | 126 | break; |
126 | case TYPE_COUNT_SCHAR_POINTER: | 127 | case TYPE_COUNT_SCHAR_POINTER: |
127 | ap->a.a_count_schar_pointer = va_arg (args, signed char *); | 128 | ap->a.a_count_schar_pointer = va_arg (args, signed char *); |
128 | break; | 129 | break; |
129 | case TYPE_COUNT_SHORT_POINTER: | 130 | case TYPE_COUNT_SHORT_POINTER: |
130 | ap->a.a_count_short_pointer = va_arg (args, short *); | 131 | ap->a.a_count_short_pointer = va_arg (args, short *); |
131 | break; | 132 | break; |
132 | case TYPE_COUNT_INT_POINTER: | 133 | case TYPE_COUNT_INT_POINTER: |
133 | ap->a.a_count_int_pointer = va_arg (args, int *); | 134 | ap->a.a_count_int_pointer = va_arg (args, int *); |
134 | break; | 135 | break; |
135 | case TYPE_COUNT_LONGINT_POINTER: | 136 | case TYPE_COUNT_LONGINT_POINTER: |
136 | ap->a.a_count_longint_pointer = va_arg (args, long int *); | 137 | ap->a.a_count_longint_pointer = va_arg (args, long int *); |
137 | break; | 138 | break; |
138 | #if HAVE_LONG_LONG_INT | 139 | #if HAVE_LONG_LONG_INT |
139 | case TYPE_COUNT_LONGLONGINT_POINTER: | 140 | case TYPE_COUNT_LONGLONGINT_POINTER: |
140 | ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); | 141 | ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); |
141 | break; | 142 | break; |
142 | #endif | 143 | #endif |
143 | #if ENABLE_UNISTDIO | 144 | #if ENABLE_UNISTDIO |
144 | /* The unistdio extensions. */ | 145 | /* The unistdio extensions. */ |
145 | case TYPE_U8_STRING: | 146 | case TYPE_U8_STRING: |
146 | ap->a.a_u8_string = va_arg (args, const uint8_t *); | 147 | ap->a.a_u8_string = va_arg (args, const uint8_t *); |
147 | /* A null pointer is an invalid argument for "%U", but in practice | 148 | /* A null pointer is an invalid argument for "%U", but in practice |
148 | it occurs quite frequently in printf statements that produce | 149 | it occurs quite frequently in printf statements that produce |
149 | debug output. Use a fallback in this case. */ | 150 | debug output. Use a fallback in this case. */ |
150 | if (ap->a.a_u8_string == NULL) | 151 | if (ap->a.a_u8_string == NULL) |
151 | { | 152 | { |
152 | static const uint8_t u8_null_string[] = | 153 | static const uint8_t u8_null_string[] = |
153 | { '(', 'N', 'U', 'L', 'L', ')', 0 }; | 154 | { '(', 'N', 'U', 'L', 'L', ')', 0 }; |
154 | ap->a.a_u8_string = u8_null_string; | 155 | ap->a.a_u8_string = u8_null_string; |
155 | } | 156 | } |
156 | break; | 157 | break; |
157 | case TYPE_U16_STRING: | 158 | case TYPE_U16_STRING: |
158 | ap->a.a_u16_string = va_arg (args, const uint16_t *); | 159 | ap->a.a_u16_string = va_arg (args, const uint16_t *); |
159 | /* A null pointer is an invalid argument for "%lU", but in practice | 160 | /* A null pointer is an invalid argument for "%lU", but in practice |
160 | it occurs quite frequently in printf statements that produce | 161 | it occurs quite frequently in printf statements that produce |
161 | debug output. Use a fallback in this case. */ | 162 | debug output. Use a fallback in this case. */ |
162 | if (ap->a.a_u16_string == NULL) | 163 | if (ap->a.a_u16_string == NULL) |
163 | { | 164 | { |
164 | static const uint16_t u16_null_string[] = | 165 | static const uint16_t u16_null_string[] = |
165 | { '(', 'N', 'U', 'L', 'L', ')', 0 }; | 166 | { '(', 'N', 'U', 'L', 'L', ')', 0 }; |
166 | ap->a.a_u16_string = u16_null_string; | 167 | ap->a.a_u16_string = u16_null_string; |
167 | } | 168 | } |
168 | break; | 169 | break; |
169 | case TYPE_U32_STRING: | 170 | case TYPE_U32_STRING: |
170 | ap->a.a_u32_string = va_arg (args, const uint32_t *); | 171 | ap->a.a_u32_string = va_arg (args, const uint32_t *); |
171 | /* A null pointer is an invalid argument for "%llU", but in practice | 172 | /* A null pointer is an invalid argument for "%llU", but in practice |
172 | it occurs quite frequently in printf statements that produce | 173 | it occurs quite frequently in printf statements that produce |
173 | debug output. Use a fallback in this case. */ | 174 | debug output. Use a fallback in this case. */ |
174 | if (ap->a.a_u32_string == NULL) | 175 | if (ap->a.a_u32_string == NULL) |
175 | { | 176 | { |
176 | static const uint32_t u32_null_string[] = | 177 | static const uint32_t u32_null_string[] = |
177 | { '(', 'N', 'U', 'L', 'L', ')', 0 }; | 178 | { '(', 'N', 'U', 'L', 'L', ')', 0 }; |
178 | ap->a.a_u32_string = u32_null_string; | 179 | ap->a.a_u32_string = u32_null_string; |
179 | } | 180 | } |
180 | break; | 181 | break; |
181 | #endif | 182 | #endif |
182 | default: | 183 | default: |
183 | /* Unknown type. */ | 184 | /* Unknown type. */ |
184 | return -1; | 185 | return -1; |
185 | } | 186 | } |
186 | return 0; | 187 | return 0; |
187 | } | 188 | } |
diff --git a/gl/printf-args.h b/gl/printf-args.h index 67cb990c..2536ebaf 100644 --- a/gl/printf-args.h +++ b/gl/printf-args.h | |||
@@ -1,5 +1,6 @@ | |||
1 | /* Decomposed printf argument list. | 1 | /* Decomposed printf argument list. |
2 | Copyright (C) 1999, 2002-2003, 2006-2007 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002-2003, 2006-2007, 2009-2010 Free Software |
3 | Foundation, Inc. | ||
3 | 4 | ||
4 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -93,42 +94,42 @@ typedef struct | |||
93 | arg_type type; | 94 | arg_type type; |
94 | union | 95 | union |
95 | { | 96 | { |
96 | signed char a_schar; | 97 | signed char a_schar; |
97 | unsigned char a_uchar; | 98 | unsigned char a_uchar; |
98 | short a_short; | 99 | short a_short; |
99 | unsigned short a_ushort; | 100 | unsigned short a_ushort; |
100 | int a_int; | 101 | int a_int; |
101 | unsigned int a_uint; | 102 | unsigned int a_uint; |
102 | long int a_longint; | 103 | long int a_longint; |
103 | unsigned long int a_ulongint; | 104 | unsigned long int a_ulongint; |
104 | #if HAVE_LONG_LONG_INT | 105 | #if HAVE_LONG_LONG_INT |
105 | long long int a_longlongint; | 106 | long long int a_longlongint; |
106 | unsigned long long int a_ulonglongint; | 107 | unsigned long long int a_ulonglongint; |
107 | #endif | 108 | #endif |
108 | float a_float; | 109 | float a_float; |
109 | double a_double; | 110 | double a_double; |
110 | long double a_longdouble; | 111 | long double a_longdouble; |
111 | int a_char; | 112 | int a_char; |
112 | #if HAVE_WINT_T | 113 | #if HAVE_WINT_T |
113 | wint_t a_wide_char; | 114 | wint_t a_wide_char; |
114 | #endif | 115 | #endif |
115 | const char* a_string; | 116 | const char* a_string; |
116 | #if HAVE_WCHAR_T | 117 | #if HAVE_WCHAR_T |
117 | const wchar_t* a_wide_string; | 118 | const wchar_t* a_wide_string; |
118 | #endif | 119 | #endif |
119 | void* a_pointer; | 120 | void* a_pointer; |
120 | signed char * a_count_schar_pointer; | 121 | signed char * a_count_schar_pointer; |
121 | short * a_count_short_pointer; | 122 | short * a_count_short_pointer; |
122 | int * a_count_int_pointer; | 123 | int * a_count_int_pointer; |
123 | long int * a_count_longint_pointer; | 124 | long int * a_count_longint_pointer; |
124 | #if HAVE_LONG_LONG_INT | 125 | #if HAVE_LONG_LONG_INT |
125 | long long int * a_count_longlongint_pointer; | 126 | long long int * a_count_longlongint_pointer; |
126 | #endif | 127 | #endif |
127 | #if ENABLE_UNISTDIO | 128 | #if ENABLE_UNISTDIO |
128 | /* The unistdio extensions. */ | 129 | /* The unistdio extensions. */ |
129 | const uint8_t * a_u8_string; | 130 | const uint8_t * a_u8_string; |
130 | const uint16_t * a_u16_string; | 131 | const uint16_t * a_u16_string; |
131 | const uint32_t * a_u32_string; | 132 | const uint32_t * a_u32_string; |
132 | #endif | 133 | #endif |
133 | } | 134 | } |
134 | a; | 135 | a; |
diff --git a/gl/printf-parse.c b/gl/printf-parse.c index 28b9bd41..f612beb5 100644 --- a/gl/printf-parse.c +++ b/gl/printf-parse.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Formatted output to strings. | 1 | /* Formatted output to strings. |
2 | Copyright (C) 1999-2000, 2002-2003, 2006-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 1999-2000, 2002-2003, 2006-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -80,10 +80,10 @@ STATIC | |||
80 | int | 80 | int |
81 | PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) | 81 | PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) |
82 | { | 82 | { |
83 | const CHAR_T *cp = format; /* pointer into format */ | 83 | const CHAR_T *cp = format; /* pointer into format */ |
84 | size_t arg_posn = 0; /* number of regular arguments consumed */ | 84 | size_t arg_posn = 0; /* number of regular arguments consumed */ |
85 | size_t d_allocated; /* allocated elements of d->dir */ | 85 | size_t d_allocated; /* allocated elements of d->dir */ |
86 | size_t a_allocated; /* allocated elements of a->arg */ | 86 | size_t a_allocated; /* allocated elements of a->arg */ |
87 | size_t max_width_length = 0; | 87 | size_t max_width_length = 0; |
88 | size_t max_precision_length = 0; | 88 | size_t max_precision_length = 0; |
89 | 89 | ||
@@ -99,501 +99,501 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) | |||
99 | a->arg = NULL; | 99 | a->arg = NULL; |
100 | 100 | ||
101 | #define REGISTER_ARG(_index_,_type_) \ | 101 | #define REGISTER_ARG(_index_,_type_) \ |
102 | { \ | 102 | { \ |
103 | size_t n = (_index_); \ | 103 | size_t n = (_index_); \ |
104 | if (n >= a_allocated) \ | 104 | if (n >= a_allocated) \ |
105 | { \ | 105 | { \ |
106 | size_t memory_size; \ | 106 | size_t memory_size; \ |
107 | argument *memory; \ | 107 | argument *memory; \ |
108 | \ | 108 | \ |
109 | a_allocated = xtimes (a_allocated, 2); \ | 109 | a_allocated = xtimes (a_allocated, 2); \ |
110 | if (a_allocated <= n) \ | 110 | if (a_allocated <= n) \ |
111 | a_allocated = xsum (n, 1); \ | 111 | a_allocated = xsum (n, 1); \ |
112 | memory_size = xtimes (a_allocated, sizeof (argument)); \ | 112 | memory_size = xtimes (a_allocated, sizeof (argument)); \ |
113 | if (size_overflow_p (memory_size)) \ | 113 | if (size_overflow_p (memory_size)) \ |
114 | /* Overflow, would lead to out of memory. */ \ | 114 | /* Overflow, would lead to out of memory. */ \ |
115 | goto out_of_memory; \ | 115 | goto out_of_memory; \ |
116 | memory = (argument *) (a->arg \ | 116 | memory = (argument *) (a->arg \ |
117 | ? realloc (a->arg, memory_size) \ | 117 | ? realloc (a->arg, memory_size) \ |
118 | : malloc (memory_size)); \ | 118 | : malloc (memory_size)); \ |
119 | if (memory == NULL) \ | 119 | if (memory == NULL) \ |
120 | /* Out of memory. */ \ | 120 | /* Out of memory. */ \ |
121 | goto out_of_memory; \ | 121 | goto out_of_memory; \ |
122 | a->arg = memory; \ | 122 | a->arg = memory; \ |
123 | } \ | 123 | } \ |
124 | while (a->count <= n) \ | 124 | while (a->count <= n) \ |
125 | a->arg[a->count++].type = TYPE_NONE; \ | 125 | a->arg[a->count++].type = TYPE_NONE; \ |
126 | if (a->arg[n].type == TYPE_NONE) \ | 126 | if (a->arg[n].type == TYPE_NONE) \ |
127 | a->arg[n].type = (_type_); \ | 127 | a->arg[n].type = (_type_); \ |
128 | else if (a->arg[n].type != (_type_)) \ | 128 | else if (a->arg[n].type != (_type_)) \ |
129 | /* Ambiguous type for positional argument. */ \ | 129 | /* Ambiguous type for positional argument. */ \ |
130 | goto error; \ | 130 | goto error; \ |
131 | } | 131 | } |
132 | 132 | ||
133 | while (*cp != '\0') | 133 | while (*cp != '\0') |
134 | { | 134 | { |
135 | CHAR_T c = *cp++; | 135 | CHAR_T c = *cp++; |
136 | if (c == '%') | 136 | if (c == '%') |
137 | { | 137 | { |
138 | size_t arg_index = ARG_NONE; | 138 | size_t arg_index = ARG_NONE; |
139 | DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */ | 139 | DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */ |
140 | 140 | ||
141 | /* Initialize the next directive. */ | 141 | /* Initialize the next directive. */ |
142 | dp->dir_start = cp - 1; | 142 | dp->dir_start = cp - 1; |
143 | dp->flags = 0; | 143 | dp->flags = 0; |
144 | dp->width_start = NULL; | 144 | dp->width_start = NULL; |
145 | dp->width_end = NULL; | 145 | dp->width_end = NULL; |
146 | dp->width_arg_index = ARG_NONE; | 146 | dp->width_arg_index = ARG_NONE; |
147 | dp->precision_start = NULL; | 147 | dp->precision_start = NULL; |
148 | dp->precision_end = NULL; | 148 | dp->precision_end = NULL; |
149 | dp->precision_arg_index = ARG_NONE; | 149 | dp->precision_arg_index = ARG_NONE; |
150 | dp->arg_index = ARG_NONE; | 150 | dp->arg_index = ARG_NONE; |
151 | 151 | ||
152 | /* Test for positional argument. */ | 152 | /* Test for positional argument. */ |
153 | if (*cp >= '0' && *cp <= '9') | 153 | if (*cp >= '0' && *cp <= '9') |
154 | { | 154 | { |
155 | const CHAR_T *np; | 155 | const CHAR_T *np; |
156 | 156 | ||
157 | for (np = cp; *np >= '0' && *np <= '9'; np++) | 157 | for (np = cp; *np >= '0' && *np <= '9'; np++) |
158 | ; | 158 | ; |
159 | if (*np == '$') | 159 | if (*np == '$') |
160 | { | 160 | { |
161 | size_t n = 0; | 161 | size_t n = 0; |
162 | 162 | ||
163 | for (np = cp; *np >= '0' && *np <= '9'; np++) | 163 | for (np = cp; *np >= '0' && *np <= '9'; np++) |
164 | n = xsum (xtimes (n, 10), *np - '0'); | 164 | n = xsum (xtimes (n, 10), *np - '0'); |
165 | if (n == 0) | 165 | if (n == 0) |
166 | /* Positional argument 0. */ | 166 | /* Positional argument 0. */ |
167 | goto error; | 167 | goto error; |
168 | if (size_overflow_p (n)) | 168 | if (size_overflow_p (n)) |
169 | /* n too large, would lead to out of memory later. */ | 169 | /* n too large, would lead to out of memory later. */ |
170 | goto error; | 170 | goto error; |
171 | arg_index = n - 1; | 171 | arg_index = n - 1; |
172 | cp = np + 1; | 172 | cp = np + 1; |
173 | } | 173 | } |
174 | } | 174 | } |
175 | 175 | ||
176 | /* Read the flags. */ | 176 | /* Read the flags. */ |
177 | for (;;) | 177 | for (;;) |
178 | { | 178 | { |
179 | if (*cp == '\'') | 179 | if (*cp == '\'') |
180 | { | 180 | { |
181 | dp->flags |= FLAG_GROUP; | 181 | dp->flags |= FLAG_GROUP; |
182 | cp++; | 182 | cp++; |
183 | } | 183 | } |
184 | else if (*cp == '-') | 184 | else if (*cp == '-') |
185 | { | 185 | { |
186 | dp->flags |= FLAG_LEFT; | 186 | dp->flags |= FLAG_LEFT; |
187 | cp++; | 187 | cp++; |
188 | } | 188 | } |
189 | else if (*cp == '+') | 189 | else if (*cp == '+') |
190 | { | 190 | { |
191 | dp->flags |= FLAG_SHOWSIGN; | 191 | dp->flags |= FLAG_SHOWSIGN; |
192 | cp++; | 192 | cp++; |
193 | } | 193 | } |
194 | else if (*cp == ' ') | 194 | else if (*cp == ' ') |
195 | { | 195 | { |
196 | dp->flags |= FLAG_SPACE; | 196 | dp->flags |= FLAG_SPACE; |
197 | cp++; | 197 | cp++; |
198 | } | 198 | } |
199 | else if (*cp == '#') | 199 | else if (*cp == '#') |
200 | { | 200 | { |
201 | dp->flags |= FLAG_ALT; | 201 | dp->flags |= FLAG_ALT; |
202 | cp++; | 202 | cp++; |
203 | } | 203 | } |
204 | else if (*cp == '0') | 204 | else if (*cp == '0') |
205 | { | 205 | { |
206 | dp->flags |= FLAG_ZERO; | 206 | dp->flags |= FLAG_ZERO; |
207 | cp++; | 207 | cp++; |
208 | } | 208 | } |
209 | else | 209 | else |
210 | break; | 210 | break; |
211 | } | 211 | } |
212 | 212 | ||
213 | /* Parse the field width. */ | 213 | /* Parse the field width. */ |
214 | if (*cp == '*') | 214 | if (*cp == '*') |
215 | { | 215 | { |
216 | dp->width_start = cp; | 216 | dp->width_start = cp; |
217 | cp++; | 217 | cp++; |
218 | dp->width_end = cp; | 218 | dp->width_end = cp; |
219 | if (max_width_length < 1) | 219 | if (max_width_length < 1) |
220 | max_width_length = 1; | 220 | max_width_length = 1; |
221 | 221 | ||
222 | /* Test for positional argument. */ | 222 | /* Test for positional argument. */ |
223 | if (*cp >= '0' && *cp <= '9') | 223 | if (*cp >= '0' && *cp <= '9') |
224 | { | 224 | { |
225 | const CHAR_T *np; | 225 | const CHAR_T *np; |
226 | 226 | ||
227 | for (np = cp; *np >= '0' && *np <= '9'; np++) | 227 | for (np = cp; *np >= '0' && *np <= '9'; np++) |
228 | ; | 228 | ; |
229 | if (*np == '$') | 229 | if (*np == '$') |
230 | { | 230 | { |
231 | size_t n = 0; | 231 | size_t n = 0; |
232 | 232 | ||
233 | for (np = cp; *np >= '0' && *np <= '9'; np++) | 233 | for (np = cp; *np >= '0' && *np <= '9'; np++) |
234 | n = xsum (xtimes (n, 10), *np - '0'); | 234 | n = xsum (xtimes (n, 10), *np - '0'); |
235 | if (n == 0) | 235 | if (n == 0) |
236 | /* Positional argument 0. */ | 236 | /* Positional argument 0. */ |
237 | goto error; | 237 | goto error; |
238 | if (size_overflow_p (n)) | 238 | if (size_overflow_p (n)) |
239 | /* n too large, would lead to out of memory later. */ | 239 | /* n too large, would lead to out of memory later. */ |
240 | goto error; | 240 | goto error; |
241 | dp->width_arg_index = n - 1; | 241 | dp->width_arg_index = n - 1; |
242 | cp = np + 1; | 242 | cp = np + 1; |
243 | } | 243 | } |
244 | } | 244 | } |
245 | if (dp->width_arg_index == ARG_NONE) | 245 | if (dp->width_arg_index == ARG_NONE) |
246 | { | 246 | { |
247 | dp->width_arg_index = arg_posn++; | 247 | dp->width_arg_index = arg_posn++; |
248 | if (dp->width_arg_index == ARG_NONE) | 248 | if (dp->width_arg_index == ARG_NONE) |
249 | /* arg_posn wrapped around. */ | 249 | /* arg_posn wrapped around. */ |
250 | goto error; | 250 | goto error; |
251 | } | 251 | } |
252 | REGISTER_ARG (dp->width_arg_index, TYPE_INT); | 252 | REGISTER_ARG (dp->width_arg_index, TYPE_INT); |
253 | } | 253 | } |
254 | else if (*cp >= '0' && *cp <= '9') | 254 | else if (*cp >= '0' && *cp <= '9') |
255 | { | 255 | { |
256 | size_t width_length; | 256 | size_t width_length; |
257 | 257 | ||
258 | dp->width_start = cp; | 258 | dp->width_start = cp; |
259 | for (; *cp >= '0' && *cp <= '9'; cp++) | 259 | for (; *cp >= '0' && *cp <= '9'; cp++) |
260 | ; | 260 | ; |
261 | dp->width_end = cp; | 261 | dp->width_end = cp; |
262 | width_length = dp->width_end - dp->width_start; | 262 | width_length = dp->width_end - dp->width_start; |
263 | if (max_width_length < width_length) | 263 | if (max_width_length < width_length) |
264 | max_width_length = width_length; | 264 | max_width_length = width_length; |
265 | } | 265 | } |
266 | 266 | ||
267 | /* Parse the precision. */ | 267 | /* Parse the precision. */ |
268 | if (*cp == '.') | 268 | if (*cp == '.') |
269 | { | 269 | { |
270 | cp++; | 270 | cp++; |
271 | if (*cp == '*') | 271 | if (*cp == '*') |
272 | { | 272 | { |
273 | dp->precision_start = cp - 1; | 273 | dp->precision_start = cp - 1; |
274 | cp++; | 274 | cp++; |
275 | dp->precision_end = cp; | 275 | dp->precision_end = cp; |
276 | if (max_precision_length < 2) | 276 | if (max_precision_length < 2) |
277 | max_precision_length = 2; | 277 | max_precision_length = 2; |
278 | 278 | ||
279 | /* Test for positional argument. */ | 279 | /* Test for positional argument. */ |
280 | if (*cp >= '0' && *cp <= '9') | 280 | if (*cp >= '0' && *cp <= '9') |
281 | { | 281 | { |
282 | const CHAR_T *np; | 282 | const CHAR_T *np; |
283 | 283 | ||
284 | for (np = cp; *np >= '0' && *np <= '9'; np++) | 284 | for (np = cp; *np >= '0' && *np <= '9'; np++) |
285 | ; | 285 | ; |
286 | if (*np == '$') | 286 | if (*np == '$') |
287 | { | 287 | { |
288 | size_t n = 0; | 288 | size_t n = 0; |
289 | 289 | ||
290 | for (np = cp; *np >= '0' && *np <= '9'; np++) | 290 | for (np = cp; *np >= '0' && *np <= '9'; np++) |
291 | n = xsum (xtimes (n, 10), *np - '0'); | 291 | n = xsum (xtimes (n, 10), *np - '0'); |
292 | if (n == 0) | 292 | if (n == 0) |
293 | /* Positional argument 0. */ | 293 | /* Positional argument 0. */ |
294 | goto error; | 294 | goto error; |
295 | if (size_overflow_p (n)) | 295 | if (size_overflow_p (n)) |
296 | /* n too large, would lead to out of memory | 296 | /* n too large, would lead to out of memory |
297 | later. */ | 297 | later. */ |
298 | goto error; | 298 | goto error; |
299 | dp->precision_arg_index = n - 1; | 299 | dp->precision_arg_index = n - 1; |
300 | cp = np + 1; | 300 | cp = np + 1; |
301 | } | 301 | } |
302 | } | 302 | } |
303 | if (dp->precision_arg_index == ARG_NONE) | 303 | if (dp->precision_arg_index == ARG_NONE) |
304 | { | 304 | { |
305 | dp->precision_arg_index = arg_posn++; | 305 | dp->precision_arg_index = arg_posn++; |
306 | if (dp->precision_arg_index == ARG_NONE) | 306 | if (dp->precision_arg_index == ARG_NONE) |
307 | /* arg_posn wrapped around. */ | 307 | /* arg_posn wrapped around. */ |
308 | goto error; | 308 | goto error; |
309 | } | 309 | } |
310 | REGISTER_ARG (dp->precision_arg_index, TYPE_INT); | 310 | REGISTER_ARG (dp->precision_arg_index, TYPE_INT); |
311 | } | 311 | } |
312 | else | 312 | else |
313 | { | 313 | { |
314 | size_t precision_length; | 314 | size_t precision_length; |
315 | 315 | ||
316 | dp->precision_start = cp - 1; | 316 | dp->precision_start = cp - 1; |
317 | for (; *cp >= '0' && *cp <= '9'; cp++) | 317 | for (; *cp >= '0' && *cp <= '9'; cp++) |
318 | ; | 318 | ; |
319 | dp->precision_end = cp; | 319 | dp->precision_end = cp; |
320 | precision_length = dp->precision_end - dp->precision_start; | 320 | precision_length = dp->precision_end - dp->precision_start; |
321 | if (max_precision_length < precision_length) | 321 | if (max_precision_length < precision_length) |
322 | max_precision_length = precision_length; | 322 | max_precision_length = precision_length; |
323 | } | 323 | } |
324 | } | 324 | } |
325 | 325 | ||
326 | { | 326 | { |
327 | arg_type type; | 327 | arg_type type; |
328 | 328 | ||
329 | /* Parse argument type/size specifiers. */ | 329 | /* Parse argument type/size specifiers. */ |
330 | { | 330 | { |
331 | int flags = 0; | 331 | int flags = 0; |
332 | 332 | ||
333 | for (;;) | 333 | for (;;) |
334 | { | 334 | { |
335 | if (*cp == 'h') | 335 | if (*cp == 'h') |
336 | { | 336 | { |
337 | flags |= (1 << (flags & 1)); | 337 | flags |= (1 << (flags & 1)); |
338 | cp++; | 338 | cp++; |
339 | } | 339 | } |
340 | else if (*cp == 'L') | 340 | else if (*cp == 'L') |
341 | { | 341 | { |
342 | flags |= 4; | 342 | flags |= 4; |
343 | cp++; | 343 | cp++; |
344 | } | 344 | } |
345 | else if (*cp == 'l') | 345 | else if (*cp == 'l') |
346 | { | 346 | { |
347 | flags += 8; | 347 | flags += 8; |
348 | cp++; | 348 | cp++; |
349 | } | 349 | } |
350 | else if (*cp == 'j') | 350 | else if (*cp == 'j') |
351 | { | 351 | { |
352 | if (sizeof (intmax_t) > sizeof (long)) | 352 | if (sizeof (intmax_t) > sizeof (long)) |
353 | { | 353 | { |
354 | /* intmax_t = long long */ | 354 | /* intmax_t = long long */ |
355 | flags += 16; | 355 | flags += 16; |
356 | } | 356 | } |
357 | else if (sizeof (intmax_t) > sizeof (int)) | 357 | else if (sizeof (intmax_t) > sizeof (int)) |
358 | { | 358 | { |
359 | /* intmax_t = long */ | 359 | /* intmax_t = long */ |
360 | flags += 8; | 360 | flags += 8; |
361 | } | 361 | } |
362 | cp++; | 362 | cp++; |
363 | } | 363 | } |
364 | else if (*cp == 'z' || *cp == 'Z') | 364 | else if (*cp == 'z' || *cp == 'Z') |
365 | { | 365 | { |
366 | /* 'z' is standardized in ISO C 99, but glibc uses 'Z' | 366 | /* 'z' is standardized in ISO C 99, but glibc uses 'Z' |
367 | because the warning facility in gcc-2.95.2 understands | 367 | because the warning facility in gcc-2.95.2 understands |
368 | only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ | 368 | only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ |
369 | if (sizeof (size_t) > sizeof (long)) | 369 | if (sizeof (size_t) > sizeof (long)) |
370 | { | 370 | { |
371 | /* size_t = long long */ | 371 | /* size_t = long long */ |
372 | flags += 16; | 372 | flags += 16; |
373 | } | 373 | } |
374 | else if (sizeof (size_t) > sizeof (int)) | 374 | else if (sizeof (size_t) > sizeof (int)) |
375 | { | 375 | { |
376 | /* size_t = long */ | 376 | /* size_t = long */ |
377 | flags += 8; | 377 | flags += 8; |
378 | } | 378 | } |
379 | cp++; | 379 | cp++; |
380 | } | 380 | } |
381 | else if (*cp == 't') | 381 | else if (*cp == 't') |
382 | { | 382 | { |
383 | if (sizeof (ptrdiff_t) > sizeof (long)) | 383 | if (sizeof (ptrdiff_t) > sizeof (long)) |
384 | { | 384 | { |
385 | /* ptrdiff_t = long long */ | 385 | /* ptrdiff_t = long long */ |
386 | flags += 16; | 386 | flags += 16; |
387 | } | 387 | } |
388 | else if (sizeof (ptrdiff_t) > sizeof (int)) | 388 | else if (sizeof (ptrdiff_t) > sizeof (int)) |
389 | { | 389 | { |
390 | /* ptrdiff_t = long */ | 390 | /* ptrdiff_t = long */ |
391 | flags += 8; | 391 | flags += 8; |
392 | } | 392 | } |
393 | cp++; | 393 | cp++; |
394 | } | 394 | } |
395 | #if defined __APPLE__ && defined __MACH__ | 395 | #if defined __APPLE__ && defined __MACH__ |
396 | /* On MacOS X 10.3, PRIdMAX is defined as "qd". | 396 | /* On MacOS X 10.3, PRIdMAX is defined as "qd". |
397 | We cannot change it to "lld" because PRIdMAX must also | 397 | We cannot change it to "lld" because PRIdMAX must also |
398 | be understood by the system's printf routines. */ | 398 | be understood by the system's printf routines. */ |
399 | else if (*cp == 'q') | 399 | else if (*cp == 'q') |
400 | { | 400 | { |
401 | if (64 / 8 > sizeof (long)) | 401 | if (64 / 8 > sizeof (long)) |
402 | { | 402 | { |
403 | /* int64_t = long long */ | 403 | /* int64_t = long long */ |
404 | flags += 16; | 404 | flags += 16; |
405 | } | 405 | } |
406 | else | 406 | else |
407 | { | 407 | { |
408 | /* int64_t = long */ | 408 | /* int64_t = long */ |
409 | flags += 8; | 409 | flags += 8; |
410 | } | 410 | } |
411 | cp++; | 411 | cp++; |
412 | } | 412 | } |
413 | #endif | 413 | #endif |
414 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 414 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
415 | /* On native Win32, PRIdMAX is defined as "I64d". | 415 | /* On native Win32, PRIdMAX is defined as "I64d". |
416 | We cannot change it to "lld" because PRIdMAX must also | 416 | We cannot change it to "lld" because PRIdMAX must also |
417 | be understood by the system's printf routines. */ | 417 | be understood by the system's printf routines. */ |
418 | else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4') | 418 | else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4') |
419 | { | 419 | { |
420 | if (64 / 8 > sizeof (long)) | 420 | if (64 / 8 > sizeof (long)) |
421 | { | 421 | { |
422 | /* __int64 = long long */ | 422 | /* __int64 = long long */ |
423 | flags += 16; | 423 | flags += 16; |
424 | } | 424 | } |
425 | else | 425 | else |
426 | { | 426 | { |
427 | /* __int64 = long */ | 427 | /* __int64 = long */ |
428 | flags += 8; | 428 | flags += 8; |
429 | } | 429 | } |
430 | cp += 3; | 430 | cp += 3; |
431 | } | 431 | } |
432 | #endif | 432 | #endif |
433 | else | 433 | else |
434 | break; | 434 | break; |
435 | } | 435 | } |
436 | 436 | ||
437 | /* Read the conversion character. */ | 437 | /* Read the conversion character. */ |
438 | c = *cp++; | 438 | c = *cp++; |
439 | switch (c) | 439 | switch (c) |
440 | { | 440 | { |
441 | case 'd': case 'i': | 441 | case 'd': case 'i': |
442 | #if HAVE_LONG_LONG_INT | 442 | #if HAVE_LONG_LONG_INT |
443 | /* If 'long long' exists and is larger than 'long': */ | 443 | /* If 'long long' exists and is larger than 'long': */ |
444 | if (flags >= 16 || (flags & 4)) | 444 | if (flags >= 16 || (flags & 4)) |
445 | type = TYPE_LONGLONGINT; | 445 | type = TYPE_LONGLONGINT; |
446 | else | 446 | else |
447 | #endif | 447 | #endif |
448 | /* If 'long long' exists and is the same as 'long', we parse | 448 | /* If 'long long' exists and is the same as 'long', we parse |
449 | "lld" into TYPE_LONGINT. */ | 449 | "lld" into TYPE_LONGINT. */ |
450 | if (flags >= 8) | 450 | if (flags >= 8) |
451 | type = TYPE_LONGINT; | 451 | type = TYPE_LONGINT; |
452 | else if (flags & 2) | 452 | else if (flags & 2) |
453 | type = TYPE_SCHAR; | 453 | type = TYPE_SCHAR; |
454 | else if (flags & 1) | 454 | else if (flags & 1) |
455 | type = TYPE_SHORT; | 455 | type = TYPE_SHORT; |
456 | else | 456 | else |
457 | type = TYPE_INT; | 457 | type = TYPE_INT; |
458 | break; | 458 | break; |
459 | case 'o': case 'u': case 'x': case 'X': | 459 | case 'o': case 'u': case 'x': case 'X': |
460 | #if HAVE_LONG_LONG_INT | 460 | #if HAVE_LONG_LONG_INT |
461 | /* If 'long long' exists and is larger than 'long': */ | 461 | /* If 'long long' exists and is larger than 'long': */ |
462 | if (flags >= 16 || (flags & 4)) | 462 | if (flags >= 16 || (flags & 4)) |
463 | type = TYPE_ULONGLONGINT; | 463 | type = TYPE_ULONGLONGINT; |
464 | else | 464 | else |
465 | #endif | 465 | #endif |
466 | /* If 'unsigned long long' exists and is the same as | 466 | /* If 'unsigned long long' exists and is the same as |
467 | 'unsigned long', we parse "llu" into TYPE_ULONGINT. */ | 467 | 'unsigned long', we parse "llu" into TYPE_ULONGINT. */ |
468 | if (flags >= 8) | 468 | if (flags >= 8) |
469 | type = TYPE_ULONGINT; | 469 | type = TYPE_ULONGINT; |
470 | else if (flags & 2) | 470 | else if (flags & 2) |
471 | type = TYPE_UCHAR; | 471 | type = TYPE_UCHAR; |
472 | else if (flags & 1) | 472 | else if (flags & 1) |
473 | type = TYPE_USHORT; | 473 | type = TYPE_USHORT; |
474 | else | 474 | else |
475 | type = TYPE_UINT; | 475 | type = TYPE_UINT; |
476 | break; | 476 | break; |
477 | case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': | 477 | case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': |
478 | case 'a': case 'A': | 478 | case 'a': case 'A': |
479 | if (flags >= 16 || (flags & 4)) | 479 | if (flags >= 16 || (flags & 4)) |
480 | type = TYPE_LONGDOUBLE; | 480 | type = TYPE_LONGDOUBLE; |
481 | else | 481 | else |
482 | type = TYPE_DOUBLE; | 482 | type = TYPE_DOUBLE; |
483 | break; | 483 | break; |
484 | case 'c': | 484 | case 'c': |
485 | if (flags >= 8) | 485 | if (flags >= 8) |
486 | #if HAVE_WINT_T | 486 | #if HAVE_WINT_T |
487 | type = TYPE_WIDE_CHAR; | 487 | type = TYPE_WIDE_CHAR; |
488 | #else | 488 | #else |
489 | goto error; | 489 | goto error; |
490 | #endif | 490 | #endif |
491 | else | 491 | else |
492 | type = TYPE_CHAR; | 492 | type = TYPE_CHAR; |
493 | break; | 493 | break; |
494 | #if HAVE_WINT_T | 494 | #if HAVE_WINT_T |
495 | case 'C': | 495 | case 'C': |
496 | type = TYPE_WIDE_CHAR; | 496 | type = TYPE_WIDE_CHAR; |
497 | c = 'c'; | 497 | c = 'c'; |
498 | break; | 498 | break; |
499 | #endif | 499 | #endif |
500 | case 's': | 500 | case 's': |
501 | if (flags >= 8) | 501 | if (flags >= 8) |
502 | #if HAVE_WCHAR_T | 502 | #if HAVE_WCHAR_T |
503 | type = TYPE_WIDE_STRING; | 503 | type = TYPE_WIDE_STRING; |
504 | #else | 504 | #else |
505 | goto error; | 505 | goto error; |
506 | #endif | 506 | #endif |
507 | else | 507 | else |
508 | type = TYPE_STRING; | 508 | type = TYPE_STRING; |
509 | break; | 509 | break; |
510 | #if HAVE_WCHAR_T | 510 | #if HAVE_WCHAR_T |
511 | case 'S': | 511 | case 'S': |
512 | type = TYPE_WIDE_STRING; | 512 | type = TYPE_WIDE_STRING; |
513 | c = 's'; | 513 | c = 's'; |
514 | break; | 514 | break; |
515 | #endif | 515 | #endif |
516 | case 'p': | 516 | case 'p': |
517 | type = TYPE_POINTER; | 517 | type = TYPE_POINTER; |
518 | break; | 518 | break; |
519 | case 'n': | 519 | case 'n': |
520 | #if HAVE_LONG_LONG_INT | 520 | #if HAVE_LONG_LONG_INT |
521 | /* If 'long long' exists and is larger than 'long': */ | 521 | /* If 'long long' exists and is larger than 'long': */ |
522 | if (flags >= 16 || (flags & 4)) | 522 | if (flags >= 16 || (flags & 4)) |
523 | type = TYPE_COUNT_LONGLONGINT_POINTER; | 523 | type = TYPE_COUNT_LONGLONGINT_POINTER; |
524 | else | 524 | else |
525 | #endif | 525 | #endif |
526 | /* If 'long long' exists and is the same as 'long', we parse | 526 | /* If 'long long' exists and is the same as 'long', we parse |
527 | "lln" into TYPE_COUNT_LONGINT_POINTER. */ | 527 | "lln" into TYPE_COUNT_LONGINT_POINTER. */ |
528 | if (flags >= 8) | 528 | if (flags >= 8) |
529 | type = TYPE_COUNT_LONGINT_POINTER; | 529 | type = TYPE_COUNT_LONGINT_POINTER; |
530 | else if (flags & 2) | 530 | else if (flags & 2) |
531 | type = TYPE_COUNT_SCHAR_POINTER; | 531 | type = TYPE_COUNT_SCHAR_POINTER; |
532 | else if (flags & 1) | 532 | else if (flags & 1) |
533 | type = TYPE_COUNT_SHORT_POINTER; | 533 | type = TYPE_COUNT_SHORT_POINTER; |
534 | else | 534 | else |
535 | type = TYPE_COUNT_INT_POINTER; | 535 | type = TYPE_COUNT_INT_POINTER; |
536 | break; | 536 | break; |
537 | #if ENABLE_UNISTDIO | 537 | #if ENABLE_UNISTDIO |
538 | /* The unistdio extensions. */ | 538 | /* The unistdio extensions. */ |
539 | case 'U': | 539 | case 'U': |
540 | if (flags >= 16) | 540 | if (flags >= 16) |
541 | type = TYPE_U32_STRING; | 541 | type = TYPE_U32_STRING; |
542 | else if (flags >= 8) | 542 | else if (flags >= 8) |
543 | type = TYPE_U16_STRING; | 543 | type = TYPE_U16_STRING; |
544 | else | 544 | else |
545 | type = TYPE_U8_STRING; | 545 | type = TYPE_U8_STRING; |
546 | break; | 546 | break; |
547 | #endif | 547 | #endif |
548 | case '%': | 548 | case '%': |
549 | type = TYPE_NONE; | 549 | type = TYPE_NONE; |
550 | break; | 550 | break; |
551 | default: | 551 | default: |
552 | /* Unknown conversion character. */ | 552 | /* Unknown conversion character. */ |
553 | goto error; | 553 | goto error; |
554 | } | 554 | } |
555 | } | 555 | } |
556 | 556 | ||
557 | if (type != TYPE_NONE) | 557 | if (type != TYPE_NONE) |
558 | { | 558 | { |
559 | dp->arg_index = arg_index; | 559 | dp->arg_index = arg_index; |
560 | if (dp->arg_index == ARG_NONE) | 560 | if (dp->arg_index == ARG_NONE) |
561 | { | 561 | { |
562 | dp->arg_index = arg_posn++; | 562 | dp->arg_index = arg_posn++; |
563 | if (dp->arg_index == ARG_NONE) | 563 | if (dp->arg_index == ARG_NONE) |
564 | /* arg_posn wrapped around. */ | 564 | /* arg_posn wrapped around. */ |
565 | goto error; | 565 | goto error; |
566 | } | 566 | } |
567 | REGISTER_ARG (dp->arg_index, type); | 567 | REGISTER_ARG (dp->arg_index, type); |
568 | } | 568 | } |
569 | dp->conversion = c; | 569 | dp->conversion = c; |
570 | dp->dir_end = cp; | 570 | dp->dir_end = cp; |
571 | } | 571 | } |
572 | 572 | ||
573 | d->count++; | 573 | d->count++; |
574 | if (d->count >= d_allocated) | 574 | if (d->count >= d_allocated) |
575 | { | 575 | { |
576 | size_t memory_size; | 576 | size_t memory_size; |
577 | DIRECTIVE *memory; | 577 | DIRECTIVE *memory; |
578 | 578 | ||
579 | d_allocated = xtimes (d_allocated, 2); | 579 | d_allocated = xtimes (d_allocated, 2); |
580 | memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); | 580 | memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); |
581 | if (size_overflow_p (memory_size)) | 581 | if (size_overflow_p (memory_size)) |
582 | /* Overflow, would lead to out of memory. */ | 582 | /* Overflow, would lead to out of memory. */ |
583 | goto out_of_memory; | 583 | goto out_of_memory; |
584 | memory = (DIRECTIVE *) realloc (d->dir, memory_size); | 584 | memory = (DIRECTIVE *) realloc (d->dir, memory_size); |
585 | if (memory == NULL) | 585 | if (memory == NULL) |
586 | /* Out of memory. */ | 586 | /* Out of memory. */ |
587 | goto out_of_memory; | 587 | goto out_of_memory; |
588 | d->dir = memory; | 588 | d->dir = memory; |
589 | } | 589 | } |
590 | } | 590 | } |
591 | #if CHAR_T_ONLY_ASCII | 591 | #if CHAR_T_ONLY_ASCII |
592 | else if (!c_isascii (c)) | 592 | else if (!c_isascii (c)) |
593 | { | 593 | { |
594 | /* Non-ASCII character. Not supported. */ | 594 | /* Non-ASCII character. Not supported. */ |
595 | goto error; | 595 | goto error; |
596 | } | 596 | } |
597 | #endif | 597 | #endif |
598 | } | 598 | } |
599 | d->dir[d->count].dir_start = cp; | 599 | d->dir[d->count].dir_start = cp; |
diff --git a/gl/printf-parse.h b/gl/printf-parse.h index e5d68d75..0f2b7082 100644 --- a/gl/printf-parse.h +++ b/gl/printf-parse.h | |||
@@ -1,5 +1,6 @@ | |||
1 | /* Parse printf format string. | 1 | /* Parse printf format string. |
2 | Copyright (C) 1999, 2002-2003, 2005, 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002-2003, 2005, 2007, 2009-2010 Free Software |
3 | Foundation, Inc. | ||
3 | 4 | ||
4 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -26,15 +27,15 @@ | |||
26 | 27 | ||
27 | 28 | ||
28 | /* Flags */ | 29 | /* Flags */ |
29 | #define FLAG_GROUP 1 /* ' flag */ | 30 | #define FLAG_GROUP 1 /* ' flag */ |
30 | #define FLAG_LEFT 2 /* - flag */ | 31 | #define FLAG_LEFT 2 /* - flag */ |
31 | #define FLAG_SHOWSIGN 4 /* + flag */ | 32 | #define FLAG_SHOWSIGN 4 /* + flag */ |
32 | #define FLAG_SPACE 8 /* space flag */ | 33 | #define FLAG_SPACE 8 /* space flag */ |
33 | #define FLAG_ALT 16 /* # flag */ | 34 | #define FLAG_ALT 16 /* # flag */ |
34 | #define FLAG_ZERO 32 | 35 | #define FLAG_ZERO 32 |
35 | 36 | ||
36 | /* arg_index value indicating that no argument is consumed. */ | 37 | /* arg_index value indicating that no argument is consumed. */ |
37 | #define ARG_NONE (~(size_t)0) | 38 | #define ARG_NONE (~(size_t)0) |
38 | 39 | ||
39 | /* xxx_directive: A parsed directive. | 40 | /* xxx_directive: A parsed directive. |
40 | xxx_directives: A parsed format string. */ | 41 | xxx_directives: A parsed format string. */ |
@@ -163,10 +164,10 @@ extern int | |||
163 | u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a); | 164 | u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a); |
164 | extern int | 165 | extern int |
165 | u16_printf_parse (const uint16_t *format, u16_directives *d, | 166 | u16_printf_parse (const uint16_t *format, u16_directives *d, |
166 | arguments *a); | 167 | arguments *a); |
167 | extern int | 168 | extern int |
168 | u32_printf_parse (const uint32_t *format, u32_directives *d, | 169 | u32_printf_parse (const uint32_t *format, u32_directives *d, |
169 | arguments *a); | 170 | arguments *a); |
170 | #else | 171 | #else |
171 | # ifdef STATIC | 172 | # ifdef STATIC |
172 | STATIC | 173 | STATIC |
diff --git a/gl/ref-add.sin b/gl/ref-add.sin index 222d7529..dbb61df3 100644 --- a/gl/ref-add.sin +++ b/gl/ref-add.sin | |||
@@ -1,6 +1,6 @@ | |||
1 | # Add this package to a list of references stored in a text file. | 1 | # Add this package to a list of references stored in a text file. |
2 | # | 2 | # |
3 | # Copyright (C) 2000 Free Software Foundation, Inc. | 3 | # Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc. |
4 | # | 4 | # |
5 | # This program is free software; you can redistribute it and/or modify | 5 | # This program is free software; you can redistribute it and/or modify |
6 | # it under the terms of the GNU General Public License as published by | 6 | # it under the terms of the GNU General Public License as published by |
diff --git a/gl/ref-del.sin b/gl/ref-del.sin index 1bf073e1..4c31a6ea 100644 --- a/gl/ref-del.sin +++ b/gl/ref-del.sin | |||
@@ -1,6 +1,6 @@ | |||
1 | # Remove this package from a list of references stored in a text file. | 1 | # Remove this package from a list of references stored in a text file. |
2 | # | 2 | # |
3 | # Copyright (C) 2000 Free Software Foundation, Inc. | 3 | # Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc. |
4 | # | 4 | # |
5 | # This program is free software; you can redistribute it and/or modify | 5 | # This program is free software; you can redistribute it and/or modify |
6 | # it under the terms of the GNU General Public License as published by | 6 | # it under the terms of the GNU General Public License as published by |
diff --git a/gl/regcomp.c b/gl/regcomp.c index b114b4d1..86ca02b0 100644 --- a/gl/regcomp.c +++ b/gl/regcomp.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Extended regular expression matching and search library. | 1 | /* Extended regular expression matching and search library. |
2 | Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 | 2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free |
3 | Free Software Foundation, Inc. | 3 | Software Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. | 5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. |
6 | 6 | ||
@@ -383,7 +383,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, | |||
383 | applies to multibyte character sets; for single byte character | 383 | applies to multibyte character sets; for single byte character |
384 | sets, the SIMPLE_BRACKET again suffices. */ | 384 | sets, the SIMPLE_BRACKET again suffices. */ |
385 | if (dfa->mb_cur_max > 1 | 385 | if (dfa->mb_cur_max > 1 |
386 | && (cset->nchar_classes || cset->non_match | 386 | && (cset->nchar_classes || cset->non_match || cset->nranges |
387 | # ifdef _LIBC | 387 | # ifdef _LIBC |
388 | || cset->nequiv_classes | 388 | || cset->nequiv_classes |
389 | # endif /* _LIBC */ | 389 | # endif /* _LIBC */ |
@@ -636,7 +636,7 @@ free_dfa_content (re_dfa_t *dfa) | |||
636 | re_dfastate_t *state = entry->array[j]; | 636 | re_dfastate_t *state = entry->array[j]; |
637 | free_state (state); | 637 | free_state (state); |
638 | } | 638 | } |
639 | re_free (entry->array); | 639 | re_free (entry->array); |
640 | } | 640 | } |
641 | re_free (dfa->state_table); | 641 | re_free (dfa->state_table); |
642 | #ifdef RE_ENABLE_I18N | 642 | #ifdef RE_ENABLE_I18N |
@@ -850,6 +850,9 @@ static reg_errcode_t | |||
850 | init_dfa (re_dfa_t *dfa, size_t pat_len) | 850 | init_dfa (re_dfa_t *dfa, size_t pat_len) |
851 | { | 851 | { |
852 | __re_size_t table_size; | 852 | __re_size_t table_size; |
853 | #ifndef _LIBC | ||
854 | char *codeset_name; | ||
855 | #endif | ||
853 | #ifdef RE_ENABLE_I18N | 856 | #ifdef RE_ENABLE_I18N |
854 | size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t)); | 857 | size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t)); |
855 | #else | 858 | #else |
@@ -893,7 +896,9 @@ init_dfa (re_dfa_t *dfa, size_t pat_len) | |||
893 | dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII) | 896 | dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII) |
894 | != 0); | 897 | != 0); |
895 | #else | 898 | #else |
896 | if (strcmp (locale_charset (), "UTF-8") == 0) | 899 | codeset_name = nl_langinfo (CODESET); |
900 | if (strcasecmp (codeset_name, "UTF-8") == 0 | ||
901 | || strcasecmp (codeset_name, "UTF8") == 0) | ||
897 | dfa->is_utf8 = 1; | 902 | dfa->is_utf8 = 1; |
898 | 903 | ||
899 | /* We check exhaustively in the loop below if this charset is a | 904 | /* We check exhaustively in the loop below if this charset is a |
@@ -1016,7 +1021,10 @@ create_initial_state (re_dfa_t *dfa) | |||
1016 | Idx dest_idx = dfa->edests[node_idx].elems[0]; | 1021 | Idx dest_idx = dfa->edests[node_idx].elems[0]; |
1017 | if (!re_node_set_contains (&init_nodes, dest_idx)) | 1022 | if (!re_node_set_contains (&init_nodes, dest_idx)) |
1018 | { | 1023 | { |
1019 | re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx); | 1024 | reg_errcode_t merge_err |
1025 | = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx); | ||
1026 | if (merge_err != REG_NOERROR) | ||
1027 | return merge_err; | ||
1020 | i = 0; | 1028 | i = 0; |
1021 | } | 1029 | } |
1022 | } | 1030 | } |
@@ -1085,8 +1093,8 @@ optimize_utf8 (re_dfa_t *dfa) | |||
1085 | } | 1093 | } |
1086 | break; | 1094 | break; |
1087 | case OP_PERIOD: | 1095 | case OP_PERIOD: |
1088 | has_period = true; | 1096 | has_period = true; |
1089 | break; | 1097 | break; |
1090 | case OP_BACK_REF: | 1098 | case OP_BACK_REF: |
1091 | case OP_ALT: | 1099 | case OP_ALT: |
1092 | case END_OF_RE: | 1100 | case END_OF_RE: |
@@ -1187,7 +1195,7 @@ analyze (regex_t *preg) | |||
1187 | { | 1195 | { |
1188 | dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len); | 1196 | dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len); |
1189 | if (BE (dfa->inveclosures == NULL, 0)) | 1197 | if (BE (dfa->inveclosures == NULL, 0)) |
1190 | return REG_ESPACE; | 1198 | return REG_ESPACE; |
1191 | ret = calc_inveclosure (dfa); | 1199 | ret = calc_inveclosure (dfa); |
1192 | } | 1200 | } |
1193 | 1201 | ||
@@ -1209,16 +1217,16 @@ postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), | |||
1209 | if that's the only child). */ | 1217 | if that's the only child). */ |
1210 | while (node->left || node->right) | 1218 | while (node->left || node->right) |
1211 | if (node->left) | 1219 | if (node->left) |
1212 | node = node->left; | 1220 | node = node->left; |
1213 | else | 1221 | else |
1214 | node = node->right; | 1222 | node = node->right; |
1215 | 1223 | ||
1216 | do | 1224 | do |
1217 | { | 1225 | { |
1218 | reg_errcode_t err = fn (extra, node); | 1226 | reg_errcode_t err = fn (extra, node); |
1219 | if (BE (err != REG_NOERROR, 0)) | 1227 | if (BE (err != REG_NOERROR, 0)) |
1220 | return err; | 1228 | return err; |
1221 | if (node->parent == NULL) | 1229 | if (node->parent == NULL) |
1222 | return REG_NOERROR; | 1230 | return REG_NOERROR; |
1223 | prev = node; | 1231 | prev = node; |
1224 | node = node->parent; | 1232 | node = node->parent; |
@@ -1252,7 +1260,7 @@ preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)), | |||
1252 | prev = node; | 1260 | prev = node; |
1253 | node = node->parent; | 1261 | node = node->parent; |
1254 | if (!node) | 1262 | if (!node) |
1255 | return REG_NOERROR; | 1263 | return REG_NOERROR; |
1256 | } | 1264 | } |
1257 | node = node->right; | 1265 | node = node->right; |
1258 | } | 1266 | } |
@@ -1275,13 +1283,13 @@ optimize_subexps (void *extra, bin_tree_t *node) | |||
1275 | } | 1283 | } |
1276 | 1284 | ||
1277 | else if (node->token.type == SUBEXP | 1285 | else if (node->token.type == SUBEXP |
1278 | && node->left && node->left->token.type == SUBEXP) | 1286 | && node->left && node->left->token.type == SUBEXP) |
1279 | { | 1287 | { |
1280 | Idx other_idx = node->left->token.opr.idx; | 1288 | Idx other_idx = node->left->token.opr.idx; |
1281 | 1289 | ||
1282 | node->left = node->left->left; | 1290 | node->left = node->left->left; |
1283 | if (node->left) | 1291 | if (node->left) |
1284 | node->left->parent = node; | 1292 | node->left->parent = node; |
1285 | 1293 | ||
1286 | dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx]; | 1294 | dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx]; |
1287 | if (other_idx < BITSET_WORD_BITS) | 1295 | if (other_idx < BITSET_WORD_BITS) |
@@ -1366,9 +1374,9 @@ calc_first (void *extra, bin_tree_t *node) | |||
1366 | node->first = node; | 1374 | node->first = node; |
1367 | node->node_idx = re_dfa_add_node (dfa, node->token); | 1375 | node->node_idx = re_dfa_add_node (dfa, node->token); |
1368 | if (BE (node->node_idx == REG_MISSING, 0)) | 1376 | if (BE (node->node_idx == REG_MISSING, 0)) |
1369 | return REG_ESPACE; | 1377 | return REG_ESPACE; |
1370 | if (node->token.type == ANCHOR) | 1378 | if (node->token.type == ANCHOR) |
1371 | dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type; | 1379 | dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type; |
1372 | } | 1380 | } |
1373 | return REG_NOERROR; | 1381 | return REG_NOERROR; |
1374 | } | 1382 | } |
@@ -1390,7 +1398,7 @@ calc_next (void *extra, bin_tree_t *node) | |||
1390 | if (node->left) | 1398 | if (node->left) |
1391 | node->left->next = node->next; | 1399 | node->left->next = node->next; |
1392 | if (node->right) | 1400 | if (node->right) |
1393 | node->right->next = node->next; | 1401 | node->right->next = node->next; |
1394 | break; | 1402 | break; |
1395 | } | 1403 | } |
1396 | return REG_NOERROR; | 1404 | return REG_NOERROR; |
@@ -1441,7 +1449,7 @@ link_nfa_nodes (void *extra, bin_tree_t *node) | |||
1441 | case OP_BACK_REF: | 1449 | case OP_BACK_REF: |
1442 | dfa->nexts[idx] = node->next->node_idx; | 1450 | dfa->nexts[idx] = node->next->node_idx; |
1443 | if (node->token.type == OP_BACK_REF) | 1451 | if (node->token.type == OP_BACK_REF) |
1444 | re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]); | 1452 | err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]); |
1445 | break; | 1453 | break; |
1446 | 1454 | ||
1447 | default: | 1455 | default: |
@@ -1498,7 +1506,6 @@ duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node, | |||
1498 | destination. */ | 1506 | destination. */ |
1499 | org_dest = dfa->edests[org_node].elems[0]; | 1507 | org_dest = dfa->edests[org_node].elems[0]; |
1500 | re_node_set_empty (dfa->edests + clone_node); | 1508 | re_node_set_empty (dfa->edests + clone_node); |
1501 | clone_dest = search_duplicated_node (dfa, org_dest, constraint); | ||
1502 | /* If the node is root_node itself, it means the epsilon closure | 1509 | /* If the node is root_node itself, it means the epsilon closure |
1503 | has a loop. Then tie it to the destination of the root_node. */ | 1510 | has a loop. Then tie it to the destination of the root_node. */ |
1504 | if (org_node == root_node && clone_node != org_node) | 1511 | if (org_node == root_node && clone_node != org_node) |
@@ -1542,7 +1549,7 @@ duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node, | |||
1542 | } | 1549 | } |
1543 | else | 1550 | else |
1544 | { | 1551 | { |
1545 | /* There is a duplicated node which satisfy the constraint, | 1552 | /* There is a duplicated node which satisfies the constraint, |
1546 | use it to avoid infinite loop. */ | 1553 | use it to avoid infinite loop. */ |
1547 | ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); | 1554 | ok = re_node_set_insert (dfa->edests + clone_node, clone_dest); |
1548 | if (BE (! ok, 0)) | 1555 | if (BE (! ok, 0)) |
@@ -1674,10 +1681,9 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) | |||
1674 | { | 1681 | { |
1675 | reg_errcode_t err; | 1682 | reg_errcode_t err; |
1676 | Idx i; | 1683 | Idx i; |
1677 | bool incomplete; | ||
1678 | bool ok; | ||
1679 | re_node_set eclosure; | 1684 | re_node_set eclosure; |
1680 | incomplete = false; | 1685 | bool ok; |
1686 | bool incomplete = false; | ||
1681 | err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1); | 1687 | err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1); |
1682 | if (BE (err != REG_NOERROR, 0)) | 1688 | if (BE (err != REG_NOERROR, 0)) |
1683 | return err; | 1689 | return err; |
@@ -1722,7 +1728,9 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) | |||
1722 | else | 1728 | else |
1723 | eclosure_elem = dfa->eclosures[edest]; | 1729 | eclosure_elem = dfa->eclosures[edest]; |
1724 | /* Merge the epsilon closure of `edest'. */ | 1730 | /* Merge the epsilon closure of `edest'. */ |
1725 | re_node_set_merge (&eclosure, &eclosure_elem); | 1731 | err = re_node_set_merge (&eclosure, &eclosure_elem); |
1732 | if (BE (err != REG_NOERROR, 0)) | ||
1733 | return err; | ||
1726 | /* If the epsilon closure of `edest' is incomplete, | 1734 | /* If the epsilon closure of `edest' is incomplete, |
1727 | the epsilon closure of this node is also incomplete. */ | 1735 | the epsilon closure of this node is also incomplete. */ |
1728 | if (dfa->eclosures[edest].nelem == 0) | 1736 | if (dfa->eclosures[edest].nelem == 0) |
@@ -1732,7 +1740,7 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) | |||
1732 | } | 1740 | } |
1733 | } | 1741 | } |
1734 | 1742 | ||
1735 | /* Epsilon closures include itself. */ | 1743 | /* An epsilon closure includes itself. */ |
1736 | ok = re_node_set_insert (&eclosure, node); | 1744 | ok = re_node_set_insert (&eclosure, node); |
1737 | if (BE (! ok, 0)) | 1745 | if (BE (! ok, 0)) |
1738 | return REG_ESPACE; | 1746 | return REG_ESPACE; |
@@ -2319,7 +2327,7 @@ parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, | |||
2319 | && dfa->word_ops_used == 0) | 2327 | && dfa->word_ops_used == 0) |
2320 | init_word_char (dfa); | 2328 | init_word_char (dfa); |
2321 | if (token->opr.ctx_type == WORD_DELIM | 2329 | if (token->opr.ctx_type == WORD_DELIM |
2322 | || token->opr.ctx_type == NOT_WORD_DELIM) | 2330 | || token->opr.ctx_type == NOT_WORD_DELIM) |
2323 | { | 2331 | { |
2324 | bin_tree_t *tree_first, *tree_last; | 2332 | bin_tree_t *tree_first, *tree_last; |
2325 | if (token->opr.ctx_type == WORD_DELIM) | 2333 | if (token->opr.ctx_type == WORD_DELIM) |
@@ -2327,13 +2335,13 @@ parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, | |||
2327 | token->opr.ctx_type = WORD_FIRST; | 2335 | token->opr.ctx_type = WORD_FIRST; |
2328 | tree_first = create_token_tree (dfa, NULL, NULL, token); | 2336 | tree_first = create_token_tree (dfa, NULL, NULL, token); |
2329 | token->opr.ctx_type = WORD_LAST; | 2337 | token->opr.ctx_type = WORD_LAST; |
2330 | } | 2338 | } |
2331 | else | 2339 | else |
2332 | { | 2340 | { |
2333 | token->opr.ctx_type = INSIDE_WORD; | 2341 | token->opr.ctx_type = INSIDE_WORD; |
2334 | tree_first = create_token_tree (dfa, NULL, NULL, token); | 2342 | tree_first = create_token_tree (dfa, NULL, NULL, token); |
2335 | token->opr.ctx_type = INSIDE_NOTWORD; | 2343 | token->opr.ctx_type = INSIDE_NOTWORD; |
2336 | } | 2344 | } |
2337 | tree_last = create_token_tree (dfa, NULL, NULL, token); | 2345 | tree_last = create_token_tree (dfa, NULL, NULL, token); |
2338 | tree = create_tree (dfa, tree_first, tree_last, OP_ALT); | 2346 | tree = create_tree (dfa, tree_first, tree_last, OP_ALT); |
2339 | if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0)) | 2347 | if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0)) |
@@ -2444,7 +2452,7 @@ parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, | |||
2444 | { | 2452 | { |
2445 | tree = parse_reg_exp (regexp, preg, token, syntax, nest, err); | 2453 | tree = parse_reg_exp (regexp, preg, token, syntax, nest, err); |
2446 | if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0)) | 2454 | if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0)) |
2447 | *err = REG_EPAREN; | 2455 | *err = REG_EPAREN; |
2448 | if (BE (*err != REG_NOERROR, 0)) | 2456 | if (BE (*err != REG_NOERROR, 0)) |
2449 | return NULL; | 2457 | return NULL; |
2450 | } | 2458 | } |
@@ -2515,7 +2523,8 @@ parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa, | |||
2515 | return elem; | 2523 | return elem; |
2516 | } | 2524 | } |
2517 | 2525 | ||
2518 | if (BE (end != REG_MISSING && start > end, 0)) | 2526 | if (BE ((end != REG_MISSING && start > end) |
2527 | || token->type != OP_CLOSE_DUP_NUM, 0)) | ||
2519 | { | 2528 | { |
2520 | /* First number greater than second. */ | 2529 | /* First number greater than second. */ |
2521 | *err = REG_BADBR; | 2530 | *err = REG_BADBR; |
@@ -2568,10 +2577,14 @@ parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa, | |||
2568 | if (BE (tree == NULL, 0)) | 2577 | if (BE (tree == NULL, 0)) |
2569 | goto parse_dup_op_espace; | 2578 | goto parse_dup_op_espace; |
2570 | 2579 | ||
2580 | /* From gnulib's "intprops.h": | ||
2581 | True if the arithmetic type T is signed. */ | ||
2582 | #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) | ||
2583 | |||
2571 | /* This loop is actually executed only when end != REG_MISSING, | 2584 | /* This loop is actually executed only when end != REG_MISSING, |
2572 | to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have | 2585 | to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have |
2573 | already created the start+1-th copy. */ | 2586 | already created the start+1-th copy. */ |
2574 | if ((Idx) -1 < 0 || end != REG_MISSING) | 2587 | if (TYPE_SIGNED (Idx) || end != REG_MISSING) |
2575 | for (i = start + 2; i <= end; ++i) | 2588 | for (i = start + 2; i <= end; ++i) |
2576 | { | 2589 | { |
2577 | elem = duplicate_tree (elem, dfa); | 2590 | elem = duplicate_tree (elem, dfa); |
@@ -2609,11 +2622,17 @@ parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa, | |||
2609 | static reg_errcode_t | 2622 | static reg_errcode_t |
2610 | internal_function | 2623 | internal_function |
2611 | # ifdef RE_ENABLE_I18N | 2624 | # ifdef RE_ENABLE_I18N |
2612 | build_range_exp (bitset_t sbcset, re_charset_t *mbcset, Idx *range_alloc, | 2625 | build_range_exp (const reg_syntax_t syntax, |
2613 | bracket_elem_t *start_elem, bracket_elem_t *end_elem) | 2626 | bitset_t sbcset, |
2627 | re_charset_t *mbcset, | ||
2628 | Idx *range_alloc, | ||
2629 | const bracket_elem_t *start_elem, | ||
2630 | const bracket_elem_t *end_elem) | ||
2614 | # else /* not RE_ENABLE_I18N */ | 2631 | # else /* not RE_ENABLE_I18N */ |
2615 | build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, | 2632 | build_range_exp (const reg_syntax_t syntax, |
2616 | bracket_elem_t *end_elem) | 2633 | bitset_t sbcset, |
2634 | const bracket_elem_t *start_elem, | ||
2635 | const bracket_elem_t *end_elem) | ||
2617 | # endif /* not RE_ENABLE_I18N */ | 2636 | # endif /* not RE_ENABLE_I18N */ |
2618 | { | 2637 | { |
2619 | unsigned int start_ch, end_ch; | 2638 | unsigned int start_ch, end_ch; |
@@ -2652,7 +2671,9 @@ build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, | |||
2652 | return REG_ECOLLATE; | 2671 | return REG_ECOLLATE; |
2653 | cmp_buf[0] = start_wc; | 2672 | cmp_buf[0] = start_wc; |
2654 | cmp_buf[4] = end_wc; | 2673 | cmp_buf[4] = end_wc; |
2655 | if (wcscoll (cmp_buf, cmp_buf + 4) > 0) | 2674 | |
2675 | if (BE ((syntax & RE_NO_EMPTY_RANGES) | ||
2676 | && wcscoll (cmp_buf, cmp_buf + 4) > 0, 0)) | ||
2656 | return REG_ERANGE; | 2677 | return REG_ERANGE; |
2657 | 2678 | ||
2658 | /* Got valid collation sequence values, add them as a new entry. | 2679 | /* Got valid collation sequence values, add them as a new entry. |
@@ -2662,9 +2683,9 @@ build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, | |||
2662 | no MBCSET if dfa->mb_cur_max == 1. */ | 2683 | no MBCSET if dfa->mb_cur_max == 1. */ |
2663 | if (mbcset) | 2684 | if (mbcset) |
2664 | { | 2685 | { |
2665 | /* Check the space of the arrays. */ | 2686 | /* Check the space of the arrays. */ |
2666 | if (BE (*range_alloc == mbcset->nranges, 0)) | 2687 | if (BE (*range_alloc == mbcset->nranges, 0)) |
2667 | { | 2688 | { |
2668 | /* There is not enough space, need realloc. */ | 2689 | /* There is not enough space, need realloc. */ |
2669 | wchar_t *new_array_start, *new_array_end; | 2690 | wchar_t *new_array_start, *new_array_end; |
2670 | Idx new_nranges; | 2691 | Idx new_nranges; |
@@ -2674,9 +2695,9 @@ build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, | |||
2674 | /* Use realloc since mbcset->range_starts and mbcset->range_ends | 2695 | /* Use realloc since mbcset->range_starts and mbcset->range_ends |
2675 | are NULL if *range_alloc == 0. */ | 2696 | are NULL if *range_alloc == 0. */ |
2676 | new_array_start = re_realloc (mbcset->range_starts, wchar_t, | 2697 | new_array_start = re_realloc (mbcset->range_starts, wchar_t, |
2677 | new_nranges); | 2698 | new_nranges); |
2678 | new_array_end = re_realloc (mbcset->range_ends, wchar_t, | 2699 | new_array_end = re_realloc (mbcset->range_ends, wchar_t, |
2679 | new_nranges); | 2700 | new_nranges); |
2680 | 2701 | ||
2681 | if (BE (new_array_start == NULL || new_array_end == NULL, 0)) | 2702 | if (BE (new_array_start == NULL || new_array_end == NULL, 0)) |
2682 | return REG_ESPACE; | 2703 | return REG_ESPACE; |
@@ -2684,10 +2705,10 @@ build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, | |||
2684 | mbcset->range_starts = new_array_start; | 2705 | mbcset->range_starts = new_array_start; |
2685 | mbcset->range_ends = new_array_end; | 2706 | mbcset->range_ends = new_array_end; |
2686 | *range_alloc = new_nranges; | 2707 | *range_alloc = new_nranges; |
2687 | } | 2708 | } |
2688 | 2709 | ||
2689 | mbcset->range_starts[mbcset->nranges] = start_wc; | 2710 | mbcset->range_starts[mbcset->nranges] = start_wc; |
2690 | mbcset->range_ends[mbcset->nranges++] = end_wc; | 2711 | mbcset->range_ends[mbcset->nranges++] = end_wc; |
2691 | } | 2712 | } |
2692 | 2713 | ||
2693 | /* Build the table for single byte characters. */ | 2714 | /* Build the table for single byte characters. */ |
@@ -2799,7 +2820,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
2799 | return elem; | 2820 | return elem; |
2800 | } | 2821 | } |
2801 | 2822 | ||
2802 | /* Local function for parse_bracket_exp used in _LIBC environement. | 2823 | /* Local function for parse_bracket_exp used in _LIBC environment. |
2803 | Look up the collation sequence value of BR_ELEM. | 2824 | Look up the collation sequence value of BR_ELEM. |
2804 | Return the value if succeeded, UINT_MAX otherwise. */ | 2825 | Return the value if succeeded, UINT_MAX otherwise. */ |
2805 | 2826 | ||
@@ -2823,7 +2844,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
2823 | } | 2844 | } |
2824 | else if (br_elem->type == MB_CHAR) | 2845 | else if (br_elem->type == MB_CHAR) |
2825 | { | 2846 | { |
2826 | return __collseq_table_lookup (collseqwc, br_elem->opr.wch); | 2847 | if (nrules != 0) |
2848 | return __collseq_table_lookup (collseqwc, br_elem->opr.wch); | ||
2827 | } | 2849 | } |
2828 | else if (br_elem->type == COLL_SYM) | 2850 | else if (br_elem->type == COLL_SYM) |
2829 | { | 2851 | { |
@@ -2904,8 +2926,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
2904 | build below suffices. */ | 2926 | build below suffices. */ |
2905 | if (nrules > 0 || dfa->mb_cur_max > 1) | 2927 | if (nrules > 0 || dfa->mb_cur_max > 1) |
2906 | { | 2928 | { |
2907 | /* Check the space of the arrays. */ | 2929 | /* Check the space of the arrays. */ |
2908 | if (BE (*range_alloc == mbcset->nranges, 0)) | 2930 | if (BE (*range_alloc == mbcset->nranges, 0)) |
2909 | { | 2931 | { |
2910 | /* There is not enough space, need realloc. */ | 2932 | /* There is not enough space, need realloc. */ |
2911 | uint32_t *new_array_start; | 2933 | uint32_t *new_array_start; |
@@ -2917,18 +2939,18 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
2917 | new_array_start = re_realloc (mbcset->range_starts, uint32_t, | 2939 | new_array_start = re_realloc (mbcset->range_starts, uint32_t, |
2918 | new_nranges); | 2940 | new_nranges); |
2919 | new_array_end = re_realloc (mbcset->range_ends, uint32_t, | 2941 | new_array_end = re_realloc (mbcset->range_ends, uint32_t, |
2920 | new_nranges); | 2942 | new_nranges); |
2921 | 2943 | ||
2922 | if (BE (new_array_start == NULL || new_array_end == NULL, 0)) | 2944 | if (BE (new_array_start == NULL || new_array_end == NULL, 0)) |
2923 | return REG_ESPACE; | 2945 | return REG_ESPACE; |
2924 | 2946 | ||
2925 | mbcset->range_starts = new_array_start; | 2947 | mbcset->range_starts = new_array_start; |
2926 | mbcset->range_ends = new_array_end; | 2948 | mbcset->range_ends = new_array_end; |
2927 | *range_alloc = new_nranges; | 2949 | *range_alloc = new_nranges; |
2928 | } | 2950 | } |
2929 | 2951 | ||
2930 | mbcset->range_starts[mbcset->nranges] = start_collseq; | 2952 | mbcset->range_starts[mbcset->nranges] = start_collseq; |
2931 | mbcset->range_ends[mbcset->nranges++] = end_collseq; | 2953 | mbcset->range_ends[mbcset->nranges++] = end_collseq; |
2932 | } | 2954 | } |
2933 | 2955 | ||
2934 | /* Build the table for single byte characters. */ | 2956 | /* Build the table for single byte characters. */ |
@@ -3154,11 +3176,11 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
3154 | &start_elem, &end_elem); | 3176 | &start_elem, &end_elem); |
3155 | #else | 3177 | #else |
3156 | # ifdef RE_ENABLE_I18N | 3178 | # ifdef RE_ENABLE_I18N |
3157 | *err = build_range_exp (sbcset, | 3179 | *err = build_range_exp (syntax, sbcset, |
3158 | dfa->mb_cur_max > 1 ? mbcset : NULL, | 3180 | dfa->mb_cur_max > 1 ? mbcset : NULL, |
3159 | &range_alloc, &start_elem, &end_elem); | 3181 | &range_alloc, &start_elem, &end_elem); |
3160 | # else | 3182 | # else |
3161 | *err = build_range_exp (sbcset, &start_elem, &end_elem); | 3183 | *err = build_range_exp (syntax, sbcset, &start_elem, &end_elem); |
3162 | # endif | 3184 | # endif |
3163 | #endif /* RE_ENABLE_I18N */ | 3185 | #endif /* RE_ENABLE_I18N */ |
3164 | if (BE (*err != REG_NOERROR, 0)) | 3186 | if (BE (*err != REG_NOERROR, 0)) |
@@ -3262,17 +3284,17 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
3262 | of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */ | 3284 | of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */ |
3263 | if (sbc_idx < BITSET_WORDS) | 3285 | if (sbc_idx < BITSET_WORDS) |
3264 | { | 3286 | { |
3265 | /* Build a tree for simple bracket. */ | 3287 | /* Build a tree for simple bracket. */ |
3266 | br_token.type = SIMPLE_BRACKET; | 3288 | br_token.type = SIMPLE_BRACKET; |
3267 | br_token.opr.sbcset = sbcset; | 3289 | br_token.opr.sbcset = sbcset; |
3268 | work_tree = create_token_tree (dfa, NULL, NULL, &br_token); | 3290 | work_tree = create_token_tree (dfa, NULL, NULL, &br_token); |
3269 | if (BE (work_tree == NULL, 0)) | 3291 | if (BE (work_tree == NULL, 0)) |
3270 | goto parse_bracket_exp_espace; | 3292 | goto parse_bracket_exp_espace; |
3271 | 3293 | ||
3272 | /* Then join them by ALT node. */ | 3294 | /* Then join them by ALT node. */ |
3273 | work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT); | 3295 | work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT); |
3274 | if (BE (work_tree == NULL, 0)) | 3296 | if (BE (work_tree == NULL, 0)) |
3275 | goto parse_bracket_exp_espace; | 3297 | goto parse_bracket_exp_espace; |
3276 | } | 3298 | } |
3277 | else | 3299 | else |
3278 | { | 3300 | { |
@@ -3291,7 +3313,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, | |||
3291 | br_token.opr.sbcset = sbcset; | 3313 | br_token.opr.sbcset = sbcset; |
3292 | work_tree = create_token_tree (dfa, NULL, NULL, &br_token); | 3314 | work_tree = create_token_tree (dfa, NULL, NULL, &br_token); |
3293 | if (BE (work_tree == NULL, 0)) | 3315 | if (BE (work_tree == NULL, 0)) |
3294 | goto parse_bracket_exp_espace; | 3316 | goto parse_bracket_exp_espace; |
3295 | } | 3317 | } |
3296 | return work_tree; | 3318 | return work_tree; |
3297 | 3319 | ||
@@ -3430,7 +3452,7 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name) | |||
3430 | 3452 | ||
3431 | /* Build single byte matcing table for this equivalence class. */ | 3453 | /* Build single byte matcing table for this equivalence class. */ |
3432 | char_buf[1] = (unsigned char) '\0'; | 3454 | char_buf[1] = (unsigned char) '\0'; |
3433 | len = weights[idx1]; | 3455 | len = weights[idx1 & 0xffffff]; |
3434 | for (ch = 0; ch < SBC_MAX; ++ch) | 3456 | for (ch = 0; ch < SBC_MAX; ++ch) |
3435 | { | 3457 | { |
3436 | char_buf[0] = ch; | 3458 | char_buf[0] = ch; |
@@ -3442,11 +3464,15 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name) | |||
3442 | if (idx2 == 0) | 3464 | if (idx2 == 0) |
3443 | /* This isn't a valid character. */ | 3465 | /* This isn't a valid character. */ |
3444 | continue; | 3466 | continue; |
3445 | if (len == weights[idx2]) | 3467 | /* Compare only if the length matches and the collation rule |
3468 | index is the same. */ | ||
3469 | if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24)) | ||
3446 | { | 3470 | { |
3447 | int cnt = 0; | 3471 | int cnt = 0; |
3472 | |||
3448 | while (cnt <= len && | 3473 | while (cnt <= len && |
3449 | weights[idx1 + 1 + cnt] == weights[idx2 + 1 + cnt]) | 3474 | weights[(idx1 & 0xffffff) + 1 + cnt] |
3475 | == weights[(idx2 & 0xffffff) + 1 + cnt]) | ||
3450 | ++cnt; | 3476 | ++cnt; |
3451 | 3477 | ||
3452 | if (cnt > len) | 3478 | if (cnt > len) |
@@ -3842,7 +3868,7 @@ duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa) | |||
3842 | node = node->parent; | 3868 | node = node->parent; |
3843 | dup_node = dup_node->parent; | 3869 | dup_node = dup_node->parent; |
3844 | if (!node) | 3870 | if (!node) |
3845 | return dup_root; | 3871 | return dup_root; |
3846 | } | 3872 | } |
3847 | node = node->right; | 3873 | node = node->right; |
3848 | p_new = &dup_node->right; | 3874 | p_new = &dup_node->right; |
@@ -1,5 +1,6 @@ | |||
1 | /* Extended regular expression matching and search library. | 1 | /* Extended regular expression matching and search library. |
2 | Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. | 2 | Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation, |
3 | Inc. | ||
3 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
4 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. | 5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. |
5 | 6 | ||
@@ -1,7 +1,8 @@ | |||
1 | /* Definitions for data structures and routines for the regular | 1 | /* Definitions for data structures and routines for the regular |
2 | expression library. | 2 | expression library. |
3 | Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006 | 3 | Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993, 1995, 1996, 1997, 1998, |
4 | Free Software Foundation, Inc. | 4 | 2000, 2001, 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation, |
5 | Inc. | ||
5 | This file is part of the GNU C Library. | 6 | This file is part of the GNU C Library. |
6 | 7 | ||
7 | This program is free software; you can redistribute it and/or modify | 8 | This program is free software; you can redistribute it and/or modify |
diff --git a/gl/regex_internal.c b/gl/regex_internal.c index 7acec79d..17eafaa9 100644 --- a/gl/regex_internal.c +++ b/gl/regex_internal.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Extended regular expression matching and search library. | 1 | /* Extended regular expression matching and search library. |
2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | 2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free |
3 | Free Software Foundation, Inc. | 3 | Software Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. | 5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. |
6 | 6 | ||
@@ -36,7 +36,7 @@ static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa, | |||
36 | re_string_reconstruct before using the object. */ | 36 | re_string_reconstruct before using the object. */ |
37 | 37 | ||
38 | static reg_errcode_t | 38 | static reg_errcode_t |
39 | internal_function | 39 | internal_function __attribute_warn_unused_result__ |
40 | re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len, | 40 | re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len, |
41 | RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) | 41 | RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) |
42 | { | 42 | { |
@@ -64,7 +64,7 @@ re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len, | |||
64 | /* This function allocate the buffers, and initialize them. */ | 64 | /* This function allocate the buffers, and initialize them. */ |
65 | 65 | ||
66 | static reg_errcode_t | 66 | static reg_errcode_t |
67 | internal_function | 67 | internal_function __attribute_warn_unused_result__ |
68 | re_string_construct (re_string_t *pstr, const char *str, Idx len, | 68 | re_string_construct (re_string_t *pstr, const char *str, Idx len, |
69 | RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) | 69 | RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa) |
70 | { | 70 | { |
@@ -127,7 +127,7 @@ re_string_construct (re_string_t *pstr, const char *str, Idx len, | |||
127 | /* Helper functions for re_string_allocate, and re_string_construct. */ | 127 | /* Helper functions for re_string_allocate, and re_string_construct. */ |
128 | 128 | ||
129 | static reg_errcode_t | 129 | static reg_errcode_t |
130 | internal_function | 130 | internal_function __attribute_warn_unused_result__ |
131 | re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len) | 131 | re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len) |
132 | { | 132 | { |
133 | #ifdef RE_ENABLE_I18N | 133 | #ifdef RE_ENABLE_I18N |
@@ -267,7 +267,7 @@ build_wcs_buffer (re_string_t *pstr) | |||
267 | but for REG_ICASE. */ | 267 | but for REG_ICASE. */ |
268 | 268 | ||
269 | static reg_errcode_t | 269 | static reg_errcode_t |
270 | internal_function | 270 | internal_function __attribute_warn_unused_result__ |
271 | build_wcs_upper_buffer (re_string_t *pstr) | 271 | build_wcs_upper_buffer (re_string_t *pstr) |
272 | { | 272 | { |
273 | mbstate_t prev_st; | 273 | mbstate_t prev_st; |
@@ -430,8 +430,8 @@ build_wcs_upper_buffer (re_string_t *pstr) | |||
430 | src_idx += mbclen; | 430 | src_idx += mbclen; |
431 | continue; | 431 | continue; |
432 | } | 432 | } |
433 | else | 433 | else |
434 | memcpy (pstr->mbs + byte_idx, p, mbclen); | 434 | memcpy (pstr->mbs + byte_idx, p, mbclen); |
435 | } | 435 | } |
436 | else | 436 | else |
437 | memcpy (pstr->mbs + byte_idx, p, mbclen); | 437 | memcpy (pstr->mbs + byte_idx, p, mbclen); |
@@ -569,7 +569,7 @@ re_string_translate_buffer (re_string_t *pstr) | |||
569 | convert to upper case in case of REG_ICASE, apply translation. */ | 569 | convert to upper case in case of REG_ICASE, apply translation. */ |
570 | 570 | ||
571 | static reg_errcode_t | 571 | static reg_errcode_t |
572 | internal_function | 572 | internal_function __attribute_warn_unused_result__ |
573 | re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags) | 573 | re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags) |
574 | { | 574 | { |
575 | Idx offset; | 575 | Idx offset; |
@@ -964,7 +964,7 @@ re_string_context_at (const re_string_t *input, Idx idx, int eflags) | |||
964 | /* Functions for set operation. */ | 964 | /* Functions for set operation. */ |
965 | 965 | ||
966 | static reg_errcode_t | 966 | static reg_errcode_t |
967 | internal_function | 967 | internal_function __attribute_warn_unused_result__ |
968 | re_node_set_alloc (re_node_set *set, Idx size) | 968 | re_node_set_alloc (re_node_set *set, Idx size) |
969 | { | 969 | { |
970 | set->alloc = size; | 970 | set->alloc = size; |
@@ -976,7 +976,7 @@ re_node_set_alloc (re_node_set *set, Idx size) | |||
976 | } | 976 | } |
977 | 977 | ||
978 | static reg_errcode_t | 978 | static reg_errcode_t |
979 | internal_function | 979 | internal_function __attribute_warn_unused_result__ |
980 | re_node_set_init_1 (re_node_set *set, Idx elem) | 980 | re_node_set_init_1 (re_node_set *set, Idx elem) |
981 | { | 981 | { |
982 | set->alloc = 1; | 982 | set->alloc = 1; |
@@ -992,7 +992,7 @@ re_node_set_init_1 (re_node_set *set, Idx elem) | |||
992 | } | 992 | } |
993 | 993 | ||
994 | static reg_errcode_t | 994 | static reg_errcode_t |
995 | internal_function | 995 | internal_function __attribute_warn_unused_result__ |
996 | re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2) | 996 | re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2) |
997 | { | 997 | { |
998 | set->alloc = 2; | 998 | set->alloc = 2; |
@@ -1022,7 +1022,7 @@ re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2) | |||
1022 | } | 1022 | } |
1023 | 1023 | ||
1024 | static reg_errcode_t | 1024 | static reg_errcode_t |
1025 | internal_function | 1025 | internal_function __attribute_warn_unused_result__ |
1026 | re_node_set_init_copy (re_node_set *dest, const re_node_set *src) | 1026 | re_node_set_init_copy (re_node_set *dest, const re_node_set *src) |
1027 | { | 1027 | { |
1028 | dest->nelem = src->nelem; | 1028 | dest->nelem = src->nelem; |
@@ -1047,7 +1047,7 @@ re_node_set_init_copy (re_node_set *dest, const re_node_set *src) | |||
1047 | Note: We assume dest->elems is NULL, when dest->alloc is 0. */ | 1047 | Note: We assume dest->elems is NULL, when dest->alloc is 0. */ |
1048 | 1048 | ||
1049 | static reg_errcode_t | 1049 | static reg_errcode_t |
1050 | internal_function | 1050 | internal_function __attribute_warn_unused_result__ |
1051 | re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, | 1051 | re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, |
1052 | const re_node_set *src2) | 1052 | const re_node_set *src2) |
1053 | { | 1053 | { |
@@ -1062,7 +1062,7 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, | |||
1062 | Idx new_alloc = src1->nelem + src2->nelem + dest->alloc; | 1062 | Idx new_alloc = src1->nelem + src2->nelem + dest->alloc; |
1063 | Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc); | 1063 | Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc); |
1064 | if (BE (new_elems == NULL, 0)) | 1064 | if (BE (new_elems == NULL, 0)) |
1065 | return REG_ESPACE; | 1065 | return REG_ESPACE; |
1066 | dest->elems = new_elems; | 1066 | dest->elems = new_elems; |
1067 | dest->alloc = new_alloc; | 1067 | dest->alloc = new_alloc; |
1068 | } | 1068 | } |
@@ -1112,20 +1112,20 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, | |||
1112 | if (delta > 0 && REG_VALID_INDEX (id)) | 1112 | if (delta > 0 && REG_VALID_INDEX (id)) |
1113 | for (;;) | 1113 | for (;;) |
1114 | { | 1114 | { |
1115 | if (dest->elems[is] > dest->elems[id]) | 1115 | if (dest->elems[is] > dest->elems[id]) |
1116 | { | 1116 | { |
1117 | /* Copy from the top. */ | 1117 | /* Copy from the top. */ |
1118 | dest->elems[id + delta--] = dest->elems[is--]; | 1118 | dest->elems[id + delta--] = dest->elems[is--]; |
1119 | if (delta == 0) | 1119 | if (delta == 0) |
1120 | break; | 1120 | break; |
1121 | } | 1121 | } |
1122 | else | 1122 | else |
1123 | { | 1123 | { |
1124 | /* Slide from the bottom. */ | 1124 | /* Slide from the bottom. */ |
1125 | dest->elems[id + delta] = dest->elems[id]; | 1125 | dest->elems[id + delta] = dest->elems[id]; |
1126 | if (! REG_VALID_INDEX (--id)) | 1126 | if (! REG_VALID_INDEX (--id)) |
1127 | break; | 1127 | break; |
1128 | } | 1128 | } |
1129 | } | 1129 | } |
1130 | 1130 | ||
1131 | /* Copy remaining SRC elements. */ | 1131 | /* Copy remaining SRC elements. */ |
@@ -1138,7 +1138,7 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, | |||
1138 | DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ | 1138 | DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ |
1139 | 1139 | ||
1140 | static reg_errcode_t | 1140 | static reg_errcode_t |
1141 | internal_function | 1141 | internal_function __attribute_warn_unused_result__ |
1142 | re_node_set_init_union (re_node_set *dest, const re_node_set *src1, | 1142 | re_node_set_init_union (re_node_set *dest, const re_node_set *src1, |
1143 | const re_node_set *src2) | 1143 | const re_node_set *src2) |
1144 | { | 1144 | { |
@@ -1191,7 +1191,7 @@ re_node_set_init_union (re_node_set *dest, const re_node_set *src1, | |||
1191 | DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ | 1191 | DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ |
1192 | 1192 | ||
1193 | static reg_errcode_t | 1193 | static reg_errcode_t |
1194 | internal_function | 1194 | internal_function __attribute_warn_unused_result__ |
1195 | re_node_set_merge (re_node_set *dest, const re_node_set *src) | 1195 | re_node_set_merge (re_node_set *dest, const re_node_set *src) |
1196 | { | 1196 | { |
1197 | Idx is, id, sbase, delta; | 1197 | Idx is, id, sbase, delta; |
@@ -1221,11 +1221,11 @@ re_node_set_merge (re_node_set *dest, const re_node_set *src) | |||
1221 | REG_VALID_INDEX (is) && REG_VALID_INDEX (id); ) | 1221 | REG_VALID_INDEX (is) && REG_VALID_INDEX (id); ) |
1222 | { | 1222 | { |
1223 | if (dest->elems[id] == src->elems[is]) | 1223 | if (dest->elems[id] == src->elems[is]) |
1224 | is--, id--; | 1224 | is--, id--; |
1225 | else if (dest->elems[id] < src->elems[is]) | 1225 | else if (dest->elems[id] < src->elems[is]) |
1226 | dest->elems[--sbase] = src->elems[is--]; | 1226 | dest->elems[--sbase] = src->elems[is--]; |
1227 | else /* if (dest->elems[id] > src->elems[is]) */ | 1227 | else /* if (dest->elems[id] > src->elems[is]) */ |
1228 | --id; | 1228 | --id; |
1229 | } | 1229 | } |
1230 | 1230 | ||
1231 | if (REG_VALID_INDEX (is)) | 1231 | if (REG_VALID_INDEX (is)) |
@@ -1247,21 +1247,21 @@ re_node_set_merge (re_node_set *dest, const re_node_set *src) | |||
1247 | for (;;) | 1247 | for (;;) |
1248 | { | 1248 | { |
1249 | if (dest->elems[is] > dest->elems[id]) | 1249 | if (dest->elems[is] > dest->elems[id]) |
1250 | { | 1250 | { |
1251 | /* Copy from the top. */ | 1251 | /* Copy from the top. */ |
1252 | dest->elems[id + delta--] = dest->elems[is--]; | 1252 | dest->elems[id + delta--] = dest->elems[is--]; |
1253 | if (delta == 0) | 1253 | if (delta == 0) |
1254 | break; | 1254 | break; |
1255 | } | 1255 | } |
1256 | else | 1256 | else |
1257 | { | 1257 | { |
1258 | /* Slide from the bottom. */ | 1258 | /* Slide from the bottom. */ |
1259 | dest->elems[id + delta] = dest->elems[id]; | 1259 | dest->elems[id + delta] = dest->elems[id]; |
1260 | if (! REG_VALID_INDEX (--id)) | 1260 | if (! REG_VALID_INDEX (--id)) |
1261 | { | 1261 | { |
1262 | /* Copy remaining SRC elements. */ | 1262 | /* Copy remaining SRC elements. */ |
1263 | memcpy (dest->elems, dest->elems + sbase, | 1263 | memcpy (dest->elems, dest->elems + sbase, |
1264 | delta * sizeof (Idx)); | 1264 | delta * sizeof (Idx)); |
1265 | break; | 1265 | break; |
1266 | } | 1266 | } |
1267 | } | 1267 | } |
@@ -1275,7 +1275,7 @@ re_node_set_merge (re_node_set *dest, const re_node_set *src) | |||
1275 | Return true if successful. */ | 1275 | Return true if successful. */ |
1276 | 1276 | ||
1277 | static bool | 1277 | static bool |
1278 | internal_function | 1278 | internal_function __attribute_warn_unused_result__ |
1279 | re_node_set_insert (re_node_set *set, Idx elem) | 1279 | re_node_set_insert (re_node_set *set, Idx elem) |
1280 | { | 1280 | { |
1281 | Idx idx; | 1281 | Idx idx; |
@@ -1308,12 +1308,12 @@ re_node_set_insert (re_node_set *set, Idx elem) | |||
1308 | { | 1308 | { |
1309 | idx = 0; | 1309 | idx = 0; |
1310 | for (idx = set->nelem; idx > 0; idx--) | 1310 | for (idx = set->nelem; idx > 0; idx--) |
1311 | set->elems[idx] = set->elems[idx - 1]; | 1311 | set->elems[idx] = set->elems[idx - 1]; |
1312 | } | 1312 | } |
1313 | else | 1313 | else |
1314 | { | 1314 | { |
1315 | for (idx = set->nelem; set->elems[idx - 1] > elem; idx--) | 1315 | for (idx = set->nelem; set->elems[idx - 1] > elem; idx--) |
1316 | set->elems[idx] = set->elems[idx - 1]; | 1316 | set->elems[idx] = set->elems[idx - 1]; |
1317 | } | 1317 | } |
1318 | 1318 | ||
1319 | /* Insert the new element. */ | 1319 | /* Insert the new element. */ |
@@ -1327,7 +1327,7 @@ re_node_set_insert (re_node_set *set, Idx elem) | |||
1327 | Return true if successful. */ | 1327 | Return true if successful. */ |
1328 | 1328 | ||
1329 | static bool | 1329 | static bool |
1330 | internal_function | 1330 | internal_function __attribute_warn_unused_result__ |
1331 | re_node_set_insert_last (re_node_set *set, Idx elem) | 1331 | re_node_set_insert_last (re_node_set *set, Idx elem) |
1332 | { | 1332 | { |
1333 | /* Realloc if we need. */ | 1333 | /* Realloc if we need. */ |
@@ -1473,7 +1473,7 @@ calc_state_hash (const re_node_set *nodes, unsigned int context) | |||
1473 | optimization. */ | 1473 | optimization. */ |
1474 | 1474 | ||
1475 | static re_dfastate_t * | 1475 | static re_dfastate_t * |
1476 | internal_function | 1476 | internal_function __attribute_warn_unused_result__ |
1477 | re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa, | 1477 | re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa, |
1478 | const re_node_set *nodes) | 1478 | const re_node_set *nodes) |
1479 | { | 1479 | { |
@@ -1521,7 +1521,7 @@ re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa, | |||
1521 | optimization. */ | 1521 | optimization. */ |
1522 | 1522 | ||
1523 | static re_dfastate_t * | 1523 | static re_dfastate_t * |
1524 | internal_function | 1524 | internal_function __attribute_warn_unused_result__ |
1525 | re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa, | 1525 | re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa, |
1526 | const re_node_set *nodes, unsigned int context) | 1526 | const re_node_set *nodes, unsigned int context) |
1527 | { | 1527 | { |
@@ -1562,6 +1562,7 @@ re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa, | |||
1562 | indicates the error code if failed. */ | 1562 | indicates the error code if failed. */ |
1563 | 1563 | ||
1564 | static reg_errcode_t | 1564 | static reg_errcode_t |
1565 | __attribute_warn_unused_result__ | ||
1565 | register_state (const re_dfa_t *dfa, re_dfastate_t *newstate, | 1566 | register_state (const re_dfa_t *dfa, re_dfastate_t *newstate, |
1566 | re_hashval_t hash) | 1567 | re_hashval_t hash) |
1567 | { | 1568 | { |
@@ -1616,7 +1617,7 @@ free_state (re_dfastate_t *state) | |||
1616 | Return the new state if succeeded, otherwise return NULL. */ | 1617 | Return the new state if succeeded, otherwise return NULL. */ |
1617 | 1618 | ||
1618 | static re_dfastate_t * | 1619 | static re_dfastate_t * |
1619 | internal_function | 1620 | internal_function __attribute_warn_unused_result__ |
1620 | create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, | 1621 | create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, |
1621 | re_hashval_t hash) | 1622 | re_hashval_t hash) |
1622 | { | 1623 | { |
@@ -1666,7 +1667,7 @@ create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, | |||
1666 | Return the new state if succeeded, otherwise return NULL. */ | 1667 | Return the new state if succeeded, otherwise return NULL. */ |
1667 | 1668 | ||
1668 | static re_dfastate_t * | 1669 | static re_dfastate_t * |
1669 | internal_function | 1670 | internal_function __attribute_warn_unused_result__ |
1670 | create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, | 1671 | create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, |
1671 | unsigned int context, re_hashval_t hash) | 1672 | unsigned int context, re_hashval_t hash) |
1672 | { | 1673 | { |
@@ -1715,7 +1716,9 @@ create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, | |||
1715 | free_state (newstate); | 1716 | free_state (newstate); |
1716 | return NULL; | 1717 | return NULL; |
1717 | } | 1718 | } |
1718 | re_node_set_init_copy (newstate->entrance_nodes, nodes); | 1719 | if (re_node_set_init_copy (newstate->entrance_nodes, nodes) |
1720 | != REG_NOERROR) | ||
1721 | return NULL; | ||
1719 | nctx_nodes = 0; | 1722 | nctx_nodes = 0; |
1720 | newstate->has_constraint = 1; | 1723 | newstate->has_constraint = 1; |
1721 | } | 1724 | } |
diff --git a/gl/regex_internal.h b/gl/regex_internal.h index dc322ec5..2cb8c4d0 100644 --- a/gl/regex_internal.h +++ b/gl/regex_internal.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Extended regular expression matching and search library. | 1 | /* Extended regular expression matching and search library. |
2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | 2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free |
3 | Free Software Foundation, Inc. | 3 | Software Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. | 5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. |
6 | 6 | ||
@@ -28,9 +28,8 @@ | |||
28 | #include <stdlib.h> | 28 | #include <stdlib.h> |
29 | #include <string.h> | 29 | #include <string.h> |
30 | 30 | ||
31 | #ifdef _LIBC | 31 | #include <langinfo.h> |
32 | # include <langinfo.h> | 32 | #ifndef _LIBC |
33 | #else | ||
34 | # include "localcharset.h" | 33 | # include "localcharset.h" |
35 | #endif | 34 | #endif |
36 | #if defined HAVE_LOCALE_H || defined _LIBC | 35 | #if defined HAVE_LOCALE_H || defined _LIBC |
@@ -852,4 +851,21 @@ re_string_elem_size_at (const re_string_t *pstr, Idx idx) | |||
852 | } | 851 | } |
853 | #endif /* RE_ENABLE_I18N */ | 852 | #endif /* RE_ENABLE_I18N */ |
854 | 853 | ||
854 | #ifndef __GNUC_PREREQ | ||
855 | # if defined __GNUC__ && defined __GNUC_MINOR__ | ||
856 | # define __GNUC_PREREQ(maj, min) \ | ||
857 | ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) | ||
858 | # else | ||
859 | # define __GNUC_PREREQ(maj, min) 0 | ||
860 | # endif | ||
861 | #endif | ||
862 | |||
863 | #if __GNUC_PREREQ (3,4) | ||
864 | # undef __attribute_warn_unused_result__ | ||
865 | # define __attribute_warn_unused_result__ \ | ||
866 | __attribute__ ((__warn_unused_result__)) | ||
867 | #else | ||
868 | # define __attribute_warn_unused_result__ /* empty */ | ||
869 | #endif | ||
870 | |||
855 | #endif /* _REGEX_INTERNAL_H */ | 871 | #endif /* _REGEX_INTERNAL_H */ |
diff --git a/gl/regexec.c b/gl/regexec.c index 5452ef78..dc449ce5 100644 --- a/gl/regexec.c +++ b/gl/regexec.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Extended regular expression matching and search library. | 1 | /* Extended regular expression matching and search library. |
2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | 2 | Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free |
3 | Free Software Foundation, Inc. | 3 | Software Foundation, Inc. |
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. | 5 | Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. |
6 | 6 | ||
@@ -637,7 +637,7 @@ re_exec (s) | |||
637 | (0 <= LAST_START && LAST_START <= LENGTH) */ | 637 | (0 <= LAST_START && LAST_START <= LENGTH) */ |
638 | 638 | ||
639 | static reg_errcode_t | 639 | static reg_errcode_t |
640 | internal_function | 640 | internal_function __attribute_warn_unused_result__ |
641 | re_search_internal (const regex_t *preg, | 641 | re_search_internal (const regex_t *preg, |
642 | const char *string, Idx length, | 642 | const char *string, Idx length, |
643 | Idx start, Idx last_start, Idx stop, | 643 | Idx start, Idx last_start, Idx stop, |
@@ -833,10 +833,10 @@ re_search_internal (const regex_t *preg, | |||
833 | break; | 833 | break; |
834 | match_first += incr; | 834 | match_first += incr; |
835 | if (match_first < left_lim || match_first > right_lim) | 835 | if (match_first < left_lim || match_first > right_lim) |
836 | { | 836 | { |
837 | err = REG_NOMATCH; | 837 | err = REG_NOMATCH; |
838 | goto free_return; | 838 | goto free_return; |
839 | } | 839 | } |
840 | } | 840 | } |
841 | break; | 841 | break; |
842 | } | 842 | } |
@@ -953,14 +953,14 @@ re_search_internal (const regex_t *preg, | |||
953 | } | 953 | } |
954 | 954 | ||
955 | if (dfa->subexp_map) | 955 | if (dfa->subexp_map) |
956 | for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++) | 956 | for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++) |
957 | if (dfa->subexp_map[reg_idx] != reg_idx) | 957 | if (dfa->subexp_map[reg_idx] != reg_idx) |
958 | { | 958 | { |
959 | pmatch[reg_idx + 1].rm_so | 959 | pmatch[reg_idx + 1].rm_so |
960 | = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so; | 960 | = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so; |
961 | pmatch[reg_idx + 1].rm_eo | 961 | pmatch[reg_idx + 1].rm_eo |
962 | = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo; | 962 | = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo; |
963 | } | 963 | } |
964 | } | 964 | } |
965 | 965 | ||
966 | free_return: | 966 | free_return: |
@@ -972,7 +972,7 @@ re_search_internal (const regex_t *preg, | |||
972 | } | 972 | } |
973 | 973 | ||
974 | static reg_errcode_t | 974 | static reg_errcode_t |
975 | internal_function | 975 | internal_function __attribute_warn_unused_result__ |
976 | prune_impossible_nodes (re_match_context_t *mctx) | 976 | prune_impossible_nodes (re_match_context_t *mctx) |
977 | { | 977 | { |
978 | const re_dfa_t *const dfa = mctx->dfa; | 978 | const re_dfa_t *const dfa = mctx->dfa; |
@@ -1110,7 +1110,7 @@ acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx, | |||
1110 | index of the buffer. */ | 1110 | index of the buffer. */ |
1111 | 1111 | ||
1112 | static Idx | 1112 | static Idx |
1113 | internal_function | 1113 | internal_function __attribute_warn_unused_result__ |
1114 | check_matching (re_match_context_t *mctx, bool fl_longest_match, | 1114 | check_matching (re_match_context_t *mctx, bool fl_longest_match, |
1115 | Idx *p_match_first) | 1115 | Idx *p_match_first) |
1116 | { | 1116 | { |
@@ -1149,7 +1149,7 @@ check_matching (re_match_context_t *mctx, bool fl_longest_match, | |||
1149 | { | 1149 | { |
1150 | err = transit_state_bkref (mctx, &cur_state->nodes); | 1150 | err = transit_state_bkref (mctx, &cur_state->nodes); |
1151 | if (BE (err != REG_NOERROR, 0)) | 1151 | if (BE (err != REG_NOERROR, 0)) |
1152 | return err; | 1152 | return err; |
1153 | } | 1153 | } |
1154 | } | 1154 | } |
1155 | } | 1155 | } |
@@ -1176,16 +1176,16 @@ check_matching (re_match_context_t *mctx, bool fl_longest_match, | |||
1176 | Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1; | 1176 | Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1; |
1177 | 1177 | ||
1178 | if (BE (next_char_idx >= mctx->input.bufs_len, 0) | 1178 | if (BE (next_char_idx >= mctx->input.bufs_len, 0) |
1179 | || (BE (next_char_idx >= mctx->input.valid_len, 0) | 1179 | || (BE (next_char_idx >= mctx->input.valid_len, 0) |
1180 | && mctx->input.valid_len < mctx->input.len)) | 1180 | && mctx->input.valid_len < mctx->input.len)) |
1181 | { | 1181 | { |
1182 | err = extend_buffers (mctx); | 1182 | err = extend_buffers (mctx); |
1183 | if (BE (err != REG_NOERROR, 0)) | 1183 | if (BE (err != REG_NOERROR, 0)) |
1184 | { | 1184 | { |
1185 | assert (err == REG_ESPACE); | 1185 | assert (err == REG_ESPACE); |
1186 | return REG_ERROR; | 1186 | return REG_ERROR; |
1187 | } | 1187 | } |
1188 | } | 1188 | } |
1189 | 1189 | ||
1190 | cur_state = transit_state (&err, mctx, cur_state); | 1190 | cur_state = transit_state (&err, mctx, cur_state); |
1191 | if (mctx->state_log != NULL) | 1191 | if (mctx->state_log != NULL) |
@@ -1309,17 +1309,17 @@ proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs, | |||
1309 | if (dest_node == REG_MISSING) | 1309 | if (dest_node == REG_MISSING) |
1310 | dest_node = candidate; | 1310 | dest_node = candidate; |
1311 | 1311 | ||
1312 | else | 1312 | else |
1313 | { | 1313 | { |
1314 | /* In order to avoid infinite loop like "(a*)*", return the second | 1314 | /* In order to avoid infinite loop like "(a*)*", return the second |
1315 | epsilon-transition if the first was already considered. */ | 1315 | epsilon-transition if the first was already considered. */ |
1316 | if (re_node_set_contains (eps_via_nodes, dest_node)) | 1316 | if (re_node_set_contains (eps_via_nodes, dest_node)) |
1317 | return candidate; | 1317 | return candidate; |
1318 | 1318 | ||
1319 | /* Otherwise, push the second epsilon-transition on the fail stack. */ | 1319 | /* Otherwise, push the second epsilon-transition on the fail stack. */ |
1320 | else if (fs != NULL | 1320 | else if (fs != NULL |
1321 | && push_fail_stack (fs, *pidx, candidate, nregs, regs, | 1321 | && push_fail_stack (fs, *pidx, candidate, nregs, regs, |
1322 | eps_via_nodes)) | 1322 | eps_via_nodes)) |
1323 | return REG_ERROR; | 1323 | return REG_ERROR; |
1324 | 1324 | ||
1325 | /* We know we are going to exit. */ | 1325 | /* We know we are going to exit. */ |
@@ -1385,7 +1385,7 @@ proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs, | |||
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | static reg_errcode_t | 1387 | static reg_errcode_t |
1388 | internal_function | 1388 | internal_function __attribute_warn_unused_result__ |
1389 | push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node, | 1389 | push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node, |
1390 | Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes) | 1390 | Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes) |
1391 | { | 1391 | { |
@@ -1432,7 +1432,7 @@ pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs, | |||
1432 | pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */ | 1432 | pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */ |
1433 | 1433 | ||
1434 | static reg_errcode_t | 1434 | static reg_errcode_t |
1435 | internal_function | 1435 | internal_function __attribute_warn_unused_result__ |
1436 | set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, | 1436 | set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, |
1437 | regmatch_t *pmatch, bool fl_backtrack) | 1437 | regmatch_t *pmatch, bool fl_backtrack) |
1438 | { | 1438 | { |
@@ -1667,7 +1667,7 @@ sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx) | |||
1667 | if (mctx->state_log[str_idx]) | 1667 | if (mctx->state_log[str_idx]) |
1668 | { | 1668 | { |
1669 | err = build_sifted_states (mctx, sctx, str_idx, &cur_dest); | 1669 | err = build_sifted_states (mctx, sctx, str_idx, &cur_dest); |
1670 | if (BE (err != REG_NOERROR, 0)) | 1670 | if (BE (err != REG_NOERROR, 0)) |
1671 | goto free_return; | 1671 | goto free_return; |
1672 | } | 1672 | } |
1673 | 1673 | ||
@@ -1686,7 +1686,7 @@ sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx) | |||
1686 | } | 1686 | } |
1687 | 1687 | ||
1688 | static reg_errcode_t | 1688 | static reg_errcode_t |
1689 | internal_function | 1689 | internal_function __attribute_warn_unused_result__ |
1690 | build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, | 1690 | build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, |
1691 | Idx str_idx, re_node_set *cur_dest) | 1691 | Idx str_idx, re_node_set *cur_dest) |
1692 | { | 1692 | { |
@@ -1848,7 +1848,7 @@ update_cur_sifted_state (const re_match_context_t *mctx, | |||
1848 | } | 1848 | } |
1849 | 1849 | ||
1850 | static reg_errcode_t | 1850 | static reg_errcode_t |
1851 | internal_function | 1851 | internal_function __attribute_warn_unused_result__ |
1852 | add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, | 1852 | add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, |
1853 | const re_node_set *candidates) | 1853 | const re_node_set *candidates) |
1854 | { | 1854 | { |
@@ -1863,10 +1863,14 @@ add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, | |||
1863 | { | 1863 | { |
1864 | err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem); | 1864 | err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem); |
1865 | if (BE (err != REG_NOERROR, 0)) | 1865 | if (BE (err != REG_NOERROR, 0)) |
1866 | return REG_ESPACE; | 1866 | return REG_ESPACE; |
1867 | for (i = 0; i < dest_nodes->nelem; i++) | 1867 | for (i = 0; i < dest_nodes->nelem; i++) |
1868 | re_node_set_merge (&state->inveclosure, | 1868 | { |
1869 | dfa->inveclosures + dest_nodes->elems[i]); | 1869 | err = re_node_set_merge (&state->inveclosure, |
1870 | dfa->inveclosures + dest_nodes->elems[i]); | ||
1871 | if (BE (err != REG_NOERROR, 0)) | ||
1872 | return REG_ESPACE; | ||
1873 | } | ||
1870 | } | 1874 | } |
1871 | return re_node_set_add_intersect (dest_nodes, candidates, | 1875 | return re_node_set_add_intersect (dest_nodes, candidates, |
1872 | &state->inveclosure); | 1876 | &state->inveclosure); |
@@ -1978,7 +1982,7 @@ check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, | |||
1978 | { | 1982 | { |
1979 | struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx; | 1983 | struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx; |
1980 | do | 1984 | do |
1981 | { | 1985 | { |
1982 | Idx dst; | 1986 | Idx dst; |
1983 | int cpos; | 1987 | int cpos; |
1984 | 1988 | ||
@@ -2000,9 +2004,9 @@ check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, | |||
2000 | if (dst == from_node) | 2004 | if (dst == from_node) |
2001 | { | 2005 | { |
2002 | if (boundaries & 1) | 2006 | if (boundaries & 1) |
2003 | return -1; | 2007 | return -1; |
2004 | else /* if (boundaries & 2) */ | 2008 | else /* if (boundaries & 2) */ |
2005 | return 0; | 2009 | return 0; |
2006 | } | 2010 | } |
2007 | 2011 | ||
2008 | cpos = | 2012 | cpos = |
@@ -2016,7 +2020,7 @@ check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, | |||
2016 | if (subexp_idx < BITSET_WORD_BITS) | 2020 | if (subexp_idx < BITSET_WORD_BITS) |
2017 | ent->eps_reachable_subexps_map | 2021 | ent->eps_reachable_subexps_map |
2018 | &= ~((bitset_word_t) 1 << subexp_idx); | 2022 | &= ~((bitset_word_t) 1 << subexp_idx); |
2019 | } | 2023 | } |
2020 | while (ent++->more); | 2024 | while (ent++->more); |
2021 | } | 2025 | } |
2022 | break; | 2026 | break; |
@@ -2158,7 +2162,7 @@ check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes, | |||
2158 | } | 2162 | } |
2159 | 2163 | ||
2160 | static reg_errcode_t | 2164 | static reg_errcode_t |
2161 | internal_function | 2165 | internal_function __attribute_warn_unused_result__ |
2162 | sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, | 2166 | sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, |
2163 | Idx str_idx, const re_node_set *candidates) | 2167 | Idx str_idx, const re_node_set *candidates) |
2164 | { | 2168 | { |
@@ -2241,7 +2245,7 @@ sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, | |||
2241 | re_node_set_remove (&local_sctx.limits, enabled_idx); | 2245 | re_node_set_remove (&local_sctx.limits, enabled_idx); |
2242 | 2246 | ||
2243 | /* mctx->bkref_ents may have changed, reload the pointer. */ | 2247 | /* mctx->bkref_ents may have changed, reload the pointer. */ |
2244 | entry = mctx->bkref_ents + enabled_idx; | 2248 | entry = mctx->bkref_ents + enabled_idx; |
2245 | } | 2249 | } |
2246 | while (enabled_idx++, entry++->more); | 2250 | while (enabled_idx++, entry++->more); |
2247 | } | 2251 | } |
@@ -2288,7 +2292,7 @@ sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx, | |||
2288 | update the destination of STATE_LOG. */ | 2292 | update the destination of STATE_LOG. */ |
2289 | 2293 | ||
2290 | static re_dfastate_t * | 2294 | static re_dfastate_t * |
2291 | internal_function | 2295 | internal_function __attribute_warn_unused_result__ |
2292 | transit_state (reg_errcode_t *err, re_match_context_t *mctx, | 2296 | transit_state (reg_errcode_t *err, re_match_context_t *mctx, |
2293 | re_dfastate_t *state) | 2297 | re_dfastate_t *state) |
2294 | { | 2298 | { |
@@ -2322,7 +2326,7 @@ transit_state (reg_errcode_t *err, re_match_context_t *mctx, | |||
2322 | 2326 | ||
2323 | trtable = state->word_trtable; | 2327 | trtable = state->word_trtable; |
2324 | if (BE (trtable != NULL, 1)) | 2328 | if (BE (trtable != NULL, 1)) |
2325 | { | 2329 | { |
2326 | unsigned int context; | 2330 | unsigned int context; |
2327 | context | 2331 | context |
2328 | = re_string_context_at (&mctx->input, | 2332 | = re_string_context_at (&mctx->input, |
@@ -2368,21 +2372,21 @@ merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, | |||
2368 | unsigned int context; | 2372 | unsigned int context; |
2369 | re_node_set next_nodes, *log_nodes, *table_nodes = NULL; | 2373 | re_node_set next_nodes, *log_nodes, *table_nodes = NULL; |
2370 | /* If (state_log[cur_idx] != 0), it implies that cur_idx is | 2374 | /* If (state_log[cur_idx] != 0), it implies that cur_idx is |
2371 | the destination of a multibyte char/collating element/ | 2375 | the destination of a multibyte char/collating element/ |
2372 | back reference. Then the next state is the union set of | 2376 | back reference. Then the next state is the union set of |
2373 | these destinations and the results of the transition table. */ | 2377 | these destinations and the results of the transition table. */ |
2374 | pstate = mctx->state_log[cur_idx]; | 2378 | pstate = mctx->state_log[cur_idx]; |
2375 | log_nodes = pstate->entrance_nodes; | 2379 | log_nodes = pstate->entrance_nodes; |
2376 | if (next_state != NULL) | 2380 | if (next_state != NULL) |
2377 | { | 2381 | { |
2378 | table_nodes = next_state->entrance_nodes; | 2382 | table_nodes = next_state->entrance_nodes; |
2379 | *err = re_node_set_init_union (&next_nodes, table_nodes, | 2383 | *err = re_node_set_init_union (&next_nodes, table_nodes, |
2380 | log_nodes); | 2384 | log_nodes); |
2381 | if (BE (*err != REG_NOERROR, 0)) | 2385 | if (BE (*err != REG_NOERROR, 0)) |
2382 | return NULL; | 2386 | return NULL; |
2383 | } | 2387 | } |
2384 | else | 2388 | else |
2385 | next_nodes = *log_nodes; | 2389 | next_nodes = *log_nodes; |
2386 | /* Note: We already add the nodes of the initial state, | 2390 | /* Note: We already add the nodes of the initial state, |
2387 | then we don't need to add them here. */ | 2391 | then we don't need to add them here. */ |
2388 | 2392 | ||
@@ -2390,12 +2394,12 @@ merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, | |||
2390 | re_string_cur_idx (&mctx->input) - 1, | 2394 | re_string_cur_idx (&mctx->input) - 1, |
2391 | mctx->eflags); | 2395 | mctx->eflags); |
2392 | next_state = mctx->state_log[cur_idx] | 2396 | next_state = mctx->state_log[cur_idx] |
2393 | = re_acquire_state_context (err, dfa, &next_nodes, context); | 2397 | = re_acquire_state_context (err, dfa, &next_nodes, context); |
2394 | /* We don't need to check errors here, since the return value of | 2398 | /* We don't need to check errors here, since the return value of |
2395 | this function is next_state and ERR is already set. */ | 2399 | this function is next_state and ERR is already set. */ |
2396 | 2400 | ||
2397 | if (table_nodes != NULL) | 2401 | if (table_nodes != NULL) |
2398 | re_node_set_free (&next_nodes); | 2402 | re_node_set_free (&next_nodes); |
2399 | } | 2403 | } |
2400 | 2404 | ||
2401 | if (BE (dfa->nbackref, 0) && next_state != NULL) | 2405 | if (BE (dfa->nbackref, 0) && next_state != NULL) |
@@ -2436,9 +2440,9 @@ find_recover_state (reg_errcode_t *err, re_match_context_t *mctx) | |||
2436 | 2440 | ||
2437 | do | 2441 | do |
2438 | { | 2442 | { |
2439 | if (++cur_str_idx > max) | 2443 | if (++cur_str_idx > max) |
2440 | return NULL; | 2444 | return NULL; |
2441 | re_string_skip_bytes (&mctx->input, 1); | 2445 | re_string_skip_bytes (&mctx->input, 1); |
2442 | } | 2446 | } |
2443 | while (mctx->state_log[cur_str_idx] == NULL); | 2447 | while (mctx->state_log[cur_str_idx] == NULL); |
2444 | 2448 | ||
@@ -2546,7 +2550,7 @@ transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate) | |||
2546 | re_dfastate_t *dest_state; | 2550 | re_dfastate_t *dest_state; |
2547 | 2551 | ||
2548 | if (!dfa->nodes[cur_node_idx].accept_mb) | 2552 | if (!dfa->nodes[cur_node_idx].accept_mb) |
2549 | continue; | 2553 | continue; |
2550 | 2554 | ||
2551 | if (dfa->nodes[cur_node_idx].constraint) | 2555 | if (dfa->nodes[cur_node_idx].constraint) |
2552 | { | 2556 | { |
@@ -2714,7 +2718,7 @@ transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes) | |||
2714 | delay these checking for prune_impossible_nodes(). */ | 2718 | delay these checking for prune_impossible_nodes(). */ |
2715 | 2719 | ||
2716 | static reg_errcode_t | 2720 | static reg_errcode_t |
2717 | internal_function | 2721 | internal_function __attribute_warn_unused_result__ |
2718 | get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx) | 2722 | get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx) |
2719 | { | 2723 | { |
2720 | const re_dfa_t *const dfa = mctx->dfa; | 2724 | const re_dfa_t *const dfa = mctx->dfa; |
@@ -2727,7 +2731,7 @@ get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx) | |||
2727 | const struct re_backref_cache_entry *entry | 2731 | const struct re_backref_cache_entry *entry |
2728 | = mctx->bkref_ents + cache_idx; | 2732 | = mctx->bkref_ents + cache_idx; |
2729 | do | 2733 | do |
2730 | if (entry->node == bkref_node) | 2734 | if (entry->node == bkref_node) |
2731 | return REG_NOERROR; /* We already checked it. */ | 2735 | return REG_NOERROR; /* We already checked it. */ |
2732 | while (entry++->more); | 2736 | while (entry++->more); |
2733 | } | 2737 | } |
@@ -2915,7 +2919,7 @@ find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes, | |||
2915 | Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */ | 2919 | Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */ |
2916 | 2920 | ||
2917 | static reg_errcode_t | 2921 | static reg_errcode_t |
2918 | internal_function | 2922 | internal_function __attribute_warn_unused_result__ |
2919 | check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, | 2923 | check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, |
2920 | Idx top_str, Idx last_node, Idx last_str, int type) | 2924 | Idx top_str, Idx last_node, Idx last_str, int type) |
2921 | { | 2925 | { |
@@ -3077,7 +3081,7 @@ check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, | |||
3077 | Can't we unify them? */ | 3081 | Can't we unify them? */ |
3078 | 3082 | ||
3079 | static reg_errcode_t | 3083 | static reg_errcode_t |
3080 | internal_function | 3084 | internal_function __attribute_warn_unused_result__ |
3081 | check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx, | 3085 | check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx, |
3082 | re_node_set *cur_nodes, re_node_set *next_nodes) | 3086 | re_node_set *cur_nodes, re_node_set *next_nodes) |
3083 | { | 3087 | { |
@@ -3211,7 +3215,7 @@ check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes, | |||
3211 | problematic append it to DST_NODES. */ | 3215 | problematic append it to DST_NODES. */ |
3212 | 3216 | ||
3213 | static reg_errcode_t | 3217 | static reg_errcode_t |
3214 | internal_function | 3218 | internal_function __attribute_warn_unused_result__ |
3215 | check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, | 3219 | check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, |
3216 | Idx target, Idx ex_subexp, int type) | 3220 | Idx target, Idx ex_subexp, int type) |
3217 | { | 3221 | { |
@@ -3256,7 +3260,7 @@ check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, | |||
3256 | in MCTX->BKREF_ENTS. */ | 3260 | in MCTX->BKREF_ENTS. */ |
3257 | 3261 | ||
3258 | static reg_errcode_t | 3262 | static reg_errcode_t |
3259 | internal_function | 3263 | internal_function __attribute_warn_unused_result__ |
3260 | expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, | 3264 | expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, |
3261 | Idx cur_str, Idx subexp_num, int type) | 3265 | Idx cur_str, Idx subexp_num, int type) |
3262 | { | 3266 | { |
@@ -3622,7 +3626,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, | |||
3622 | } | 3626 | } |
3623 | #ifdef RE_ENABLE_I18N | 3627 | #ifdef RE_ENABLE_I18N |
3624 | else if (type == OP_UTF8_PERIOD) | 3628 | else if (type == OP_UTF8_PERIOD) |
3625 | { | 3629 | { |
3626 | if (ASCII_CHARS % BITSET_WORD_BITS == 0) | 3630 | if (ASCII_CHARS % BITSET_WORD_BITS == 0) |
3627 | memset (accepts, -1, ASCII_CHARS / CHAR_BIT); | 3631 | memset (accepts, -1, ASCII_CHARS / CHAR_BIT); |
3628 | else | 3632 | else |
@@ -3631,7 +3635,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, | |||
3631 | bitset_clear (accepts, '\n'); | 3635 | bitset_clear (accepts, '\n'); |
3632 | if (dfa->syntax & RE_DOT_NOT_NULL) | 3636 | if (dfa->syntax & RE_DOT_NOT_NULL) |
3633 | bitset_clear (accepts, '\0'); | 3637 | bitset_clear (accepts, '\0'); |
3634 | } | 3638 | } |
3635 | #endif | 3639 | #endif |
3636 | else | 3640 | else |
3637 | continue; | 3641 | continue; |
@@ -3836,7 +3840,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, | |||
3836 | if (node->type == OP_PERIOD) | 3840 | if (node->type == OP_PERIOD) |
3837 | { | 3841 | { |
3838 | if (char_len <= 1) | 3842 | if (char_len <= 1) |
3839 | return 0; | 3843 | return 0; |
3840 | /* FIXME: I don't think this if is needed, as both '\n' | 3844 | /* FIXME: I don't think this if is needed, as both '\n' |
3841 | and '\0' are char_len == 1. */ | 3845 | and '\0' are char_len == 1. */ |
3842 | /* '.' accepts any one character except the following two cases. */ | 3846 | /* '.' accepts any one character except the following two cases. */ |
@@ -3949,15 +3953,20 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, | |||
3949 | _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); | 3953 | _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); |
3950 | indirect = (const int32_t *) | 3954 | indirect = (const int32_t *) |
3951 | _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); | 3955 | _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); |
3952 | idx = findidx (&cp); | 3956 | int32_t idx = findidx (&cp); |
3953 | if (idx > 0) | 3957 | if (idx > 0) |
3954 | for (i = 0; i < cset->nequiv_classes; ++i) | 3958 | for (i = 0; i < cset->nequiv_classes; ++i) |
3955 | { | 3959 | { |
3956 | int32_t equiv_class_idx = cset->equiv_classes[i]; | 3960 | int32_t equiv_class_idx = cset->equiv_classes[i]; |
3957 | size_t weight_len = weights[idx]; | 3961 | size_t weight_len = weights[idx & 0xffffff]; |
3958 | if (weight_len == weights[equiv_class_idx]) | 3962 | if (weight_len == weights[equiv_class_idx & 0xffffff] |
3963 | && (idx >> 24) == (equiv_class_idx >> 24)) | ||
3959 | { | 3964 | { |
3960 | Idx cnt = 0; | 3965 | Idx cnt = 0; |
3966 | |||
3967 | idx &= 0xffffff; | ||
3968 | equiv_class_idx &= 0xffffff; | ||
3969 | |||
3961 | while (cnt <= weight_len | 3970 | while (cnt <= weight_len |
3962 | && (weights[equiv_class_idx + 1 + cnt] | 3971 | && (weights[equiv_class_idx + 1 + cnt] |
3963 | == weights[idx + 1 + cnt])) | 3972 | == weights[idx + 1 + cnt])) |
@@ -4123,7 +4132,7 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node, | |||
4123 | /* Extend the buffers, if the buffers have run out. */ | 4132 | /* Extend the buffers, if the buffers have run out. */ |
4124 | 4133 | ||
4125 | static reg_errcode_t | 4134 | static reg_errcode_t |
4126 | internal_function | 4135 | internal_function __attribute_warn_unused_result__ |
4127 | extend_buffers (re_match_context_t *mctx) | 4136 | extend_buffers (re_match_context_t *mctx) |
4128 | { | 4137 | { |
4129 | reg_errcode_t ret; | 4138 | reg_errcode_t ret; |
@@ -4186,7 +4195,7 @@ extend_buffers (re_match_context_t *mctx) | |||
4186 | /* Initialize MCTX. */ | 4195 | /* Initialize MCTX. */ |
4187 | 4196 | ||
4188 | static reg_errcode_t | 4197 | static reg_errcode_t |
4189 | internal_function | 4198 | internal_function __attribute_warn_unused_result__ |
4190 | match_ctx_init (re_match_context_t *mctx, int eflags, Idx n) | 4199 | match_ctx_init (re_match_context_t *mctx, int eflags, Idx n) |
4191 | { | 4200 | { |
4192 | mctx->eflags = eflags; | 4201 | mctx->eflags = eflags; |
@@ -4266,7 +4275,7 @@ match_ctx_free (re_match_context_t *mctx) | |||
4266 | */ | 4275 | */ |
4267 | 4276 | ||
4268 | static reg_errcode_t | 4277 | static reg_errcode_t |
4269 | internal_function | 4278 | internal_function __attribute_warn_unused_result__ |
4270 | match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, | 4279 | match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, |
4271 | Idx to) | 4280 | Idx to) |
4272 | { | 4281 | { |
@@ -4338,7 +4347,7 @@ search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx) | |||
4338 | at STR_IDX. */ | 4347 | at STR_IDX. */ |
4339 | 4348 | ||
4340 | static reg_errcode_t | 4349 | static reg_errcode_t |
4341 | internal_function | 4350 | internal_function __attribute_warn_unused_result__ |
4342 | match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx) | 4351 | match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx) |
4343 | { | 4352 | { |
4344 | #ifdef DEBUG | 4353 | #ifdef DEBUG |
diff --git a/gl/safe-read.c b/gl/safe-read.c index 0cb1edee..855be677 100644 --- a/gl/safe-read.c +++ b/gl/safe-read.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* An interface to read and write that retries after interrupts. | 1 | /* An interface to read and write that retries after interrupts. |
2 | 2 | ||
3 | Copyright (C) 1993, 1994, 1998, 2002, 2003, 2004, 2005, 2006 Free | 3 | Copyright (C) 1993-1994, 1998, 2002-2006, 2009-2010 Free Software |
4 | Software Foundation, Inc. | 4 | Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
@@ -66,12 +66,12 @@ safe_rw (int fd, void const *buf, size_t count) | |||
66 | ssize_t result = rw (fd, buf, count); | 66 | ssize_t result = rw (fd, buf, count); |
67 | 67 | ||
68 | if (0 <= result) | 68 | if (0 <= result) |
69 | return result; | 69 | return result; |
70 | else if (IS_EINTR (errno)) | 70 | else if (IS_EINTR (errno)) |
71 | continue; | 71 | continue; |
72 | else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count) | 72 | else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count) |
73 | count = BUGGY_READ_MAXIMUM; | 73 | count = BUGGY_READ_MAXIMUM; |
74 | else | 74 | else |
75 | return result; | 75 | return result; |
76 | } | 76 | } |
77 | } | 77 | } |
diff --git a/gl/safe-read.h b/gl/safe-read.h index ba191713..1f15b018 100644 --- a/gl/safe-read.h +++ b/gl/safe-read.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* An interface to read() that retries after interrupts. | 1 | /* An interface to read() that retries after interrupts. |
2 | Copyright (C) 2002, 2006 Free Software Foundation, Inc. | 2 | Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/safe-write.c b/gl/safe-write.c index b644f7cf..a2c3b4df 100644 --- a/gl/safe-write.c +++ b/gl/safe-write.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* An interface to write that retries after interrupts. | 1 | /* An interface to write that retries after interrupts. |
2 | Copyright (C) 2002 Free Software Foundation, Inc. | 2 | Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/safe-write.h b/gl/safe-write.h index da036a97..185f6603 100644 --- a/gl/safe-write.h +++ b/gl/safe-write.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* An interface to write() that retries after interrupts. | 1 | /* An interface to write() that retries after interrupts. |
2 | Copyright (C) 2002 Free Software Foundation, Inc. | 2 | Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/size_max.h b/gl/size_max.h index 2ccc5f08..56d5a9b1 100644 --- a/gl/size_max.h +++ b/gl/size_max.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* size_max.h -- declare SIZE_MAX through system headers | 1 | /* size_max.h -- declare SIZE_MAX through system headers |
2 | Copyright (C) 2005-2006 Free Software Foundation, Inc. | 2 | Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc. |
3 | Written by Simon Josefsson. | 3 | Written by Simon Josefsson. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
diff --git a/gl/snprintf.c b/gl/snprintf.c index dafbda81..810ca14b 100644 --- a/gl/snprintf.c +++ b/gl/snprintf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Formatted output to strings. | 1 | /* Formatted output to strings. |
2 | Copyright (C) 2004, 2006-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2004, 2006-2010 Free Software Foundation, Inc. |
3 | Written by Simon Josefsson and Paul Eggert. | 3 | Written by Simon Josefsson and Paul Eggert. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -53,11 +53,11 @@ snprintf (char *str, size_t size, const char *format, ...) | |||
53 | if (output != str) | 53 | if (output != str) |
54 | { | 54 | { |
55 | if (size) | 55 | if (size) |
56 | { | 56 | { |
57 | size_t pruned_len = (len < size ? len : size - 1); | 57 | size_t pruned_len = (len < size ? len : size - 1); |
58 | memcpy (str, output, pruned_len); | 58 | memcpy (str, output, pruned_len); |
59 | str[pruned_len] = '\0'; | 59 | str[pruned_len] = '\0'; |
60 | } | 60 | } |
61 | 61 | ||
62 | free (output); | 62 | free (output); |
63 | } | 63 | } |
diff --git a/gl/sockets.c b/gl/sockets.c new file mode 100644 index 00000000..b946c7e6 --- /dev/null +++ b/gl/sockets.c | |||
@@ -0,0 +1,118 @@ | |||
1 | /* sockets.c --- wrappers for Windows socket functions | ||
2 | |||
3 | Copyright (C) 2008-2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | /* Written by Simon Josefsson */ | ||
19 | |||
20 | #include <config.h> | ||
21 | |||
22 | /* Specification. */ | ||
23 | #include "sockets.h" | ||
24 | |||
25 | #if WINDOWS_SOCKETS | ||
26 | |||
27 | /* This includes winsock2.h on MinGW. */ | ||
28 | # include <sys/socket.h> | ||
29 | |||
30 | # include "close-hook.h" | ||
31 | |||
32 | /* Get set_winsock_errno, FD_TO_SOCKET etc. */ | ||
33 | # include "w32sock.h" | ||
34 | |||
35 | static int | ||
36 | close_fd_maybe_socket (int fd, const struct close_hook *remaining_list) | ||
37 | { | ||
38 | SOCKET sock; | ||
39 | WSANETWORKEVENTS ev; | ||
40 | |||
41 | /* Test whether fd refers to a socket. */ | ||
42 | sock = FD_TO_SOCKET (fd); | ||
43 | ev.lNetworkEvents = 0xDEADBEEF; | ||
44 | WSAEnumNetworkEvents (sock, NULL, &ev); | ||
45 | if (ev.lNetworkEvents != 0xDEADBEEF) | ||
46 | { | ||
47 | /* fd refers to a socket. */ | ||
48 | /* FIXME: other applications, like squid, use an undocumented | ||
49 | _free_osfhnd free function. But this is not enough: The 'osfile' | ||
50 | flags for fd also needs to be cleared, but it is hard to access it. | ||
51 | Instead, here we just close twice the file descriptor. */ | ||
52 | if (closesocket (sock)) | ||
53 | { | ||
54 | set_winsock_errno (); | ||
55 | return -1; | ||
56 | } | ||
57 | else | ||
58 | { | ||
59 | /* This call frees the file descriptor and does a | ||
60 | CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */ | ||
61 | _close (fd); | ||
62 | return 0; | ||
63 | } | ||
64 | } | ||
65 | else | ||
66 | /* Some other type of file descriptor. */ | ||
67 | return execute_close_hooks (fd, remaining_list); | ||
68 | } | ||
69 | |||
70 | static struct close_hook close_sockets_hook; | ||
71 | |||
72 | static int initialized_sockets_version /* = 0 */; | ||
73 | |||
74 | #endif /* WINDOWS_SOCKETS */ | ||
75 | |||
76 | int | ||
77 | gl_sockets_startup (int version _GL_UNUSED) | ||
78 | { | ||
79 | #if WINDOWS_SOCKETS | ||
80 | if (version > initialized_sockets_version) | ||
81 | { | ||
82 | WSADATA data; | ||
83 | int err; | ||
84 | |||
85 | err = WSAStartup (version, &data); | ||
86 | if (err != 0) | ||
87 | return 1; | ||
88 | |||
89 | if (data.wVersion < version) | ||
90 | return 2; | ||
91 | |||
92 | if (initialized_sockets_version == 0) | ||
93 | register_close_hook (close_fd_maybe_socket, &close_sockets_hook); | ||
94 | |||
95 | initialized_sockets_version = version; | ||
96 | } | ||
97 | #endif | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | int | ||
103 | gl_sockets_cleanup (void) | ||
104 | { | ||
105 | #if WINDOWS_SOCKETS | ||
106 | int err; | ||
107 | |||
108 | initialized_sockets_version = 0; | ||
109 | |||
110 | unregister_close_hook (&close_sockets_hook); | ||
111 | |||
112 | err = WSACleanup (); | ||
113 | if (err != 0) | ||
114 | return 1; | ||
115 | #endif | ||
116 | |||
117 | return 0; | ||
118 | } | ||
diff --git a/gl/sockets.h b/gl/sockets.h new file mode 100644 index 00000000..921bf6f7 --- /dev/null +++ b/gl/sockets.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* sockets.h - wrappers for Windows socket functions | ||
2 | |||
3 | Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | /* Written by Simon Josefsson */ | ||
19 | |||
20 | #ifndef SOCKETS_H | ||
21 | # define SOCKETS_H 1 | ||
22 | |||
23 | #define SOCKETS_1_0 0x100 /* don't use - does not work on Windows XP */ | ||
24 | #define SOCKETS_1_1 0x101 | ||
25 | #define SOCKETS_2_0 0x200 /* don't use - does not work on Windows XP */ | ||
26 | #define SOCKETS_2_1 0x201 | ||
27 | #define SOCKETS_2_2 0x202 | ||
28 | |||
29 | int gl_sockets_startup (int version); | ||
30 | int gl_sockets_cleanup (void); | ||
31 | |||
32 | /* This function is useful it you create a socket using gnulib's | ||
33 | Winsock wrappers but needs to pass on the socket handle to some | ||
34 | other library that only accepts sockets. */ | ||
35 | #if WINDOWS_SOCKETS | ||
36 | |||
37 | #include <sys/socket.h> | ||
38 | |||
39 | static inline SOCKET | ||
40 | gl_fd_to_handle (int fd) | ||
41 | { | ||
42 | return _get_osfhandle (fd); | ||
43 | } | ||
44 | |||
45 | #else | ||
46 | |||
47 | #define gl_fd_to_handle(x) (x) | ||
48 | |||
49 | #endif /* WINDOWS_SOCKETS */ | ||
50 | |||
51 | #endif /* SOCKETS_H */ | ||
diff --git a/gl/stat.c b/gl/stat.c new file mode 100644 index 00000000..875317bf --- /dev/null +++ b/gl/stat.c | |||
@@ -0,0 +1,104 @@ | |||
1 | /* Work around platform bugs in stat. | ||
2 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 3 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
16 | |||
17 | /* written by Eric Blake */ | ||
18 | |||
19 | #include <config.h> | ||
20 | |||
21 | /* Get the original definition of stat. It might be defined as a macro. */ | ||
22 | #define __need_system_sys_stat_h | ||
23 | #include <sys/types.h> | ||
24 | #include <sys/stat.h> | ||
25 | #undef __need_system_sys_stat_h | ||
26 | |||
27 | static inline int | ||
28 | orig_stat (const char *filename, struct stat *buf) | ||
29 | { | ||
30 | return stat (filename, buf); | ||
31 | } | ||
32 | |||
33 | /* Specification. */ | ||
34 | #include <sys/stat.h> | ||
35 | |||
36 | #include <errno.h> | ||
37 | #include <limits.h> | ||
38 | #include <stdbool.h> | ||
39 | #include <string.h> | ||
40 | |||
41 | /* Store information about NAME into ST. Work around bugs with | ||
42 | trailing slashes. Mingw has other bugs (such as st_ino always | ||
43 | being 0 on success) which this wrapper does not work around. But | ||
44 | at least this implementation provides the ability to emulate fchdir | ||
45 | correctly. */ | ||
46 | |||
47 | int | ||
48 | rpl_stat (char const *name, struct stat *st) | ||
49 | { | ||
50 | int result = orig_stat (name, st); | ||
51 | #if REPLACE_FUNC_STAT_FILE | ||
52 | /* Solaris 9 mistakenly succeeds when given a non-directory with a | ||
53 | trailing slash. */ | ||
54 | if (result == 0 && !S_ISDIR (st->st_mode)) | ||
55 | { | ||
56 | size_t len = strlen (name); | ||
57 | if (ISSLASH (name[len - 1])) | ||
58 | { | ||
59 | errno = ENOTDIR; | ||
60 | return -1; | ||
61 | } | ||
62 | } | ||
63 | #endif /* REPLACE_FUNC_STAT_FILE */ | ||
64 | #if REPLACE_FUNC_STAT_DIR | ||
65 | if (result == -1 && errno == ENOENT) | ||
66 | { | ||
67 | /* Due to mingw's oddities, there are some directories (like | ||
68 | c:\) where stat() only succeeds with a trailing slash, and | ||
69 | other directories (like c:\windows) where stat() only | ||
70 | succeeds without a trailing slash. But we want the two to be | ||
71 | synonymous, since chdir() manages either style. Likewise, Mingw also | ||
72 | reports ENOENT for names longer than PATH_MAX, when we want | ||
73 | ENAMETOOLONG, and for stat("file/"), when we want ENOTDIR. | ||
74 | Fortunately, mingw PATH_MAX is small enough for stack | ||
75 | allocation. */ | ||
76 | char fixed_name[PATH_MAX + 1] = {0}; | ||
77 | size_t len = strlen (name); | ||
78 | bool check_dir = false; | ||
79 | if (PATH_MAX <= len) | ||
80 | errno = ENAMETOOLONG; | ||
81 | else if (len) | ||
82 | { | ||
83 | strcpy (fixed_name, name); | ||
84 | if (ISSLASH (fixed_name[len - 1])) | ||
85 | { | ||
86 | check_dir = true; | ||
87 | while (len && ISSLASH (fixed_name[len - 1])) | ||
88 | fixed_name[--len] = '\0'; | ||
89 | if (!len) | ||
90 | fixed_name[0] = '/'; | ||
91 | } | ||
92 | else | ||
93 | fixed_name[len++] = '/'; | ||
94 | result = orig_stat (fixed_name, st); | ||
95 | if (result == 0 && check_dir && !S_ISDIR (st->st_mode)) | ||
96 | { | ||
97 | result = -1; | ||
98 | errno = ENOTDIR; | ||
99 | } | ||
100 | } | ||
101 | } | ||
102 | #endif /* REPLACE_FUNC_STAT_DIR */ | ||
103 | return result; | ||
104 | } | ||
diff --git a/gl/stdbool.in.h b/gl/stdbool.in.h index cffa0ab2..e2312ecb 100644 --- a/gl/stdbool.in.h +++ b/gl/stdbool.in.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright (C) 2001-2003, 2006-2008 Free Software Foundation, Inc. | 1 | /* Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc. |
2 | Written by Bruno Haible <haible@clisp.cons.org>, 2001. | 2 | Written by Bruno Haible <haible@clisp.cons.org>, 2001. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
diff --git a/gl/stddef.in.h b/gl/stddef.in.h new file mode 100644 index 00000000..08778a23 --- /dev/null +++ b/gl/stddef.in.h | |||
@@ -0,0 +1,86 @@ | |||
1 | /* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues. | ||
2 | |||
3 | Copyright (C) 2009, 2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3, or (at your option) | ||
8 | any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software Foundation, | ||
17 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
18 | |||
19 | /* Written by Eric Blake. */ | ||
20 | |||
21 | /* | ||
22 | * POSIX 2008 <stddef.h> for platforms that have issues. | ||
23 | * <http://www.opengroup.org/susv3xbd/stddef.h.html> | ||
24 | */ | ||
25 | |||
26 | #if __GNUC__ >= 3 | ||
27 | @PRAGMA_SYSTEM_HEADER@ | ||
28 | #endif | ||
29 | |||
30 | #if defined __need_wchar_t || defined __need_size_t \ | ||
31 | || defined __need_ptrdiff_t || defined __need_NULL \ | ||
32 | || defined __need_wint_t | ||
33 | /* Special invocation convention inside gcc header files. In | ||
34 | particular, gcc provides a version of <stddef.h> that blindly | ||
35 | redefines NULL even when __need_wint_t was defined, even though | ||
36 | wint_t is not normally provided by <stddef.h>. Hence, we must | ||
37 | remember if special invocation has ever been used to obtain wint_t, | ||
38 | in which case we need to clean up NULL yet again. */ | ||
39 | |||
40 | # if !(defined _GL_STDDEF_H && defined _GL_STDDEF_WINT_T) | ||
41 | # ifdef __need_wint_t | ||
42 | # undef _GL_STDDEF_H | ||
43 | # define _GL_STDDEF_WINT_T | ||
44 | # endif | ||
45 | # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ | ||
46 | # endif | ||
47 | |||
48 | #else | ||
49 | /* Normal invocation convention. */ | ||
50 | |||
51 | # ifndef _GL_STDDEF_H | ||
52 | |||
53 | /* The include_next requires a split double-inclusion guard. */ | ||
54 | |||
55 | # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ | ||
56 | |||
57 | # ifndef _GL_STDDEF_H | ||
58 | # define _GL_STDDEF_H | ||
59 | |||
60 | /* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */ | ||
61 | #if @REPLACE_NULL@ | ||
62 | # undef NULL | ||
63 | # ifdef __cplusplus | ||
64 | /* ISO C++ says that the macro NULL must expand to an integer constant | ||
65 | expression, hence '((void *) 0)' is not allowed in C++. */ | ||
66 | # if __GNUG__ >= 3 | ||
67 | /* GNU C++ has a __null macro that behaves like an integer ('int' or | ||
68 | 'long') but has the same size as a pointer. Use that, to avoid | ||
69 | warnings. */ | ||
70 | # define NULL __null | ||
71 | # else | ||
72 | # define NULL 0L | ||
73 | # endif | ||
74 | # else | ||
75 | # define NULL ((void *) 0) | ||
76 | # endif | ||
77 | #endif | ||
78 | |||
79 | /* Some platforms lack wchar_t. */ | ||
80 | #if !@HAVE_WCHAR_T@ | ||
81 | # define wchar_t int | ||
82 | #endif | ||
83 | |||
84 | # endif /* _GL_STDDEF_H */ | ||
85 | # endif /* _GL_STDDEF_H */ | ||
86 | #endif /* __need_XXX */ | ||
diff --git a/gl/stdint.in.h b/gl/stdint.in.h index 53aa34a8..5da5f178 100644 --- a/gl/stdint.in.h +++ b/gl/stdint.in.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright (C) 2001-2002, 2004-2009 Free Software Foundation, Inc. | 1 | /* Copyright (C) 2001-2002, 2004-2010 Free Software Foundation, Inc. |
2 | Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood. | 2 | Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood. |
3 | This file is part of gnulib. | 3 | This file is part of gnulib. |
4 | 4 | ||
@@ -23,6 +23,10 @@ | |||
23 | 23 | ||
24 | #ifndef _GL_STDINT_H | 24 | #ifndef _GL_STDINT_H |
25 | 25 | ||
26 | #if __GNUC__ >= 3 | ||
27 | @PRAGMA_SYSTEM_HEADER@ | ||
28 | #endif | ||
29 | |||
26 | /* When including a system file that in turn includes <inttypes.h>, | 30 | /* When including a system file that in turn includes <inttypes.h>, |
27 | use the system <inttypes.h>, not our substitute. This avoids | 31 | use the system <inttypes.h>, not our substitute. This avoids |
28 | problems with (for example) VMS, whose <sys/bitypes.h> includes | 32 | problems with (for example) VMS, whose <sys/bitypes.h> includes |
@@ -49,9 +53,6 @@ | |||
49 | in <inttypes.h> would reinclude us, skipping our contents because | 53 | in <inttypes.h> would reinclude us, skipping our contents because |
50 | _GL_STDINT_H is defined. | 54 | _GL_STDINT_H is defined. |
51 | The include_next requires a split double-inclusion guard. */ | 55 | The include_next requires a split double-inclusion guard. */ |
52 | # if __GNUC__ >= 3 | ||
53 | @PRAGMA_SYSTEM_HEADER@ | ||
54 | # endif | ||
55 | # @INCLUDE_NEXT@ @NEXT_STDINT_H@ | 56 | # @INCLUDE_NEXT@ @NEXT_STDINT_H@ |
56 | #endif | 57 | #endif |
57 | 58 | ||
@@ -102,8 +103,8 @@ | |||
102 | ((signed) \ | 103 | ((signed) \ |
103 | ? ~ _STDINT_MIN (signed, bits, zero) \ | 104 | ? ~ _STDINT_MIN (signed, bits, zero) \ |
104 | : /* The expression for the unsigned case. The subtraction of (signed) \ | 105 | : /* The expression for the unsigned case. The subtraction of (signed) \ |
105 | is a nop in the unsigned case and avoids "signed integer overflow" \ | 106 | is a nop in the unsigned case and avoids "signed integer overflow" \ |
106 | warnings in the signed case. */ \ | 107 | warnings in the signed case. */ \ |
107 | ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1) | 108 | ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1) |
108 | 109 | ||
109 | /* 7.18.1.1. Exact-width integer types */ | 110 | /* 7.18.1.1. Exact-width integer types */ |
@@ -454,10 +455,10 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) - | |||
454 | #undef SIG_ATOMIC_MAX | 455 | #undef SIG_ATOMIC_MAX |
455 | #define SIG_ATOMIC_MIN \ | 456 | #define SIG_ATOMIC_MIN \ |
456 | _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ | 457 | _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ |
457 | 0@SIG_ATOMIC_T_SUFFIX@) | 458 | 0@SIG_ATOMIC_T_SUFFIX@) |
458 | #define SIG_ATOMIC_MAX \ | 459 | #define SIG_ATOMIC_MAX \ |
459 | _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ | 460 | _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ |
460 | 0@SIG_ATOMIC_T_SUFFIX@) | 461 | 0@SIG_ATOMIC_T_SUFFIX@) |
461 | 462 | ||
462 | 463 | ||
463 | /* size_t limit */ | 464 | /* size_t limit */ |
diff --git a/gl/stdio-write.c b/gl/stdio-write.c index f1d0fcb7..f7da9e42 100644 --- a/gl/stdio-write.c +++ b/gl/stdio-write.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* POSIX compatible FILE stream write function. | 1 | /* POSIX compatible FILE stream write function. |
2 | Copyright (C) 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2008-2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2008. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
@@ -39,30 +39,31 @@ | |||
39 | # include <windows.h> | 39 | # include <windows.h> |
40 | 40 | ||
41 | # define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \ | 41 | # define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \ |
42 | if (ferror (stream)) \ | 42 | if (ferror (stream)) \ |
43 | return (EXPRESSION); \ | 43 | return (EXPRESSION); \ |
44 | else \ | 44 | else \ |
45 | { \ | 45 | { \ |
46 | RETTYPE ret; \ | 46 | RETTYPE ret; \ |
47 | SetLastError (0); \ | 47 | SetLastError (0); \ |
48 | ret = (EXPRESSION); \ | 48 | ret = (EXPRESSION); \ |
49 | if (FAILED && GetLastError () == ERROR_NO_DATA && ferror (stream)) \ | 49 | if (FAILED && GetLastError () == ERROR_NO_DATA && ferror (stream)) \ |
50 | { \ | 50 | { \ |
51 | int fd = fileno (stream); \ | 51 | int fd = fileno (stream); \ |
52 | if (fd >= 0 \ | 52 | if (fd >= 0 \ |
53 | && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE)\ | 53 | && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE)\ |
54 | { \ | 54 | { \ |
55 | /* Try to raise signal SIGPIPE. */ \ | 55 | /* Try to raise signal SIGPIPE. */ \ |
56 | raise (SIGPIPE); \ | 56 | raise (SIGPIPE); \ |
57 | /* If it is currently blocked or ignored, change errno from \ | 57 | /* If it is currently blocked or ignored, change errno from \ |
58 | EINVAL to EPIPE. */ \ | 58 | EINVAL to EPIPE. */ \ |
59 | errno = EPIPE; \ | 59 | errno = EPIPE; \ |
60 | } \ | 60 | } \ |
61 | } \ | 61 | } \ |
62 | return ret; \ | 62 | return ret; \ |
63 | } | 63 | } |
64 | 64 | ||
65 | # if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */ | 65 | # if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */ |
66 | # if !DEPENDS_ON_LIBINTL /* avoid collision with intl/printf.c */ | ||
66 | int | 67 | int |
67 | printf (const char *format, ...) | 68 | printf (const char *format, ...) |
68 | { | 69 | { |
@@ -75,6 +76,7 @@ printf (const char *format, ...) | |||
75 | 76 | ||
76 | return retval; | 77 | return retval; |
77 | } | 78 | } |
79 | # endif | ||
78 | # endif | 80 | # endif |
79 | 81 | ||
80 | # if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */ | 82 | # if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */ |
@@ -92,7 +94,7 @@ fprintf (FILE *stream, const char *format, ...) | |||
92 | } | 94 | } |
93 | # endif | 95 | # endif |
94 | 96 | ||
95 | # if !REPLACE_VFPRINTF_POSIX /* avoid collision with vprintf.c */ | 97 | # if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */ |
96 | int | 98 | int |
97 | vprintf (const char *format, va_list args) | 99 | vprintf (const char *format, va_list args) |
98 | { | 100 | { |
@@ -100,7 +102,7 @@ vprintf (const char *format, va_list args) | |||
100 | } | 102 | } |
101 | # endif | 103 | # endif |
102 | 104 | ||
103 | # if !REPLACE_VPRINTF_POSIX /* avoid collision with vfprintf.c */ | 105 | # if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */ |
104 | int | 106 | int |
105 | vfprintf (FILE *stream, const char *format, va_list args) | 107 | vfprintf (FILE *stream, const char *format, va_list args) |
106 | #undef vfprintf | 108 | #undef vfprintf |
diff --git a/gl/stdio.in.h b/gl/stdio.in.h index cb273d76..dcb8ee57 100644 --- a/gl/stdio.in.h +++ b/gl/stdio.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A GNU-like <stdio.h>. | 1 | /* A GNU-like <stdio.h>. |
2 | 2 | ||
3 | Copyright (C) 2004, 2007-2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2004, 2007-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -36,489 +36,1022 @@ | |||
36 | #ifndef _GL_STDIO_H | 36 | #ifndef _GL_STDIO_H |
37 | #define _GL_STDIO_H | 37 | #define _GL_STDIO_H |
38 | 38 | ||
39 | /* Get va_list. Needed on many systems, including glibc 2.8. */ | ||
39 | #include <stdarg.h> | 40 | #include <stdarg.h> |
41 | |||
40 | #include <stddef.h> | 42 | #include <stddef.h> |
41 | 43 | ||
42 | #if (@GNULIB_FSEEKO@ && @REPLACE_FSEEKO@) \ | 44 | /* Get off_t and ssize_t. Needed on many systems, including glibc 2.8. */ |
43 | || (@GNULIB_FTELLO@ && @REPLACE_FTELLO@) \ | 45 | #include <sys/types.h> |
44 | || (@GNULIB_GETDELIM@ && !@HAVE_DECL_GETDELIM@) \ | ||
45 | || (@GNULIB_GETLINE@ && (!@HAVE_DECL_GETLINE@ || @REPLACE_GETLINE@)) | ||
46 | /* Get off_t and ssize_t. */ | ||
47 | # include <sys/types.h> | ||
48 | #endif | ||
49 | 46 | ||
50 | #ifndef __attribute__ | 47 | #ifndef __attribute__ |
51 | /* This feature is available in gcc versions 2.5 and later. */ | 48 | /* The __attribute__ feature is available in gcc versions 2.5 and later. |
52 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) | 49 | The __-protected variants of the attributes 'format' and 'printf' are |
53 | # define __attribute__(Spec) /* empty */ | 50 | accepted by gcc versions 2.6.4 (effectively 2.7) and later. |
54 | # endif | 51 | We enable __attribute__ only if these are supported too, because |
55 | /* The __-protected variants of `format' and `printf' attributes | 52 | gnulib and libintl do '#define printf __printf__' when they override |
56 | are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ | 53 | the 'printf' function. */ |
57 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) | 54 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) |
58 | # define __format__ format | 55 | # define __attribute__(Spec) /* empty */ |
59 | # define __printf__ printf | ||
60 | # endif | 56 | # endif |
61 | #endif | 57 | #endif |
62 | 58 | ||
63 | 59 | ||
64 | /* The definition of GL_LINK_WARNING is copied here. */ | 60 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
65 | 61 | ||
62 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
66 | 63 | ||
67 | #ifdef __cplusplus | 64 | /* The definition of _GL_WARN_ON_USE is copied here. */ |
68 | extern "C" { | ||
69 | #endif | ||
70 | 65 | ||
71 | 66 | ||
72 | #if @GNULIB_FPRINTF_POSIX@ | 67 | #if @GNULIB_DPRINTF@ |
73 | # if @REPLACE_FPRINTF@ | 68 | # if @REPLACE_DPRINTF@ |
74 | # define fprintf rpl_fprintf | 69 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
75 | extern int fprintf (FILE *fp, const char *format, ...) | 70 | # define dprintf rpl_dprintf |
76 | __attribute__ ((__format__ (__printf__, 2, 3))); | 71 | # endif |
72 | _GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...) | ||
73 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
74 | _GL_ARG_NONNULL ((2))); | ||
75 | _GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...)); | ||
76 | # else | ||
77 | # if !@HAVE_DPRINTF@ | ||
78 | _GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...) | ||
79 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
80 | _GL_ARG_NONNULL ((2))); | ||
81 | # endif | ||
82 | _GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...)); | ||
77 | # endif | 83 | # endif |
78 | #elif @GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 84 | _GL_CXXALIASWARN (dprintf); |
79 | # define fprintf rpl_fprintf | ||
80 | extern int fprintf (FILE *fp, const char *format, ...) | ||
81 | __attribute__ ((__format__ (__printf__, 2, 3))); | ||
82 | #elif defined GNULIB_POSIXCHECK | 85 | #elif defined GNULIB_POSIXCHECK |
83 | # undef fprintf | 86 | # undef dprintf |
84 | # define fprintf \ | 87 | # if HAVE_RAW_DECL_DPRINTF |
85 | (GL_LINK_WARNING ("fprintf is not always POSIX compliant - " \ | 88 | _GL_WARN_ON_USE (dprintf, "dprintf is unportable - " |
86 | "use gnulib module fprintf-posix for portable " \ | 89 | "use gnulib module dprintf for portability"); |
87 | "POSIX compliance"), \ | 90 | # endif |
88 | fprintf) | 91 | #endif |
89 | #endif | 92 | |
90 | 93 | #if @GNULIB_FCLOSE@ | |
91 | #if @GNULIB_VFPRINTF_POSIX@ | 94 | /* Close STREAM and its underlying file descriptor. */ |
92 | # if @REPLACE_VFPRINTF@ | 95 | # if @REPLACE_FCLOSE@ |
93 | # define vfprintf rpl_vfprintf | 96 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
94 | extern int vfprintf (FILE *fp, const char *format, va_list args) | 97 | # define fclose rpl_fclose |
95 | __attribute__ ((__format__ (__printf__, 2, 0))); | 98 | # endif |
96 | # endif | 99 | _GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); |
97 | #elif @GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 100 | _GL_CXXALIAS_RPL (fclose, int, (FILE *stream)); |
98 | # define vfprintf rpl_vfprintf | 101 | # else |
99 | extern int vfprintf (FILE *fp, const char *format, va_list args) | 102 | _GL_CXXALIAS_SYS (fclose, int, (FILE *stream)); |
100 | __attribute__ ((__format__ (__printf__, 2, 0))); | 103 | # endif |
104 | _GL_CXXALIASWARN (fclose); | ||
101 | #elif defined GNULIB_POSIXCHECK | 105 | #elif defined GNULIB_POSIXCHECK |
102 | # undef vfprintf | 106 | # undef fclose |
103 | # define vfprintf(s,f,a) \ | 107 | /* Assume fclose is always declared. */ |
104 | (GL_LINK_WARNING ("vfprintf is not always POSIX compliant - " \ | 108 | _GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - " |
105 | "use gnulib module vfprintf-posix for portable " \ | 109 | "use gnulib module fclose for portable POSIX compliance"); |
106 | "POSIX compliance"), \ | ||
107 | vfprintf (s, f, a)) | ||
108 | #endif | 110 | #endif |
109 | 111 | ||
110 | #if @GNULIB_PRINTF_POSIX@ | 112 | #if @GNULIB_FFLUSH@ |
111 | # if @REPLACE_PRINTF@ | 113 | /* Flush all pending data on STREAM according to POSIX rules. Both |
112 | /* Don't break __attribute__((format(printf,M,N))). */ | 114 | output and seekable input streams are supported. |
113 | # define printf __printf__ | 115 | Note! LOSS OF DATA can occur if fflush is applied on an input stream |
114 | extern int printf (const char *format, ...) | 116 | that is _not_seekable_ or on an update stream that is _not_seekable_ |
115 | __attribute__ ((__format__ (__printf__, 1, 2))); | 117 | and in which the most recent operation was input. Seekability can |
118 | be tested with lseek(fileno(fp),0,SEEK_CUR). */ | ||
119 | # if @REPLACE_FFLUSH@ | ||
120 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
121 | # define fflush rpl_fflush | ||
122 | # endif | ||
123 | _GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream)); | ||
124 | _GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream)); | ||
125 | # else | ||
126 | _GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream)); | ||
116 | # endif | 127 | # endif |
117 | #elif @GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 128 | _GL_CXXALIASWARN (fflush); |
118 | /* Don't break __attribute__((format(printf,M,N))). */ | ||
119 | # define printf __printf__ | ||
120 | extern int printf (const char *format, ...) | ||
121 | __attribute__ ((__format__ (__printf__, 1, 2))); | ||
122 | #elif defined GNULIB_POSIXCHECK | 129 | #elif defined GNULIB_POSIXCHECK |
123 | # undef printf | 130 | # undef fflush |
124 | # define printf \ | 131 | /* Assume fflush is always declared. */ |
125 | (GL_LINK_WARNING ("printf is not always POSIX compliant - " \ | 132 | _GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - " |
126 | "use gnulib module printf-posix for portable " \ | 133 | "use gnulib module fflush for portable POSIX compliance"); |
127 | "POSIX compliance"), \ | 134 | #endif |
128 | printf) | 135 | |
129 | /* Don't break __attribute__((format(printf,M,N))). */ | 136 | /* It is very rare that the developer ever has full control of stdin, |
130 | # define format(kind,m,n) format (__##kind##__, m, n) | 137 | so any use of gets warrants an unconditional warning. Assume it is |
131 | # define __format__(kind,m,n) __format__ (__##kind##__, m, n) | 138 | always declared, since it is required by C89. */ |
132 | # define ____printf____ __printf__ | 139 | #undef gets |
133 | # define ____scanf____ __scanf__ | 140 | _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); |
134 | # define ____strftime____ __strftime__ | 141 | |
135 | # define ____strfmon____ __strfmon__ | 142 | #if @GNULIB_FOPEN@ |
136 | #endif | 143 | # if @REPLACE_FOPEN@ |
137 | 144 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | |
138 | #if @GNULIB_VPRINTF_POSIX@ | 145 | # undef fopen |
139 | # if @REPLACE_VPRINTF@ | 146 | # define fopen rpl_fopen |
140 | # define vprintf rpl_vprintf | 147 | # endif |
141 | extern int vprintf (const char *format, va_list args) | 148 | _GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode) |
142 | __attribute__ ((__format__ (__printf__, 1, 0))); | 149 | _GL_ARG_NONNULL ((1, 2))); |
143 | # endif | 150 | _GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode)); |
144 | #elif @GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 151 | # else |
145 | # define vprintf rpl_vprintf | 152 | _GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode)); |
146 | extern int vprintf (const char *format, va_list args) | 153 | # endif |
147 | __attribute__ ((__format__ (__printf__, 1, 0))); | 154 | _GL_CXXALIASWARN (fopen); |
148 | #elif defined GNULIB_POSIXCHECK | 155 | #elif defined GNULIB_POSIXCHECK |
149 | # undef vprintf | 156 | # undef fopen |
150 | # define vprintf(f,a) \ | 157 | /* Assume fopen is always declared. */ |
151 | (GL_LINK_WARNING ("vprintf is not always POSIX compliant - " \ | 158 | _GL_WARN_ON_USE (fopen, "fopen on Win32 platforms is not POSIX compatible - " |
152 | "use gnulib module vprintf-posix for portable " \ | 159 | "use gnulib module fopen for portability"); |
153 | "POSIX compliance"), \ | ||
154 | vprintf (f, a)) | ||
155 | #endif | 160 | #endif |
156 | 161 | ||
157 | #if @GNULIB_SNPRINTF@ | 162 | #if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@ |
158 | # if @REPLACE_SNPRINTF@ | 163 | # if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \ |
159 | # define snprintf rpl_snprintf | 164 | || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@) |
165 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
166 | # define fprintf rpl_fprintf | ||
167 | # endif | ||
168 | # define GNULIB_overrides_fprintf 1 | ||
169 | _GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...) | ||
170 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
171 | _GL_ARG_NONNULL ((1, 2))); | ||
172 | _GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...)); | ||
173 | # else | ||
174 | _GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...)); | ||
175 | # endif | ||
176 | _GL_CXXALIASWARN (fprintf); | ||
177 | #endif | ||
178 | #if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK | ||
179 | # if !GNULIB_overrides_fprintf | ||
180 | # undef fprintf | ||
160 | # endif | 181 | # endif |
161 | # if @REPLACE_SNPRINTF@ || !@HAVE_DECL_SNPRINTF@ | 182 | /* Assume fprintf is always declared. */ |
162 | extern int snprintf (char *str, size_t size, const char *format, ...) | 183 | _GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - " |
163 | __attribute__ ((__format__ (__printf__, 3, 4))); | 184 | "use gnulib module fprintf-posix for portable " |
185 | "POSIX compliance"); | ||
186 | #endif | ||
187 | |||
188 | #if @GNULIB_FPURGE@ | ||
189 | /* Discard all pending buffered I/O data on STREAM. | ||
190 | STREAM must not be wide-character oriented. | ||
191 | When discarding pending output, the file position is set back to where it | ||
192 | was before the write calls. When discarding pending input, the file | ||
193 | position is advanced to match the end of the previously read input. | ||
194 | Return 0 if successful. Upon error, return -1 and set errno. */ | ||
195 | # if @REPLACE_FPURGE@ | ||
196 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
197 | # define fpurge rpl_fpurge | ||
198 | # endif | ||
199 | _GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); | ||
200 | _GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream)); | ||
201 | # else | ||
202 | # if !@HAVE_DECL_FPURGE@ | ||
203 | _GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1))); | ||
204 | # endif | ||
205 | _GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream)); | ||
164 | # endif | 206 | # endif |
207 | _GL_CXXALIASWARN (fpurge); | ||
165 | #elif defined GNULIB_POSIXCHECK | 208 | #elif defined GNULIB_POSIXCHECK |
166 | # undef snprintf | 209 | # undef fpurge |
167 | # define snprintf \ | 210 | # if HAVE_RAW_DECL_FPURGE |
168 | (GL_LINK_WARNING ("snprintf is unportable - " \ | 211 | _GL_WARN_ON_USE (fpurge, "fpurge is not always present - " |
169 | "use gnulib module snprintf for portability"), \ | 212 | "use gnulib module fpurge for portability"); |
170 | snprintf) | 213 | # endif |
171 | #endif | 214 | #endif |
172 | 215 | ||
173 | #if @GNULIB_VSNPRINTF@ | 216 | #if @GNULIB_FPUTC@ |
174 | # if @REPLACE_VSNPRINTF@ | 217 | # if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ |
175 | # define vsnprintf rpl_vsnprintf | 218 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
219 | # undef fputc | ||
220 | # define fputc rpl_fputc | ||
221 | # endif | ||
222 | _GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); | ||
223 | _GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream)); | ||
224 | # else | ||
225 | _GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream)); | ||
176 | # endif | 226 | # endif |
177 | # if @REPLACE_VSNPRINTF@ || !@HAVE_DECL_VSNPRINTF@ | 227 | _GL_CXXALIASWARN (fputc); |
178 | extern int vsnprintf (char *str, size_t size, const char *format, va_list args) | 228 | #endif |
179 | __attribute__ ((__format__ (__printf__, 3, 0))); | 229 | |
230 | #if @GNULIB_FPUTS@ | ||
231 | # if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | ||
232 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
233 | # undef fputs | ||
234 | # define fputs rpl_fputs | ||
235 | # endif | ||
236 | _GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream) | ||
237 | _GL_ARG_NONNULL ((1, 2))); | ||
238 | _GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream)); | ||
239 | # else | ||
240 | _GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream)); | ||
180 | # endif | 241 | # endif |
181 | #elif defined GNULIB_POSIXCHECK | 242 | _GL_CXXALIASWARN (fputs); |
182 | # undef vsnprintf | ||
183 | # define vsnprintf(b,s,f,a) \ | ||
184 | (GL_LINK_WARNING ("vsnprintf is unportable - " \ | ||
185 | "use gnulib module vsnprintf for portability"), \ | ||
186 | vsnprintf (b, s, f, a)) | ||
187 | #endif | 243 | #endif |
188 | 244 | ||
189 | #if @GNULIB_SPRINTF_POSIX@ | 245 | #if @GNULIB_FREOPEN@ |
190 | # if @REPLACE_SPRINTF@ | 246 | # if @REPLACE_FREOPEN@ |
191 | # define sprintf rpl_sprintf | 247 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
192 | extern int sprintf (char *str, const char *format, ...) | 248 | # undef freopen |
193 | __attribute__ ((__format__ (__printf__, 2, 3))); | 249 | # define freopen rpl_freopen |
250 | # endif | ||
251 | _GL_FUNCDECL_RPL (freopen, FILE *, | ||
252 | (const char *filename, const char *mode, FILE *stream) | ||
253 | _GL_ARG_NONNULL ((2, 3))); | ||
254 | _GL_CXXALIAS_RPL (freopen, FILE *, | ||
255 | (const char *filename, const char *mode, FILE *stream)); | ||
256 | # else | ||
257 | _GL_CXXALIAS_SYS (freopen, FILE *, | ||
258 | (const char *filename, const char *mode, FILE *stream)); | ||
194 | # endif | 259 | # endif |
260 | _GL_CXXALIASWARN (freopen); | ||
195 | #elif defined GNULIB_POSIXCHECK | 261 | #elif defined GNULIB_POSIXCHECK |
196 | # undef sprintf | 262 | # undef freopen |
197 | # define sprintf \ | 263 | /* Assume freopen is always declared. */ |
198 | (GL_LINK_WARNING ("sprintf is not always POSIX compliant - " \ | 264 | _GL_WARN_ON_USE (freopen, "freopen on Win32 platforms is not POSIX compatible - " |
199 | "use gnulib module sprintf-posix for portable " \ | 265 | "use gnulib module freopen for portability"); |
200 | "POSIX compliance"), \ | ||
201 | sprintf) | ||
202 | #endif | 266 | #endif |
203 | 267 | ||
204 | #if @GNULIB_VSPRINTF_POSIX@ | 268 | |
205 | # if @REPLACE_VSPRINTF@ | 269 | /* Set up the following warnings, based on which modules are in use. |
206 | # define vsprintf rpl_vsprintf | 270 | GNU Coding Standards discourage the use of fseek, since it imposes |
207 | extern int vsprintf (char *str, const char *format, va_list args) | 271 | an arbitrary limitation on some 32-bit hosts. Remember that the |
208 | __attribute__ ((__format__ (__printf__, 2, 0))); | 272 | fseek module depends on the fseeko module, so we only have three |
273 | cases to consider: | ||
274 | |||
275 | 1. The developer is not using either module. Issue a warning under | ||
276 | GNULIB_POSIXCHECK for both functions, to remind them that both | ||
277 | functions have bugs on some systems. _GL_NO_LARGE_FILES has no | ||
278 | impact on this warning. | ||
279 | |||
280 | 2. The developer is using both modules. They may be unaware of the | ||
281 | arbitrary limitations of fseek, so issue a warning under | ||
282 | GNULIB_POSIXCHECK. On the other hand, they may be using both | ||
283 | modules intentionally, so the developer can define | ||
284 | _GL_NO_LARGE_FILES in the compilation units where the use of fseek | ||
285 | is safe, to silence the warning. | ||
286 | |||
287 | 3. The developer is using the fseeko module, but not fseek. Gnulib | ||
288 | guarantees that fseek will still work around platform bugs in that | ||
289 | case, but we presume that the developer is aware of the pitfalls of | ||
290 | fseek and was trying to avoid it, so issue a warning even when | ||
291 | GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be | ||
292 | defined to silence the warning in particular compilation units. | ||
293 | In C++ compilations with GNULIB_NAMESPACE, in order to avoid that | ||
294 | fseek gets defined as a macro, it is recommended that the developer | ||
295 | uses the fseek module, even if he is not calling the fseek function. | ||
296 | |||
297 | Most gnulib clients that perform stream operations should fall into | ||
298 | category 3. */ | ||
299 | |||
300 | #if @GNULIB_FSEEK@ | ||
301 | # if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES | ||
302 | # define _GL_FSEEK_WARN /* Category 2, above. */ | ||
303 | # undef fseek | ||
304 | # endif | ||
305 | # if @REPLACE_FSEEK@ | ||
306 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
307 | # undef fseek | ||
308 | # define fseek rpl_fseek | ||
309 | # endif | ||
310 | _GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence) | ||
311 | _GL_ARG_NONNULL ((1))); | ||
312 | _GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence)); | ||
313 | # else | ||
314 | _GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence)); | ||
315 | # endif | ||
316 | _GL_CXXALIASWARN (fseek); | ||
317 | #endif | ||
318 | |||
319 | #if @GNULIB_FSEEKO@ | ||
320 | # if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES | ||
321 | # define _GL_FSEEK_WARN /* Category 3, above. */ | ||
322 | # undef fseek | ||
323 | # endif | ||
324 | # if @REPLACE_FSEEKO@ | ||
325 | /* Provide an fseeko function that is aware of a preceding fflush(), and which | ||
326 | detects pipes. */ | ||
327 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
328 | # undef fseeko | ||
329 | # define fseeko rpl_fseeko | ||
330 | # endif | ||
331 | _GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence) | ||
332 | _GL_ARG_NONNULL ((1))); | ||
333 | _GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)); | ||
334 | # else | ||
335 | # if ! @HAVE_FSEEKO@ | ||
336 | _GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence) | ||
337 | _GL_ARG_NONNULL ((1))); | ||
338 | # endif | ||
339 | _GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)); | ||
340 | # endif | ||
341 | _GL_CXXALIASWARN (fseeko); | ||
342 | # if (@REPLACE_FSEEKO@ || !@HAVE_FSEEKO@) && !@GNULIB_FSEEK@ | ||
343 | /* Provide an fseek function that is consistent with fseeko. */ | ||
344 | /* In order to avoid that fseek gets defined as a macro here, the | ||
345 | developer can request the 'fseek' module. */ | ||
346 | # undef fseek | ||
347 | # define fseek rpl_fseek | ||
348 | static inline int _GL_ARG_NONNULL ((1)) | ||
349 | rpl_fseek (FILE *fp, long offset, int whence) | ||
350 | { | ||
351 | # if @REPLACE_FSEEKO@ | ||
352 | return rpl_fseeko (fp, offset, whence); | ||
353 | # else | ||
354 | return fseeko (fp, offset, whence); | ||
355 | # endif | ||
356 | } | ||
209 | # endif | 357 | # endif |
210 | #elif defined GNULIB_POSIXCHECK | 358 | #elif defined GNULIB_POSIXCHECK |
211 | # undef vsprintf | 359 | # define _GL_FSEEK_WARN /* Category 1, above. */ |
212 | # define vsprintf(b,f,a) \ | 360 | # undef fseek |
213 | (GL_LINK_WARNING ("vsprintf is not always POSIX compliant - " \ | 361 | # undef fseeko |
214 | "use gnulib module vsprintf-posix for portable " \ | 362 | # if HAVE_RAW_DECL_FSEEKO |
215 | "POSIX compliance"), \ | 363 | _GL_WARN_ON_USE (fseeko, "fseeko is unportable - " |
216 | vsprintf (b, f, a)) | 364 | "use gnulib module fseeko for portability"); |
365 | # endif | ||
217 | #endif | 366 | #endif |
218 | 367 | ||
219 | #if @GNULIB_DPRINTF@ | 368 | #ifdef _GL_FSEEK_WARN |
220 | # if @REPLACE_DPRINTF@ | 369 | # undef _GL_FSEEK_WARN |
221 | # define dprintf rpl_dprintf | 370 | /* Here, either fseek is undefined (but C89 guarantees that it is |
371 | declared), or it is defined as rpl_fseek (declared above). */ | ||
372 | _GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB " | ||
373 | "on 32-bit platforms - " | ||
374 | "use fseeko function for handling of large files"); | ||
375 | #endif | ||
376 | |||
377 | |||
378 | /* ftell, ftello. See the comments on fseek/fseeko. */ | ||
379 | |||
380 | #if @GNULIB_FTELL@ | ||
381 | # if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES | ||
382 | # define _GL_FTELL_WARN /* Category 2, above. */ | ||
383 | # undef ftell | ||
384 | # endif | ||
385 | # if @REPLACE_FTELL@ | ||
386 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
387 | # undef ftell | ||
388 | # define ftell rpl_ftell | ||
389 | # endif | ||
390 | _GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1))); | ||
391 | _GL_CXXALIAS_RPL (ftell, long, (FILE *fp)); | ||
392 | # else | ||
393 | _GL_CXXALIAS_SYS (ftell, long, (FILE *fp)); | ||
394 | # endif | ||
395 | _GL_CXXALIASWARN (ftell); | ||
396 | #endif | ||
397 | |||
398 | #if @GNULIB_FTELLO@ | ||
399 | # if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES | ||
400 | # define _GL_FTELL_WARN /* Category 3, above. */ | ||
401 | # undef ftell | ||
402 | # endif | ||
403 | # if @REPLACE_FTELLO@ | ||
404 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
405 | # undef ftello | ||
406 | # define ftello rpl_ftello | ||
407 | # endif | ||
408 | _GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); | ||
409 | _GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp)); | ||
410 | # else | ||
411 | # if ! @HAVE_FTELLO@ | ||
412 | _GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1))); | ||
413 | # endif | ||
414 | _GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp)); | ||
222 | # endif | 415 | # endif |
223 | # if @REPLACE_DPRINTF@ || !@HAVE_DPRINTF@ | 416 | _GL_CXXALIASWARN (ftello); |
224 | extern int dprintf (int fd, const char *format, ...) | 417 | # if (@REPLACE_FTELLO@ || !@HAVE_FTELLO@) && !@GNULIB_FTELL@ |
225 | __attribute__ ((__format__ (__printf__, 2, 3))); | 418 | /* Provide an ftell function that is consistent with ftello. */ |
419 | /* In order to avoid that ftell gets defined as a macro here, the | ||
420 | developer can request the 'ftell' module. */ | ||
421 | # undef ftell | ||
422 | # define ftell rpl_ftell | ||
423 | static inline long _GL_ARG_NONNULL ((1)) | ||
424 | rpl_ftell (FILE *f) | ||
425 | { | ||
426 | # if @REPLACE_FTELLO@ | ||
427 | return rpl_ftello (f); | ||
428 | # else | ||
429 | return ftello (f); | ||
430 | # endif | ||
431 | } | ||
226 | # endif | 432 | # endif |
227 | #elif defined GNULIB_POSIXCHECK | 433 | #elif defined GNULIB_POSIXCHECK |
228 | # undef dprintf | 434 | # define _GL_FTELL_WARN /* Category 1, above. */ |
229 | # define dprintf(d,f,a) \ | 435 | # undef ftell |
230 | (GL_LINK_WARNING ("dprintf is unportable - " \ | 436 | # undef ftello |
231 | "use gnulib module dprintf for portability"), \ | 437 | # if HAVE_RAW_DECL_FTELLO |
232 | dprintf (d, f, a)) | 438 | _GL_WARN_ON_USE (ftello, "ftello is unportable - " |
439 | "use gnulib module ftello for portability"); | ||
440 | # endif | ||
233 | #endif | 441 | #endif |
234 | 442 | ||
235 | #if @GNULIB_VDPRINTF@ | 443 | #ifdef _GL_FTELL_WARN |
236 | # if @REPLACE_VDPRINTF@ | 444 | # undef _GL_FTELL_WARN |
237 | # define vdprintf rpl_vdprintf | 445 | /* Here, either ftell is undefined (but C89 guarantees that it is |
446 | declared), or it is defined as rpl_ftell (declared above). */ | ||
447 | _GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB " | ||
448 | "on 32-bit platforms - " | ||
449 | "use ftello function for handling of large files"); | ||
450 | #endif | ||
451 | |||
452 | |||
453 | #if @GNULIB_FWRITE@ | ||
454 | # if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | ||
455 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
456 | # undef fwrite | ||
457 | # define fwrite rpl_fwrite | ||
458 | # endif | ||
459 | _GL_FUNCDECL_RPL (fwrite, size_t, | ||
460 | (const void *ptr, size_t s, size_t n, FILE *stream) | ||
461 | _GL_ARG_NONNULL ((1, 4))); | ||
462 | _GL_CXXALIAS_RPL (fwrite, size_t, | ||
463 | (const void *ptr, size_t s, size_t n, FILE *stream)); | ||
464 | # else | ||
465 | _GL_CXXALIAS_SYS (fwrite, size_t, | ||
466 | (const void *ptr, size_t s, size_t n, FILE *stream)); | ||
238 | # endif | 467 | # endif |
239 | # if @REPLACE_VDPRINTF@ || !@HAVE_VDPRINTF@ | 468 | _GL_CXXALIASWARN (fwrite); |
240 | extern int vdprintf (int fd, const char *format, va_list args) | 469 | #endif |
241 | __attribute__ ((__format__ (__printf__, 2, 0))); | 470 | |
471 | #if @GNULIB_GETDELIM@ | ||
472 | /* Read input, up to (and including) the next occurrence of DELIMITER, from | ||
473 | STREAM, store it in *LINEPTR (and NUL-terminate it). | ||
474 | *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE | ||
475 | bytes of space. It is realloc'd as necessary. | ||
476 | Return the number of bytes read and stored at *LINEPTR (not including the | ||
477 | NUL terminator), or -1 on error or EOF. */ | ||
478 | # if @REPLACE_GETDELIM@ | ||
479 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
480 | # undef getdelim | ||
481 | # define getdelim rpl_getdelim | ||
482 | # endif | ||
483 | _GL_FUNCDECL_RPL (getdelim, ssize_t, | ||
484 | (char **lineptr, size_t *linesize, int delimiter, | ||
485 | FILE *stream) | ||
486 | _GL_ARG_NONNULL ((1, 2, 4))); | ||
487 | _GL_CXXALIAS_RPL (getdelim, ssize_t, | ||
488 | (char **lineptr, size_t *linesize, int delimiter, | ||
489 | FILE *stream)); | ||
490 | # else | ||
491 | # if !@HAVE_DECL_GETDELIM@ | ||
492 | _GL_FUNCDECL_SYS (getdelim, ssize_t, | ||
493 | (char **lineptr, size_t *linesize, int delimiter, | ||
494 | FILE *stream) | ||
495 | _GL_ARG_NONNULL ((1, 2, 4))); | ||
496 | # endif | ||
497 | _GL_CXXALIAS_SYS (getdelim, ssize_t, | ||
498 | (char **lineptr, size_t *linesize, int delimiter, | ||
499 | FILE *stream)); | ||
242 | # endif | 500 | # endif |
501 | _GL_CXXALIASWARN (getdelim); | ||
243 | #elif defined GNULIB_POSIXCHECK | 502 | #elif defined GNULIB_POSIXCHECK |
244 | # undef vdprintf | 503 | # undef getdelim |
245 | # define vdprintf(d,f,a) \ | 504 | # if HAVE_RAW_DECL_GETDELIM |
246 | (GL_LINK_WARNING ("vdprintf is unportable - " \ | 505 | _GL_WARN_ON_USE (getdelim, "getdelim is unportable - " |
247 | "use gnulib module vdprintf for portability"), \ | 506 | "use gnulib module getdelim for portability"); |
248 | vdprintf (d, f, a)) | 507 | # endif |
249 | #endif | 508 | #endif |
250 | 509 | ||
251 | #if @GNULIB_VASPRINTF@ | 510 | #if @GNULIB_GETLINE@ |
252 | # if @REPLACE_VASPRINTF@ | 511 | /* Read a line, up to (and including) the next newline, from STREAM, store it |
253 | # define asprintf rpl_asprintf | 512 | in *LINEPTR (and NUL-terminate it). |
254 | # define vasprintf rpl_vasprintf | 513 | *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE |
514 | bytes of space. It is realloc'd as necessary. | ||
515 | Return the number of bytes read and stored at *LINEPTR (not including the | ||
516 | NUL terminator), or -1 on error or EOF. */ | ||
517 | # if @REPLACE_GETLINE@ | ||
518 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
519 | # undef getline | ||
520 | # define getline rpl_getline | ||
521 | # endif | ||
522 | _GL_FUNCDECL_RPL (getline, ssize_t, | ||
523 | (char **lineptr, size_t *linesize, FILE *stream) | ||
524 | _GL_ARG_NONNULL ((1, 2, 3))); | ||
525 | _GL_CXXALIAS_RPL (getline, ssize_t, | ||
526 | (char **lineptr, size_t *linesize, FILE *stream)); | ||
527 | # else | ||
528 | # if !@HAVE_DECL_GETLINE@ | ||
529 | _GL_FUNCDECL_SYS (getline, ssize_t, | ||
530 | (char **lineptr, size_t *linesize, FILE *stream) | ||
531 | _GL_ARG_NONNULL ((1, 2, 3))); | ||
532 | # endif | ||
533 | _GL_CXXALIAS_SYS (getline, ssize_t, | ||
534 | (char **lineptr, size_t *linesize, FILE *stream)); | ||
535 | # endif | ||
536 | # if @HAVE_DECL_GETLINE@ | ||
537 | _GL_CXXALIASWARN (getline); | ||
255 | # endif | 538 | # endif |
256 | # if @REPLACE_VASPRINTF@ || !@HAVE_VASPRINTF@ | 539 | #elif defined GNULIB_POSIXCHECK |
257 | /* Write formatted output to a string dynamically allocated with malloc(). | 540 | # undef getline |
258 | If the memory allocation succeeds, store the address of the string in | 541 | # if HAVE_RAW_DECL_GETLINE |
259 | *RESULT and return the number of resulting bytes, excluding the trailing | 542 | _GL_WARN_ON_USE (getline, "getline is unportable - " |
260 | NUL. Upon memory allocation error, or some other error, return -1. */ | 543 | "use gnulib module getline for portability"); |
261 | extern int asprintf (char **result, const char *format, ...) | ||
262 | __attribute__ ((__format__ (__printf__, 2, 3))); | ||
263 | extern int vasprintf (char **result, const char *format, va_list args) | ||
264 | __attribute__ ((__format__ (__printf__, 2, 0))); | ||
265 | # endif | 544 | # endif |
266 | #endif | 545 | #endif |
267 | 546 | ||
268 | #if @GNULIB_OBSTACK_PRINTF@ | 547 | #if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@ |
548 | struct obstack; | ||
549 | /* Grow an obstack with formatted output. Return the number of | ||
550 | bytes added to OBS. No trailing nul byte is added, and the | ||
551 | object should be closed with obstack_finish before use. Upon | ||
552 | memory allocation error, call obstack_alloc_failed_handler. Upon | ||
553 | other error, return -1. */ | ||
269 | # if @REPLACE_OBSTACK_PRINTF@ | 554 | # if @REPLACE_OBSTACK_PRINTF@ |
270 | # define obstack_printf rpl_osbtack_printf | 555 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
271 | # define obstack_vprintf rpl_obstack_vprintf | 556 | # define obstack_printf rpl_obstack_printf |
557 | # endif | ||
558 | _GL_FUNCDECL_RPL (obstack_printf, int, | ||
559 | (struct obstack *obs, const char *format, ...) | ||
560 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
561 | _GL_ARG_NONNULL ((1, 2))); | ||
562 | _GL_CXXALIAS_RPL (obstack_printf, int, | ||
563 | (struct obstack *obs, const char *format, ...)); | ||
564 | # else | ||
565 | # if !@HAVE_DECL_OBSTACK_PRINTF@ | ||
566 | _GL_FUNCDECL_SYS (obstack_printf, int, | ||
567 | (struct obstack *obs, const char *format, ...) | ||
568 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
569 | _GL_ARG_NONNULL ((1, 2))); | ||
570 | # endif | ||
571 | _GL_CXXALIAS_SYS (obstack_printf, int, | ||
572 | (struct obstack *obs, const char *format, ...)); | ||
272 | # endif | 573 | # endif |
273 | # if @REPLACE_OBSTACK_PRINTF@ || !@HAVE_DECL_OBSTACK_PRINTF@ | 574 | _GL_CXXALIASWARN (obstack_printf); |
274 | struct obstack; | 575 | # if @REPLACE_OBSTACK_PRINTF@ |
275 | /* Grow an obstack with formatted output. Return the number of | 576 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
276 | bytes added to OBS. No trailing nul byte is added, and the | 577 | # define obstack_vprintf rpl_obstack_vprintf |
277 | object should be closed with obstack_finish before use. Upon | 578 | # endif |
278 | memory allocation error, call obstack_alloc_failed_handler. Upon | 579 | _GL_FUNCDECL_RPL (obstack_vprintf, int, |
279 | other error, return -1. */ | 580 | (struct obstack *obs, const char *format, va_list args) |
280 | extern int obstack_printf (struct obstack *obs, const char *format, ...) | 581 | __attribute__ ((__format__ (__printf__, 2, 0))) |
281 | __attribute__ ((__format__ (__printf__, 2, 3))); | 582 | _GL_ARG_NONNULL ((1, 2))); |
282 | extern int obstack_vprintf (struct obstack *obs, const char *format, | 583 | _GL_CXXALIAS_RPL (obstack_vprintf, int, |
283 | va_list args) | 584 | (struct obstack *obs, const char *format, va_list args)); |
284 | __attribute__ ((__format__ (__printf__, 2, 0))); | 585 | # else |
586 | # if !@HAVE_DECL_OBSTACK_PRINTF@ | ||
587 | _GL_FUNCDECL_SYS (obstack_vprintf, int, | ||
588 | (struct obstack *obs, const char *format, va_list args) | ||
589 | __attribute__ ((__format__ (__printf__, 2, 0))) | ||
590 | _GL_ARG_NONNULL ((1, 2))); | ||
591 | # endif | ||
592 | _GL_CXXALIAS_SYS (obstack_vprintf, int, | ||
593 | (struct obstack *obs, const char *format, va_list args)); | ||
285 | # endif | 594 | # endif |
595 | _GL_CXXALIASWARN (obstack_vprintf); | ||
286 | #endif | 596 | #endif |
287 | 597 | ||
288 | #if @GNULIB_FOPEN@ | 598 | #if @GNULIB_PERROR@ |
289 | # if @REPLACE_FOPEN@ | 599 | /* Print a message to standard error, describing the value of ERRNO, |
290 | # undef fopen | 600 | (if STRING is not NULL and not empty) prefixed with STRING and ": ", |
291 | # define fopen rpl_fopen | 601 | and terminated with a newline. */ |
292 | extern FILE * fopen (const char *filename, const char *mode); | 602 | # if @REPLACE_PERROR@ |
603 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
604 | # define perror rpl_perror | ||
605 | # endif | ||
606 | _GL_FUNCDECL_RPL (perror, void, (const char *string)); | ||
607 | _GL_CXXALIAS_RPL (perror, void, (const char *string)); | ||
608 | # else | ||
609 | _GL_CXXALIAS_SYS (perror, void, (const char *string)); | ||
293 | # endif | 610 | # endif |
611 | _GL_CXXALIASWARN (perror); | ||
294 | #elif defined GNULIB_POSIXCHECK | 612 | #elif defined GNULIB_POSIXCHECK |
295 | # undef fopen | 613 | # undef perror |
296 | # define fopen(f,m) \ | 614 | /* Assume perror is always declared. */ |
297 | (GL_LINK_WARNING ("fopen on Win32 platforms is not POSIX compatible - " \ | 615 | _GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - " |
298 | "use gnulib module fopen for portability"), \ | 616 | "use gnulib module perror for portability"); |
299 | fopen (f, m)) | ||
300 | #endif | 617 | #endif |
301 | 618 | ||
302 | #if @GNULIB_FREOPEN@ | 619 | #if @GNULIB_POPEN@ |
303 | # if @REPLACE_FREOPEN@ | 620 | # if @REPLACE_POPEN@ |
304 | # undef freopen | 621 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
305 | # define freopen rpl_freopen | 622 | # undef popen |
306 | extern FILE * freopen (const char *filename, const char *mode, FILE *stream); | 623 | # define popen rpl_popen |
624 | # endif | ||
625 | _GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode) | ||
626 | _GL_ARG_NONNULL ((1, 2))); | ||
627 | _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode)); | ||
628 | # else | ||
629 | _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode)); | ||
307 | # endif | 630 | # endif |
631 | _GL_CXXALIASWARN (popen); | ||
308 | #elif defined GNULIB_POSIXCHECK | 632 | #elif defined GNULIB_POSIXCHECK |
309 | # undef freopen | 633 | # undef popen |
310 | # define freopen(f,m,s) \ | 634 | # if HAVE_RAW_DECL_POPEN |
311 | (GL_LINK_WARNING ("freopen on Win32 platforms is not POSIX compatible - " \ | 635 | _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - " |
312 | "use gnulib module freopen for portability"), \ | 636 | "use gnulib module popen or pipe for more portability"); |
313 | freopen (f, m, s)) | 637 | # endif |
314 | #endif | 638 | #endif |
315 | 639 | ||
316 | #if @GNULIB_FSEEKO@ | 640 | #if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@ |
317 | # if @REPLACE_FSEEKO@ | 641 | # if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \ |
318 | /* Provide fseek, fseeko functions that are aware of a preceding | 642 | || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@) |
319 | fflush(), and which detect pipes. */ | 643 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
320 | # define fseeko rpl_fseeko | 644 | /* Don't break __attribute__((format(printf,M,N))). */ |
321 | extern int fseeko (FILE *fp, off_t offset, int whence); | 645 | # define printf __printf__ |
322 | # define fseek(fp, offset, whence) fseeko (fp, (off_t)(offset), whence) | 646 | # endif |
647 | # define GNULIB_overrides_printf 1 | ||
648 | _GL_FUNCDECL_RPL_1 (__printf__, int, | ||
649 | (const char *format, ...) | ||
650 | __attribute__ ((__format__ (__printf__, 1, 2))) | ||
651 | _GL_ARG_NONNULL ((1))); | ||
652 | _GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...)); | ||
653 | # else | ||
654 | _GL_CXXALIAS_SYS (printf, int, (const char *format, ...)); | ||
323 | # endif | 655 | # endif |
324 | #elif defined GNULIB_POSIXCHECK | 656 | _GL_CXXALIASWARN (printf); |
325 | # undef fseeko | 657 | #endif |
326 | # define fseeko(f,o,w) \ | 658 | #if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK |
327 | (GL_LINK_WARNING ("fseeko is unportable - " \ | 659 | # if !GNULIB_overrides_printf |
328 | "use gnulib module fseeko for portability"), \ | 660 | # undef printf |
329 | fseeko (f, o, w)) | 661 | # endif |
662 | /* Assume printf is always declared. */ | ||
663 | _GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - " | ||
664 | "use gnulib module printf-posix for portable " | ||
665 | "POSIX compliance"); | ||
330 | #endif | 666 | #endif |
331 | 667 | ||
332 | #if @GNULIB_FSEEK@ && @REPLACE_FSEEK@ | 668 | #if @GNULIB_PUTC@ |
333 | extern int rpl_fseek (FILE *fp, long offset, int whence); | 669 | # if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ |
334 | # undef fseek | 670 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
335 | # if defined GNULIB_POSIXCHECK | 671 | # undef putc |
336 | # define fseek(f,o,w) \ | 672 | # define putc rpl_fputc |
337 | (GL_LINK_WARNING ("fseek cannot handle files larger than 4 GB " \ | 673 | # endif |
338 | "on 32-bit platforms - " \ | 674 | _GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2))); |
339 | "use fseeko function for handling of large files"), \ | 675 | _GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream)); |
340 | rpl_fseek (f, o, w)) | ||
341 | # else | 676 | # else |
342 | # define fseek rpl_fseek | 677 | _GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream)); |
343 | # endif | 678 | # endif |
344 | #elif defined GNULIB_POSIXCHECK | 679 | _GL_CXXALIASWARN (putc); |
345 | # ifndef fseek | 680 | #endif |
346 | # define fseek(f,o,w) \ | 681 | |
347 | (GL_LINK_WARNING ("fseek cannot handle files larger than 4 GB " \ | 682 | #if @GNULIB_PUTCHAR@ |
348 | "on 32-bit platforms - " \ | 683 | # if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ |
349 | "use fseeko function for handling of large files"), \ | 684 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
350 | fseek (f, o, w)) | 685 | # undef putchar |
686 | # define putchar rpl_putchar | ||
687 | # endif | ||
688 | _GL_FUNCDECL_RPL (putchar, int, (int c)); | ||
689 | _GL_CXXALIAS_RPL (putchar, int, (int c)); | ||
690 | # else | ||
691 | _GL_CXXALIAS_SYS (putchar, int, (int c)); | ||
351 | # endif | 692 | # endif |
693 | _GL_CXXALIASWARN (putchar); | ||
352 | #endif | 694 | #endif |
353 | 695 | ||
354 | #if @GNULIB_FTELLO@ | 696 | #if @GNULIB_PUTS@ |
355 | # if @REPLACE_FTELLO@ | 697 | # if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ |
356 | # define ftello rpl_ftello | 698 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
357 | extern off_t ftello (FILE *fp); | 699 | # undef puts |
358 | # define ftell(fp) ftello (fp) | 700 | # define puts rpl_puts |
701 | # endif | ||
702 | _GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1))); | ||
703 | _GL_CXXALIAS_RPL (puts, int, (const char *string)); | ||
704 | # else | ||
705 | _GL_CXXALIAS_SYS (puts, int, (const char *string)); | ||
359 | # endif | 706 | # endif |
360 | #elif defined GNULIB_POSIXCHECK | 707 | _GL_CXXALIASWARN (puts); |
361 | # undef ftello | ||
362 | # define ftello(f) \ | ||
363 | (GL_LINK_WARNING ("ftello is unportable - " \ | ||
364 | "use gnulib module ftello for portability"), \ | ||
365 | ftello (f)) | ||
366 | #endif | 708 | #endif |
367 | 709 | ||
368 | #if @GNULIB_FTELL@ && @REPLACE_FTELL@ | 710 | #if @GNULIB_REMOVE@ |
369 | extern long rpl_ftell (FILE *fp); | 711 | # if @REPLACE_REMOVE@ |
370 | # undef ftell | 712 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
371 | # if GNULIB_POSIXCHECK | 713 | # undef remove |
372 | # define ftell(f) \ | 714 | # define remove rpl_remove |
373 | (GL_LINK_WARNING ("ftell cannot handle files larger than 4 GB " \ | 715 | # endif |
374 | "on 32-bit platforms - " \ | 716 | _GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1))); |
375 | "use ftello function for handling of large files"), \ | 717 | _GL_CXXALIAS_RPL (remove, int, (const char *name)); |
376 | rpl_ftell (f)) | ||
377 | # else | 718 | # else |
378 | # define ftell rpl_ftell | 719 | _GL_CXXALIAS_SYS (remove, int, (const char *name)); |
379 | # endif | 720 | # endif |
721 | _GL_CXXALIASWARN (remove); | ||
380 | #elif defined GNULIB_POSIXCHECK | 722 | #elif defined GNULIB_POSIXCHECK |
381 | # ifndef ftell | 723 | # undef remove |
382 | # define ftell(f) \ | 724 | /* Assume remove is always declared. */ |
383 | (GL_LINK_WARNING ("ftell cannot handle files larger than 4 GB " \ | 725 | _GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - " |
384 | "on 32-bit platforms - " \ | 726 | "use gnulib module remove for more portability"); |
385 | "use ftello function for handling of large files"), \ | ||
386 | ftell (f)) | ||
387 | # endif | ||
388 | #endif | 727 | #endif |
389 | 728 | ||
390 | #if @GNULIB_FFLUSH@ | 729 | #if @GNULIB_RENAME@ |
391 | # if @REPLACE_FFLUSH@ | 730 | # if @REPLACE_RENAME@ |
392 | # define fflush rpl_fflush | 731 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
393 | /* Flush all pending data on STREAM according to POSIX rules. Both | 732 | # undef rename |
394 | output and seekable input streams are supported. | 733 | # define rename rpl_rename |
395 | Note! LOSS OF DATA can occur if fflush is applied on an input stream | 734 | # endif |
396 | that is _not_seekable_ or on an update stream that is _not_seekable_ | 735 | _GL_FUNCDECL_RPL (rename, int, |
397 | and in which the most recent operation was input. Seekability can | 736 | (const char *old_filename, const char *new_filename) |
398 | be tested with lseek(fileno(fp),0,SEEK_CUR). */ | 737 | _GL_ARG_NONNULL ((1, 2))); |
399 | extern int fflush (FILE *gl_stream); | 738 | _GL_CXXALIAS_RPL (rename, int, |
739 | (const char *old_filename, const char *new_filename)); | ||
740 | # else | ||
741 | _GL_CXXALIAS_SYS (rename, int, | ||
742 | (const char *old_filename, const char *new_filename)); | ||
400 | # endif | 743 | # endif |
744 | _GL_CXXALIASWARN (rename); | ||
401 | #elif defined GNULIB_POSIXCHECK | 745 | #elif defined GNULIB_POSIXCHECK |
402 | # undef fflush | 746 | # undef rename |
403 | # define fflush(f) \ | 747 | /* Assume rename is always declared. */ |
404 | (GL_LINK_WARNING ("fflush is not always POSIX compliant - " \ | 748 | _GL_WARN_ON_USE (rename, "rename is buggy on some platforms - " |
405 | "use gnulib module fflush for portable " \ | 749 | "use gnulib module rename for more portability"); |
406 | "POSIX compliance"), \ | ||
407 | fflush (f)) | ||
408 | #endif | 750 | #endif |
409 | 751 | ||
410 | #if @GNULIB_FCLOSE@ | 752 | #if @GNULIB_RENAMEAT@ |
411 | # if @REPLACE_FCLOSE@ | 753 | # if @REPLACE_RENAMEAT@ |
412 | # define fclose rpl_fclose | 754 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
413 | /* Close STREAM and its underlying file descriptor. */ | 755 | # undef renameat |
414 | extern int fclose (FILE *stream); | 756 | # define renameat rpl_renameat |
757 | # endif | ||
758 | _GL_FUNCDECL_RPL (renameat, int, | ||
759 | (int fd1, char const *file1, int fd2, char const *file2) | ||
760 | _GL_ARG_NONNULL ((2, 4))); | ||
761 | _GL_CXXALIAS_RPL (renameat, int, | ||
762 | (int fd1, char const *file1, int fd2, char const *file2)); | ||
763 | # else | ||
764 | # if !@HAVE_RENAMEAT@ | ||
765 | _GL_FUNCDECL_SYS (renameat, int, | ||
766 | (int fd1, char const *file1, int fd2, char const *file2) | ||
767 | _GL_ARG_NONNULL ((2, 4))); | ||
768 | # endif | ||
769 | _GL_CXXALIAS_SYS (renameat, int, | ||
770 | (int fd1, char const *file1, int fd2, char const *file2)); | ||
415 | # endif | 771 | # endif |
772 | _GL_CXXALIASWARN (renameat); | ||
416 | #elif defined GNULIB_POSIXCHECK | 773 | #elif defined GNULIB_POSIXCHECK |
417 | # undef fclose | 774 | # undef renameat |
418 | # define fclose(f) \ | 775 | # if HAVE_RAW_DECL_RENAMEAT |
419 | (GL_LINK_WARNING ("fclose is not always POSIX compliant - " \ | 776 | _GL_WARN_ON_USE (renameat, "renameat is not portable - " |
420 | "use gnulib module fclose for portable " \ | 777 | "use gnulib module renameat for portability"); |
421 | "POSIX compliance"), \ | 778 | # endif |
422 | fclose (f)) | ||
423 | #endif | 779 | #endif |
424 | 780 | ||
425 | #if @GNULIB_FPUTC@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 781 | #if @GNULIB_SNPRINTF@ |
426 | # undef fputc | 782 | # if @REPLACE_SNPRINTF@ |
427 | # define fputc rpl_fputc | 783 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
428 | extern int fputc (int c, FILE *stream); | 784 | # define snprintf rpl_snprintf |
785 | # endif | ||
786 | _GL_FUNCDECL_RPL (snprintf, int, | ||
787 | (char *str, size_t size, const char *format, ...) | ||
788 | __attribute__ ((__format__ (__printf__, 3, 4))) | ||
789 | _GL_ARG_NONNULL ((3))); | ||
790 | _GL_CXXALIAS_RPL (snprintf, int, | ||
791 | (char *str, size_t size, const char *format, ...)); | ||
792 | # else | ||
793 | # if !@HAVE_DECL_SNPRINTF@ | ||
794 | _GL_FUNCDECL_SYS (snprintf, int, | ||
795 | (char *str, size_t size, const char *format, ...) | ||
796 | __attribute__ ((__format__ (__printf__, 3, 4))) | ||
797 | _GL_ARG_NONNULL ((3))); | ||
798 | # endif | ||
799 | _GL_CXXALIAS_SYS (snprintf, int, | ||
800 | (char *str, size_t size, const char *format, ...)); | ||
801 | # endif | ||
802 | _GL_CXXALIASWARN (snprintf); | ||
803 | #elif defined GNULIB_POSIXCHECK | ||
804 | # undef snprintf | ||
805 | # if HAVE_RAW_DECL_SNPRINTF | ||
806 | _GL_WARN_ON_USE (snprintf, "snprintf is unportable - " | ||
807 | "use gnulib module snprintf for portability"); | ||
808 | # endif | ||
429 | #endif | 809 | #endif |
430 | 810 | ||
431 | #if @GNULIB_PUTC@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 811 | /* Some people would argue that sprintf should be handled like gets |
432 | # undef putc | 812 | (for example, OpenBSD issues a link warning for both functions), |
433 | # define putc rpl_fputc | 813 | since both can cause security holes due to buffer overruns. |
434 | extern int putc (int c, FILE *stream); | 814 | However, we believe that sprintf can be used safely, and is more |
435 | #endif | 815 | efficient than snprintf in those safe cases; and as proof of our |
816 | belief, we use sprintf in several gnulib modules. So this header | ||
817 | intentionally avoids adding a warning to sprintf except when | ||
818 | GNULIB_POSIXCHECK is defined. */ | ||
436 | 819 | ||
437 | #if @GNULIB_PUTCHAR@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 820 | #if @GNULIB_SPRINTF_POSIX@ |
438 | # undef putchar | 821 | # if @REPLACE_SPRINTF@ |
439 | # define putchar rpl_putchar | 822 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
440 | extern int putchar (int c); | 823 | # define sprintf rpl_sprintf |
824 | # endif | ||
825 | _GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...) | ||
826 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
827 | _GL_ARG_NONNULL ((1, 2))); | ||
828 | _GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...)); | ||
829 | # else | ||
830 | _GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...)); | ||
831 | # endif | ||
832 | _GL_CXXALIASWARN (sprintf); | ||
833 | #elif defined GNULIB_POSIXCHECK | ||
834 | # undef sprintf | ||
835 | /* Assume sprintf is always declared. */ | ||
836 | _GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - " | ||
837 | "use gnulib module sprintf-posix for portable " | ||
838 | "POSIX compliance"); | ||
441 | #endif | 839 | #endif |
442 | 840 | ||
443 | #if @GNULIB_FPUTS@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 841 | #if @GNULIB_TMPFILE@ |
444 | # undef fputs | 842 | # if @REPLACE_TMPFILE@ |
445 | # define fputs rpl_fputs | 843 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
446 | extern int fputs (const char *string, FILE *stream); | 844 | # define tmpfile rpl_tmpfile |
845 | # endif | ||
846 | _GL_FUNCDECL_RPL (tmpfile, FILE *, (void)); | ||
847 | _GL_CXXALIAS_RPL (tmpfile, FILE *, (void)); | ||
848 | # else | ||
849 | _GL_CXXALIAS_SYS (tmpfile, FILE *, (void)); | ||
850 | # endif | ||
851 | _GL_CXXALIASWARN (tmpfile); | ||
852 | #elif defined GNULIB_POSIXCHECK | ||
853 | # undef tmpfile | ||
854 | # if HAVE_RAW_DECL_TMPFILE | ||
855 | _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - " | ||
856 | "use gnulib module tmpfile for portability"); | ||
857 | # endif | ||
447 | #endif | 858 | #endif |
448 | 859 | ||
449 | #if @GNULIB_PUTS@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 860 | #if @GNULIB_VASPRINTF@ |
450 | # undef puts | 861 | /* Write formatted output to a string dynamically allocated with malloc(). |
451 | # define puts rpl_puts | 862 | If the memory allocation succeeds, store the address of the string in |
452 | extern int puts (const char *string); | 863 | *RESULT and return the number of resulting bytes, excluding the trailing |
864 | NUL. Upon memory allocation error, or some other error, return -1. */ | ||
865 | # if @REPLACE_VASPRINTF@ | ||
866 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
867 | # define asprintf rpl_asprintf | ||
868 | # endif | ||
869 | _GL_FUNCDECL_RPL (asprintf, int, | ||
870 | (char **result, const char *format, ...) | ||
871 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
872 | _GL_ARG_NONNULL ((1, 2))); | ||
873 | _GL_CXXALIAS_RPL (asprintf, int, | ||
874 | (char **result, const char *format, ...)); | ||
875 | # else | ||
876 | # if !@HAVE_VASPRINTF@ | ||
877 | _GL_FUNCDECL_SYS (asprintf, int, | ||
878 | (char **result, const char *format, ...) | ||
879 | __attribute__ ((__format__ (__printf__, 2, 3))) | ||
880 | _GL_ARG_NONNULL ((1, 2))); | ||
881 | # endif | ||
882 | _GL_CXXALIAS_SYS (asprintf, int, | ||
883 | (char **result, const char *format, ...)); | ||
884 | # endif | ||
885 | _GL_CXXALIASWARN (asprintf); | ||
886 | # if @REPLACE_VASPRINTF@ | ||
887 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
888 | # define vasprintf rpl_vasprintf | ||
889 | # endif | ||
890 | _GL_FUNCDECL_RPL (vasprintf, int, | ||
891 | (char **result, const char *format, va_list args) | ||
892 | __attribute__ ((__format__ (__printf__, 2, 0))) | ||
893 | _GL_ARG_NONNULL ((1, 2))); | ||
894 | _GL_CXXALIAS_RPL (vasprintf, int, | ||
895 | (char **result, const char *format, va_list args)); | ||
896 | # else | ||
897 | # if !@HAVE_VASPRINTF@ | ||
898 | _GL_FUNCDECL_SYS (vasprintf, int, | ||
899 | (char **result, const char *format, va_list args) | ||
900 | __attribute__ ((__format__ (__printf__, 2, 0))) | ||
901 | _GL_ARG_NONNULL ((1, 2))); | ||
902 | # endif | ||
903 | _GL_CXXALIAS_SYS (vasprintf, int, | ||
904 | (char **result, const char *format, va_list args)); | ||
905 | # endif | ||
906 | _GL_CXXALIASWARN (vasprintf); | ||
453 | #endif | 907 | #endif |
454 | 908 | ||
455 | #if @GNULIB_FWRITE@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@ | 909 | #if @GNULIB_VDPRINTF@ |
456 | # undef fwrite | 910 | # if @REPLACE_VDPRINTF@ |
457 | # define fwrite rpl_fwrite | 911 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
458 | extern size_t fwrite (const void *ptr, size_t s, size_t n, FILE *stream); | 912 | # define vdprintf rpl_vdprintf |
913 | # endif | ||
914 | _GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args) | ||
915 | __attribute__ ((__format__ (__printf__, 2, 0))) | ||
916 | _GL_ARG_NONNULL ((2))); | ||
917 | _GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args)); | ||
918 | # else | ||
919 | # if !@HAVE_VDPRINTF@ | ||
920 | _GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args) | ||
921 | __attribute__ ((__format__ (__printf__, 2, 0))) | ||
922 | _GL_ARG_NONNULL ((2))); | ||
923 | # endif | ||
924 | /* Need to cast, because on Solaris, the third parameter will likely be | ||
925 | __va_list args. */ | ||
926 | _GL_CXXALIAS_SYS_CAST (vdprintf, int, | ||
927 | (int fd, const char *format, va_list args)); | ||
928 | # endif | ||
929 | _GL_CXXALIASWARN (vdprintf); | ||
930 | #elif defined GNULIB_POSIXCHECK | ||
931 | # undef vdprintf | ||
932 | # if HAVE_RAW_DECL_VDPRINTF | ||
933 | _GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - " | ||
934 | "use gnulib module vdprintf for portability"); | ||
935 | # endif | ||
459 | #endif | 936 | #endif |
460 | 937 | ||
461 | #if @GNULIB_GETDELIM@ | 938 | #if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@ |
462 | # if !@HAVE_DECL_GETDELIM@ | 939 | # if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \ |
463 | /* Read input, up to (and including) the next occurrence of DELIMITER, from | 940 | || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@) |
464 | STREAM, store it in *LINEPTR (and NUL-terminate it). | 941 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
465 | *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE | 942 | # define vfprintf rpl_vfprintf |
466 | bytes of space. It is realloc'd as necessary. | 943 | # endif |
467 | Return the number of bytes read and stored at *LINEPTR (not including the | 944 | # define GNULIB_overrides_vfprintf 1 |
468 | NUL terminator), or -1 on error or EOF. */ | 945 | _GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args) |
469 | extern ssize_t getdelim (char **lineptr, size_t *linesize, int delimiter, | 946 | __attribute__ ((__format__ (__printf__, 2, 0))) |
470 | FILE *stream); | 947 | _GL_ARG_NONNULL ((1, 2))); |
948 | _GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)); | ||
949 | # else | ||
950 | /* Need to cast, because on Solaris, the third parameter is | ||
951 | __va_list args | ||
952 | and GCC's fixincludes did not change this to __gnuc_va_list. */ | ||
953 | _GL_CXXALIAS_SYS_CAST (vfprintf, int, | ||
954 | (FILE *fp, const char *format, va_list args)); | ||
471 | # endif | 955 | # endif |
472 | #elif defined GNULIB_POSIXCHECK | 956 | _GL_CXXALIASWARN (vfprintf); |
473 | # undef getdelim | 957 | #endif |
474 | # define getdelim(l, s, d, f) \ | 958 | #if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK |
475 | (GL_LINK_WARNING ("getdelim is unportable - " \ | 959 | # if !GNULIB_overrides_vfprintf |
476 | "use gnulib module getdelim for portability"), \ | 960 | # undef vfprintf |
477 | getdelim (l, s, d, f)) | 961 | # endif |
962 | /* Assume vfprintf is always declared. */ | ||
963 | _GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - " | ||
964 | "use gnulib module vfprintf-posix for portable " | ||
965 | "POSIX compliance"); | ||
478 | #endif | 966 | #endif |
479 | 967 | ||
480 | #if @GNULIB_GETLINE@ | 968 | #if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@ |
481 | # if @REPLACE_GETLINE@ | 969 | # if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \ |
482 | # undef getline | 970 | || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@) |
483 | # define getline rpl_getline | 971 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
972 | # define vprintf rpl_vprintf | ||
973 | # endif | ||
974 | # define GNULIB_overrides_vprintf 1 | ||
975 | _GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args) | ||
976 | __attribute__ ((__format__ (__printf__, 1, 0))) | ||
977 | _GL_ARG_NONNULL ((1))); | ||
978 | _GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args)); | ||
979 | # else | ||
980 | /* Need to cast, because on Solaris, the second parameter is | ||
981 | __va_list args | ||
982 | and GCC's fixincludes did not change this to __gnuc_va_list. */ | ||
983 | _GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args)); | ||
484 | # endif | 984 | # endif |
485 | # if !@HAVE_DECL_GETLINE@ || @REPLACE_GETLINE@ | 985 | _GL_CXXALIASWARN (vprintf); |
486 | /* Read a line, up to (and including) the next newline, from STREAM, store it | 986 | #endif |
487 | in *LINEPTR (and NUL-terminate it). | 987 | #if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK |
488 | *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE | 988 | # if !GNULIB_overrides_vprintf |
489 | bytes of space. It is realloc'd as necessary. | 989 | # undef vprintf |
490 | Return the number of bytes read and stored at *LINEPTR (not including the | ||
491 | NUL terminator), or -1 on error or EOF. */ | ||
492 | extern ssize_t getline (char **lineptr, size_t *linesize, FILE *stream); | ||
493 | # endif | 990 | # endif |
494 | #elif defined GNULIB_POSIXCHECK | 991 | /* Assume vprintf is always declared. */ |
495 | # undef getline | 992 | _GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - " |
496 | # define getline(l, s, f) \ | 993 | "use gnulib module vprintf-posix for portable " |
497 | (GL_LINK_WARNING ("getline is unportable - " \ | 994 | "POSIX compliance"); |
498 | "use gnulib module getline for portability"), \ | ||
499 | getline (l, s, f)) | ||
500 | #endif | 995 | #endif |
501 | 996 | ||
502 | #if @GNULIB_PERROR@ | 997 | #if @GNULIB_VSNPRINTF@ |
503 | # if @REPLACE_PERROR@ | 998 | # if @REPLACE_VSNPRINTF@ |
504 | # define perror rpl_perror | 999 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
505 | /* Print a message to standard error, describing the value of ERRNO, | 1000 | # define vsnprintf rpl_vsnprintf |
506 | (if STRING is not NULL and not empty) prefixed with STRING and ": ", | 1001 | # endif |
507 | and terminated with a newline. */ | 1002 | _GL_FUNCDECL_RPL (vsnprintf, int, |
508 | extern void perror (const char *string); | 1003 | (char *str, size_t size, const char *format, va_list args) |
1004 | __attribute__ ((__format__ (__printf__, 3, 0))) | ||
1005 | _GL_ARG_NONNULL ((3))); | ||
1006 | _GL_CXXALIAS_RPL (vsnprintf, int, | ||
1007 | (char *str, size_t size, const char *format, va_list args)); | ||
1008 | # else | ||
1009 | # if !@HAVE_DECL_VSNPRINTF@ | ||
1010 | _GL_FUNCDECL_SYS (vsnprintf, int, | ||
1011 | (char *str, size_t size, const char *format, va_list args) | ||
1012 | __attribute__ ((__format__ (__printf__, 3, 0))) | ||
1013 | _GL_ARG_NONNULL ((3))); | ||
1014 | # endif | ||
1015 | _GL_CXXALIAS_SYS (vsnprintf, int, | ||
1016 | (char *str, size_t size, const char *format, va_list args)); | ||
509 | # endif | 1017 | # endif |
1018 | _GL_CXXALIASWARN (vsnprintf); | ||
510 | #elif defined GNULIB_POSIXCHECK | 1019 | #elif defined GNULIB_POSIXCHECK |
511 | # undef perror | 1020 | # undef vsnprintf |
512 | # define perror(s) \ | 1021 | # if HAVE_RAW_DECL_VSNPRINTF |
513 | (GL_LINK_WARNING ("perror is not always POSIX compliant - " \ | 1022 | _GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - " |
514 | "use gnulib module perror for portability"), \ | 1023 | "use gnulib module vsnprintf for portability"); |
515 | perror (s)) | 1024 | # endif |
516 | #endif | 1025 | #endif |
517 | 1026 | ||
518 | #ifdef __cplusplus | 1027 | #if @GNULIB_VSPRINTF_POSIX@ |
519 | } | 1028 | # if @REPLACE_VSPRINTF@ |
1029 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
1030 | # define vsprintf rpl_vsprintf | ||
1031 | # endif | ||
1032 | _GL_FUNCDECL_RPL (vsprintf, int, | ||
1033 | (char *str, const char *format, va_list args) | ||
1034 | __attribute__ ((__format__ (__printf__, 2, 0))) | ||
1035 | _GL_ARG_NONNULL ((1, 2))); | ||
1036 | _GL_CXXALIAS_RPL (vsprintf, int, | ||
1037 | (char *str, const char *format, va_list args)); | ||
1038 | # else | ||
1039 | /* Need to cast, because on Solaris, the third parameter is | ||
1040 | __va_list args | ||
1041 | and GCC's fixincludes did not change this to __gnuc_va_list. */ | ||
1042 | _GL_CXXALIAS_SYS_CAST (vsprintf, int, | ||
1043 | (char *str, const char *format, va_list args)); | ||
1044 | # endif | ||
1045 | _GL_CXXALIASWARN (vsprintf); | ||
1046 | #elif defined GNULIB_POSIXCHECK | ||
1047 | # undef vsprintf | ||
1048 | /* Assume vsprintf is always declared. */ | ||
1049 | _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - " | ||
1050 | "use gnulib module vsprintf-posix for portable " | ||
1051 | "POSIX compliance"); | ||
520 | #endif | 1052 | #endif |
521 | 1053 | ||
1054 | |||
522 | #endif /* _GL_STDIO_H */ | 1055 | #endif /* _GL_STDIO_H */ |
523 | #endif /* _GL_STDIO_H */ | 1056 | #endif /* _GL_STDIO_H */ |
524 | #endif | 1057 | #endif |
diff --git a/gl/stdlib.in.h b/gl/stdlib.in.h index f99767f6..d74c2518 100644 --- a/gl/stdlib.in.h +++ b/gl/stdlib.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A GNU-like <stdlib.h>. | 1 | /* A GNU-like <stdlib.h>. |
2 | 2 | ||
3 | Copyright (C) 1995, 2001-2004, 2006-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 1995, 2001-2004, 2006-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -35,9 +35,11 @@ | |||
35 | #ifndef _GL_STDLIB_H | 35 | #ifndef _GL_STDLIB_H |
36 | #define _GL_STDLIB_H | 36 | #define _GL_STDLIB_H |
37 | 37 | ||
38 | /* NetBSD 5.0 mis-defines NULL. */ | ||
39 | #include <stddef.h> | ||
38 | 40 | ||
39 | /* Solaris declares getloadavg() in <sys/loadavg.h>. */ | 41 | /* Solaris declares getloadavg() in <sys/loadavg.h>. */ |
40 | #if @GNULIB_GETLOADAVG@ && @HAVE_SYS_LOADAVG_H@ | 42 | #if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@ |
41 | # include <sys/loadavg.h> | 43 | # include <sys/loadavg.h> |
42 | #endif | 44 | #endif |
43 | 45 | ||
@@ -47,24 +49,36 @@ | |||
47 | # include <random.h> | 49 | # include <random.h> |
48 | #endif | 50 | #endif |
49 | 51 | ||
50 | #if @GNULIB_RANDOM_R@ || !@HAVE_STRUCT_RANDOM_DATA@ | 52 | #if !@HAVE_STRUCT_RANDOM_DATA@ || (@GNULIB_RANDOM_R@ && !@HAVE_RANDOM_R@) \ |
53 | || defined GNULIB_POSIXCHECK | ||
51 | # include <stdint.h> | 54 | # include <stdint.h> |
52 | #endif | 55 | #endif |
53 | 56 | ||
54 | #if !@HAVE_STRUCT_RANDOM_DATA@ | 57 | #if !@HAVE_STRUCT_RANDOM_DATA@ |
55 | struct random_data | 58 | struct random_data |
56 | { | 59 | { |
57 | int32_t *fptr; /* Front pointer. */ | 60 | int32_t *fptr; /* Front pointer. */ |
58 | int32_t *rptr; /* Rear pointer. */ | 61 | int32_t *rptr; /* Rear pointer. */ |
59 | int32_t *state; /* Array of state values. */ | 62 | int32_t *state; /* Array of state values. */ |
60 | int rand_type; /* Type of random number generator. */ | 63 | int rand_type; /* Type of random number generator. */ |
61 | int rand_deg; /* Degree of random number generator. */ | 64 | int rand_deg; /* Degree of random number generator. */ |
62 | int rand_sep; /* Distance between front and rear. */ | 65 | int rand_sep; /* Distance between front and rear. */ |
63 | int32_t *end_ptr; /* Pointer behind state table. */ | 66 | int32_t *end_ptr; /* Pointer behind state table. */ |
64 | }; | 67 | }; |
65 | #endif | 68 | #endif |
66 | 69 | ||
67 | /* The definition of GL_LINK_WARNING is copied here. */ | 70 | #if (@GNULIB_MKSTEMP@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) |
71 | /* On MacOS X 10.3, only <unistd.h> declares mkstemp. */ | ||
72 | /* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */ | ||
73 | /* But avoid namespace pollution on glibc systems and native Windows. */ | ||
74 | # include <unistd.h> | ||
75 | #endif | ||
76 | |||
77 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
78 | |||
79 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
80 | |||
81 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
68 | 82 | ||
69 | 83 | ||
70 | /* Some systems do not define EXIT_*, despite otherwise supporting C89. */ | 84 | /* Some systems do not define EXIT_*, despite otherwise supporting C89. */ |
@@ -81,88 +95,84 @@ struct random_data | |||
81 | #endif | 95 | #endif |
82 | 96 | ||
83 | 97 | ||
84 | #ifdef __cplusplus | 98 | #if @GNULIB_ATOLL@ |
85 | extern "C" { | 99 | /* Parse a signed decimal integer. |
86 | #endif | 100 | Returns the value of the integer. Errors are not detected. */ |
87 | 101 | # if !@HAVE_ATOLL@ | |
88 | 102 | _GL_FUNCDECL_SYS (atoll, long long, (const char *string) _GL_ARG_NONNULL ((1))); | |
89 | #if @GNULIB_MALLOC_POSIX@ | ||
90 | # if !@HAVE_MALLOC_POSIX@ | ||
91 | # undef malloc | ||
92 | # define malloc rpl_malloc | ||
93 | extern void * malloc (size_t size); | ||
94 | # endif | 103 | # endif |
104 | _GL_CXXALIAS_SYS (atoll, long long, (const char *string)); | ||
105 | _GL_CXXALIASWARN (atoll); | ||
95 | #elif defined GNULIB_POSIXCHECK | 106 | #elif defined GNULIB_POSIXCHECK |
96 | # undef malloc | 107 | # undef atoll |
97 | # define malloc(s) \ | 108 | # if HAVE_RAW_DECL_ATOLL |
98 | (GL_LINK_WARNING ("malloc is not POSIX compliant everywhere - " \ | 109 | _GL_WARN_ON_USE (atoll, "atoll is unportable - " |
99 | "use gnulib module malloc-posix for portability"), \ | 110 | "use gnulib module atoll for portability"); |
100 | malloc (s)) | ||
101 | #endif | ||
102 | |||
103 | |||
104 | #if @GNULIB_REALLOC_POSIX@ | ||
105 | # if !@HAVE_REALLOC_POSIX@ | ||
106 | # undef realloc | ||
107 | # define realloc rpl_realloc | ||
108 | extern void * realloc (void *ptr, size_t size); | ||
109 | # endif | 111 | # endif |
110 | #elif defined GNULIB_POSIXCHECK | ||
111 | # undef realloc | ||
112 | # define realloc(p,s) \ | ||
113 | (GL_LINK_WARNING ("realloc is not POSIX compliant everywhere - " \ | ||
114 | "use gnulib module realloc-posix for portability"), \ | ||
115 | realloc (p, s)) | ||
116 | #endif | 112 | #endif |
117 | 113 | ||
118 | |||
119 | #if @GNULIB_CALLOC_POSIX@ | 114 | #if @GNULIB_CALLOC_POSIX@ |
120 | # if !@HAVE_CALLOC_POSIX@ | 115 | # if !@HAVE_CALLOC_POSIX@ |
121 | # undef calloc | 116 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
122 | # define calloc rpl_calloc | 117 | # undef calloc |
123 | extern void * calloc (size_t nmemb, size_t size); | 118 | # define calloc rpl_calloc |
119 | # endif | ||
120 | _GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size)); | ||
121 | _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size)); | ||
122 | # else | ||
123 | _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size)); | ||
124 | # endif | 124 | # endif |
125 | _GL_CXXALIASWARN (calloc); | ||
125 | #elif defined GNULIB_POSIXCHECK | 126 | #elif defined GNULIB_POSIXCHECK |
126 | # undef calloc | 127 | # undef calloc |
127 | # define calloc(n,s) \ | 128 | /* Assume calloc is always declared. */ |
128 | (GL_LINK_WARNING ("calloc is not POSIX compliant everywhere - " \ | 129 | _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - " |
129 | "use gnulib module calloc-posix for portability"), \ | 130 | "use gnulib module calloc-posix for portability"); |
130 | calloc (n, s)) | ||
131 | #endif | 131 | #endif |
132 | 132 | ||
133 | 133 | #if @GNULIB_CANONICALIZE_FILE_NAME@ | |
134 | #if @GNULIB_ATOLL@ | 134 | # if @REPLACE_CANONICALIZE_FILE_NAME@ |
135 | # if !@HAVE_ATOLL@ | 135 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
136 | /* Parse a signed decimal integer. | 136 | # define canonicalize_file_name rpl_canonicalize_file_name |
137 | Returns the value of the integer. Errors are not detected. */ | 137 | # endif |
138 | extern long long atoll (const char *string); | 138 | _GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name) |
139 | _GL_ARG_NONNULL ((1))); | ||
140 | _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name)); | ||
141 | # else | ||
142 | # if !@HAVE_CANONICALIZE_FILE_NAME@ | ||
143 | _GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name) | ||
144 | _GL_ARG_NONNULL ((1))); | ||
145 | # endif | ||
146 | _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name)); | ||
139 | # endif | 147 | # endif |
148 | _GL_CXXALIASWARN (canonicalize_file_name); | ||
140 | #elif defined GNULIB_POSIXCHECK | 149 | #elif defined GNULIB_POSIXCHECK |
141 | # undef atoll | 150 | # undef canonicalize_file_name |
142 | # define atoll(s) \ | 151 | # if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME |
143 | (GL_LINK_WARNING ("atoll is unportable - " \ | 152 | _GL_WARN_ON_USE (canonicalize_file_name, "canonicalize_file_name is unportable - " |
144 | "use gnulib module atoll for portability"), \ | 153 | "use gnulib module canonicalize-lgpl for portability"); |
145 | atoll (s)) | 154 | # endif |
146 | #endif | 155 | #endif |
147 | 156 | ||
148 | |||
149 | #if @GNULIB_GETLOADAVG@ | 157 | #if @GNULIB_GETLOADAVG@ |
150 | # if !@HAVE_DECL_GETLOADAVG@ | ||
151 | /* Store max(NELEM,3) load average numbers in LOADAVG[]. | 158 | /* Store max(NELEM,3) load average numbers in LOADAVG[]. |
152 | The three numbers are the load average of the last 1 minute, the last 5 | 159 | The three numbers are the load average of the last 1 minute, the last 5 |
153 | minutes, and the last 15 minutes, respectively. | 160 | minutes, and the last 15 minutes, respectively. |
154 | LOADAVG is an array of NELEM numbers. */ | 161 | LOADAVG is an array of NELEM numbers. */ |
155 | extern int getloadavg (double loadavg[], int nelem); | 162 | # if !@HAVE_DECL_GETLOADAVG@ |
163 | _GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem) | ||
164 | _GL_ARG_NONNULL ((1))); | ||
156 | # endif | 165 | # endif |
166 | _GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem)); | ||
167 | _GL_CXXALIASWARN (getloadavg); | ||
157 | #elif defined GNULIB_POSIXCHECK | 168 | #elif defined GNULIB_POSIXCHECK |
158 | # undef getloadavg | 169 | # undef getloadavg |
159 | # define getloadavg(l,n) \ | 170 | # if HAVE_RAW_DECL_GETLOADAVG |
160 | (GL_LINK_WARNING ("getloadavg is not portable - " \ | 171 | _GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - " |
161 | "use gnulib module getloadavg for portability"), \ | 172 | "use gnulib module getloadavg for portability"); |
162 | getloadavg (l, n)) | 173 | # endif |
163 | #endif | 174 | #endif |
164 | 175 | ||
165 | |||
166 | #if @GNULIB_GETSUBOPT@ | 176 | #if @GNULIB_GETSUBOPT@ |
167 | /* Assuming *OPTIONP is a comma separated list of elements of the form | 177 | /* Assuming *OPTIONP is a comma separated list of elements of the form |
168 | "token" or "token=value", getsubopt parses the first of these elements. | 178 | "token" or "token=value", getsubopt parses the first of these elements. |
@@ -176,37 +186,133 @@ extern int getloadavg (double loadavg[], int nelem); | |||
176 | For more details see the POSIX:2001 specification. | 186 | For more details see the POSIX:2001 specification. |
177 | http://www.opengroup.org/susv3xsh/getsubopt.html */ | 187 | http://www.opengroup.org/susv3xsh/getsubopt.html */ |
178 | # if !@HAVE_GETSUBOPT@ | 188 | # if !@HAVE_GETSUBOPT@ |
179 | extern int getsubopt (char **optionp, char *const *tokens, char **valuep); | 189 | _GL_FUNCDECL_SYS (getsubopt, int, |
190 | (char **optionp, char *const *tokens, char **valuep) | ||
191 | _GL_ARG_NONNULL ((1, 2, 3))); | ||
180 | # endif | 192 | # endif |
193 | _GL_CXXALIAS_SYS (getsubopt, int, | ||
194 | (char **optionp, char *const *tokens, char **valuep)); | ||
195 | _GL_CXXALIASWARN (getsubopt); | ||
181 | #elif defined GNULIB_POSIXCHECK | 196 | #elif defined GNULIB_POSIXCHECK |
182 | # undef getsubopt | 197 | # undef getsubopt |
183 | # define getsubopt(o,t,v) \ | 198 | # if HAVE_RAW_DECL_GETSUBOPT |
184 | (GL_LINK_WARNING ("getsubopt is unportable - " \ | 199 | _GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - " |
185 | "use gnulib module getsubopt for portability"), \ | 200 | "use gnulib module getsubopt for portability"); |
186 | getsubopt (o, t, v)) | 201 | # endif |
202 | #endif | ||
203 | |||
204 | #if @GNULIB_GRANTPT@ | ||
205 | /* Change the ownership and access permission of the slave side of the | ||
206 | pseudo-terminal whose master side is specified by FD. */ | ||
207 | # if !@HAVE_GRANTPT@ | ||
208 | _GL_FUNCDECL_SYS (grantpt, int, (int fd)); | ||
209 | # endif | ||
210 | _GL_CXXALIAS_SYS (grantpt, int, (int fd)); | ||
211 | _GL_CXXALIASWARN (grantpt); | ||
212 | #elif defined GNULIB_POSIXCHECK | ||
213 | # undef grantpt | ||
214 | # if HAVE_RAW_DECL_GRANTPT | ||
215 | _GL_WARN_ON_USE (ptsname, "grantpt is not portable - " | ||
216 | "use gnulib module grantpt for portability"); | ||
217 | # endif | ||
187 | #endif | 218 | #endif |
188 | 219 | ||
220 | #if @GNULIB_MALLOC_POSIX@ | ||
221 | # if !@HAVE_MALLOC_POSIX@ | ||
222 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
223 | # undef malloc | ||
224 | # define malloc rpl_malloc | ||
225 | # endif | ||
226 | _GL_FUNCDECL_RPL (malloc, void *, (size_t size)); | ||
227 | _GL_CXXALIAS_RPL (malloc, void *, (size_t size)); | ||
228 | # else | ||
229 | _GL_CXXALIAS_SYS (malloc, void *, (size_t size)); | ||
230 | # endif | ||
231 | _GL_CXXALIASWARN (malloc); | ||
232 | #elif defined GNULIB_POSIXCHECK | ||
233 | # undef malloc | ||
234 | /* Assume malloc is always declared. */ | ||
235 | _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - " | ||
236 | "use gnulib module malloc-posix for portability"); | ||
237 | #endif | ||
189 | 238 | ||
190 | #if @GNULIB_MKDTEMP@ | 239 | #if @GNULIB_MKDTEMP@ |
191 | # if !@HAVE_MKDTEMP@ | ||
192 | /* Create a unique temporary directory from TEMPLATE. | 240 | /* Create a unique temporary directory from TEMPLATE. |
193 | The last six characters of TEMPLATE must be "XXXXXX"; | 241 | The last six characters of TEMPLATE must be "XXXXXX"; |
194 | they are replaced with a string that makes the directory name unique. | 242 | they are replaced with a string that makes the directory name unique. |
195 | Returns TEMPLATE, or a null pointer if it cannot get a unique name. | 243 | Returns TEMPLATE, or a null pointer if it cannot get a unique name. |
196 | The directory is created mode 700. */ | 244 | The directory is created mode 700. */ |
197 | extern char * mkdtemp (char * /*template*/); | 245 | # if !@HAVE_MKDTEMP@ |
246 | _GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1))); | ||
198 | # endif | 247 | # endif |
248 | _GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/)); | ||
249 | _GL_CXXALIASWARN (mkdtemp); | ||
199 | #elif defined GNULIB_POSIXCHECK | 250 | #elif defined GNULIB_POSIXCHECK |
200 | # undef mkdtemp | 251 | # undef mkdtemp |
201 | # define mkdtemp(t) \ | 252 | # if HAVE_RAW_DECL_MKDTEMP |
202 | (GL_LINK_WARNING ("mkdtemp is unportable - " \ | 253 | _GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - " |
203 | "use gnulib module mkdtemp for portability"), \ | 254 | "use gnulib module mkdtemp for portability"); |
204 | mkdtemp (t)) | 255 | # endif |
205 | #endif | 256 | #endif |
206 | 257 | ||
258 | #if @GNULIB_MKOSTEMP@ | ||
259 | /* Create a unique temporary file from TEMPLATE. | ||
260 | The last six characters of TEMPLATE must be "XXXXXX"; | ||
261 | they are replaced with a string that makes the file name unique. | ||
262 | The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>) | ||
263 | and O_TEXT, O_BINARY (defined in "binary-io.h"). | ||
264 | The file is then created, with the specified flags, ensuring it didn't exist | ||
265 | before. | ||
266 | The file is created read-write (mask at least 0600 & ~umask), but it may be | ||
267 | world-readable and world-writable (mask 0666 & ~umask), depending on the | ||
268 | implementation. | ||
269 | Returns the open file descriptor if successful, otherwise -1 and errno | ||
270 | set. */ | ||
271 | # if !@HAVE_MKOSTEMP@ | ||
272 | _GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/) | ||
273 | _GL_ARG_NONNULL ((1))); | ||
274 | # endif | ||
275 | _GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)); | ||
276 | _GL_CXXALIASWARN (mkostemp); | ||
277 | #elif defined GNULIB_POSIXCHECK | ||
278 | # undef mkostemp | ||
279 | # if HAVE_RAW_DECL_MKOSTEMP | ||
280 | _GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - " | ||
281 | "use gnulib module mkostemp for portability"); | ||
282 | # endif | ||
283 | #endif | ||
284 | |||
285 | #if @GNULIB_MKOSTEMPS@ | ||
286 | /* Create a unique temporary file from TEMPLATE. | ||
287 | The last six characters of TEMPLATE before a suffix of length | ||
288 | SUFFIXLEN must be "XXXXXX"; | ||
289 | they are replaced with a string that makes the file name unique. | ||
290 | The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>) | ||
291 | and O_TEXT, O_BINARY (defined in "binary-io.h"). | ||
292 | The file is then created, with the specified flags, ensuring it didn't exist | ||
293 | before. | ||
294 | The file is created read-write (mask at least 0600 & ~umask), but it may be | ||
295 | world-readable and world-writable (mask 0666 & ~umask), depending on the | ||
296 | implementation. | ||
297 | Returns the open file descriptor if successful, otherwise -1 and errno | ||
298 | set. */ | ||
299 | # if !@HAVE_MKOSTEMPS@ | ||
300 | _GL_FUNCDECL_SYS (mkostemps, int, | ||
301 | (char * /*template*/, int /*suffixlen*/, int /*flags*/) | ||
302 | _GL_ARG_NONNULL ((1))); | ||
303 | # endif | ||
304 | _GL_CXXALIAS_SYS (mkostemps, int, | ||
305 | (char * /*template*/, int /*suffixlen*/, int /*flags*/)); | ||
306 | _GL_CXXALIASWARN (mkostemps); | ||
307 | #elif defined GNULIB_POSIXCHECK | ||
308 | # undef mkostemps | ||
309 | # if HAVE_RAW_DECL_MKOSTEMPS | ||
310 | _GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - " | ||
311 | "use gnulib module mkostemps for portability"); | ||
312 | # endif | ||
313 | #endif | ||
207 | 314 | ||
208 | #if @GNULIB_MKSTEMP@ | 315 | #if @GNULIB_MKSTEMP@ |
209 | # if @REPLACE_MKSTEMP@ | ||
210 | /* Create a unique temporary file from TEMPLATE. | 316 | /* Create a unique temporary file from TEMPLATE. |
211 | The last six characters of TEMPLATE must be "XXXXXX"; | 317 | The last six characters of TEMPLATE must be "XXXXXX"; |
212 | they are replaced with a string that makes the file name unique. | 318 | they are replaced with a string that makes the file name unique. |
@@ -216,124 +322,276 @@ extern char * mkdtemp (char * /*template*/); | |||
216 | implementation. | 322 | implementation. |
217 | Returns the open file descriptor if successful, otherwise -1 and errno | 323 | Returns the open file descriptor if successful, otherwise -1 and errno |
218 | set. */ | 324 | set. */ |
219 | # define mkstemp rpl_mkstemp | 325 | # if @REPLACE_MKSTEMP@ |
220 | extern int mkstemp (char * /*template*/); | 326 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
327 | # define mkstemp rpl_mkstemp | ||
328 | # endif | ||
329 | _GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); | ||
330 | _GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/)); | ||
221 | # else | 331 | # else |
222 | /* On MacOS X 10.3, only <unistd.h> declares mkstemp. */ | 332 | # if ! @HAVE_MKSTEMP@ |
223 | # include <unistd.h> | 333 | _GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1))); |
334 | # endif | ||
335 | _GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/)); | ||
224 | # endif | 336 | # endif |
337 | _GL_CXXALIASWARN (mkstemp); | ||
225 | #elif defined GNULIB_POSIXCHECK | 338 | #elif defined GNULIB_POSIXCHECK |
226 | # undef mkstemp | 339 | # undef mkstemp |
227 | # define mkstemp(t) \ | 340 | # if HAVE_RAW_DECL_MKSTEMP |
228 | (GL_LINK_WARNING ("mkstemp is unportable - " \ | 341 | _GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - " |
229 | "use gnulib module mkstemp for portability"), \ | 342 | "use gnulib module mkstemp for portability"); |
230 | mkstemp (t)) | 343 | # endif |
231 | #endif | 344 | #endif |
232 | 345 | ||
346 | #if @GNULIB_MKSTEMPS@ | ||
347 | /* Create a unique temporary file from TEMPLATE. | ||
348 | The last six characters of TEMPLATE prior to a suffix of length | ||
349 | SUFFIXLEN must be "XXXXXX"; | ||
350 | they are replaced with a string that makes the file name unique. | ||
351 | The file is then created, ensuring it didn't exist before. | ||
352 | The file is created read-write (mask at least 0600 & ~umask), but it may be | ||
353 | world-readable and world-writable (mask 0666 & ~umask), depending on the | ||
354 | implementation. | ||
355 | Returns the open file descriptor if successful, otherwise -1 and errno | ||
356 | set. */ | ||
357 | # if !@HAVE_MKSTEMPS@ | ||
358 | _GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/) | ||
359 | _GL_ARG_NONNULL ((1))); | ||
360 | # endif | ||
361 | _GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)); | ||
362 | _GL_CXXALIASWARN (mkstemps); | ||
363 | #elif defined GNULIB_POSIXCHECK | ||
364 | # undef mkstemps | ||
365 | # if HAVE_RAW_DECL_MKSTEMPS | ||
366 | _GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - " | ||
367 | "use gnulib module mkstemps for portability"); | ||
368 | # endif | ||
369 | #endif | ||
370 | |||
371 | #if @GNULIB_PTSNAME@ | ||
372 | /* Return the pathname of the pseudo-terminal slave associated with | ||
373 | the master FD is open on, or NULL on errors. */ | ||
374 | # if !@HAVE_PTSNAME@ | ||
375 | _GL_FUNCDECL_SYS (ptsname, char *, (int fd)); | ||
376 | # endif | ||
377 | _GL_CXXALIAS_SYS (ptsname, char *, (int fd)); | ||
378 | _GL_CXXALIASWARN (ptsname); | ||
379 | #elif defined GNULIB_POSIXCHECK | ||
380 | # undef ptsname | ||
381 | # if HAVE_RAW_DECL_PTSNAME | ||
382 | _GL_WARN_ON_USE (ptsname, "ptsname is not portable - " | ||
383 | "use gnulib module ptsname for portability"); | ||
384 | # endif | ||
385 | #endif | ||
233 | 386 | ||
234 | #if @GNULIB_PUTENV@ | 387 | #if @GNULIB_PUTENV@ |
235 | # if @REPLACE_PUTENV@ | 388 | # if @REPLACE_PUTENV@ |
236 | # undef putenv | 389 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
237 | # define putenv rpl_putenv | 390 | # undef putenv |
238 | extern int putenv (char *string); | 391 | # define putenv rpl_putenv |
392 | # endif | ||
393 | _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1))); | ||
394 | _GL_CXXALIAS_RPL (putenv, int, (char *string)); | ||
395 | # else | ||
396 | _GL_CXXALIAS_SYS (putenv, int, (char *string)); | ||
239 | # endif | 397 | # endif |
398 | _GL_CXXALIASWARN (putenv); | ||
240 | #endif | 399 | #endif |
241 | 400 | ||
242 | 401 | ||
243 | #if @GNULIB_RANDOM_R@ | 402 | #if @GNULIB_RANDOM_R@ |
244 | # if !@HAVE_RANDOM_R@ | 403 | # if !@HAVE_RANDOM_R@ |
245 | |||
246 | # ifndef RAND_MAX | 404 | # ifndef RAND_MAX |
247 | # define RAND_MAX 2147483647 | 405 | # define RAND_MAX 2147483647 |
248 | # endif | 406 | # endif |
407 | # endif | ||
408 | #endif | ||
249 | 409 | ||
250 | int srandom_r (unsigned int seed, struct random_data *rand_state); | 410 | #if @GNULIB_RANDOM_R@ |
251 | int initstate_r (unsigned int seed, char *buf, size_t buf_size, | 411 | # if !@HAVE_RANDOM_R@ |
252 | struct random_data *rand_state); | 412 | _GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result) |
253 | int setstate_r (char *arg_state, struct random_data *rand_state); | 413 | _GL_ARG_NONNULL ((1, 2))); |
254 | int random_r (struct random_data *buf, int32_t *result); | ||
255 | # endif | 414 | # endif |
415 | _GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result)); | ||
416 | _GL_CXXALIASWARN (random_r); | ||
256 | #elif defined GNULIB_POSIXCHECK | 417 | #elif defined GNULIB_POSIXCHECK |
257 | # undef random_r | 418 | # undef random_r |
258 | # define random_r(b,r) \ | 419 | # if HAVE_RAW_DECL_RANDOM_R |
259 | (GL_LINK_WARNING ("random_r is unportable - " \ | 420 | _GL_WARN_ON_USE (random_r, "random_r is unportable - " |
260 | "use gnulib module random_r for portability"), \ | 421 | "use gnulib module random_r for portability"); |
261 | random_r (b,r)) | 422 | # endif |
262 | # undef initstate_r | 423 | #endif |
263 | # define initstate_r(s,b,sz,r) \ | 424 | |
264 | (GL_LINK_WARNING ("initstate_r is unportable - " \ | 425 | #if @GNULIB_RANDOM_R@ |
265 | "use gnulib module random_r for portability"), \ | 426 | # if !@HAVE_RANDOM_R@ |
266 | initstate_r (s,b,sz,r)) | 427 | _GL_FUNCDECL_SYS (srandom_r, int, |
428 | (unsigned int seed, struct random_data *rand_state) | ||
429 | _GL_ARG_NONNULL ((2))); | ||
430 | # endif | ||
431 | _GL_CXXALIAS_SYS (srandom_r, int, | ||
432 | (unsigned int seed, struct random_data *rand_state)); | ||
433 | _GL_CXXALIASWARN (srandom_r); | ||
434 | #elif defined GNULIB_POSIXCHECK | ||
267 | # undef srandom_r | 435 | # undef srandom_r |
268 | # define srandom_r(s,r) \ | 436 | # if HAVE_RAW_DECL_SRANDOM_R |
269 | (GL_LINK_WARNING ("srandom_r is unportable - " \ | 437 | _GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - " |
270 | "use gnulib module random_r for portability"), \ | 438 | "use gnulib module random_r for portability"); |
271 | srandom_r (s,r)) | 439 | # endif |
440 | #endif | ||
441 | |||
442 | #if @GNULIB_RANDOM_R@ | ||
443 | # if !@HAVE_RANDOM_R@ | ||
444 | _GL_FUNCDECL_SYS (initstate_r, int, | ||
445 | (unsigned int seed, char *buf, size_t buf_size, | ||
446 | struct random_data *rand_state) | ||
447 | _GL_ARG_NONNULL ((2, 4))); | ||
448 | # endif | ||
449 | _GL_CXXALIAS_SYS (initstate_r, int, | ||
450 | (unsigned int seed, char *buf, size_t buf_size, | ||
451 | struct random_data *rand_state)); | ||
452 | _GL_CXXALIASWARN (initstate_r); | ||
453 | #elif defined GNULIB_POSIXCHECK | ||
454 | # undef initstate_r | ||
455 | # if HAVE_RAW_DECL_INITSTATE_R | ||
456 | _GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - " | ||
457 | "use gnulib module random_r for portability"); | ||
458 | # endif | ||
459 | #endif | ||
460 | |||
461 | #if @GNULIB_RANDOM_R@ | ||
462 | # if !@HAVE_RANDOM_R@ | ||
463 | _GL_FUNCDECL_SYS (setstate_r, int, | ||
464 | (char *arg_state, struct random_data *rand_state) | ||
465 | _GL_ARG_NONNULL ((1, 2))); | ||
466 | # endif | ||
467 | _GL_CXXALIAS_SYS (setstate_r, int, | ||
468 | (char *arg_state, struct random_data *rand_state)); | ||
469 | _GL_CXXALIASWARN (setstate_r); | ||
470 | #elif defined GNULIB_POSIXCHECK | ||
272 | # undef setstate_r | 471 | # undef setstate_r |
273 | # define setstate_r(a,r) \ | 472 | # if HAVE_RAW_DECL_SETSTATE_R |
274 | (GL_LINK_WARNING ("setstate_r is unportable - " \ | 473 | _GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - " |
275 | "use gnulib module random_r for portability"), \ | 474 | "use gnulib module random_r for portability"); |
276 | setstate_r (a,r)) | 475 | # endif |
277 | #endif | 476 | #endif |
278 | 477 | ||
279 | 478 | ||
479 | #if @GNULIB_REALLOC_POSIX@ | ||
480 | # if !@HAVE_REALLOC_POSIX@ | ||
481 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
482 | # undef realloc | ||
483 | # define realloc rpl_realloc | ||
484 | # endif | ||
485 | _GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)); | ||
486 | _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size)); | ||
487 | # else | ||
488 | _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size)); | ||
489 | # endif | ||
490 | _GL_CXXALIASWARN (realloc); | ||
491 | #elif defined GNULIB_POSIXCHECK | ||
492 | # undef realloc | ||
493 | /* Assume realloc is always declared. */ | ||
494 | _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - " | ||
495 | "use gnulib module realloc-posix for portability"); | ||
496 | #endif | ||
497 | |||
498 | #if @GNULIB_REALPATH@ | ||
499 | # if @REPLACE_REALPATH@ | ||
500 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
501 | # define realpath rpl_realpath | ||
502 | # endif | ||
503 | _GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved) | ||
504 | _GL_ARG_NONNULL ((1))); | ||
505 | _GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved)); | ||
506 | # else | ||
507 | # if !@HAVE_REALPATH@ | ||
508 | _GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved) | ||
509 | _GL_ARG_NONNULL ((1))); | ||
510 | # endif | ||
511 | _GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved)); | ||
512 | # endif | ||
513 | _GL_CXXALIASWARN (realpath); | ||
514 | #elif defined GNULIB_POSIXCHECK | ||
515 | # undef realpath | ||
516 | # if HAVE_RAW_DECL_REALPATH | ||
517 | _GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module " | ||
518 | "canonicalize or canonicalize-lgpl for portability"); | ||
519 | # endif | ||
520 | #endif | ||
521 | |||
280 | #if @GNULIB_RPMATCH@ | 522 | #if @GNULIB_RPMATCH@ |
281 | # if !@HAVE_RPMATCH@ | ||
282 | /* Test a user response to a question. | 523 | /* Test a user response to a question. |
283 | Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */ | 524 | Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */ |
284 | extern int rpmatch (const char *response); | 525 | # if !@HAVE_RPMATCH@ |
526 | _GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1))); | ||
285 | # endif | 527 | # endif |
528 | _GL_CXXALIAS_SYS (rpmatch, int, (const char *response)); | ||
529 | _GL_CXXALIASWARN (rpmatch); | ||
286 | #elif defined GNULIB_POSIXCHECK | 530 | #elif defined GNULIB_POSIXCHECK |
287 | # undef rpmatch | 531 | # undef rpmatch |
288 | # define rpmatch(r) \ | 532 | # if HAVE_RAW_DECL_RPMATCH |
289 | (GL_LINK_WARNING ("rpmatch is unportable - " \ | 533 | _GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - " |
290 | "use gnulib module rpmatch for portability"), \ | 534 | "use gnulib module rpmatch for portability"); |
291 | rpmatch (r)) | 535 | # endif |
292 | #endif | 536 | #endif |
293 | 537 | ||
294 | |||
295 | #if @GNULIB_SETENV@ | 538 | #if @GNULIB_SETENV@ |
296 | # if !@HAVE_SETENV@ | ||
297 | /* Set NAME to VALUE in the environment. | 539 | /* Set NAME to VALUE in the environment. |
298 | If REPLACE is nonzero, overwrite an existing value. */ | 540 | If REPLACE is nonzero, overwrite an existing value. */ |
299 | extern int setenv (const char *name, const char *value, int replace); | 541 | # if @REPLACE_SETENV@ |
300 | # endif | 542 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
301 | #endif | 543 | # undef setenv |
302 | 544 | # define setenv rpl_setenv | |
303 | |||
304 | #if @GNULIB_UNSETENV@ | ||
305 | # if @HAVE_UNSETENV@ | ||
306 | # if @VOID_UNSETENV@ | ||
307 | /* On some systems, unsetenv() returns void. | ||
308 | This is the case for MacOS X 10.3, FreeBSD 4.8, NetBSD 1.6, OpenBSD 3.4. */ | ||
309 | # define unsetenv(name) ((unsetenv)(name), 0) | ||
310 | # endif | 545 | # endif |
546 | _GL_FUNCDECL_RPL (setenv, int, | ||
547 | (const char *name, const char *value, int replace) | ||
548 | _GL_ARG_NONNULL ((1))); | ||
549 | _GL_CXXALIAS_RPL (setenv, int, | ||
550 | (const char *name, const char *value, int replace)); | ||
311 | # else | 551 | # else |
312 | /* Remove the variable NAME from the environment. */ | 552 | # if !@HAVE_SETENV@ |
313 | extern int unsetenv (const char *name); | 553 | _GL_FUNCDECL_SYS (setenv, int, |
554 | (const char *name, const char *value, int replace) | ||
555 | _GL_ARG_NONNULL ((1))); | ||
556 | # endif | ||
557 | _GL_CXXALIAS_SYS (setenv, int, | ||
558 | (const char *name, const char *value, int replace)); | ||
559 | # endif | ||
560 | _GL_CXXALIASWARN (setenv); | ||
561 | #elif defined GNULIB_POSIXCHECK | ||
562 | # undef setenv | ||
563 | # if HAVE_RAW_DECL_SETENV | ||
564 | _GL_WARN_ON_USE (setenv, "setenv is unportable - " | ||
565 | "use gnulib module setenv for portability"); | ||
314 | # endif | 566 | # endif |
315 | #endif | 567 | #endif |
316 | 568 | ||
317 | |||
318 | #if @GNULIB_STRTOD@ | 569 | #if @GNULIB_STRTOD@ |
319 | # if @REPLACE_STRTOD@ | ||
320 | # define strtod rpl_strtod | ||
321 | # endif | ||
322 | # if !@HAVE_STRTOD@ || @REPLACE_STRTOD@ | ||
323 | /* Parse a double from STRING, updating ENDP if appropriate. */ | 570 | /* Parse a double from STRING, updating ENDP if appropriate. */ |
324 | extern double strtod (const char *str, char **endp); | 571 | # if @REPLACE_STRTOD@ |
572 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
573 | # define strtod rpl_strtod | ||
574 | # endif | ||
575 | _GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp) | ||
576 | _GL_ARG_NONNULL ((1))); | ||
577 | _GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp)); | ||
578 | # else | ||
579 | # if !@HAVE_STRTOD@ | ||
580 | _GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp) | ||
581 | _GL_ARG_NONNULL ((1))); | ||
582 | # endif | ||
583 | _GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp)); | ||
325 | # endif | 584 | # endif |
585 | _GL_CXXALIASWARN (strtod); | ||
326 | #elif defined GNULIB_POSIXCHECK | 586 | #elif defined GNULIB_POSIXCHECK |
327 | # undef strtod | 587 | # undef strtod |
328 | # define strtod(s, e) \ | 588 | # if HAVE_RAW_DECL_STRTOD |
329 | (GL_LINK_WARNING ("strtod is unportable - " \ | 589 | _GL_WARN_ON_USE (strtod, "strtod is unportable - " |
330 | "use gnulib module strtod for portability"), \ | 590 | "use gnulib module strtod for portability"); |
331 | strtod (s, e)) | 591 | # endif |
332 | #endif | 592 | #endif |
333 | 593 | ||
334 | |||
335 | #if @GNULIB_STRTOLL@ | 594 | #if @GNULIB_STRTOLL@ |
336 | # if !@HAVE_STRTOLL@ | ||
337 | /* Parse a signed integer whose textual representation starts at STRING. | 595 | /* Parse a signed integer whose textual representation starts at STRING. |
338 | The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, | 596 | The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, |
339 | it may be decimal or octal (with prefix "0") or hexadecimal (with prefix | 597 | it may be decimal or octal (with prefix "0") or hexadecimal (with prefix |
@@ -342,19 +600,23 @@ extern double strtod (const char *str, char **endp); | |||
342 | stored in *ENDPTR. | 600 | stored in *ENDPTR. |
343 | Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set | 601 | Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set |
344 | to ERANGE. */ | 602 | to ERANGE. */ |
345 | extern long long strtoll (const char *string, char **endptr, int base); | 603 | # if !@HAVE_STRTOLL@ |
604 | _GL_FUNCDECL_SYS (strtoll, long long, | ||
605 | (const char *string, char **endptr, int base) | ||
606 | _GL_ARG_NONNULL ((1))); | ||
346 | # endif | 607 | # endif |
608 | _GL_CXXALIAS_SYS (strtoll, long long, | ||
609 | (const char *string, char **endptr, int base)); | ||
610 | _GL_CXXALIASWARN (strtoll); | ||
347 | #elif defined GNULIB_POSIXCHECK | 611 | #elif defined GNULIB_POSIXCHECK |
348 | # undef strtoll | 612 | # undef strtoll |
349 | # define strtoll(s,e,b) \ | 613 | # if HAVE_RAW_DECL_STRTOLL |
350 | (GL_LINK_WARNING ("strtoll is unportable - " \ | 614 | _GL_WARN_ON_USE (strtoll, "strtoll is unportable - " |
351 | "use gnulib module strtoll for portability"), \ | 615 | "use gnulib module strtoll for portability"); |
352 | strtoll (s, e, b)) | 616 | # endif |
353 | #endif | 617 | #endif |
354 | 618 | ||
355 | |||
356 | #if @GNULIB_STRTOULL@ | 619 | #if @GNULIB_STRTOULL@ |
357 | # if !@HAVE_STRTOULL@ | ||
358 | /* Parse an unsigned integer whose textual representation starts at STRING. | 620 | /* Parse an unsigned integer whose textual representation starts at STRING. |
359 | The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, | 621 | The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0, |
360 | it may be decimal or octal (with prefix "0") or hexadecimal (with prefix | 622 | it may be decimal or octal (with prefix "0") or hexadecimal (with prefix |
@@ -363,21 +625,63 @@ extern long long strtoll (const char *string, char **endptr, int base); | |||
363 | stored in *ENDPTR. | 625 | stored in *ENDPTR. |
364 | Upon overflow, the return value is ULLONG_MAX, and errno is set to | 626 | Upon overflow, the return value is ULLONG_MAX, and errno is set to |
365 | ERANGE. */ | 627 | ERANGE. */ |
366 | extern unsigned long long strtoull (const char *string, char **endptr, int base); | 628 | # if !@HAVE_STRTOULL@ |
629 | _GL_FUNCDECL_SYS (strtoull, unsigned long long, | ||
630 | (const char *string, char **endptr, int base) | ||
631 | _GL_ARG_NONNULL ((1))); | ||
367 | # endif | 632 | # endif |
633 | _GL_CXXALIAS_SYS (strtoull, unsigned long long, | ||
634 | (const char *string, char **endptr, int base)); | ||
635 | _GL_CXXALIASWARN (strtoull); | ||
368 | #elif defined GNULIB_POSIXCHECK | 636 | #elif defined GNULIB_POSIXCHECK |
369 | # undef strtoull | 637 | # undef strtoull |
370 | # define strtoull(s,e,b) \ | 638 | # if HAVE_RAW_DECL_STRTOULL |
371 | (GL_LINK_WARNING ("strtoull is unportable - " \ | 639 | _GL_WARN_ON_USE (strtoull, "strtoull is unportable - " |
372 | "use gnulib module strtoull for portability"), \ | 640 | "use gnulib module strtoull for portability"); |
373 | strtoull (s, e, b)) | 641 | # endif |
374 | #endif | 642 | #endif |
375 | 643 | ||
644 | #if @GNULIB_UNLOCKPT@ | ||
645 | /* Unlock the slave side of the pseudo-terminal whose master side is specified | ||
646 | by FD, so that it can be opened. */ | ||
647 | # if !@HAVE_UNLOCKPT@ | ||
648 | _GL_FUNCDECL_SYS (unlockpt, int, (int fd)); | ||
649 | # endif | ||
650 | _GL_CXXALIAS_SYS (unlockpt, int, (int fd)); | ||
651 | _GL_CXXALIASWARN (unlockpt); | ||
652 | #elif defined GNULIB_POSIXCHECK | ||
653 | # undef unlockpt | ||
654 | # if HAVE_RAW_DECL_UNLOCKPT | ||
655 | _GL_WARN_ON_USE (ptsname, "unlockpt is not portable - " | ||
656 | "use gnulib module unlockpt for portability"); | ||
657 | # endif | ||
658 | #endif | ||
376 | 659 | ||
377 | #ifdef __cplusplus | 660 | #if @GNULIB_UNSETENV@ |
378 | } | 661 | /* Remove the variable NAME from the environment. */ |
662 | # if @REPLACE_UNSETENV@ | ||
663 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
664 | # undef unsetenv | ||
665 | # define unsetenv rpl_unsetenv | ||
666 | # endif | ||
667 | _GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); | ||
668 | _GL_CXXALIAS_RPL (unsetenv, int, (const char *name)); | ||
669 | # else | ||
670 | # if !@HAVE_UNSETENV@ | ||
671 | _GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); | ||
672 | # endif | ||
673 | _GL_CXXALIAS_SYS (unsetenv, int, (const char *name)); | ||
674 | # endif | ||
675 | _GL_CXXALIASWARN (unsetenv); | ||
676 | #elif defined GNULIB_POSIXCHECK | ||
677 | # undef unsetenv | ||
678 | # if HAVE_RAW_DECL_UNSETENV | ||
679 | _GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - " | ||
680 | "use gnulib module unsetenv for portability"); | ||
681 | # endif | ||
379 | #endif | 682 | #endif |
380 | 683 | ||
684 | |||
381 | #endif /* _GL_STDLIB_H */ | 685 | #endif /* _GL_STDLIB_H */ |
382 | #endif /* _GL_STDLIB_H */ | 686 | #endif /* _GL_STDLIB_H */ |
383 | #endif | 687 | #endif |
diff --git a/gl/str-two-way.h b/gl/str-two-way.h new file mode 100644 index 00000000..c08f60ef --- /dev/null +++ b/gl/str-two-way.h | |||
@@ -0,0 +1,429 @@ | |||
1 | /* Byte-wise substring search, using the Two-Way algorithm. | ||
2 | Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. | ||
3 | This file is part of the GNU C Library. | ||
4 | Written by Eric Blake <ebb9@byu.net>, 2008. | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 3, or (at your option) | ||
9 | any later version. | ||
10 | |||
11 | This program 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 | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License along | ||
17 | with this program; if not, write to the Free Software Foundation, | ||
18 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
19 | |||
20 | /* Before including this file, you need to include <config.h> and | ||
21 | <string.h>, and define: | ||
22 | RESULT_TYPE A macro that expands to the return type. | ||
23 | AVAILABLE(h, h_l, j, n_l) | ||
24 | A macro that returns nonzero if there are | ||
25 | at least N_L bytes left starting at H[J]. | ||
26 | H is 'unsigned char *', H_L, J, and N_L | ||
27 | are 'size_t'; H_L is an lvalue. For | ||
28 | NUL-terminated searches, H_L can be | ||
29 | modified each iteration to avoid having | ||
30 | to compute the end of H up front. | ||
31 | |||
32 | For case-insensitivity, you may optionally define: | ||
33 | CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L | ||
34 | characters of P1 and P2 are equal. | ||
35 | CANON_ELEMENT(c) A macro that canonicalizes an element right after | ||
36 | it has been fetched from one of the two strings. | ||
37 | The argument is an 'unsigned char'; the result | ||
38 | must be an 'unsigned char' as well. | ||
39 | |||
40 | This file undefines the macros documented above, and defines | ||
41 | LONG_NEEDLE_THRESHOLD. | ||
42 | */ | ||
43 | |||
44 | #include <limits.h> | ||
45 | #include <stdint.h> | ||
46 | |||
47 | /* We use the Two-Way string matching algorithm, which guarantees | ||
48 | linear complexity with constant space. Additionally, for long | ||
49 | needles, we also use a bad character shift table similar to the | ||
50 | Boyer-Moore algorithm to achieve improved (potentially sub-linear) | ||
51 | performance. | ||
52 | |||
53 | See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260 | ||
54 | and http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm | ||
55 | */ | ||
56 | |||
57 | /* Point at which computing a bad-byte shift table is likely to be | ||
58 | worthwhile. Small needles should not compute a table, since it | ||
59 | adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a | ||
60 | speedup no greater than a factor of NEEDLE_LEN. The larger the | ||
61 | needle, the better the potential performance gain. On the other | ||
62 | hand, on non-POSIX systems with CHAR_BIT larger than eight, the | ||
63 | memory required for the table is prohibitive. */ | ||
64 | #if CHAR_BIT < 10 | ||
65 | # define LONG_NEEDLE_THRESHOLD 32U | ||
66 | #else | ||
67 | # define LONG_NEEDLE_THRESHOLD SIZE_MAX | ||
68 | #endif | ||
69 | |||
70 | #ifndef MAX | ||
71 | # define MAX(a, b) ((a < b) ? (b) : (a)) | ||
72 | #endif | ||
73 | |||
74 | #ifndef CANON_ELEMENT | ||
75 | # define CANON_ELEMENT(c) c | ||
76 | #endif | ||
77 | #ifndef CMP_FUNC | ||
78 | # define CMP_FUNC memcmp | ||
79 | #endif | ||
80 | |||
81 | /* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN. | ||
82 | Return the index of the first byte in the right half, and set | ||
83 | *PERIOD to the global period of the right half. | ||
84 | |||
85 | The global period of a string is the smallest index (possibly its | ||
86 | length) at which all remaining bytes in the string are repetitions | ||
87 | of the prefix (the last repetition may be a subset of the prefix). | ||
88 | |||
89 | When NEEDLE is factored into two halves, a local period is the | ||
90 | length of the smallest word that shares a suffix with the left half | ||
91 | and shares a prefix with the right half. All factorizations of a | ||
92 | non-empty NEEDLE have a local period of at least 1 and no greater | ||
93 | than NEEDLE_LEN. | ||
94 | |||
95 | A critical factorization has the property that the local period | ||
96 | equals the global period. All strings have at least one critical | ||
97 | factorization with the left half smaller than the global period. | ||
98 | |||
99 | Given an ordered alphabet, a critical factorization can be computed | ||
100 | in linear time, with 2 * NEEDLE_LEN comparisons, by computing the | ||
101 | larger of two ordered maximal suffixes. The ordered maximal | ||
102 | suffixes are determined by lexicographic comparison of | ||
103 | periodicity. */ | ||
104 | static size_t | ||
105 | critical_factorization (const unsigned char *needle, size_t needle_len, | ||
106 | size_t *period) | ||
107 | { | ||
108 | /* Index of last byte of left half, or SIZE_MAX. */ | ||
109 | size_t max_suffix, max_suffix_rev; | ||
110 | size_t j; /* Index into NEEDLE for current candidate suffix. */ | ||
111 | size_t k; /* Offset into current period. */ | ||
112 | size_t p; /* Intermediate period. */ | ||
113 | unsigned char a, b; /* Current comparison bytes. */ | ||
114 | |||
115 | /* Invariants: | ||
116 | 0 <= j < NEEDLE_LEN - 1 | ||
117 | -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed) | ||
118 | min(max_suffix, max_suffix_rev) < global period of NEEDLE | ||
119 | 1 <= p <= global period of NEEDLE | ||
120 | p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j] | ||
121 | 1 <= k <= p | ||
122 | */ | ||
123 | |||
124 | /* Perform lexicographic search. */ | ||
125 | max_suffix = SIZE_MAX; | ||
126 | j = 0; | ||
127 | k = p = 1; | ||
128 | while (j + k < needle_len) | ||
129 | { | ||
130 | a = CANON_ELEMENT (needle[j + k]); | ||
131 | b = CANON_ELEMENT (needle[max_suffix + k]); | ||
132 | if (a < b) | ||
133 | { | ||
134 | /* Suffix is smaller, period is entire prefix so far. */ | ||
135 | j += k; | ||
136 | k = 1; | ||
137 | p = j - max_suffix; | ||
138 | } | ||
139 | else if (a == b) | ||
140 | { | ||
141 | /* Advance through repetition of the current period. */ | ||
142 | if (k != p) | ||
143 | ++k; | ||
144 | else | ||
145 | { | ||
146 | j += p; | ||
147 | k = 1; | ||
148 | } | ||
149 | } | ||
150 | else /* b < a */ | ||
151 | { | ||
152 | /* Suffix is larger, start over from current location. */ | ||
153 | max_suffix = j++; | ||
154 | k = p = 1; | ||
155 | } | ||
156 | } | ||
157 | *period = p; | ||
158 | |||
159 | /* Perform reverse lexicographic search. */ | ||
160 | max_suffix_rev = SIZE_MAX; | ||
161 | j = 0; | ||
162 | k = p = 1; | ||
163 | while (j + k < needle_len) | ||
164 | { | ||
165 | a = CANON_ELEMENT (needle[j + k]); | ||
166 | b = CANON_ELEMENT (needle[max_suffix_rev + k]); | ||
167 | if (b < a) | ||
168 | { | ||
169 | /* Suffix is smaller, period is entire prefix so far. */ | ||
170 | j += k; | ||
171 | k = 1; | ||
172 | p = j - max_suffix_rev; | ||
173 | } | ||
174 | else if (a == b) | ||
175 | { | ||
176 | /* Advance through repetition of the current period. */ | ||
177 | if (k != p) | ||
178 | ++k; | ||
179 | else | ||
180 | { | ||
181 | j += p; | ||
182 | k = 1; | ||
183 | } | ||
184 | } | ||
185 | else /* a < b */ | ||
186 | { | ||
187 | /* Suffix is larger, start over from current location. */ | ||
188 | max_suffix_rev = j++; | ||
189 | k = p = 1; | ||
190 | } | ||
191 | } | ||
192 | |||
193 | /* Choose the longer suffix. Return the first byte of the right | ||
194 | half, rather than the last byte of the left half. */ | ||
195 | if (max_suffix_rev + 1 < max_suffix + 1) | ||
196 | return max_suffix + 1; | ||
197 | *period = p; | ||
198 | return max_suffix_rev + 1; | ||
199 | } | ||
200 | |||
201 | /* Return the first location of non-empty NEEDLE within HAYSTACK, or | ||
202 | NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This | ||
203 | method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD. | ||
204 | Performance is guaranteed to be linear, with an initialization cost | ||
205 | of 2 * NEEDLE_LEN comparisons. | ||
206 | |||
207 | If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at | ||
208 | most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. | ||
209 | If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * | ||
210 | HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */ | ||
211 | static RETURN_TYPE | ||
212 | two_way_short_needle (const unsigned char *haystack, size_t haystack_len, | ||
213 | const unsigned char *needle, size_t needle_len) | ||
214 | { | ||
215 | size_t i; /* Index into current byte of NEEDLE. */ | ||
216 | size_t j; /* Index into current window of HAYSTACK. */ | ||
217 | size_t period; /* The period of the right half of needle. */ | ||
218 | size_t suffix; /* The index of the right half of needle. */ | ||
219 | |||
220 | /* Factor the needle into two halves, such that the left half is | ||
221 | smaller than the global period, and the right half is | ||
222 | periodic (with a period as large as NEEDLE_LEN - suffix). */ | ||
223 | suffix = critical_factorization (needle, needle_len, &period); | ||
224 | |||
225 | /* Perform the search. Each iteration compares the right half | ||
226 | first. */ | ||
227 | if (CMP_FUNC (needle, needle + period, suffix) == 0) | ||
228 | { | ||
229 | /* Entire needle is periodic; a mismatch can only advance by the | ||
230 | period, so use memory to avoid rescanning known occurrences | ||
231 | of the period. */ | ||
232 | size_t memory = 0; | ||
233 | j = 0; | ||
234 | while (AVAILABLE (haystack, haystack_len, j, needle_len)) | ||
235 | { | ||
236 | /* Scan for matches in right half. */ | ||
237 | i = MAX (suffix, memory); | ||
238 | while (i < needle_len && (CANON_ELEMENT (needle[i]) | ||
239 | == CANON_ELEMENT (haystack[i + j]))) | ||
240 | ++i; | ||
241 | if (needle_len <= i) | ||
242 | { | ||
243 | /* Scan for matches in left half. */ | ||
244 | i = suffix - 1; | ||
245 | while (memory < i + 1 && (CANON_ELEMENT (needle[i]) | ||
246 | == CANON_ELEMENT (haystack[i + j]))) | ||
247 | --i; | ||
248 | if (i + 1 < memory + 1) | ||
249 | return (RETURN_TYPE) (haystack + j); | ||
250 | /* No match, so remember how many repetitions of period | ||
251 | on the right half were scanned. */ | ||
252 | j += period; | ||
253 | memory = needle_len - period; | ||
254 | } | ||
255 | else | ||
256 | { | ||
257 | j += i - suffix + 1; | ||
258 | memory = 0; | ||
259 | } | ||
260 | } | ||
261 | } | ||
262 | else | ||
263 | { | ||
264 | /* The two halves of needle are distinct; no extra memory is | ||
265 | required, and any mismatch results in a maximal shift. */ | ||
266 | period = MAX (suffix, needle_len - suffix) + 1; | ||
267 | j = 0; | ||
268 | while (AVAILABLE (haystack, haystack_len, j, needle_len)) | ||
269 | { | ||
270 | /* Scan for matches in right half. */ | ||
271 | i = suffix; | ||
272 | while (i < needle_len && (CANON_ELEMENT (needle[i]) | ||
273 | == CANON_ELEMENT (haystack[i + j]))) | ||
274 | ++i; | ||
275 | if (needle_len <= i) | ||
276 | { | ||
277 | /* Scan for matches in left half. */ | ||
278 | i = suffix - 1; | ||
279 | while (i != SIZE_MAX && (CANON_ELEMENT (needle[i]) | ||
280 | == CANON_ELEMENT (haystack[i + j]))) | ||
281 | --i; | ||
282 | if (i == SIZE_MAX) | ||
283 | return (RETURN_TYPE) (haystack + j); | ||
284 | j += period; | ||
285 | } | ||
286 | else | ||
287 | j += i - suffix + 1; | ||
288 | } | ||
289 | } | ||
290 | return NULL; | ||
291 | } | ||
292 | |||
293 | /* Return the first location of non-empty NEEDLE within HAYSTACK, or | ||
294 | NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This | ||
295 | method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN. | ||
296 | Performance is guaranteed to be linear, with an initialization cost | ||
297 | of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations. | ||
298 | |||
299 | If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at | ||
300 | most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, | ||
301 | and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible. | ||
302 | If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * | ||
303 | HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and | ||
304 | sublinear performance is not possible. */ | ||
305 | static RETURN_TYPE | ||
306 | two_way_long_needle (const unsigned char *haystack, size_t haystack_len, | ||
307 | const unsigned char *needle, size_t needle_len) | ||
308 | { | ||
309 | size_t i; /* Index into current byte of NEEDLE. */ | ||
310 | size_t j; /* Index into current window of HAYSTACK. */ | ||
311 | size_t period; /* The period of the right half of needle. */ | ||
312 | size_t suffix; /* The index of the right half of needle. */ | ||
313 | size_t shift_table[1U << CHAR_BIT]; /* See below. */ | ||
314 | |||
315 | /* Factor the needle into two halves, such that the left half is | ||
316 | smaller than the global period, and the right half is | ||
317 | periodic (with a period as large as NEEDLE_LEN - suffix). */ | ||
318 | suffix = critical_factorization (needle, needle_len, &period); | ||
319 | |||
320 | /* Populate shift_table. For each possible byte value c, | ||
321 | shift_table[c] is the distance from the last occurrence of c to | ||
322 | the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE. | ||
323 | shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */ | ||
324 | for (i = 0; i < 1U << CHAR_BIT; i++) | ||
325 | shift_table[i] = needle_len; | ||
326 | for (i = 0; i < needle_len; i++) | ||
327 | shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1; | ||
328 | |||
329 | /* Perform the search. Each iteration compares the right half | ||
330 | first. */ | ||
331 | if (CMP_FUNC (needle, needle + period, suffix) == 0) | ||
332 | { | ||
333 | /* Entire needle is periodic; a mismatch can only advance by the | ||
334 | period, so use memory to avoid rescanning known occurrences | ||
335 | of the period. */ | ||
336 | size_t memory = 0; | ||
337 | size_t shift; | ||
338 | j = 0; | ||
339 | while (AVAILABLE (haystack, haystack_len, j, needle_len)) | ||
340 | { | ||
341 | /* Check the last byte first; if it does not match, then | ||
342 | shift to the next possible match location. */ | ||
343 | shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; | ||
344 | if (0 < shift) | ||
345 | { | ||
346 | if (memory && shift < period) | ||
347 | { | ||
348 | /* Since needle is periodic, but the last period has | ||
349 | a byte out of place, there can be no match until | ||
350 | after the mismatch. */ | ||
351 | shift = needle_len - period; | ||
352 | memory = 0; | ||
353 | } | ||
354 | j += shift; | ||
355 | continue; | ||
356 | } | ||
357 | /* Scan for matches in right half. The last byte has | ||
358 | already been matched, by virtue of the shift table. */ | ||
359 | i = MAX (suffix, memory); | ||
360 | while (i < needle_len - 1 && (CANON_ELEMENT (needle[i]) | ||
361 | == CANON_ELEMENT (haystack[i + j]))) | ||
362 | ++i; | ||
363 | if (needle_len - 1 <= i) | ||
364 | { | ||
365 | /* Scan for matches in left half. */ | ||
366 | i = suffix - 1; | ||
367 | while (memory < i + 1 && (CANON_ELEMENT (needle[i]) | ||
368 | == CANON_ELEMENT (haystack[i + j]))) | ||
369 | --i; | ||
370 | if (i + 1 < memory + 1) | ||
371 | return (RETURN_TYPE) (haystack + j); | ||
372 | /* No match, so remember how many repetitions of period | ||
373 | on the right half were scanned. */ | ||
374 | j += period; | ||
375 | memory = needle_len - period; | ||
376 | } | ||
377 | else | ||
378 | { | ||
379 | j += i - suffix + 1; | ||
380 | memory = 0; | ||
381 | } | ||
382 | } | ||
383 | } | ||
384 | else | ||
385 | { | ||
386 | /* The two halves of needle are distinct; no extra memory is | ||
387 | required, and any mismatch results in a maximal shift. */ | ||
388 | size_t shift; | ||
389 | period = MAX (suffix, needle_len - suffix) + 1; | ||
390 | j = 0; | ||
391 | while (AVAILABLE (haystack, haystack_len, j, needle_len)) | ||
392 | { | ||
393 | /* Check the last byte first; if it does not match, then | ||
394 | shift to the next possible match location. */ | ||
395 | shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; | ||
396 | if (0 < shift) | ||
397 | { | ||
398 | j += shift; | ||
399 | continue; | ||
400 | } | ||
401 | /* Scan for matches in right half. The last byte has | ||
402 | already been matched, by virtue of the shift table. */ | ||
403 | i = suffix; | ||
404 | while (i < needle_len - 1 && (CANON_ELEMENT (needle[i]) | ||
405 | == CANON_ELEMENT (haystack[i + j]))) | ||
406 | ++i; | ||
407 | if (needle_len - 1 <= i) | ||
408 | { | ||
409 | /* Scan for matches in left half. */ | ||
410 | i = suffix - 1; | ||
411 | while (i != SIZE_MAX && (CANON_ELEMENT (needle[i]) | ||
412 | == CANON_ELEMENT (haystack[i + j]))) | ||
413 | --i; | ||
414 | if (i == SIZE_MAX) | ||
415 | return (RETURN_TYPE) (haystack + j); | ||
416 | j += period; | ||
417 | } | ||
418 | else | ||
419 | j += i - suffix + 1; | ||
420 | } | ||
421 | } | ||
422 | return NULL; | ||
423 | } | ||
424 | |||
425 | #undef AVAILABLE | ||
426 | #undef CANON_ELEMENT | ||
427 | #undef CMP_FUNC | ||
428 | #undef MAX | ||
429 | #undef RETURN_TYPE | ||
diff --git a/gl/strdup.c b/gl/strdup.c index bebe5c8f..4b1794ec 100644 --- a/gl/strdup.c +++ b/gl/strdup.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Copyright (C) 1991, 1996, 1997, 1998, 2002, 2003, 2004, 2006, 2007 Free | 1 | /* Copyright (C) 1991, 1996, 1997, 1998, 2002, 2003, 2004, 2006, 2007, 2009, |
2 | Software Foundation, Inc. | 2 | 2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This file is part of the GNU C Library. | 4 | This file is part of the GNU C Library. |
5 | 5 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* Optimized string comparison. | 1 | /* Optimized string comparison. |
2 | Copyright (C) 2001-2002, 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 2001-2002, 2007, 2009-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify it | 4 | This program is free software: you can redistribute it and/or modify it |
5 | under the terms of the GNU General Public License as published | 5 | under the terms of the GNU General Public License as published |
diff --git a/gl/strerror.c b/gl/strerror.c index 798d8540..b0df7784 100644 --- a/gl/strerror.c +++ b/gl/strerror.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* strerror.c --- POSIX compatible system error routine | 1 | /* strerror.c --- POSIX compatible system error routine |
2 | 2 | ||
3 | Copyright (C) 2007-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2007-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -313,7 +313,13 @@ rpl_strerror (int n) | |||
313 | break; | 313 | break; |
314 | # endif | 314 | # endif |
315 | 315 | ||
316 | # if GNULIB_defined_ | 316 | # if GNULIB_defined_ESTALE |
317 | case ESTALE: | ||
318 | msg = "Stale NFS file handle"; | ||
319 | break; | ||
320 | # endif | ||
321 | |||
322 | # if GNULIB_defined_ECANCELED | ||
317 | case ECANCELED: | 323 | case ECANCELED: |
318 | msg = "Operation canceled"; | 324 | msg = "Operation canceled"; |
319 | break; | 325 | break; |
@@ -328,10 +334,10 @@ rpl_strerror (int n) | |||
328 | 334 | ||
329 | if (result == NULL || result[0] == '\0') | 335 | if (result == NULL || result[0] == '\0') |
330 | { | 336 | { |
331 | static char const fmt[] = "Unknown error (%d)"; | 337 | static char const fmt[] = "Unknown error (%d)"; |
332 | static char msg_buf[sizeof fmt + INT_STRLEN_BOUND (n)]; | 338 | static char msg_buf[sizeof fmt + INT_STRLEN_BOUND (n)]; |
333 | sprintf (msg_buf, fmt, n); | 339 | sprintf (msg_buf, fmt, n); |
334 | return msg_buf; | 340 | return msg_buf; |
335 | } | 341 | } |
336 | 342 | ||
337 | return result; | 343 | return result; |
diff --git a/gl/string.in.h b/gl/string.in.h index f021a3ed..eb8d7588 100644 --- a/gl/string.in.h +++ b/gl/string.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A GNU-like <string.h>. | 1 | /* A GNU-like <string.h>. |
2 | 2 | ||
3 | Copyright (C) 1995-1996, 2001-2008 Free Software Foundation, Inc. | 3 | Copyright (C) 1995-1996, 2001-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -28,6 +28,13 @@ | |||
28 | #ifndef _GL_STRING_H | 28 | #ifndef _GL_STRING_H |
29 | #define _GL_STRING_H | 29 | #define _GL_STRING_H |
30 | 30 | ||
31 | /* NetBSD 5.0 mis-defines NULL. */ | ||
32 | #include <stddef.h> | ||
33 | |||
34 | /* MirBSD defines mbslen as a macro. */ | ||
35 | #if @GNULIB_MBSLEN@ && defined __MirBSD__ | ||
36 | # include <wchar.h> | ||
37 | #endif | ||
31 | 38 | ||
32 | #ifndef __attribute__ | 39 | #ifndef __attribute__ |
33 | /* This feature is available in gcc versions 2.5 and later. */ | 40 | /* This feature is available in gcc versions 2.5 and later. */ |
@@ -41,60 +48,132 @@ | |||
41 | #endif | 48 | #endif |
42 | 49 | ||
43 | 50 | ||
44 | /* The definition of GL_LINK_WARNING is copied here. */ | 51 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
45 | 52 | ||
46 | 53 | /* The definition of _GL_ARG_NONNULL is copied here. */ | |
47 | #ifdef __cplusplus | 54 | |
48 | extern "C" { | 55 | /* The definition of _GL_WARN_ON_USE is copied here. */ |
56 | |||
57 | |||
58 | /* Return the first instance of C within N bytes of S, or NULL. */ | ||
59 | #if @GNULIB_MEMCHR@ | ||
60 | # if @REPLACE_MEMCHR@ | ||
61 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
62 | # define memchr rpl_memchr | ||
63 | # endif | ||
64 | _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n) | ||
65 | __attribute__ ((__pure__)) | ||
66 | _GL_ARG_NONNULL ((1))); | ||
67 | _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n)); | ||
68 | # else | ||
69 | # if ! @HAVE_MEMCHR@ | ||
70 | _GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n) | ||
71 | __attribute__ ((__pure__)) | ||
72 | _GL_ARG_NONNULL ((1))); | ||
73 | # endif | ||
74 | /* On some systems, this function is defined as an overloaded function: | ||
75 | extern "C" { const void * std::memchr (const void *, int, size_t); } | ||
76 | extern "C++" { void * std::memchr (void *, int, size_t); } */ | ||
77 | _GL_CXXALIAS_SYS_CAST2 (memchr, | ||
78 | void *, (void const *__s, int __c, size_t __n), | ||
79 | void const *, (void const *__s, int __c, size_t __n)); | ||
80 | # endif | ||
81 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ | ||
82 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) | ||
83 | _GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n)); | ||
84 | _GL_CXXALIASWARN1 (memchr, void const *, | ||
85 | (void const *__s, int __c, size_t __n)); | ||
86 | # else | ||
87 | _GL_CXXALIASWARN (memchr); | ||
88 | # endif | ||
89 | #elif defined GNULIB_POSIXCHECK | ||
90 | # undef memchr | ||
91 | /* Assume memchr is always declared. */ | ||
92 | _GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - " | ||
93 | "use gnulib module memchr for portability" ); | ||
49 | #endif | 94 | #endif |
50 | 95 | ||
51 | |||
52 | /* Return the first occurrence of NEEDLE in HAYSTACK. */ | 96 | /* Return the first occurrence of NEEDLE in HAYSTACK. */ |
53 | #if @GNULIB_MEMMEM@ | 97 | #if @GNULIB_MEMMEM@ |
54 | # if @REPLACE_MEMMEM@ | 98 | # if @REPLACE_MEMMEM@ |
55 | # define memmem rpl_memmem | 99 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
56 | # endif | 100 | # define memmem rpl_memmem |
57 | # if ! @HAVE_DECL_MEMMEM@ || @REPLACE_MEMMEM@ | 101 | # endif |
58 | extern void *memmem (void const *__haystack, size_t __haystack_len, | 102 | _GL_FUNCDECL_RPL (memmem, void *, |
59 | void const *__needle, size_t __needle_len) | 103 | (void const *__haystack, size_t __haystack_len, |
60 | __attribute__ ((__pure__)); | 104 | void const *__needle, size_t __needle_len) |
105 | __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3))); | ||
106 | _GL_CXXALIAS_RPL (memmem, void *, | ||
107 | (void const *__haystack, size_t __haystack_len, | ||
108 | void const *__needle, size_t __needle_len)); | ||
109 | # else | ||
110 | # if ! @HAVE_DECL_MEMMEM@ | ||
111 | _GL_FUNCDECL_SYS (memmem, void *, | ||
112 | (void const *__haystack, size_t __haystack_len, | ||
113 | void const *__needle, size_t __needle_len) | ||
114 | __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3))); | ||
115 | # endif | ||
116 | _GL_CXXALIAS_SYS (memmem, void *, | ||
117 | (void const *__haystack, size_t __haystack_len, | ||
118 | void const *__needle, size_t __needle_len)); | ||
61 | # endif | 119 | # endif |
120 | _GL_CXXALIASWARN (memmem); | ||
62 | #elif defined GNULIB_POSIXCHECK | 121 | #elif defined GNULIB_POSIXCHECK |
63 | # undef memmem | 122 | # undef memmem |
64 | # define memmem(a,al,b,bl) \ | 123 | # if HAVE_RAW_DECL_MEMMEM |
65 | (GL_LINK_WARNING ("memmem is unportable and often quadratic - " \ | 124 | _GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - " |
66 | "use gnulib module memmem-simple for portability, " \ | 125 | "use gnulib module memmem-simple for portability, " |
67 | "and module memmem for speed" ), \ | 126 | "and module memmem for speed" ); |
68 | memmem (a, al, b, bl)) | 127 | # endif |
69 | #endif | 128 | #endif |
70 | 129 | ||
71 | /* Copy N bytes of SRC to DEST, return pointer to bytes after the | 130 | /* Copy N bytes of SRC to DEST, return pointer to bytes after the |
72 | last written byte. */ | 131 | last written byte. */ |
73 | #if @GNULIB_MEMPCPY@ | 132 | #if @GNULIB_MEMPCPY@ |
74 | # if ! @HAVE_MEMPCPY@ | 133 | # if ! @HAVE_MEMPCPY@ |
75 | extern void *mempcpy (void *restrict __dest, void const *restrict __src, | 134 | _GL_FUNCDECL_SYS (mempcpy, void *, |
76 | size_t __n); | 135 | (void *restrict __dest, void const *restrict __src, |
136 | size_t __n) | ||
137 | _GL_ARG_NONNULL ((1, 2))); | ||
77 | # endif | 138 | # endif |
139 | _GL_CXXALIAS_SYS (mempcpy, void *, | ||
140 | (void *restrict __dest, void const *restrict __src, | ||
141 | size_t __n)); | ||
142 | _GL_CXXALIASWARN (mempcpy); | ||
78 | #elif defined GNULIB_POSIXCHECK | 143 | #elif defined GNULIB_POSIXCHECK |
79 | # undef mempcpy | 144 | # undef mempcpy |
80 | # define mempcpy(a,b,n) \ | 145 | # if HAVE_RAW_DECL_MEMPCPY |
81 | (GL_LINK_WARNING ("mempcpy is unportable - " \ | 146 | _GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - " |
82 | "use gnulib module mempcpy for portability"), \ | 147 | "use gnulib module mempcpy for portability"); |
83 | mempcpy (a, b, n)) | 148 | # endif |
84 | #endif | 149 | #endif |
85 | 150 | ||
86 | /* Search backwards through a block for a byte (specified as an int). */ | 151 | /* Search backwards through a block for a byte (specified as an int). */ |
87 | #if @GNULIB_MEMRCHR@ | 152 | #if @GNULIB_MEMRCHR@ |
88 | # if ! @HAVE_DECL_MEMRCHR@ | 153 | # if ! @HAVE_DECL_MEMRCHR@ |
89 | extern void *memrchr (void const *, int, size_t) | 154 | _GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t) |
90 | __attribute__ ((__pure__)); | 155 | __attribute__ ((__pure__)) |
156 | _GL_ARG_NONNULL ((1))); | ||
157 | # endif | ||
158 | /* On some systems, this function is defined as an overloaded function: | ||
159 | extern "C++" { const void * std::memrchr (const void *, int, size_t); } | ||
160 | extern "C++" { void * std::memrchr (void *, int, size_t); } */ | ||
161 | _GL_CXXALIAS_SYS_CAST2 (memrchr, | ||
162 | void *, (void const *, int, size_t), | ||
163 | void const *, (void const *, int, size_t)); | ||
164 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ | ||
165 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) | ||
166 | _GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t)); | ||
167 | _GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t)); | ||
168 | # else | ||
169 | _GL_CXXALIASWARN (memrchr); | ||
91 | # endif | 170 | # endif |
92 | #elif defined GNULIB_POSIXCHECK | 171 | #elif defined GNULIB_POSIXCHECK |
93 | # undef memrchr | 172 | # undef memrchr |
94 | # define memrchr(a,b,c) \ | 173 | # if HAVE_RAW_DECL_MEMRCHR |
95 | (GL_LINK_WARNING ("memrchr is unportable - " \ | 174 | _GL_WARN_ON_USE (memrchr, "memrchr is unportable - " |
96 | "use gnulib module memrchr for portability"), \ | 175 | "use gnulib module memrchr for portability"); |
97 | memrchr (a, b, c)) | 176 | # endif |
98 | #endif | 177 | #endif |
99 | 178 | ||
100 | /* Find the first occurrence of C in S. More efficient than | 179 | /* Find the first occurrence of C in S. More efficient than |
@@ -102,103 +181,191 @@ extern void *memrchr (void const *, int, size_t) | |||
102 | occur within N bytes. */ | 181 | occur within N bytes. */ |
103 | #if @GNULIB_RAWMEMCHR@ | 182 | #if @GNULIB_RAWMEMCHR@ |
104 | # if ! @HAVE_RAWMEMCHR@ | 183 | # if ! @HAVE_RAWMEMCHR@ |
105 | extern void *rawmemchr (void const *__s, int __c_in) | 184 | _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in) |
106 | __attribute__ ((__pure__)); | 185 | __attribute__ ((__pure__)) |
186 | _GL_ARG_NONNULL ((1))); | ||
187 | # endif | ||
188 | /* On some systems, this function is defined as an overloaded function: | ||
189 | extern "C++" { const void * std::rawmemchr (const void *, int); } | ||
190 | extern "C++" { void * std::rawmemchr (void *, int); } */ | ||
191 | _GL_CXXALIAS_SYS_CAST2 (rawmemchr, | ||
192 | void *, (void const *__s, int __c_in), | ||
193 | void const *, (void const *__s, int __c_in)); | ||
194 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ | ||
195 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) | ||
196 | _GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in)); | ||
197 | _GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in)); | ||
198 | # else | ||
199 | _GL_CXXALIASWARN (rawmemchr); | ||
107 | # endif | 200 | # endif |
108 | #elif defined GNULIB_POSIXCHECK | 201 | #elif defined GNULIB_POSIXCHECK |
109 | # undef rawmemchr | 202 | # undef rawmemchr |
110 | # define rawmemchr(a,b) \ | 203 | # if HAVE_RAW_DECL_RAWMEMCHR |
111 | (GL_LINK_WARNING ("rawmemchr is unportable - " \ | 204 | _GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - " |
112 | "use gnulib module rawmemchr for portability"), \ | 205 | "use gnulib module rawmemchr for portability"); |
113 | rawmemchr (a, b)) | 206 | # endif |
114 | #endif | 207 | #endif |
115 | 208 | ||
116 | /* Copy SRC to DST, returning the address of the terminating '\0' in DST. */ | 209 | /* Copy SRC to DST, returning the address of the terminating '\0' in DST. */ |
117 | #if @GNULIB_STPCPY@ | 210 | #if @GNULIB_STPCPY@ |
118 | # if ! @HAVE_STPCPY@ | 211 | # if ! @HAVE_STPCPY@ |
119 | extern char *stpcpy (char *restrict __dst, char const *restrict __src); | 212 | _GL_FUNCDECL_SYS (stpcpy, char *, |
213 | (char *restrict __dst, char const *restrict __src) | ||
214 | _GL_ARG_NONNULL ((1, 2))); | ||
120 | # endif | 215 | # endif |
216 | _GL_CXXALIAS_SYS (stpcpy, char *, | ||
217 | (char *restrict __dst, char const *restrict __src)); | ||
218 | _GL_CXXALIASWARN (stpcpy); | ||
121 | #elif defined GNULIB_POSIXCHECK | 219 | #elif defined GNULIB_POSIXCHECK |
122 | # undef stpcpy | 220 | # undef stpcpy |
123 | # define stpcpy(a,b) \ | 221 | # if HAVE_RAW_DECL_STPCPY |
124 | (GL_LINK_WARNING ("stpcpy is unportable - " \ | 222 | _GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - " |
125 | "use gnulib module stpcpy for portability"), \ | 223 | "use gnulib module stpcpy for portability"); |
126 | stpcpy (a, b)) | 224 | # endif |
127 | #endif | 225 | #endif |
128 | 226 | ||
129 | /* Copy no more than N bytes of SRC to DST, returning a pointer past the | 227 | /* Copy no more than N bytes of SRC to DST, returning a pointer past the |
130 | last non-NUL byte written into DST. */ | 228 | last non-NUL byte written into DST. */ |
131 | #if @GNULIB_STPNCPY@ | 229 | #if @GNULIB_STPNCPY@ |
132 | # if ! @HAVE_STPNCPY@ | 230 | # if @REPLACE_STPNCPY@ |
133 | # define stpncpy gnu_stpncpy | 231 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
134 | extern char *stpncpy (char *restrict __dst, char const *restrict __src, | 232 | # define stpncpy rpl_stpncpy |
135 | size_t __n); | 233 | # endif |
234 | _GL_FUNCDECL_RPL (stpncpy, char *, | ||
235 | (char *restrict __dst, char const *restrict __src, | ||
236 | size_t __n) | ||
237 | _GL_ARG_NONNULL ((1, 2))); | ||
238 | _GL_CXXALIAS_RPL (stpncpy, char *, | ||
239 | (char *restrict __dst, char const *restrict __src, | ||
240 | size_t __n)); | ||
241 | # else | ||
242 | # if ! @HAVE_STPNCPY@ | ||
243 | _GL_FUNCDECL_SYS (stpncpy, char *, | ||
244 | (char *restrict __dst, char const *restrict __src, | ||
245 | size_t __n) | ||
246 | _GL_ARG_NONNULL ((1, 2))); | ||
247 | # endif | ||
248 | _GL_CXXALIAS_SYS (stpncpy, char *, | ||
249 | (char *restrict __dst, char const *restrict __src, | ||
250 | size_t __n)); | ||
136 | # endif | 251 | # endif |
252 | _GL_CXXALIASWARN (stpncpy); | ||
137 | #elif defined GNULIB_POSIXCHECK | 253 | #elif defined GNULIB_POSIXCHECK |
138 | # undef stpncpy | 254 | # undef stpncpy |
139 | # define stpncpy(a,b,n) \ | 255 | # if HAVE_RAW_DECL_STPNCPY |
140 | (GL_LINK_WARNING ("stpncpy is unportable - " \ | 256 | _GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - " |
141 | "use gnulib module stpncpy for portability"), \ | 257 | "use gnulib module stpncpy for portability"); |
142 | stpncpy (a, b, n)) | 258 | # endif |
143 | #endif | 259 | #endif |
144 | 260 | ||
145 | #if defined GNULIB_POSIXCHECK | 261 | #if defined GNULIB_POSIXCHECK |
146 | /* strchr() does not work with multibyte strings if the locale encoding is | 262 | /* strchr() does not work with multibyte strings if the locale encoding is |
147 | GB18030 and the character to be searched is a digit. */ | 263 | GB18030 and the character to be searched is a digit. */ |
148 | # undef strchr | 264 | # undef strchr |
149 | # define strchr(s,c) \ | 265 | /* Assume strchr is always declared. */ |
150 | (GL_LINK_WARNING ("strchr cannot work correctly on character strings " \ | 266 | _GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings " |
151 | "in some multibyte locales - " \ | 267 | "in some multibyte locales - " |
152 | "use mbschr if you care about internationalization"), \ | 268 | "use mbschr if you care about internationalization"); |
153 | strchr (s, c)) | ||
154 | #endif | 269 | #endif |
155 | 270 | ||
156 | /* Find the first occurrence of C in S or the final NUL byte. */ | 271 | /* Find the first occurrence of C in S or the final NUL byte. */ |
157 | #if @GNULIB_STRCHRNUL@ | 272 | #if @GNULIB_STRCHRNUL@ |
158 | # if ! @HAVE_STRCHRNUL@ | 273 | # if ! @HAVE_STRCHRNUL@ |
159 | extern char *strchrnul (char const *__s, int __c_in) | 274 | _GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in) |
160 | __attribute__ ((__pure__)); | 275 | __attribute__ ((__pure__)) |
276 | _GL_ARG_NONNULL ((1))); | ||
277 | # endif | ||
278 | /* On some systems, this function is defined as an overloaded function: | ||
279 | extern "C++" { const char * std::strchrnul (const char *, int); } | ||
280 | extern "C++" { char * std::strchrnul (char *, int); } */ | ||
281 | _GL_CXXALIAS_SYS_CAST2 (strchrnul, | ||
282 | char *, (char const *__s, int __c_in), | ||
283 | char const *, (char const *__s, int __c_in)); | ||
284 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ | ||
285 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) | ||
286 | _GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in)); | ||
287 | _GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in)); | ||
288 | # else | ||
289 | _GL_CXXALIASWARN (strchrnul); | ||
161 | # endif | 290 | # endif |
162 | #elif defined GNULIB_POSIXCHECK | 291 | #elif defined GNULIB_POSIXCHECK |
163 | # undef strchrnul | 292 | # undef strchrnul |
164 | # define strchrnul(a,b) \ | 293 | # if HAVE_RAW_DECL_STRCHRNUL |
165 | (GL_LINK_WARNING ("strchrnul is unportable - " \ | 294 | _GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - " |
166 | "use gnulib module strchrnul for portability"), \ | 295 | "use gnulib module strchrnul for portability"); |
167 | strchrnul (a, b)) | 296 | # endif |
168 | #endif | 297 | #endif |
169 | 298 | ||
170 | /* Duplicate S, returning an identical malloc'd string. */ | 299 | /* Duplicate S, returning an identical malloc'd string. */ |
171 | #if @GNULIB_STRDUP@ | 300 | #if @GNULIB_STRDUP@ |
172 | # if @REPLACE_STRDUP@ | 301 | # if @REPLACE_STRDUP@ |
173 | # undef strdup | 302 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
174 | # define strdup rpl_strdup | 303 | # undef strdup |
175 | # endif | 304 | # define strdup rpl_strdup |
176 | # if !(@HAVE_DECL_STRDUP@ || defined strdup) || @REPLACE_STRDUP@ | 305 | # endif |
177 | extern char *strdup (char const *__s); | 306 | _GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); |
307 | _GL_CXXALIAS_RPL (strdup, char *, (char const *__s)); | ||
308 | # else | ||
309 | # if !(@HAVE_DECL_STRDUP@ || defined strdup) | ||
310 | _GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); | ||
311 | # endif | ||
312 | _GL_CXXALIAS_SYS (strdup, char *, (char const *__s)); | ||
178 | # endif | 313 | # endif |
314 | _GL_CXXALIASWARN (strdup); | ||
179 | #elif defined GNULIB_POSIXCHECK | 315 | #elif defined GNULIB_POSIXCHECK |
180 | # undef strdup | 316 | # undef strdup |
181 | # define strdup(a) \ | 317 | # if HAVE_RAW_DECL_STRDUP |
182 | (GL_LINK_WARNING ("strdup is unportable - " \ | 318 | _GL_WARN_ON_USE (strdup, "strdup is unportable - " |
183 | "use gnulib module strdup for portability"), \ | 319 | "use gnulib module strdup for portability"); |
184 | strdup (a)) | 320 | # endif |
321 | #endif | ||
322 | |||
323 | /* Append no more than N characters from SRC onto DEST. */ | ||
324 | #if @GNULIB_STRNCAT@ | ||
325 | # if @REPLACE_STRNCAT@ | ||
326 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
327 | # undef strncat | ||
328 | # define strncat rpl_strncat | ||
329 | # endif | ||
330 | _GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n) | ||
331 | _GL_ARG_NONNULL ((1, 2))); | ||
332 | _GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n)); | ||
333 | # else | ||
334 | _GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n)); | ||
335 | # endif | ||
336 | _GL_CXXALIASWARN (strncat); | ||
337 | #elif defined GNULIB_POSIXCHECK | ||
338 | # undef strncat | ||
339 | # if HAVE_RAW_DECL_STRNCAT | ||
340 | _GL_WARN_ON_USE (strncat, "strncat is unportable - " | ||
341 | "use gnulib module strncat for portability"); | ||
342 | # endif | ||
185 | #endif | 343 | #endif |
186 | 344 | ||
187 | /* Return a newly allocated copy of at most N bytes of STRING. */ | 345 | /* Return a newly allocated copy of at most N bytes of STRING. */ |
188 | #if @GNULIB_STRNDUP@ | 346 | #if @GNULIB_STRNDUP@ |
189 | # if ! @HAVE_STRNDUP@ | 347 | # if @REPLACE_STRNDUP@ |
190 | # undef strndup | 348 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
191 | # define strndup rpl_strndup | 349 | # undef strndup |
192 | # endif | 350 | # define strndup rpl_strndup |
193 | # if ! @HAVE_STRNDUP@ || ! @HAVE_DECL_STRNDUP@ | 351 | # endif |
194 | extern char *strndup (char const *__string, size_t __n); | 352 | _GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n) |
353 | _GL_ARG_NONNULL ((1))); | ||
354 | _GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n)); | ||
355 | # else | ||
356 | # if ! @HAVE_DECL_STRNDUP@ | ||
357 | _GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n) | ||
358 | _GL_ARG_NONNULL ((1))); | ||
359 | # endif | ||
360 | _GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n)); | ||
195 | # endif | 361 | # endif |
362 | _GL_CXXALIASWARN (strndup); | ||
196 | #elif defined GNULIB_POSIXCHECK | 363 | #elif defined GNULIB_POSIXCHECK |
197 | # undef strndup | 364 | # undef strndup |
198 | # define strndup(a,n) \ | 365 | # if HAVE_RAW_DECL_STRNDUP |
199 | (GL_LINK_WARNING ("strndup is unportable - " \ | 366 | _GL_WARN_ON_USE (strndup, "strndup is unportable - " |
200 | "use gnulib module strndup for portability"), \ | 367 | "use gnulib module strndup for portability"); |
201 | strndup (a, n)) | 368 | # endif |
202 | #endif | 369 | #endif |
203 | 370 | ||
204 | /* Find the length (number of bytes) of STRING, but scan at most | 371 | /* Find the length (number of bytes) of STRING, but scan at most |
@@ -206,15 +373,18 @@ extern char *strndup (char const *__string, size_t __n); | |||
206 | return MAXLEN. */ | 373 | return MAXLEN. */ |
207 | #if @GNULIB_STRNLEN@ | 374 | #if @GNULIB_STRNLEN@ |
208 | # if ! @HAVE_DECL_STRNLEN@ | 375 | # if ! @HAVE_DECL_STRNLEN@ |
209 | extern size_t strnlen (char const *__string, size_t __maxlen) | 376 | _GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen) |
210 | __attribute__ ((__pure__)); | 377 | __attribute__ ((__pure__)) |
378 | _GL_ARG_NONNULL ((1))); | ||
211 | # endif | 379 | # endif |
380 | _GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)); | ||
381 | _GL_CXXALIASWARN (strnlen); | ||
212 | #elif defined GNULIB_POSIXCHECK | 382 | #elif defined GNULIB_POSIXCHECK |
213 | # undef strnlen | 383 | # undef strnlen |
214 | # define strnlen(a,n) \ | 384 | # if HAVE_RAW_DECL_STRNLEN |
215 | (GL_LINK_WARNING ("strnlen is unportable - " \ | 385 | _GL_WARN_ON_USE (strnlen, "strnlen is unportable - " |
216 | "use gnulib module strnlen for portability"), \ | 386 | "use gnulib module strnlen for portability"); |
217 | strnlen (a, n)) | 387 | # endif |
218 | #endif | 388 | #endif |
219 | 389 | ||
220 | #if defined GNULIB_POSIXCHECK | 390 | #if defined GNULIB_POSIXCHECK |
@@ -223,18 +393,32 @@ extern size_t strnlen (char const *__string, size_t __maxlen) | |||
223 | locale encoding is GB18030 and one of the characters to be searched is a | 393 | locale encoding is GB18030 and one of the characters to be searched is a |
224 | digit. */ | 394 | digit. */ |
225 | # undef strcspn | 395 | # undef strcspn |
226 | # define strcspn(s,a) \ | 396 | /* Assume strcspn is always declared. */ |
227 | (GL_LINK_WARNING ("strcspn cannot work correctly on character strings " \ | 397 | _GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings " |
228 | "in multibyte locales - " \ | 398 | "in multibyte locales - " |
229 | "use mbscspn if you care about internationalization"), \ | 399 | "use mbscspn if you care about internationalization"); |
230 | strcspn (s, a)) | ||
231 | #endif | 400 | #endif |
232 | 401 | ||
233 | /* Find the first occurrence in S of any character in ACCEPT. */ | 402 | /* Find the first occurrence in S of any character in ACCEPT. */ |
234 | #if @GNULIB_STRPBRK@ | 403 | #if @GNULIB_STRPBRK@ |
235 | # if ! @HAVE_STRPBRK@ | 404 | # if ! @HAVE_STRPBRK@ |
236 | extern char *strpbrk (char const *__s, char const *__accept) | 405 | _GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept) |
237 | __attribute__ ((__pure__)); | 406 | __attribute__ ((__pure__)) |
407 | _GL_ARG_NONNULL ((1, 2))); | ||
408 | # endif | ||
409 | /* On some systems, this function is defined as an overloaded function: | ||
410 | extern "C" { const char * strpbrk (const char *, const char *); } | ||
411 | extern "C++" { char * strpbrk (char *, const char *); } */ | ||
412 | _GL_CXXALIAS_SYS_CAST2 (strpbrk, | ||
413 | char *, (char const *__s, char const *__accept), | ||
414 | const char *, (char const *__s, char const *__accept)); | ||
415 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ | ||
416 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) | ||
417 | _GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept)); | ||
418 | _GL_CXXALIASWARN1 (strpbrk, char const *, | ||
419 | (char const *__s, char const *__accept)); | ||
420 | # else | ||
421 | _GL_CXXALIASWARN (strpbrk); | ||
238 | # endif | 422 | # endif |
239 | # if defined GNULIB_POSIXCHECK | 423 | # if defined GNULIB_POSIXCHECK |
240 | /* strpbrk() assumes the second argument is a list of single-byte characters. | 424 | /* strpbrk() assumes the second argument is a list of single-byte characters. |
@@ -242,40 +426,36 @@ extern char *strpbrk (char const *__s, char const *__accept) | |||
242 | locale encoding is GB18030 and one of the characters to be searched is a | 426 | locale encoding is GB18030 and one of the characters to be searched is a |
243 | digit. */ | 427 | digit. */ |
244 | # undef strpbrk | 428 | # undef strpbrk |
245 | # define strpbrk(s,a) \ | 429 | _GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings " |
246 | (GL_LINK_WARNING ("strpbrk cannot work correctly on character strings " \ | 430 | "in multibyte locales - " |
247 | "in multibyte locales - " \ | 431 | "use mbspbrk if you care about internationalization"); |
248 | "use mbspbrk if you care about internationalization"), \ | ||
249 | strpbrk (s, a)) | ||
250 | # endif | 432 | # endif |
251 | #elif defined GNULIB_POSIXCHECK | 433 | #elif defined GNULIB_POSIXCHECK |
252 | # undef strpbrk | 434 | # undef strpbrk |
253 | # define strpbrk(s,a) \ | 435 | # if HAVE_RAW_DECL_STRPBRK |
254 | (GL_LINK_WARNING ("strpbrk is unportable - " \ | 436 | _GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - " |
255 | "use gnulib module strpbrk for portability"), \ | 437 | "use gnulib module strpbrk for portability"); |
256 | strpbrk (s, a)) | 438 | # endif |
257 | #endif | 439 | #endif |
258 | 440 | ||
259 | #if defined GNULIB_POSIXCHECK | 441 | #if defined GNULIB_POSIXCHECK |
260 | /* strspn() assumes the second argument is a list of single-byte characters. | 442 | /* strspn() assumes the second argument is a list of single-byte characters. |
261 | Even in this simple case, it cannot work with multibyte strings. */ | 443 | Even in this simple case, it cannot work with multibyte strings. */ |
262 | # undef strspn | 444 | # undef strspn |
263 | # define strspn(s,a) \ | 445 | /* Assume strspn is always declared. */ |
264 | (GL_LINK_WARNING ("strspn cannot work correctly on character strings " \ | 446 | _GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings " |
265 | "in multibyte locales - " \ | 447 | "in multibyte locales - " |
266 | "use mbsspn if you care about internationalization"), \ | 448 | "use mbsspn if you care about internationalization"); |
267 | strspn (s, a)) | ||
268 | #endif | 449 | #endif |
269 | 450 | ||
270 | #if defined GNULIB_POSIXCHECK | 451 | #if defined GNULIB_POSIXCHECK |
271 | /* strrchr() does not work with multibyte strings if the locale encoding is | 452 | /* strrchr() does not work with multibyte strings if the locale encoding is |
272 | GB18030 and the character to be searched is a digit. */ | 453 | GB18030 and the character to be searched is a digit. */ |
273 | # undef strrchr | 454 | # undef strrchr |
274 | # define strrchr(s,c) \ | 455 | /* Assume strrchr is always declared. */ |
275 | (GL_LINK_WARNING ("strrchr cannot work correctly on character strings " \ | 456 | _GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings " |
276 | "in some multibyte locales - " \ | 457 | "in some multibyte locales - " |
277 | "use mbsrchr if you care about internationalization"), \ | 458 | "use mbsrchr if you care about internationalization"); |
278 | strrchr (s, c)) | ||
279 | #endif | 459 | #endif |
280 | 460 | ||
281 | /* Search the next delimiter (char listed in DELIM) starting at *STRINGP. | 461 | /* Search the next delimiter (char listed in DELIM) starting at *STRINGP. |
@@ -296,29 +476,51 @@ extern char *strpbrk (char const *__s, char const *__accept) | |||
296 | See also strtok_r(). */ | 476 | See also strtok_r(). */ |
297 | #if @GNULIB_STRSEP@ | 477 | #if @GNULIB_STRSEP@ |
298 | # if ! @HAVE_STRSEP@ | 478 | # if ! @HAVE_STRSEP@ |
299 | extern char *strsep (char **restrict __stringp, char const *restrict __delim); | 479 | _GL_FUNCDECL_SYS (strsep, char *, |
480 | (char **restrict __stringp, char const *restrict __delim) | ||
481 | _GL_ARG_NONNULL ((1, 2))); | ||
300 | # endif | 482 | # endif |
483 | _GL_CXXALIAS_SYS (strsep, char *, | ||
484 | (char **restrict __stringp, char const *restrict __delim)); | ||
485 | _GL_CXXALIASWARN (strsep); | ||
301 | # if defined GNULIB_POSIXCHECK | 486 | # if defined GNULIB_POSIXCHECK |
302 | # undef strsep | 487 | # undef strsep |
303 | # define strsep(s,d) \ | 488 | _GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings " |
304 | (GL_LINK_WARNING ("strsep cannot work correctly on character strings " \ | 489 | "in multibyte locales - " |
305 | "in multibyte locales - " \ | 490 | "use mbssep if you care about internationalization"); |
306 | "use mbssep if you care about internationalization"), \ | ||
307 | strsep (s, d)) | ||
308 | # endif | 491 | # endif |
309 | #elif defined GNULIB_POSIXCHECK | 492 | #elif defined GNULIB_POSIXCHECK |
310 | # undef strsep | 493 | # undef strsep |
311 | # define strsep(s,d) \ | 494 | # if HAVE_RAW_DECL_STRSEP |
312 | (GL_LINK_WARNING ("strsep is unportable - " \ | 495 | _GL_WARN_ON_USE (strsep, "strsep is unportable - " |
313 | "use gnulib module strsep for portability"), \ | 496 | "use gnulib module strsep for portability"); |
314 | strsep (s, d)) | 497 | # endif |
315 | #endif | 498 | #endif |
316 | 499 | ||
317 | #if @GNULIB_STRSTR@ | 500 | #if @GNULIB_STRSTR@ |
318 | # if @REPLACE_STRSTR@ | 501 | # if @REPLACE_STRSTR@ |
319 | # define strstr rpl_strstr | 502 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
320 | char *strstr (const char *haystack, const char *needle) | 503 | # define strstr rpl_strstr |
321 | __attribute__ ((__pure__)); | 504 | # endif |
505 | _GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle) | ||
506 | __attribute__ ((__pure__)) | ||
507 | _GL_ARG_NONNULL ((1, 2))); | ||
508 | _GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle)); | ||
509 | # else | ||
510 | /* On some systems, this function is defined as an overloaded function: | ||
511 | extern "C++" { const char * strstr (const char *, const char *); } | ||
512 | extern "C++" { char * strstr (char *, const char *); } */ | ||
513 | _GL_CXXALIAS_SYS_CAST2 (strstr, | ||
514 | char *, (const char *haystack, const char *needle), | ||
515 | const char *, (const char *haystack, const char *needle)); | ||
516 | # endif | ||
517 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ | ||
518 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) | ||
519 | _GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle)); | ||
520 | _GL_CXXALIASWARN1 (strstr, const char *, | ||
521 | (const char *haystack, const char *needle)); | ||
522 | # else | ||
523 | _GL_CXXALIASWARN (strstr); | ||
322 | # endif | 524 | # endif |
323 | #elif defined GNULIB_POSIXCHECK | 525 | #elif defined GNULIB_POSIXCHECK |
324 | /* strstr() does not work with multibyte strings if the locale encoding is | 526 | /* strstr() does not work with multibyte strings if the locale encoding is |
@@ -326,48 +528,70 @@ char *strstr (const char *haystack, const char *needle) | |||
326 | POSIX says that it operates on "strings", and "string" in POSIX is defined | 528 | POSIX says that it operates on "strings", and "string" in POSIX is defined |
327 | as a sequence of bytes, not of characters. */ | 529 | as a sequence of bytes, not of characters. */ |
328 | # undef strstr | 530 | # undef strstr |
329 | # define strstr(a,b) \ | 531 | /* Assume strstr is always declared. */ |
330 | (GL_LINK_WARNING ("strstr is quadratic on many systems, and cannot " \ | 532 | _GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot " |
331 | "work correctly on character strings in most " \ | 533 | "work correctly on character strings in most " |
332 | "multibyte locales - " \ | 534 | "multibyte locales - " |
333 | "use mbsstr if you care about internationalization, " \ | 535 | "use mbsstr if you care about internationalization, " |
334 | "or use strstr if you care about speed"), \ | 536 | "or use strstr if you care about speed"); |
335 | strstr (a, b)) | ||
336 | #endif | 537 | #endif |
337 | 538 | ||
338 | /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive | 539 | /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive |
339 | comparison. */ | 540 | comparison. */ |
340 | #if @GNULIB_STRCASESTR@ | 541 | #if @GNULIB_STRCASESTR@ |
341 | # if @REPLACE_STRCASESTR@ | 542 | # if @REPLACE_STRCASESTR@ |
342 | # define strcasestr rpl_strcasestr | 543 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
544 | # define strcasestr rpl_strcasestr | ||
545 | # endif | ||
546 | _GL_FUNCDECL_RPL (strcasestr, char *, | ||
547 | (const char *haystack, const char *needle) | ||
548 | __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2))); | ||
549 | _GL_CXXALIAS_RPL (strcasestr, char *, | ||
550 | (const char *haystack, const char *needle)); | ||
551 | # else | ||
552 | # if ! @HAVE_STRCASESTR@ | ||
553 | _GL_FUNCDECL_SYS (strcasestr, char *, | ||
554 | (const char *haystack, const char *needle) | ||
555 | __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2))); | ||
556 | # endif | ||
557 | /* On some systems, this function is defined as an overloaded function: | ||
558 | extern "C++" { const char * strcasestr (const char *, const char *); } | ||
559 | extern "C++" { char * strcasestr (char *, const char *); } */ | ||
560 | _GL_CXXALIAS_SYS_CAST2 (strcasestr, | ||
561 | char *, (const char *haystack, const char *needle), | ||
562 | const char *, (const char *haystack, const char *needle)); | ||
343 | # endif | 563 | # endif |
344 | # if ! @HAVE_STRCASESTR@ || @REPLACE_STRCASESTR@ | 564 | # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ |
345 | extern char *strcasestr (const char *haystack, const char *needle) | 565 | && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) |
346 | __attribute__ ((__pure__)); | 566 | _GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle)); |
567 | _GL_CXXALIASWARN1 (strcasestr, const char *, | ||
568 | (const char *haystack, const char *needle)); | ||
569 | # else | ||
570 | _GL_CXXALIASWARN (strcasestr); | ||
347 | # endif | 571 | # endif |
348 | #elif defined GNULIB_POSIXCHECK | 572 | #elif defined GNULIB_POSIXCHECK |
349 | /* strcasestr() does not work with multibyte strings: | 573 | /* strcasestr() does not work with multibyte strings: |
350 | It is a glibc extension, and glibc implements it only for unibyte | 574 | It is a glibc extension, and glibc implements it only for unibyte |
351 | locales. */ | 575 | locales. */ |
352 | # undef strcasestr | 576 | # undef strcasestr |
353 | # define strcasestr(a,b) \ | 577 | # if HAVE_RAW_DECL_STRCASESTR |
354 | (GL_LINK_WARNING ("strcasestr does work correctly on character strings " \ | 578 | _GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character " |
355 | "in multibyte locales - " \ | 579 | "strings in multibyte locales - " |
356 | "use mbscasestr if you care about " \ | 580 | "use mbscasestr if you care about " |
357 | "internationalization, or use c-strcasestr if you want " \ | 581 | "internationalization, or use c-strcasestr if you want " |
358 | "a locale independent function"), \ | 582 | "a locale independent function"); |
359 | strcasestr (a, b)) | 583 | # endif |
360 | #endif | 584 | #endif |
361 | 585 | ||
362 | /* Parse S into tokens separated by characters in DELIM. | 586 | /* Parse S into tokens separated by characters in DELIM. |
363 | If S is NULL, the saved pointer in SAVE_PTR is used as | 587 | If S is NULL, the saved pointer in SAVE_PTR is used as |
364 | the next starting point. For example: | 588 | the next starting point. For example: |
365 | char s[] = "-abc-=-def"; | 589 | char s[] = "-abc-=-def"; |
366 | char *sp; | 590 | char *sp; |
367 | x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" | 591 | x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" |
368 | x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL | 592 | x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL |
369 | x = strtok_r(NULL, "=", &sp); // x = NULL | 593 | x = strtok_r(NULL, "=", &sp); // x = NULL |
370 | // s = "abc\0-def\0" | 594 | // s = "abc\0-def\0" |
371 | 595 | ||
372 | This is a variant of strtok() that is multithread-safe. | 596 | This is a variant of strtok() that is multithread-safe. |
373 | 597 | ||
@@ -382,24 +606,44 @@ extern char *strcasestr (const char *haystack, const char *needle) | |||
382 | 606 | ||
383 | See also strsep(). */ | 607 | See also strsep(). */ |
384 | #if @GNULIB_STRTOK_R@ | 608 | #if @GNULIB_STRTOK_R@ |
385 | # if ! @HAVE_DECL_STRTOK_R@ | 609 | # if @REPLACE_STRTOK_R@ |
386 | extern char *strtok_r (char *restrict s, char const *restrict delim, | 610 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
387 | char **restrict save_ptr); | 611 | # undef strtok_r |
612 | # define strtok_r rpl_strtok_r | ||
613 | # endif | ||
614 | _GL_FUNCDECL_RPL (strtok_r, char *, | ||
615 | (char *restrict s, char const *restrict delim, | ||
616 | char **restrict save_ptr) | ||
617 | _GL_ARG_NONNULL ((2, 3))); | ||
618 | _GL_CXXALIAS_RPL (strtok_r, char *, | ||
619 | (char *restrict s, char const *restrict delim, | ||
620 | char **restrict save_ptr)); | ||
621 | # else | ||
622 | # if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK | ||
623 | # undef strtok_r | ||
624 | # endif | ||
625 | # if ! @HAVE_DECL_STRTOK_R@ | ||
626 | _GL_FUNCDECL_SYS (strtok_r, char *, | ||
627 | (char *restrict s, char const *restrict delim, | ||
628 | char **restrict save_ptr) | ||
629 | _GL_ARG_NONNULL ((2, 3))); | ||
630 | # endif | ||
631 | _GL_CXXALIAS_SYS (strtok_r, char *, | ||
632 | (char *restrict s, char const *restrict delim, | ||
633 | char **restrict save_ptr)); | ||
388 | # endif | 634 | # endif |
635 | _GL_CXXALIASWARN (strtok_r); | ||
389 | # if defined GNULIB_POSIXCHECK | 636 | # if defined GNULIB_POSIXCHECK |
390 | # undef strtok_r | 637 | _GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character " |
391 | # define strtok_r(s,d,p) \ | 638 | "strings in multibyte locales - " |
392 | (GL_LINK_WARNING ("strtok_r cannot work correctly on character strings " \ | 639 | "use mbstok_r if you care about internationalization"); |
393 | "in multibyte locales - " \ | ||
394 | "use mbstok_r if you care about internationalization"), \ | ||
395 | strtok_r (s, d, p)) | ||
396 | # endif | 640 | # endif |
397 | #elif defined GNULIB_POSIXCHECK | 641 | #elif defined GNULIB_POSIXCHECK |
398 | # undef strtok_r | 642 | # undef strtok_r |
399 | # define strtok_r(s,d,p) \ | 643 | # if HAVE_RAW_DECL_STRTOK_R |
400 | (GL_LINK_WARNING ("strtok_r is unportable - " \ | 644 | _GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - " |
401 | "use gnulib module strtok_r for portability"), \ | 645 | "use gnulib module strtok_r for portability"); |
402 | strtok_r (s, d, p)) | 646 | # endif |
403 | #endif | 647 | #endif |
404 | 648 | ||
405 | 649 | ||
@@ -409,13 +653,27 @@ extern char *strtok_r (char *restrict s, char const *restrict delim, | |||
409 | #if @GNULIB_MBSLEN@ | 653 | #if @GNULIB_MBSLEN@ |
410 | /* Return the number of multibyte characters in the character string STRING. | 654 | /* Return the number of multibyte characters in the character string STRING. |
411 | This considers multibyte characters, unlike strlen, which counts bytes. */ | 655 | This considers multibyte characters, unlike strlen, which counts bytes. */ |
412 | extern size_t mbslen (const char *string); | 656 | # ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */ |
657 | # undef mbslen | ||
658 | # endif | ||
659 | # if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */ | ||
660 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
661 | # define mbslen rpl_mbslen | ||
662 | # endif | ||
663 | _GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1))); | ||
664 | _GL_CXXALIAS_RPL (mbslen, size_t, (const char *string)); | ||
665 | # else | ||
666 | _GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1))); | ||
667 | _GL_CXXALIAS_SYS (mbslen, size_t, (const char *string)); | ||
668 | # endif | ||
669 | _GL_CXXALIASWARN (mbslen); | ||
413 | #endif | 670 | #endif |
414 | 671 | ||
415 | #if @GNULIB_MBSNLEN@ | 672 | #if @GNULIB_MBSNLEN@ |
416 | /* Return the number of multibyte characters in the character string starting | 673 | /* Return the number of multibyte characters in the character string starting |
417 | at STRING and ending at STRING + LEN. */ | 674 | at STRING and ending at STRING + LEN. */ |
418 | extern size_t mbsnlen (const char *string, size_t len); | 675 | _GL_EXTERN_C size_t mbsnlen (const char *string, size_t len) |
676 | _GL_ARG_NONNULL ((1)); | ||
419 | #endif | 677 | #endif |
420 | 678 | ||
421 | #if @GNULIB_MBSCHR@ | 679 | #if @GNULIB_MBSCHR@ |
@@ -423,8 +681,19 @@ extern size_t mbsnlen (const char *string, size_t len); | |||
423 | and return a pointer to it. Return NULL if C is not found in STRING. | 681 | and return a pointer to it. Return NULL if C is not found in STRING. |
424 | Unlike strchr(), this function works correctly in multibyte locales with | 682 | Unlike strchr(), this function works correctly in multibyte locales with |
425 | encodings such as GB18030. */ | 683 | encodings such as GB18030. */ |
426 | # define mbschr rpl_mbschr /* avoid collision with HP-UX function */ | 684 | # if defined __hpux |
427 | extern char * mbschr (const char *string, int c); | 685 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
686 | # define mbschr rpl_mbschr /* avoid collision with HP-UX function */ | ||
687 | # endif | ||
688 | _GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c) | ||
689 | _GL_ARG_NONNULL ((1))); | ||
690 | _GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c)); | ||
691 | # else | ||
692 | _GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c) | ||
693 | _GL_ARG_NONNULL ((1))); | ||
694 | _GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c)); | ||
695 | # endif | ||
696 | _GL_CXXALIASWARN (mbschr); | ||
428 | #endif | 697 | #endif |
429 | 698 | ||
430 | #if @GNULIB_MBSRCHR@ | 699 | #if @GNULIB_MBSRCHR@ |
@@ -432,8 +701,19 @@ extern char * mbschr (const char *string, int c); | |||
432 | and return a pointer to it. Return NULL if C is not found in STRING. | 701 | and return a pointer to it. Return NULL if C is not found in STRING. |
433 | Unlike strrchr(), this function works correctly in multibyte locales with | 702 | Unlike strrchr(), this function works correctly in multibyte locales with |
434 | encodings such as GB18030. */ | 703 | encodings such as GB18030. */ |
435 | # define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */ | 704 | # if defined __hpux |
436 | extern char * mbsrchr (const char *string, int c); | 705 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
706 | # define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */ | ||
707 | # endif | ||
708 | _GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c) | ||
709 | _GL_ARG_NONNULL ((1))); | ||
710 | _GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c)); | ||
711 | # else | ||
712 | _GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c) | ||
713 | _GL_ARG_NONNULL ((1))); | ||
714 | _GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c)); | ||
715 | # endif | ||
716 | _GL_CXXALIASWARN (mbsrchr); | ||
437 | #endif | 717 | #endif |
438 | 718 | ||
439 | #if @GNULIB_MBSSTR@ | 719 | #if @GNULIB_MBSSTR@ |
@@ -441,7 +721,8 @@ extern char * mbsrchr (const char *string, int c); | |||
441 | string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK. | 721 | string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK. |
442 | Unlike strstr(), this function works correctly in multibyte locales with | 722 | Unlike strstr(), this function works correctly in multibyte locales with |
443 | encodings different from UTF-8. */ | 723 | encodings different from UTF-8. */ |
444 | extern char * mbsstr (const char *haystack, const char *needle); | 724 | _GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle) |
725 | _GL_ARG_NONNULL ((1, 2)); | ||
445 | #endif | 726 | #endif |
446 | 727 | ||
447 | #if @GNULIB_MBSCASECMP@ | 728 | #if @GNULIB_MBSCASECMP@ |
@@ -451,7 +732,8 @@ extern char * mbsstr (const char *haystack, const char *needle); | |||
451 | Note: This function may, in multibyte locales, return 0 for strings of | 732 | Note: This function may, in multibyte locales, return 0 for strings of |
452 | different lengths! | 733 | different lengths! |
453 | Unlike strcasecmp(), this function works correctly in multibyte locales. */ | 734 | Unlike strcasecmp(), this function works correctly in multibyte locales. */ |
454 | extern int mbscasecmp (const char *s1, const char *s2); | 735 | _GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2) |
736 | _GL_ARG_NONNULL ((1, 2)); | ||
455 | #endif | 737 | #endif |
456 | 738 | ||
457 | #if @GNULIB_MBSNCASECMP@ | 739 | #if @GNULIB_MBSNCASECMP@ |
@@ -464,7 +746,8 @@ extern int mbscasecmp (const char *s1, const char *s2); | |||
464 | of different lengths! | 746 | of different lengths! |
465 | Unlike strncasecmp(), this function works correctly in multibyte locales. | 747 | Unlike strncasecmp(), this function works correctly in multibyte locales. |
466 | But beware that N is not a byte count but a character count! */ | 748 | But beware that N is not a byte count but a character count! */ |
467 | extern int mbsncasecmp (const char *s1, const char *s2, size_t n); | 749 | _GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n) |
750 | _GL_ARG_NONNULL ((1, 2)); | ||
468 | #endif | 751 | #endif |
469 | 752 | ||
470 | #if @GNULIB_MBSPCASECMP@ | 753 | #if @GNULIB_MBSPCASECMP@ |
@@ -477,7 +760,8 @@ extern int mbsncasecmp (const char *s1, const char *s2, size_t n); | |||
477 | smaller length than PREFIX! | 760 | smaller length than PREFIX! |
478 | Unlike strncasecmp(), this function works correctly in multibyte | 761 | Unlike strncasecmp(), this function works correctly in multibyte |
479 | locales. */ | 762 | locales. */ |
480 | extern char * mbspcasecmp (const char *string, const char *prefix); | 763 | _GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix) |
764 | _GL_ARG_NONNULL ((1, 2)); | ||
481 | #endif | 765 | #endif |
482 | 766 | ||
483 | #if @GNULIB_MBSCASESTR@ | 767 | #if @GNULIB_MBSCASESTR@ |
@@ -486,7 +770,8 @@ extern char * mbspcasecmp (const char *string, const char *prefix); | |||
486 | Note: This function may, in multibyte locales, return success even if | 770 | Note: This function may, in multibyte locales, return success even if |
487 | strlen (haystack) < strlen (needle) ! | 771 | strlen (haystack) < strlen (needle) ! |
488 | Unlike strcasestr(), this function works correctly in multibyte locales. */ | 772 | Unlike strcasestr(), this function works correctly in multibyte locales. */ |
489 | extern char * mbscasestr (const char *haystack, const char *needle); | 773 | _GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle) |
774 | _GL_ARG_NONNULL ((1, 2)); | ||
490 | #endif | 775 | #endif |
491 | 776 | ||
492 | #if @GNULIB_MBSCSPN@ | 777 | #if @GNULIB_MBSCSPN@ |
@@ -495,7 +780,8 @@ extern char * mbscasestr (const char *haystack, const char *needle); | |||
495 | beginning of the string to this occurrence, or to the end of the string | 780 | beginning of the string to this occurrence, or to the end of the string |
496 | if none exists. | 781 | if none exists. |
497 | Unlike strcspn(), this function works correctly in multibyte locales. */ | 782 | Unlike strcspn(), this function works correctly in multibyte locales. */ |
498 | extern size_t mbscspn (const char *string, const char *accept); | 783 | _GL_EXTERN_C size_t mbscspn (const char *string, const char *accept) |
784 | _GL_ARG_NONNULL ((1, 2)); | ||
499 | #endif | 785 | #endif |
500 | 786 | ||
501 | #if @GNULIB_MBSPBRK@ | 787 | #if @GNULIB_MBSPBRK@ |
@@ -503,8 +789,19 @@ extern size_t mbscspn (const char *string, const char *accept); | |||
503 | in the character string ACCEPT. Return the pointer to it, or NULL if none | 789 | in the character string ACCEPT. Return the pointer to it, or NULL if none |
504 | exists. | 790 | exists. |
505 | Unlike strpbrk(), this function works correctly in multibyte locales. */ | 791 | Unlike strpbrk(), this function works correctly in multibyte locales. */ |
506 | # define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ | 792 | # if defined __hpux |
507 | extern char * mbspbrk (const char *string, const char *accept); | 793 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
794 | # define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ | ||
795 | # endif | ||
796 | _GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept) | ||
797 | _GL_ARG_NONNULL ((1, 2))); | ||
798 | _GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept)); | ||
799 | # else | ||
800 | _GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept) | ||
801 | _GL_ARG_NONNULL ((1, 2))); | ||
802 | _GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept)); | ||
803 | # endif | ||
804 | _GL_CXXALIASWARN (mbspbrk); | ||
508 | #endif | 805 | #endif |
509 | 806 | ||
510 | #if @GNULIB_MBSSPN@ | 807 | #if @GNULIB_MBSSPN@ |
@@ -513,7 +810,8 @@ extern char * mbspbrk (const char *string, const char *accept); | |||
513 | beginning of the string to this occurrence, or to the end of the string | 810 | beginning of the string to this occurrence, or to the end of the string |
514 | if none exists. | 811 | if none exists. |
515 | Unlike strspn(), this function works correctly in multibyte locales. */ | 812 | Unlike strspn(), this function works correctly in multibyte locales. */ |
516 | extern size_t mbsspn (const char *string, const char *reject); | 813 | _GL_EXTERN_C size_t mbsspn (const char *string, const char *reject) |
814 | _GL_ARG_NONNULL ((1, 2)); | ||
517 | #endif | 815 | #endif |
518 | 816 | ||
519 | #if @GNULIB_MBSSEP@ | 817 | #if @GNULIB_MBSSEP@ |
@@ -531,7 +829,8 @@ extern size_t mbsspn (const char *string, const char *reject); | |||
531 | Caveat: The identity of the delimiting character is lost. | 829 | Caveat: The identity of the delimiting character is lost. |
532 | 830 | ||
533 | See also mbstok_r(). */ | 831 | See also mbstok_r(). */ |
534 | extern char * mbssep (char **stringp, const char *delim); | 832 | _GL_EXTERN_C char * mbssep (char **stringp, const char *delim) |
833 | _GL_ARG_NONNULL ((1, 2)); | ||
535 | #endif | 834 | #endif |
536 | 835 | ||
537 | #if @GNULIB_MBSTOK_R@ | 836 | #if @GNULIB_MBSTOK_R@ |
@@ -539,67 +838,81 @@ extern char * mbssep (char **stringp, const char *delim); | |||
539 | the character string DELIM. | 838 | the character string DELIM. |
540 | If STRING is NULL, the saved pointer in SAVE_PTR is used as | 839 | If STRING is NULL, the saved pointer in SAVE_PTR is used as |
541 | the next starting point. For example: | 840 | the next starting point. For example: |
542 | char s[] = "-abc-=-def"; | 841 | char s[] = "-abc-=-def"; |
543 | char *sp; | 842 | char *sp; |
544 | x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def" | 843 | x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def" |
545 | x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL | 844 | x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL |
546 | x = mbstok_r(NULL, "=", &sp); // x = NULL | 845 | x = mbstok_r(NULL, "=", &sp); // x = NULL |
547 | // s = "abc\0-def\0" | 846 | // s = "abc\0-def\0" |
548 | 847 | ||
549 | Caveat: It modifies the original string. | 848 | Caveat: It modifies the original string. |
550 | Caveat: These functions cannot be used on constant strings. | 849 | Caveat: These functions cannot be used on constant strings. |
551 | Caveat: The identity of the delimiting character is lost. | 850 | Caveat: The identity of the delimiting character is lost. |
552 | 851 | ||
553 | See also mbssep(). */ | 852 | See also mbssep(). */ |
554 | extern char * mbstok_r (char *string, const char *delim, char **save_ptr); | 853 | _GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr) |
854 | _GL_ARG_NONNULL ((2, 3)); | ||
555 | #endif | 855 | #endif |
556 | 856 | ||
557 | /* Map any int, typically from errno, into an error message. */ | 857 | /* Map any int, typically from errno, into an error message. */ |
558 | #if @GNULIB_STRERROR@ | 858 | #if @GNULIB_STRERROR@ |
559 | # if @REPLACE_STRERROR@ | 859 | # if @REPLACE_STRERROR@ |
560 | # undef strerror | 860 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
561 | # define strerror rpl_strerror | 861 | # undef strerror |
562 | extern char *strerror (int); | 862 | # define strerror rpl_strerror |
863 | # endif | ||
864 | _GL_FUNCDECL_RPL (strerror, char *, (int)); | ||
865 | _GL_CXXALIAS_RPL (strerror, char *, (int)); | ||
866 | # else | ||
867 | _GL_CXXALIAS_SYS (strerror, char *, (int)); | ||
563 | # endif | 868 | # endif |
869 | _GL_CXXALIASWARN (strerror); | ||
564 | #elif defined GNULIB_POSIXCHECK | 870 | #elif defined GNULIB_POSIXCHECK |
565 | # undef strerror | 871 | # undef strerror |
566 | # define strerror(e) \ | 872 | /* Assume strerror is always declared. */ |
567 | (GL_LINK_WARNING ("strerror is unportable - " \ | 873 | _GL_WARN_ON_USE (strerror, "strerror is unportable - " |
568 | "use gnulib module strerror to guarantee non-NULL result"), \ | 874 | "use gnulib module strerror to guarantee non-NULL result"); |
569 | strerror (e)) | ||
570 | #endif | 875 | #endif |
571 | 876 | ||
572 | #if @GNULIB_STRSIGNAL@ | 877 | #if @GNULIB_STRSIGNAL@ |
573 | # if @REPLACE_STRSIGNAL@ | 878 | # if @REPLACE_STRSIGNAL@ |
574 | # define strsignal rpl_strsignal | 879 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
575 | # endif | 880 | # define strsignal rpl_strsignal |
576 | # if ! @HAVE_DECL_STRSIGNAL@ || @REPLACE_STRSIGNAL@ | 881 | # endif |
577 | extern char *strsignal (int __sig); | 882 | _GL_FUNCDECL_RPL (strsignal, char *, (int __sig)); |
883 | _GL_CXXALIAS_RPL (strsignal, char *, (int __sig)); | ||
884 | # else | ||
885 | # if ! @HAVE_DECL_STRSIGNAL@ | ||
886 | _GL_FUNCDECL_SYS (strsignal, char *, (int __sig)); | ||
887 | # endif | ||
888 | /* Need to cast, because on Cygwin 1.5.x systems, the return type is | ||
889 | 'const char *'. */ | ||
890 | _GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig)); | ||
578 | # endif | 891 | # endif |
892 | _GL_CXXALIASWARN (strsignal); | ||
579 | #elif defined GNULIB_POSIXCHECK | 893 | #elif defined GNULIB_POSIXCHECK |
580 | # undef strsignal | 894 | # undef strsignal |
581 | # define strsignal(a) \ | 895 | # if HAVE_RAW_DECL_STRSIGNAL |
582 | (GL_LINK_WARNING ("strsignal is unportable - " \ | 896 | _GL_WARN_ON_USE (strsignal, "strsignal is unportable - " |
583 | "use gnulib module strsignal for portability"), \ | 897 | "use gnulib module strsignal for portability"); |
584 | strsignal (a)) | 898 | # endif |
585 | #endif | 899 | #endif |
586 | 900 | ||
587 | #if @GNULIB_STRVERSCMP@ | 901 | #if @GNULIB_STRVERSCMP@ |
588 | # if !@HAVE_STRVERSCMP@ | 902 | # if !@HAVE_STRVERSCMP@ |
589 | extern int strverscmp (const char *, const char *); | 903 | _GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *) |
904 | _GL_ARG_NONNULL ((1, 2))); | ||
590 | # endif | 905 | # endif |
906 | _GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *)); | ||
907 | _GL_CXXALIASWARN (strverscmp); | ||
591 | #elif defined GNULIB_POSIXCHECK | 908 | #elif defined GNULIB_POSIXCHECK |
592 | # undef strverscmp | 909 | # undef strverscmp |
593 | # define strverscmp(a, b) \ | 910 | # if HAVE_RAW_DECL_STRVERSCMP |
594 | (GL_LINK_WARNING ("strverscmp is unportable - " \ | 911 | _GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - " |
595 | "use gnulib module strverscmp for portability"), \ | 912 | "use gnulib module strverscmp for portability"); |
596 | strverscmp (a, b)) | 913 | # endif |
597 | #endif | 914 | #endif |
598 | 915 | ||
599 | 916 | ||
600 | #ifdef __cplusplus | ||
601 | } | ||
602 | #endif | ||
603 | |||
604 | #endif /* _GL_STRING_H */ | 917 | #endif /* _GL_STRING_H */ |
605 | #endif /* _GL_STRING_H */ | 918 | #endif /* _GL_STRING_H */ |
diff --git a/gl/stripslash.c b/gl/stripslash.c index 40844102..3a5996fd 100644 --- a/gl/stripslash.c +++ b/gl/stripslash.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* stripslash.c -- remove redundant trailing slashes from a file name | 1 | /* stripslash.c -- remove redundant trailing slashes from a file name |
2 | 2 | ||
3 | Copyright (C) 1990, 2001, 2003-2006 Free Software Foundation, Inc. | 3 | Copyright (C) 1990, 2001, 2003-2006, 2009-2010 Free Software Foundation, |
4 | Inc. | ||
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/strndup.c b/gl/strndup.c index 507e9c06..3de3dbc5 100644 --- a/gl/strndup.c +++ b/gl/strndup.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* A replacement function, for systems that lack strndup. | 1 | /* A replacement function, for systems that lack strndup. |
2 | 2 | ||
3 | Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2005, 2006, 2007 | 3 | Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2005, 2006, 2007, 2009, |
4 | Free Software Foundation, Inc. | 4 | 2010 Free Software Foundation, Inc. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms of the GNU General Public License as published by the | 7 | under the terms of the GNU General Public License as published by the |
diff --git a/gl/strnlen.c b/gl/strnlen.c index 93d1ac14..f1ec356d 100644 --- a/gl/strnlen.c +++ b/gl/strnlen.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Find the length of STRING, but scan at most MAXLEN characters. | 1 | /* Find the length of STRING, but scan at most MAXLEN characters. |
2 | Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. | 2 | Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. |
3 | Written by Simon Josefsson. | 3 | Written by Simon Josefsson. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
diff --git a/gl/strstr.c b/gl/strstr.c new file mode 100644 index 00000000..ae184ff7 --- /dev/null +++ b/gl/strstr.c | |||
@@ -0,0 +1,83 @@ | |||
1 | /* Copyright (C) 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, 2004, 2007, | ||
2 | 2008, 2009, 2010 Free Software Foundation, Inc. | ||
3 | This file is part of the GNU C Library. | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3, or (at your option) | ||
8 | any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License along | ||
16 | with this program; if not, write to the Free Software Foundation, | ||
17 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
18 | |||
19 | /* This particular implementation was written by Eric Blake, 2008. */ | ||
20 | |||
21 | #ifndef _LIBC | ||
22 | # include <config.h> | ||
23 | #endif | ||
24 | |||
25 | /* Specification of strstr. */ | ||
26 | #include <string.h> | ||
27 | |||
28 | #include <stdbool.h> | ||
29 | |||
30 | #ifndef _LIBC | ||
31 | # define __builtin_expect(expr, val) (expr) | ||
32 | #endif | ||
33 | |||
34 | #define RETURN_TYPE char * | ||
35 | #define AVAILABLE(h, h_l, j, n_l) \ | ||
36 | (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \ | ||
37 | && ((h_l) = (j) + (n_l))) | ||
38 | #include "str-two-way.h" | ||
39 | |||
40 | /* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK | ||
41 | if NEEDLE is empty, otherwise NULL if NEEDLE is not found in | ||
42 | HAYSTACK. */ | ||
43 | char * | ||
44 | strstr (const char *haystack_start, const char *needle_start) | ||
45 | { | ||
46 | const char *haystack = haystack_start; | ||
47 | const char *needle = needle_start; | ||
48 | size_t needle_len; /* Length of NEEDLE. */ | ||
49 | size_t haystack_len; /* Known minimum length of HAYSTACK. */ | ||
50 | bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */ | ||
51 | |||
52 | /* Determine length of NEEDLE, and in the process, make sure | ||
53 | HAYSTACK is at least as long (no point processing all of a long | ||
54 | NEEDLE if HAYSTACK is too short). */ | ||
55 | while (*haystack && *needle) | ||
56 | ok &= *haystack++ == *needle++; | ||
57 | if (*needle) | ||
58 | return NULL; | ||
59 | if (ok) | ||
60 | return (char *) haystack_start; | ||
61 | |||
62 | /* Reduce the size of haystack using strchr, since it has a smaller | ||
63 | linear coefficient than the Two-Way algorithm. */ | ||
64 | needle_len = needle - needle_start; | ||
65 | haystack = strchr (haystack_start + 1, *needle_start); | ||
66 | if (!haystack || __builtin_expect (needle_len == 1, 0)) | ||
67 | return (char *) haystack; | ||
68 | needle -= needle_len; | ||
69 | haystack_len = (haystack > haystack_start + needle_len ? 1 | ||
70 | : needle_len + haystack_start - haystack); | ||
71 | |||
72 | /* Perform the search. Abstract memory is considered to be an array | ||
73 | of 'unsigned char' values, not an array of 'char' values. See | ||
74 | ISO C 99 section 6.2.6.1. */ | ||
75 | if (needle_len < LONG_NEEDLE_THRESHOLD) | ||
76 | return two_way_short_needle ((const unsigned char *) haystack, | ||
77 | haystack_len, | ||
78 | (const unsigned char *) needle, needle_len); | ||
79 | return two_way_long_needle ((const unsigned char *) haystack, haystack_len, | ||
80 | (const unsigned char *) needle, needle_len); | ||
81 | } | ||
82 | |||
83 | #undef LONG_NEEDLE_THRESHOLD | ||
diff --git a/gl/sys_socket.in.h b/gl/sys_socket.in.h index dadd56ac..fc105e63 100644 --- a/gl/sys_socket.in.h +++ b/gl/sys_socket.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Provide a sys/socket header file for systems lacking it (read: MinGW) | 1 | /* Provide a sys/socket header file for systems lacking it (read: MinGW) |
2 | and for systems where it is incomplete. | 2 | and for systems where it is incomplete. |
3 | Copyright (C) 2005-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2010 Free Software Foundation, Inc. |
4 | Written by Simon Josefsson. | 4 | Written by Simon Josefsson. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 6 | This program is free software; you can redistribute it and/or modify |
@@ -23,13 +23,27 @@ | |||
23 | It is intended to provide definitions and prototypes needed by an | 23 | It is intended to provide definitions and prototypes needed by an |
24 | application. */ | 24 | application. */ |
25 | 25 | ||
26 | #if __GNUC__ >= 3 | ||
27 | @PRAGMA_SYSTEM_HEADER@ | ||
28 | #endif | ||
29 | |||
30 | #if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H | ||
31 | /* Special invocation convention: | ||
32 | - On Cygwin 1.5.x we have a sequence of nested includes | ||
33 | <sys/socket.h> -> <cygwin/socket.h> -> <asm/socket.h> -> <cygwin/if.h>, | ||
34 | and the latter includes <sys/socket.h>. In this situation, the functions | ||
35 | are not yet declared, therefore we cannot provide the C++ aliases. */ | ||
36 | |||
37 | #@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ | ||
38 | |||
39 | #else | ||
40 | /* Normal invocation convention. */ | ||
41 | |||
26 | #ifndef _GL_SYS_SOCKET_H | 42 | #ifndef _GL_SYS_SOCKET_H |
27 | 43 | ||
28 | #if @HAVE_SYS_SOCKET_H@ | 44 | #if @HAVE_SYS_SOCKET_H@ |
29 | 45 | ||
30 | # if __GNUC__ >= 3 | 46 | # define _GL_ALREADY_INCLUDING_SYS_SOCKET_H |
31 | @PRAGMA_SYSTEM_HEADER@ | ||
32 | # endif | ||
33 | 47 | ||
34 | /* On many platforms, <sys/socket.h> assumes prior inclusion of | 48 | /* On many platforms, <sys/socket.h> assumes prior inclusion of |
35 | <sys/types.h>. */ | 49 | <sys/types.h>. */ |
@@ -38,11 +52,23 @@ | |||
38 | /* The include_next requires a split double-inclusion guard. */ | 52 | /* The include_next requires a split double-inclusion guard. */ |
39 | # @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ | 53 | # @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@ |
40 | 54 | ||
55 | # undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H | ||
56 | |||
41 | #endif | 57 | #endif |
42 | 58 | ||
43 | #ifndef _GL_SYS_SOCKET_H | 59 | #ifndef _GL_SYS_SOCKET_H |
44 | #define _GL_SYS_SOCKET_H | 60 | #define _GL_SYS_SOCKET_H |
45 | 61 | ||
62 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
63 | |||
64 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
65 | |||
66 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
67 | |||
68 | #if !@HAVE_SA_FAMILY_T@ | ||
69 | typedef unsigned short sa_family_t; | ||
70 | #endif | ||
71 | |||
46 | #if !@HAVE_STRUCT_SOCKADDR_STORAGE@ | 72 | #if !@HAVE_STRUCT_SOCKADDR_STORAGE@ |
47 | # include <alignof.h> | 73 | # include <alignof.h> |
48 | /* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on | 74 | /* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on |
@@ -50,10 +76,10 @@ | |||
50 | # define __ss_aligntype unsigned long int | 76 | # define __ss_aligntype unsigned long int |
51 | # define _SS_SIZE 256 | 77 | # define _SS_SIZE 256 |
52 | # define _SS_PADSIZE \ | 78 | # define _SS_PADSIZE \ |
53 | (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \ | 79 | (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \ |
54 | ? sizeof (sa_family_t) \ | 80 | ? sizeof (sa_family_t) \ |
55 | : alignof (__ss_aligntype)) \ | 81 | : alignof (__ss_aligntype)) \ |
56 | + sizeof (__ss_aligntype))) | 82 | + sizeof (__ss_aligntype))) |
57 | 83 | ||
58 | struct sockaddr_storage | 84 | struct sockaddr_storage |
59 | { | 85 | { |
@@ -120,8 +146,6 @@ struct sockaddr_storage | |||
120 | # define SHUT_RDWR SD_BOTH | 146 | # define SHUT_RDWR SD_BOTH |
121 | # endif | 147 | # endif |
122 | 148 | ||
123 | /* The definition of GL_LINK_WARNING is copied here. */ | ||
124 | |||
125 | # if @HAVE_WINSOCK2_H@ | 149 | # if @HAVE_WINSOCK2_H@ |
126 | /* Include headers needed by the emulation code. */ | 150 | /* Include headers needed by the emulation code. */ |
127 | # include <sys/types.h> | 151 | # include <sys/types.h> |
@@ -131,11 +155,9 @@ typedef int socklen_t; | |||
131 | 155 | ||
132 | # endif | 156 | # endif |
133 | 157 | ||
134 | # ifdef __cplusplus | 158 | #endif |
135 | extern "C" { | ||
136 | # endif | ||
137 | 159 | ||
138 | # if @HAVE_WINSOCK2_H@ | 160 | #if @HAVE_WINSOCK2_H@ |
139 | 161 | ||
140 | /* Re-define FD_ISSET to avoid a WSA call while we are not using | 162 | /* Re-define FD_ISSET to avoid a WSA call while we are not using |
141 | network sockets. */ | 163 | network sockets. */ |
@@ -153,271 +175,454 @@ rpl_fd_isset (SOCKET fd, fd_set * set) | |||
153 | return 0; | 175 | return 0; |
154 | } | 176 | } |
155 | 177 | ||
156 | # undef FD_ISSET | 178 | # undef FD_ISSET |
157 | # define FD_ISSET(fd, set) rpl_fd_isset(fd, set) | 179 | # define FD_ISSET(fd, set) rpl_fd_isset(fd, set) |
158 | 180 | ||
159 | # endif | 181 | #endif |
160 | 182 | ||
161 | /* Wrap everything else to use libc file descriptors for sockets. */ | 183 | /* Wrap everything else to use libc file descriptors for sockets. */ |
162 | 184 | ||
163 | # if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H | 185 | #if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H |
186 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
164 | # undef close | 187 | # undef close |
165 | # define close close_used_without_including_unistd_h | 188 | # define close close_used_without_including_unistd_h |
189 | # else | ||
190 | _GL_WARN_ON_USE (close, | ||
191 | "close() used without including <unistd.h>"); | ||
166 | # endif | 192 | # endif |
193 | #endif | ||
167 | 194 | ||
168 | # if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H | 195 | #if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H |
196 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
169 | # undef gethostname | 197 | # undef gethostname |
170 | # define gethostname gethostname_used_without_including_unistd_h | 198 | # define gethostname gethostname_used_without_including_unistd_h |
199 | # else | ||
200 | _GL_WARN_ON_USE (gethostname, | ||
201 | "gethostname() used without including <unistd.h>"); | ||
171 | # endif | 202 | # endif |
203 | #endif | ||
172 | 204 | ||
173 | # if @GNULIB_SOCKET@ | 205 | #if @GNULIB_SOCKET@ |
174 | # if @HAVE_WINSOCK2_H@ | 206 | # if @HAVE_WINSOCK2_H@ |
207 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
175 | # undef socket | 208 | # undef socket |
176 | # define socket rpl_socket | 209 | # define socket rpl_socket |
177 | extern int rpl_socket (int, int, int protocol); | ||
178 | # endif | 210 | # endif |
179 | # elif @HAVE_WINSOCK2_H@ | 211 | _GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol)); |
180 | # undef socket | 212 | _GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol)); |
181 | # define socket socket_used_without_requesting_gnulib_module_socket | 213 | # else |
182 | # elif defined GNULIB_POSIXCHECK | 214 | _GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol)); |
183 | # undef socket | 215 | # endif |
184 | # define socket(d,t,p) \ | 216 | _GL_CXXALIASWARN (socket); |
185 | (GL_LINK_WARNING ("socket is not always POSIX compliant - " \ | 217 | #elif @HAVE_WINSOCK2_H@ |
186 | "use gnulib module socket for portability"), \ | 218 | # undef socket |
187 | socket (d, t, p)) | 219 | # define socket socket_used_without_requesting_gnulib_module_socket |
188 | # endif | 220 | #elif defined GNULIB_POSIXCHECK |
189 | 221 | # undef socket | |
190 | # if @GNULIB_CONNECT@ | 222 | # if HAVE_RAW_DECL_SOCKET |
191 | # if @HAVE_WINSOCK2_H@ | 223 | _GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - " |
224 | "use gnulib module socket for portability"); | ||
225 | # endif | ||
226 | #endif | ||
227 | |||
228 | #if @GNULIB_CONNECT@ | ||
229 | # if @HAVE_WINSOCK2_H@ | ||
230 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
192 | # undef connect | 231 | # undef connect |
193 | # define connect rpl_connect | 232 | # define connect rpl_connect |
194 | extern int rpl_connect (int, struct sockaddr *, int); | ||
195 | # endif | 233 | # endif |
196 | # elif @HAVE_WINSOCK2_H@ | 234 | _GL_FUNCDECL_RPL (connect, int, |
197 | # undef connect | 235 | (int fd, const struct sockaddr *addr, socklen_t addrlen) |
198 | # define connect socket_used_without_requesting_gnulib_module_connect | 236 | _GL_ARG_NONNULL ((2))); |
199 | # elif defined GNULIB_POSIXCHECK | 237 | _GL_CXXALIAS_RPL (connect, int, |
200 | # undef connect | 238 | (int fd, const struct sockaddr *addr, socklen_t addrlen)); |
201 | # define connect(s,a,l) \ | 239 | # else |
202 | (GL_LINK_WARNING ("connect is not always POSIX compliant - " \ | 240 | _GL_CXXALIAS_SYS (connect, int, |
203 | "use gnulib module connect for portability"), \ | 241 | (int fd, const struct sockaddr *addr, socklen_t addrlen)); |
204 | connect (s, a, l)) | 242 | # endif |
205 | # endif | 243 | _GL_CXXALIASWARN (connect); |
206 | 244 | #elif @HAVE_WINSOCK2_H@ | |
207 | # if @GNULIB_ACCEPT@ | 245 | # undef connect |
208 | # if @HAVE_WINSOCK2_H@ | 246 | # define connect socket_used_without_requesting_gnulib_module_connect |
247 | #elif defined GNULIB_POSIXCHECK | ||
248 | # undef connect | ||
249 | # if HAVE_RAW_DECL_CONNECT | ||
250 | _GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - " | ||
251 | "use gnulib module connect for portability"); | ||
252 | # endif | ||
253 | #endif | ||
254 | |||
255 | #if @GNULIB_ACCEPT@ | ||
256 | # if @HAVE_WINSOCK2_H@ | ||
257 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
209 | # undef accept | 258 | # undef accept |
210 | # define accept rpl_accept | 259 | # define accept rpl_accept |
211 | extern int rpl_accept (int, struct sockaddr *, int *); | ||
212 | # endif | 260 | # endif |
213 | # elif @HAVE_WINSOCK2_H@ | 261 | _GL_FUNCDECL_RPL (accept, int, |
214 | # undef accept | 262 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
215 | # define accept accept_used_without_requesting_gnulib_module_accept | 263 | _GL_CXXALIAS_RPL (accept, int, |
216 | # elif defined GNULIB_POSIXCHECK | 264 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
217 | # undef accept | 265 | # else |
218 | # define accept(s,a,l) \ | 266 | /* Need to cast, because on Solaris 10 systems, the third parameter is |
219 | (GL_LINK_WARNING ("accept is not always POSIX compliant - " \ | 267 | void *addrlen. */ |
220 | "use gnulib module accept for portability"), \ | 268 | _GL_CXXALIAS_SYS_CAST (accept, int, |
221 | accept (s, a, l)) | 269 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
222 | # endif | 270 | # endif |
223 | 271 | _GL_CXXALIASWARN (accept); | |
224 | # if @GNULIB_BIND@ | 272 | #elif @HAVE_WINSOCK2_H@ |
225 | # if @HAVE_WINSOCK2_H@ | 273 | # undef accept |
274 | # define accept accept_used_without_requesting_gnulib_module_accept | ||
275 | #elif defined GNULIB_POSIXCHECK | ||
276 | # undef accept | ||
277 | # if HAVE_RAW_DECL_ACCEPT | ||
278 | _GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - " | ||
279 | "use gnulib module accept for portability"); | ||
280 | # endif | ||
281 | #endif | ||
282 | |||
283 | #if @GNULIB_BIND@ | ||
284 | # if @HAVE_WINSOCK2_H@ | ||
285 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
226 | # undef bind | 286 | # undef bind |
227 | # define bind rpl_bind | 287 | # define bind rpl_bind |
228 | extern int rpl_bind (int, struct sockaddr *, int); | ||
229 | # endif | 288 | # endif |
230 | # elif @HAVE_WINSOCK2_H@ | 289 | _GL_FUNCDECL_RPL (bind, int, |
231 | # undef bind | 290 | (int fd, const struct sockaddr *addr, socklen_t addrlen) |
232 | # define bind bind_used_without_requesting_gnulib_module_bind | 291 | _GL_ARG_NONNULL ((2))); |
233 | # elif defined GNULIB_POSIXCHECK | 292 | _GL_CXXALIAS_RPL (bind, int, |
234 | # undef bind | 293 | (int fd, const struct sockaddr *addr, socklen_t addrlen)); |
235 | # define bind(s,a,l) \ | 294 | # else |
236 | (GL_LINK_WARNING ("bind is not always POSIX compliant - " \ | 295 | _GL_CXXALIAS_SYS (bind, int, |
237 | "use gnulib module bind for portability"), \ | 296 | (int fd, const struct sockaddr *addr, socklen_t addrlen)); |
238 | bind (s, a, l)) | 297 | # endif |
239 | # endif | 298 | _GL_CXXALIASWARN (bind); |
240 | 299 | #elif @HAVE_WINSOCK2_H@ | |
241 | # if @GNULIB_GETPEERNAME@ | 300 | # undef bind |
242 | # if @HAVE_WINSOCK2_H@ | 301 | # define bind bind_used_without_requesting_gnulib_module_bind |
302 | #elif defined GNULIB_POSIXCHECK | ||
303 | # undef bind | ||
304 | # if HAVE_RAW_DECL_BIND | ||
305 | _GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - " | ||
306 | "use gnulib module bind for portability"); | ||
307 | # endif | ||
308 | #endif | ||
309 | |||
310 | #if @GNULIB_GETPEERNAME@ | ||
311 | # if @HAVE_WINSOCK2_H@ | ||
312 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
243 | # undef getpeername | 313 | # undef getpeername |
244 | # define getpeername rpl_getpeername | 314 | # define getpeername rpl_getpeername |
245 | extern int rpl_getpeername (int, struct sockaddr *, int *); | ||
246 | # endif | 315 | # endif |
247 | # elif @HAVE_WINSOCK2_H@ | 316 | _GL_FUNCDECL_RPL (getpeername, int, |
248 | # undef getpeername | 317 | (int fd, struct sockaddr *addr, socklen_t *addrlen) |
249 | # define getpeername getpeername_used_without_requesting_gnulib_module_getpeername | 318 | _GL_ARG_NONNULL ((2, 3))); |
250 | # elif defined GNULIB_POSIXCHECK | 319 | _GL_CXXALIAS_RPL (getpeername, int, |
251 | # undef getpeername | 320 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
252 | # define getpeername(s,a,l) \ | 321 | # else |
253 | (GL_LINK_WARNING ("getpeername is not always POSIX compliant - " \ | 322 | /* Need to cast, because on Solaris 10 systems, the third parameter is |
254 | "use gnulib module getpeername for portability"), \ | 323 | void *addrlen. */ |
255 | getpeername (s, a, l)) | 324 | _GL_CXXALIAS_SYS_CAST (getpeername, int, |
256 | # endif | 325 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
257 | 326 | # endif | |
258 | # if @GNULIB_GETSOCKNAME@ | 327 | _GL_CXXALIASWARN (getpeername); |
259 | # if @HAVE_WINSOCK2_H@ | 328 | #elif @HAVE_WINSOCK2_H@ |
329 | # undef getpeername | ||
330 | # define getpeername getpeername_used_without_requesting_gnulib_module_getpeername | ||
331 | #elif defined GNULIB_POSIXCHECK | ||
332 | # undef getpeername | ||
333 | # if HAVE_RAW_DECL_GETPEERNAME | ||
334 | _GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - " | ||
335 | "use gnulib module getpeername for portability"); | ||
336 | # endif | ||
337 | #endif | ||
338 | |||
339 | #if @GNULIB_GETSOCKNAME@ | ||
340 | # if @HAVE_WINSOCK2_H@ | ||
341 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
260 | # undef getsockname | 342 | # undef getsockname |
261 | # define getsockname rpl_getsockname | 343 | # define getsockname rpl_getsockname |
262 | extern int rpl_getsockname (int, struct sockaddr *, int *); | ||
263 | # endif | 344 | # endif |
264 | # elif @HAVE_WINSOCK2_H@ | 345 | _GL_FUNCDECL_RPL (getsockname, int, |
265 | # undef getsockname | 346 | (int fd, struct sockaddr *addr, socklen_t *addrlen) |
266 | # define getsockname getsockname_used_without_requesting_gnulib_module_getsockname | 347 | _GL_ARG_NONNULL ((2, 3))); |
267 | # elif defined GNULIB_POSIXCHECK | 348 | _GL_CXXALIAS_RPL (getsockname, int, |
268 | # undef getsockname | 349 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
269 | # define getsockname(s,a,l) \ | 350 | # else |
270 | (GL_LINK_WARNING ("getsockname is not always POSIX compliant - " \ | 351 | /* Need to cast, because on Solaris 10 systems, the third parameter is |
271 | "use gnulib module getsockname for portability"), \ | 352 | void *addrlen. */ |
272 | getsockname (s, a, l)) | 353 | _GL_CXXALIAS_SYS_CAST (getsockname, int, |
273 | # endif | 354 | (int fd, struct sockaddr *addr, socklen_t *addrlen)); |
274 | 355 | # endif | |
275 | # if @GNULIB_GETSOCKOPT@ | 356 | _GL_CXXALIASWARN (getsockname); |
276 | # if @HAVE_WINSOCK2_H@ | 357 | #elif @HAVE_WINSOCK2_H@ |
358 | # undef getsockname | ||
359 | # define getsockname getsockname_used_without_requesting_gnulib_module_getsockname | ||
360 | #elif defined GNULIB_POSIXCHECK | ||
361 | # undef getsockname | ||
362 | # if HAVE_RAW_DECL_GETSOCKNAME | ||
363 | _GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - " | ||
364 | "use gnulib module getsockname for portability"); | ||
365 | # endif | ||
366 | #endif | ||
367 | |||
368 | #if @GNULIB_GETSOCKOPT@ | ||
369 | # if @HAVE_WINSOCK2_H@ | ||
370 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
277 | # undef getsockopt | 371 | # undef getsockopt |
278 | # define getsockopt rpl_getsockopt | 372 | # define getsockopt rpl_getsockopt |
279 | extern int rpl_getsockopt (int, int, int, void *, socklen_t *); | ||
280 | # endif | 373 | # endif |
281 | # elif @HAVE_WINSOCK2_H@ | 374 | _GL_FUNCDECL_RPL (getsockopt, int, (int fd, int level, int optname, |
282 | # undef getsockopt | 375 | void *optval, socklen_t *optlen) |
283 | # define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt | 376 | _GL_ARG_NONNULL ((4, 5))); |
284 | # elif defined GNULIB_POSIXCHECK | 377 | _GL_CXXALIAS_RPL (getsockopt, int, (int fd, int level, int optname, |
285 | # undef getsockopt | 378 | void *optval, socklen_t *optlen)); |
286 | # define getsockopt(s,lvl,o,v,l) \ | 379 | # else |
287 | (GL_LINK_WARNING ("getsockopt is not always POSIX compliant - " \ | 380 | /* Need to cast, because on Solaris 10 systems, the fifth parameter is |
288 | "use gnulib module getsockopt for portability"), \ | 381 | void *optlen. */ |
289 | getsockopt (s, lvl, o, v, l)) | 382 | _GL_CXXALIAS_SYS_CAST (getsockopt, int, (int fd, int level, int optname, |
290 | # endif | 383 | void *optval, socklen_t *optlen)); |
291 | 384 | # endif | |
292 | # if @GNULIB_LISTEN@ | 385 | _GL_CXXALIASWARN (getsockopt); |
293 | # if @HAVE_WINSOCK2_H@ | 386 | #elif @HAVE_WINSOCK2_H@ |
387 | # undef getsockopt | ||
388 | # define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt | ||
389 | #elif defined GNULIB_POSIXCHECK | ||
390 | # undef getsockopt | ||
391 | # if HAVE_RAW_DECL_GETSOCKOPT | ||
392 | _GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - " | ||
393 | "use gnulib module getsockopt for portability"); | ||
394 | # endif | ||
395 | #endif | ||
396 | |||
397 | #if @GNULIB_LISTEN@ | ||
398 | # if @HAVE_WINSOCK2_H@ | ||
399 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
294 | # undef listen | 400 | # undef listen |
295 | # define listen rpl_listen | 401 | # define listen rpl_listen |
296 | extern int rpl_listen (int, int); | ||
297 | # endif | 402 | # endif |
298 | # elif @HAVE_WINSOCK2_H@ | 403 | _GL_FUNCDECL_RPL (listen, int, (int fd, int backlog)); |
299 | # undef listen | 404 | _GL_CXXALIAS_RPL (listen, int, (int fd, int backlog)); |
300 | # define listen listen_used_without_requesting_gnulib_module_listen | 405 | # else |
301 | # elif defined GNULIB_POSIXCHECK | 406 | _GL_CXXALIAS_SYS (listen, int, (int fd, int backlog)); |
302 | # undef listen | 407 | # endif |
303 | # define listen(s,b) \ | 408 | _GL_CXXALIASWARN (listen); |
304 | (GL_LINK_WARNING ("listen is not always POSIX compliant - " \ | 409 | #elif @HAVE_WINSOCK2_H@ |
305 | "use gnulib module listen for portability"), \ | 410 | # undef listen |
306 | listen (s, b)) | 411 | # define listen listen_used_without_requesting_gnulib_module_listen |
307 | # endif | 412 | #elif defined GNULIB_POSIXCHECK |
308 | 413 | # undef listen | |
309 | # if @GNULIB_RECV@ | 414 | # if HAVE_RAW_DECL_LISTEN |
310 | # if @HAVE_WINSOCK2_H@ | 415 | _GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - " |
416 | "use gnulib module listen for portability"); | ||
417 | # endif | ||
418 | #endif | ||
419 | |||
420 | #if @GNULIB_RECV@ | ||
421 | # if @HAVE_WINSOCK2_H@ | ||
422 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
311 | # undef recv | 423 | # undef recv |
312 | # define recv rpl_recv | 424 | # define recv rpl_recv |
313 | extern int rpl_recv (int, void *, int, int); | ||
314 | # endif | 425 | # endif |
315 | # elif @HAVE_WINSOCK2_H@ | 426 | _GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags) |
316 | # undef recv | 427 | _GL_ARG_NONNULL ((2))); |
317 | # define recv recv_used_without_requesting_gnulib_module_recv | 428 | _GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); |
318 | # elif defined GNULIB_POSIXCHECK | 429 | # else |
319 | # undef recv | 430 | _GL_CXXALIAS_SYS (recv, ssize_t, (int fd, void *buf, size_t len, int flags)); |
320 | # define recv(s,b,n,f) \ | 431 | # endif |
321 | (GL_LINK_WARNING ("recv is not always POSIX compliant - " \ | 432 | _GL_CXXALIASWARN (recv); |
322 | "use gnulib module recv for portability"), \ | 433 | #elif @HAVE_WINSOCK2_H@ |
323 | recv (s, b, n, f)) | 434 | # undef recv |
324 | # endif | 435 | # define recv recv_used_without_requesting_gnulib_module_recv |
325 | 436 | #elif defined GNULIB_POSIXCHECK | |
326 | # if @GNULIB_SEND@ | 437 | # undef recv |
327 | # if @HAVE_WINSOCK2_H@ | 438 | # if HAVE_RAW_DECL_RECV |
439 | _GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - " | ||
440 | "use gnulib module recv for portability"); | ||
441 | # endif | ||
442 | #endif | ||
443 | |||
444 | #if @GNULIB_SEND@ | ||
445 | # if @HAVE_WINSOCK2_H@ | ||
446 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
328 | # undef send | 447 | # undef send |
329 | # define send rpl_send | 448 | # define send rpl_send |
330 | extern int rpl_send (int, const void *, int, int); | ||
331 | # endif | 449 | # endif |
332 | # elif @HAVE_WINSOCK2_H@ | 450 | _GL_FUNCDECL_RPL (send, ssize_t, |
333 | # undef send | 451 | (int fd, const void *buf, size_t len, int flags) |
334 | # define send send_used_without_requesting_gnulib_module_send | 452 | _GL_ARG_NONNULL ((2))); |
335 | # elif defined GNULIB_POSIXCHECK | 453 | _GL_CXXALIAS_RPL (send, ssize_t, |
336 | # undef send | 454 | (int fd, const void *buf, size_t len, int flags)); |
337 | # define send(s,b,n,f) \ | 455 | # else |
338 | (GL_LINK_WARNING ("send is not always POSIX compliant - " \ | 456 | _GL_CXXALIAS_SYS (send, ssize_t, |
339 | "use gnulib module send for portability"), \ | 457 | (int fd, const void *buf, size_t len, int flags)); |
340 | send (s, b, n, f)) | 458 | # endif |
341 | # endif | 459 | _GL_CXXALIASWARN (send); |
342 | 460 | #elif @HAVE_WINSOCK2_H@ | |
343 | # if @GNULIB_RECVFROM@ | 461 | # undef send |
344 | # if @HAVE_WINSOCK2_H@ | 462 | # define send send_used_without_requesting_gnulib_module_send |
463 | #elif defined GNULIB_POSIXCHECK | ||
464 | # undef send | ||
465 | # if HAVE_RAW_DECL_SEND | ||
466 | _GL_WARN_ON_USE (send, "send is not always POSIX compliant - " | ||
467 | "use gnulib module send for portability"); | ||
468 | # endif | ||
469 | #endif | ||
470 | |||
471 | #if @GNULIB_RECVFROM@ | ||
472 | # if @HAVE_WINSOCK2_H@ | ||
473 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
345 | # undef recvfrom | 474 | # undef recvfrom |
346 | # define recvfrom rpl_recvfrom | 475 | # define recvfrom rpl_recvfrom |
347 | extern int rpl_recvfrom (int, void *, int, int, struct sockaddr *, int *); | ||
348 | # endif | 476 | # endif |
349 | # elif @HAVE_WINSOCK2_H@ | 477 | _GL_FUNCDECL_RPL (recvfrom, ssize_t, |
350 | # undef recvfrom | 478 | (int fd, void *buf, size_t len, int flags, |
351 | # define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom | 479 | struct sockaddr *from, socklen_t *fromlen) |
352 | # elif defined GNULIB_POSIXCHECK | 480 | _GL_ARG_NONNULL ((2))); |
353 | # undef recvfrom | 481 | _GL_CXXALIAS_RPL (recvfrom, ssize_t, |
354 | # define recvfrom(s,b,n,f,a,l) \ | 482 | (int fd, void *buf, size_t len, int flags, |
355 | (GL_LINK_WARNING ("recvfrom is not always POSIX compliant - " \ | 483 | struct sockaddr *from, socklen_t *fromlen)); |
356 | "use gnulib module recvfrom for portability"), \ | 484 | # else |
357 | recvfrom (s, b, n, f, a, l)) | 485 | /* Need to cast, because on Solaris 10 systems, the sixth parameter is |
358 | # endif | 486 | void *fromlen. */ |
359 | 487 | _GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t, | |
360 | # if @GNULIB_SENDTO@ | 488 | (int fd, void *buf, size_t len, int flags, |
361 | # if @HAVE_WINSOCK2_H@ | 489 | struct sockaddr *from, socklen_t *fromlen)); |
490 | # endif | ||
491 | _GL_CXXALIASWARN (recvfrom); | ||
492 | #elif @HAVE_WINSOCK2_H@ | ||
493 | # undef recvfrom | ||
494 | # define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom | ||
495 | #elif defined GNULIB_POSIXCHECK | ||
496 | # undef recvfrom | ||
497 | # if HAVE_RAW_DECL_RECVFROM | ||
498 | _GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - " | ||
499 | "use gnulib module recvfrom for portability"); | ||
500 | # endif | ||
501 | #endif | ||
502 | |||
503 | #if @GNULIB_SENDTO@ | ||
504 | # if @HAVE_WINSOCK2_H@ | ||
505 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
362 | # undef sendto | 506 | # undef sendto |
363 | # define sendto rpl_sendto | 507 | # define sendto rpl_sendto |
364 | extern int rpl_sendto (int, const void *, int, int, struct sockaddr *, int); | ||
365 | # endif | 508 | # endif |
366 | # elif @HAVE_WINSOCK2_H@ | 509 | _GL_FUNCDECL_RPL (sendto, ssize_t, |
367 | # undef sendto | 510 | (int fd, const void *buf, size_t len, int flags, |
368 | # define sendto sendto_used_without_requesting_gnulib_module_sendto | 511 | const struct sockaddr *to, socklen_t tolen) |
369 | # elif defined GNULIB_POSIXCHECK | 512 | _GL_ARG_NONNULL ((2))); |
370 | # undef sendto | 513 | _GL_CXXALIAS_RPL (sendto, ssize_t, |
371 | # define sendto(s,b,n,f,a,l) \ | 514 | (int fd, const void *buf, size_t len, int flags, |
372 | (GL_LINK_WARNING ("sendto is not always POSIX compliant - " \ | 515 | const struct sockaddr *to, socklen_t tolen)); |
373 | "use gnulib module sendto for portability"), \ | 516 | # else |
374 | sendto (s, b, n, f, a, l)) | 517 | _GL_CXXALIAS_SYS (sendto, ssize_t, |
375 | # endif | 518 | (int fd, const void *buf, size_t len, int flags, |
376 | 519 | const struct sockaddr *to, socklen_t tolen)); | |
377 | # if @GNULIB_SETSOCKOPT@ | 520 | # endif |
378 | # if @HAVE_WINSOCK2_H@ | 521 | _GL_CXXALIASWARN (sendto); |
522 | #elif @HAVE_WINSOCK2_H@ | ||
523 | # undef sendto | ||
524 | # define sendto sendto_used_without_requesting_gnulib_module_sendto | ||
525 | #elif defined GNULIB_POSIXCHECK | ||
526 | # undef sendto | ||
527 | # if HAVE_RAW_DECL_SENDTO | ||
528 | _GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - " | ||
529 | "use gnulib module sendto for portability"); | ||
530 | # endif | ||
531 | #endif | ||
532 | |||
533 | #if @GNULIB_SETSOCKOPT@ | ||
534 | # if @HAVE_WINSOCK2_H@ | ||
535 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
379 | # undef setsockopt | 536 | # undef setsockopt |
380 | # define setsockopt rpl_setsockopt | 537 | # define setsockopt rpl_setsockopt |
381 | extern int rpl_setsockopt (int, int, int, const void *, socklen_t); | ||
382 | # endif | 538 | # endif |
383 | # elif @HAVE_WINSOCK2_H@ | 539 | _GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname, |
384 | # undef setsockopt | 540 | const void * optval, socklen_t optlen) |
385 | # define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt | 541 | _GL_ARG_NONNULL ((4))); |
386 | # elif defined GNULIB_POSIXCHECK | 542 | _GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname, |
387 | # undef setsockopt | 543 | const void * optval, socklen_t optlen)); |
388 | # define setsockopt(s,lvl,o,v,l) \ | 544 | # else |
389 | (GL_LINK_WARNING ("setsockopt is not always POSIX compliant - " \ | 545 | _GL_CXXALIAS_SYS (setsockopt, int, (int fd, int level, int optname, |
390 | "use gnulib module setsockopt for portability"), \ | 546 | const void * optval, socklen_t optlen)); |
391 | setsockopt (s, lvl, o, v, l)) | 547 | # endif |
392 | # endif | 548 | _GL_CXXALIASWARN (setsockopt); |
393 | 549 | #elif @HAVE_WINSOCK2_H@ | |
394 | # if @GNULIB_SHUTDOWN@ | 550 | # undef setsockopt |
395 | # if @HAVE_WINSOCK2_H@ | 551 | # define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt |
552 | #elif defined GNULIB_POSIXCHECK | ||
553 | # undef setsockopt | ||
554 | # if HAVE_RAW_DECL_SETSOCKOPT | ||
555 | _GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - " | ||
556 | "use gnulib module setsockopt for portability"); | ||
557 | # endif | ||
558 | #endif | ||
559 | |||
560 | #if @GNULIB_SHUTDOWN@ | ||
561 | # if @HAVE_WINSOCK2_H@ | ||
562 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
396 | # undef shutdown | 563 | # undef shutdown |
397 | # define shutdown rpl_shutdown | 564 | # define shutdown rpl_shutdown |
398 | extern int rpl_shutdown (int, int); | ||
399 | # endif | 565 | # endif |
400 | # elif @HAVE_WINSOCK2_H@ | 566 | _GL_FUNCDECL_RPL (shutdown, int, (int fd, int how)); |
401 | # undef shutdown | 567 | _GL_CXXALIAS_RPL (shutdown, int, (int fd, int how)); |
402 | # define shutdown shutdown_used_without_requesting_gnulib_module_shutdown | 568 | # else |
403 | # elif defined GNULIB_POSIXCHECK | 569 | _GL_CXXALIAS_SYS (shutdown, int, (int fd, int how)); |
404 | # undef shutdown | 570 | # endif |
405 | # define shutdown(s,h) \ | 571 | _GL_CXXALIASWARN (shutdown); |
406 | (GL_LINK_WARNING ("shutdown is not always POSIX compliant - " \ | 572 | #elif @HAVE_WINSOCK2_H@ |
407 | "use gnulib module shutdown for portability"), \ | 573 | # undef shutdown |
408 | shutdown (s, h)) | 574 | # define shutdown shutdown_used_without_requesting_gnulib_module_shutdown |
575 | #elif defined GNULIB_POSIXCHECK | ||
576 | # undef shutdown | ||
577 | # if HAVE_RAW_DECL_SHUTDOWN | ||
578 | _GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - " | ||
579 | "use gnulib module shutdown for portability"); | ||
409 | # endif | 580 | # endif |
581 | #endif | ||
410 | 582 | ||
411 | # if @HAVE_WINSOCK2_H@ | 583 | #if @HAVE_WINSOCK2_H@ |
584 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
412 | # undef select | 585 | # undef select |
413 | # define select select_used_without_including_sys_select_h | 586 | # define select select_used_without_including_sys_select_h |
587 | # else | ||
588 | _GL_WARN_ON_USE (select, | ||
589 | "select() used without including <sys/select.h>"); | ||
414 | # endif | 590 | # endif |
591 | #endif | ||
415 | 592 | ||
416 | # ifdef __cplusplus | 593 | #if @GNULIB_ACCEPT4@ |
417 | } | 594 | /* Accept a connection on a socket, with specific opening flags. |
595 | The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>) | ||
596 | and O_TEXT, O_BINARY (defined in "binary-io.h"). | ||
597 | See also the Linux man page at | ||
598 | <http://www.kernel.org/doc/man-pages/online/pages/man2/accept4.2.html>. */ | ||
599 | # if @HAVE_ACCEPT4@ | ||
600 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
601 | # define accept4 rpl_accept4 | ||
602 | # endif | ||
603 | _GL_FUNCDECL_RPL (accept4, int, | ||
604 | (int sockfd, struct sockaddr *addr, socklen_t *addrlen, | ||
605 | int flags)); | ||
606 | _GL_CXXALIAS_RPL (accept4, int, | ||
607 | (int sockfd, struct sockaddr *addr, socklen_t *addrlen, | ||
608 | int flags)); | ||
609 | # else | ||
610 | _GL_FUNCDECL_SYS (accept4, int, | ||
611 | (int sockfd, struct sockaddr *addr, socklen_t *addrlen, | ||
612 | int flags)); | ||
613 | _GL_CXXALIAS_SYS (accept4, int, | ||
614 | (int sockfd, struct sockaddr *addr, socklen_t *addrlen, | ||
615 | int flags)); | ||
418 | # endif | 616 | # endif |
419 | 617 | _GL_CXXALIASWARN (accept4); | |
420 | #endif /* HAVE_SYS_SOCKET_H */ | 618 | #elif defined GNULIB_POSIXCHECK |
619 | # undef accept4 | ||
620 | # if HAVE_RAW_DECL_ACCEPT4 | ||
621 | _GL_WARN_ON_USE (accept4, "accept4 is unportable - " | ||
622 | "use gnulib module accept4 for portability"); | ||
623 | # endif | ||
624 | #endif | ||
421 | 625 | ||
422 | #endif /* _GL_SYS_SOCKET_H */ | 626 | #endif /* _GL_SYS_SOCKET_H */ |
423 | #endif /* _GL_SYS_SOCKET_H */ | 627 | #endif /* _GL_SYS_SOCKET_H */ |
628 | #endif | ||
diff --git a/gl/sys_stat.in.h b/gl/sys_stat.in.h new file mode 100644 index 00000000..a64bf029 --- /dev/null +++ b/gl/sys_stat.in.h | |||
@@ -0,0 +1,638 @@ | |||
1 | /* Provide a more complete sys/stat header file. | ||
2 | Copyright (C) 2005-2010 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 3, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program; if not, write to the Free Software Foundation, | ||
16 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
17 | |||
18 | /* Written by Eric Blake, Paul Eggert, and Jim Meyering. */ | ||
19 | |||
20 | /* This file is supposed to be used on platforms where <sys/stat.h> is | ||
21 | incomplete. It is intended to provide definitions and prototypes | ||
22 | needed by an application. Start with what the system provides. */ | ||
23 | |||
24 | #if __GNUC__ >= 3 | ||
25 | @PRAGMA_SYSTEM_HEADER@ | ||
26 | #endif | ||
27 | |||
28 | #if defined __need_system_sys_stat_h | ||
29 | /* Special invocation convention. */ | ||
30 | |||
31 | #@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ | ||
32 | |||
33 | #else | ||
34 | /* Normal invocation convention. */ | ||
35 | |||
36 | #ifndef _GL_SYS_STAT_H | ||
37 | |||
38 | /* Get nlink_t. */ | ||
39 | #include <sys/types.h> | ||
40 | |||
41 | /* Get struct timespec. */ | ||
42 | #include <time.h> | ||
43 | |||
44 | /* The include_next requires a split double-inclusion guard. */ | ||
45 | #@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ | ||
46 | |||
47 | #ifndef _GL_SYS_STAT_H | ||
48 | #define _GL_SYS_STAT_H | ||
49 | |||
50 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
51 | |||
52 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
53 | |||
54 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
55 | |||
56 | /* Before doing "#define mkdir rpl_mkdir" below, we need to include all | ||
57 | headers that may declare mkdir(). */ | ||
58 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
59 | # include <io.h> | ||
60 | #endif | ||
61 | |||
62 | #ifndef S_IFMT | ||
63 | # define S_IFMT 0170000 | ||
64 | #endif | ||
65 | |||
66 | #if STAT_MACROS_BROKEN | ||
67 | # undef S_ISBLK | ||
68 | # undef S_ISCHR | ||
69 | # undef S_ISDIR | ||
70 | # undef S_ISFIFO | ||
71 | # undef S_ISLNK | ||
72 | # undef S_ISNAM | ||
73 | # undef S_ISMPB | ||
74 | # undef S_ISMPC | ||
75 | # undef S_ISNWK | ||
76 | # undef S_ISREG | ||
77 | # undef S_ISSOCK | ||
78 | #endif | ||
79 | |||
80 | #ifndef S_ISBLK | ||
81 | # ifdef S_IFBLK | ||
82 | # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) | ||
83 | # else | ||
84 | # define S_ISBLK(m) 0 | ||
85 | # endif | ||
86 | #endif | ||
87 | |||
88 | #ifndef S_ISCHR | ||
89 | # ifdef S_IFCHR | ||
90 | # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) | ||
91 | # else | ||
92 | # define S_ISCHR(m) 0 | ||
93 | # endif | ||
94 | #endif | ||
95 | |||
96 | #ifndef S_ISDIR | ||
97 | # ifdef S_IFDIR | ||
98 | # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | ||
99 | # else | ||
100 | # define S_ISDIR(m) 0 | ||
101 | # endif | ||
102 | #endif | ||
103 | |||
104 | #ifndef S_ISDOOR /* Solaris 2.5 and up */ | ||
105 | # define S_ISDOOR(m) 0 | ||
106 | #endif | ||
107 | |||
108 | #ifndef S_ISFIFO | ||
109 | # ifdef S_IFIFO | ||
110 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) | ||
111 | # else | ||
112 | # define S_ISFIFO(m) 0 | ||
113 | # endif | ||
114 | #endif | ||
115 | |||
116 | #ifndef S_ISLNK | ||
117 | # ifdef S_IFLNK | ||
118 | # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) | ||
119 | # else | ||
120 | # define S_ISLNK(m) 0 | ||
121 | # endif | ||
122 | #endif | ||
123 | |||
124 | #ifndef S_ISMPB /* V7 */ | ||
125 | # ifdef S_IFMPB | ||
126 | # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) | ||
127 | # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) | ||
128 | # else | ||
129 | # define S_ISMPB(m) 0 | ||
130 | # define S_ISMPC(m) 0 | ||
131 | # endif | ||
132 | #endif | ||
133 | |||
134 | #ifndef S_ISNAM /* Xenix */ | ||
135 | # ifdef S_IFNAM | ||
136 | # define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM) | ||
137 | # else | ||
138 | # define S_ISNAM(m) 0 | ||
139 | # endif | ||
140 | #endif | ||
141 | |||
142 | #ifndef S_ISNWK /* HP/UX */ | ||
143 | # ifdef S_IFNWK | ||
144 | # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) | ||
145 | # else | ||
146 | # define S_ISNWK(m) 0 | ||
147 | # endif | ||
148 | #endif | ||
149 | |||
150 | #ifndef S_ISPORT /* Solaris 10 and up */ | ||
151 | # define S_ISPORT(m) 0 | ||
152 | #endif | ||
153 | |||
154 | #ifndef S_ISREG | ||
155 | # ifdef S_IFREG | ||
156 | # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | ||
157 | # else | ||
158 | # define S_ISREG(m) 0 | ||
159 | # endif | ||
160 | #endif | ||
161 | |||
162 | #ifndef S_ISSOCK | ||
163 | # ifdef S_IFSOCK | ||
164 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) | ||
165 | # else | ||
166 | # define S_ISSOCK(m) 0 | ||
167 | # endif | ||
168 | #endif | ||
169 | |||
170 | |||
171 | #ifndef S_TYPEISMQ | ||
172 | # define S_TYPEISMQ(p) 0 | ||
173 | #endif | ||
174 | |||
175 | #ifndef S_TYPEISTMO | ||
176 | # define S_TYPEISTMO(p) 0 | ||
177 | #endif | ||
178 | |||
179 | |||
180 | #ifndef S_TYPEISSEM | ||
181 | # ifdef S_INSEM | ||
182 | # define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM) | ||
183 | # else | ||
184 | # define S_TYPEISSEM(p) 0 | ||
185 | # endif | ||
186 | #endif | ||
187 | |||
188 | #ifndef S_TYPEISSHM | ||
189 | # ifdef S_INSHD | ||
190 | # define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD) | ||
191 | # else | ||
192 | # define S_TYPEISSHM(p) 0 | ||
193 | # endif | ||
194 | #endif | ||
195 | |||
196 | /* high performance ("contiguous data") */ | ||
197 | #ifndef S_ISCTG | ||
198 | # define S_ISCTG(p) 0 | ||
199 | #endif | ||
200 | |||
201 | /* Cray DMF (data migration facility): off line, with data */ | ||
202 | #ifndef S_ISOFD | ||
203 | # define S_ISOFD(p) 0 | ||
204 | #endif | ||
205 | |||
206 | /* Cray DMF (data migration facility): off line, with no data */ | ||
207 | #ifndef S_ISOFL | ||
208 | # define S_ISOFL(p) 0 | ||
209 | #endif | ||
210 | |||
211 | /* 4.4BSD whiteout */ | ||
212 | #ifndef S_ISWHT | ||
213 | # define S_ISWHT(m) 0 | ||
214 | #endif | ||
215 | |||
216 | /* If any of the following are undefined, | ||
217 | define them to their de facto standard values. */ | ||
218 | #if !S_ISUID | ||
219 | # define S_ISUID 04000 | ||
220 | #endif | ||
221 | #if !S_ISGID | ||
222 | # define S_ISGID 02000 | ||
223 | #endif | ||
224 | |||
225 | /* S_ISVTX is a common extension to POSIX. */ | ||
226 | #ifndef S_ISVTX | ||
227 | # define S_ISVTX 01000 | ||
228 | #endif | ||
229 | |||
230 | #if !S_IRUSR && S_IREAD | ||
231 | # define S_IRUSR S_IREAD | ||
232 | #endif | ||
233 | #if !S_IRUSR | ||
234 | # define S_IRUSR 00400 | ||
235 | #endif | ||
236 | #if !S_IRGRP | ||
237 | # define S_IRGRP (S_IRUSR >> 3) | ||
238 | #endif | ||
239 | #if !S_IROTH | ||
240 | # define S_IROTH (S_IRUSR >> 6) | ||
241 | #endif | ||
242 | |||
243 | #if !S_IWUSR && S_IWRITE | ||
244 | # define S_IWUSR S_IWRITE | ||
245 | #endif | ||
246 | #if !S_IWUSR | ||
247 | # define S_IWUSR 00200 | ||
248 | #endif | ||
249 | #if !S_IWGRP | ||
250 | # define S_IWGRP (S_IWUSR >> 3) | ||
251 | #endif | ||
252 | #if !S_IWOTH | ||
253 | # define S_IWOTH (S_IWUSR >> 6) | ||
254 | #endif | ||
255 | |||
256 | #if !S_IXUSR && S_IEXEC | ||
257 | # define S_IXUSR S_IEXEC | ||
258 | #endif | ||
259 | #if !S_IXUSR | ||
260 | # define S_IXUSR 00100 | ||
261 | #endif | ||
262 | #if !S_IXGRP | ||
263 | # define S_IXGRP (S_IXUSR >> 3) | ||
264 | #endif | ||
265 | #if !S_IXOTH | ||
266 | # define S_IXOTH (S_IXUSR >> 6) | ||
267 | #endif | ||
268 | |||
269 | #if !S_IRWXU | ||
270 | # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) | ||
271 | #endif | ||
272 | #if !S_IRWXG | ||
273 | # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) | ||
274 | #endif | ||
275 | #if !S_IRWXO | ||
276 | # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) | ||
277 | #endif | ||
278 | |||
279 | /* S_IXUGO is a common extension to POSIX. */ | ||
280 | #if !S_IXUGO | ||
281 | # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) | ||
282 | #endif | ||
283 | |||
284 | #ifndef S_IRWXUGO | ||
285 | # define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) | ||
286 | #endif | ||
287 | |||
288 | /* Macros for futimens and utimensat. */ | ||
289 | #ifndef UTIME_NOW | ||
290 | # define UTIME_NOW (-1) | ||
291 | # define UTIME_OMIT (-2) | ||
292 | #endif | ||
293 | |||
294 | |||
295 | #if @GNULIB_FCHMODAT@ | ||
296 | # if !@HAVE_FCHMODAT@ | ||
297 | _GL_FUNCDECL_SYS (fchmodat, int, | ||
298 | (int fd, char const *file, mode_t mode, int flag) | ||
299 | _GL_ARG_NONNULL ((2))); | ||
300 | # endif | ||
301 | _GL_CXXALIAS_SYS (fchmodat, int, | ||
302 | (int fd, char const *file, mode_t mode, int flag)); | ||
303 | _GL_CXXALIASWARN (fchmodat); | ||
304 | #elif defined GNULIB_POSIXCHECK | ||
305 | # undef fchmodat | ||
306 | # if HAVE_RAW_DECL_FCHMODAT | ||
307 | _GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - " | ||
308 | "use gnulib module openat for portability"); | ||
309 | # endif | ||
310 | #endif | ||
311 | |||
312 | |||
313 | #if @REPLACE_FSTAT@ | ||
314 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
315 | # define fstat rpl_fstat | ||
316 | # endif | ||
317 | _GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2))); | ||
318 | _GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf)); | ||
319 | #else | ||
320 | _GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf)); | ||
321 | #endif | ||
322 | _GL_CXXALIASWARN (fstat); | ||
323 | |||
324 | |||
325 | #if @GNULIB_FSTATAT@ | ||
326 | # if @REPLACE_FSTATAT@ | ||
327 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
328 | # undef fstatat | ||
329 | # define fstatat rpl_fstatat | ||
330 | # endif | ||
331 | _GL_FUNCDECL_RPL (fstatat, int, | ||
332 | (int fd, char const *name, struct stat *st, int flags) | ||
333 | _GL_ARG_NONNULL ((2, 3))); | ||
334 | _GL_CXXALIAS_RPL (fstatat, int, | ||
335 | (int fd, char const *name, struct stat *st, int flags)); | ||
336 | # else | ||
337 | # if !@HAVE_FSTATAT@ | ||
338 | _GL_FUNCDECL_SYS (fstatat, int, | ||
339 | (int fd, char const *name, struct stat *st, int flags) | ||
340 | _GL_ARG_NONNULL ((2, 3))); | ||
341 | # endif | ||
342 | _GL_CXXALIAS_SYS (fstatat, int, | ||
343 | (int fd, char const *name, struct stat *st, int flags)); | ||
344 | # endif | ||
345 | _GL_CXXALIASWARN (fstatat); | ||
346 | #elif defined GNULIB_POSIXCHECK | ||
347 | # undef fstatat | ||
348 | # if HAVE_RAW_DECL_FSTATAT | ||
349 | _GL_WARN_ON_USE (fstatat, "fstatat is not portable - " | ||
350 | "use gnulib module openat for portability"); | ||
351 | # endif | ||
352 | #endif | ||
353 | |||
354 | |||
355 | #if @GNULIB_FUTIMENS@ | ||
356 | # if @REPLACE_FUTIMENS@ | ||
357 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
358 | # undef futimens | ||
359 | # define futimens rpl_futimens | ||
360 | # endif | ||
361 | _GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2])); | ||
362 | _GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2])); | ||
363 | # else | ||
364 | # if !@HAVE_FUTIMENS@ | ||
365 | _GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2])); | ||
366 | # endif | ||
367 | _GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2])); | ||
368 | # endif | ||
369 | _GL_CXXALIASWARN (futimens); | ||
370 | #elif defined GNULIB_POSIXCHECK | ||
371 | # undef futimens | ||
372 | # if HAVE_RAW_DECL_FUTIMENS | ||
373 | _GL_WARN_ON_USE (futimens, "futimens is not portable - " | ||
374 | "use gnulib module futimens for portability"); | ||
375 | # endif | ||
376 | #endif | ||
377 | |||
378 | |||
379 | #if @GNULIB_LCHMOD@ | ||
380 | /* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME | ||
381 | denotes a symbolic link. */ | ||
382 | # if !@HAVE_LCHMOD@ | ||
383 | /* The lchmod replacement follows symbolic links. Callers should take | ||
384 | this into account; lchmod should be applied only to arguments that | ||
385 | are known to not be symbolic links. On hosts that lack lchmod, | ||
386 | this can lead to race conditions between the check and the | ||
387 | invocation of lchmod, but we know of no workarounds that are | ||
388 | reliable in general. You might try requesting support for lchmod | ||
389 | from your operating system supplier. */ | ||
390 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
391 | # define lchmod chmod | ||
392 | # endif | ||
393 | /* Need to cast, because on mingw, the second parameter of chmod is | ||
394 | int mode. */ | ||
395 | _GL_CXXALIAS_RPL_CAST_1 (lchmod, chmod, int, | ||
396 | (const char *filename, mode_t mode)); | ||
397 | # else | ||
398 | # if 0 /* assume already declared */ | ||
399 | _GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode) | ||
400 | _GL_ARG_NONNULL ((1))); | ||
401 | # endif | ||
402 | _GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode)); | ||
403 | # endif | ||
404 | # if @HAVE_LCHMOD@ | ||
405 | _GL_CXXALIASWARN (lchmod); | ||
406 | # endif | ||
407 | #elif defined GNULIB_POSIXCHECK | ||
408 | # undef lchmod | ||
409 | # if HAVE_RAW_DECL_LCHMOD | ||
410 | _GL_WARN_ON_USE (lchmod, "lchmod is unportable - " | ||
411 | "use gnulib module lchmod for portability"); | ||
412 | # endif | ||
413 | #endif | ||
414 | |||
415 | |||
416 | #if @GNULIB_LSTAT@ | ||
417 | # if ! @HAVE_LSTAT@ | ||
418 | /* mingw does not support symlinks, therefore it does not have lstat. But | ||
419 | without links, stat does just fine. */ | ||
420 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
421 | # define lstat stat | ||
422 | # endif | ||
423 | _GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf)); | ||
424 | # elif @REPLACE_LSTAT@ | ||
425 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
426 | # undef lstat | ||
427 | # define lstat rpl_lstat | ||
428 | # endif | ||
429 | _GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf) | ||
430 | _GL_ARG_NONNULL ((1, 2))); | ||
431 | _GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf)); | ||
432 | # else | ||
433 | _GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf)); | ||
434 | # endif | ||
435 | # if @HAVE_LSTAT@ | ||
436 | _GL_CXXALIASWARN (lstat); | ||
437 | # endif | ||
438 | #elif defined GNULIB_POSIXCHECK | ||
439 | # undef lstat | ||
440 | # if HAVE_RAW_DECL_LSTAT | ||
441 | _GL_WARN_ON_USE (lstat, "lstat is unportable - " | ||
442 | "use gnulib module lstat for portability"); | ||
443 | # endif | ||
444 | #endif | ||
445 | |||
446 | |||
447 | #if @REPLACE_MKDIR@ | ||
448 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
449 | # undef mkdir | ||
450 | # define mkdir rpl_mkdir | ||
451 | # endif | ||
452 | _GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode) | ||
453 | _GL_ARG_NONNULL ((1))); | ||
454 | _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); | ||
455 | #else | ||
456 | /* mingw's _mkdir() function has 1 argument, but we pass 2 arguments. | ||
457 | Additionally, it declares _mkdir (and depending on compile flags, an | ||
458 | alias mkdir), only in the nonstandard <io.h>, which is included above. */ | ||
459 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
460 | |||
461 | static inline int | ||
462 | rpl_mkdir (char const *name, mode_t mode) | ||
463 | { | ||
464 | return _mkdir (name); | ||
465 | } | ||
466 | |||
467 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
468 | # define mkdir rpl_mkdir | ||
469 | # endif | ||
470 | _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); | ||
471 | # else | ||
472 | _GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode)); | ||
473 | # endif | ||
474 | #endif | ||
475 | _GL_CXXALIASWARN (mkdir); | ||
476 | |||
477 | |||
478 | #if @GNULIB_MKDIRAT@ | ||
479 | # if !@HAVE_MKDIRAT@ | ||
480 | _GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode) | ||
481 | _GL_ARG_NONNULL ((2))); | ||
482 | # endif | ||
483 | _GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)); | ||
484 | _GL_CXXALIASWARN (mkdirat); | ||
485 | #elif defined GNULIB_POSIXCHECK | ||
486 | # undef mkdirat | ||
487 | # if HAVE_RAW_DECL_MKDIRAT | ||
488 | _GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - " | ||
489 | "use gnulib module openat for portability"); | ||
490 | # endif | ||
491 | #endif | ||
492 | |||
493 | |||
494 | #if @GNULIB_MKFIFO@ | ||
495 | # if @REPLACE_MKFIFO@ | ||
496 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
497 | # undef mkfifo | ||
498 | # define mkfifo rpl_mkfifo | ||
499 | # endif | ||
500 | _GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode) | ||
501 | _GL_ARG_NONNULL ((1))); | ||
502 | _GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode)); | ||
503 | # else | ||
504 | # if !@HAVE_MKFIFO@ | ||
505 | _GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode) | ||
506 | _GL_ARG_NONNULL ((1))); | ||
507 | # endif | ||
508 | _GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode)); | ||
509 | # endif | ||
510 | _GL_CXXALIASWARN (mkfifo); | ||
511 | #elif defined GNULIB_POSIXCHECK | ||
512 | # undef mkfifo | ||
513 | # if HAVE_RAW_DECL_MKFIFO | ||
514 | _GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - " | ||
515 | "use gnulib module mkfifo for portability"); | ||
516 | # endif | ||
517 | #endif | ||
518 | |||
519 | |||
520 | #if @GNULIB_MKFIFOAT@ | ||
521 | # if !@HAVE_MKFIFOAT@ | ||
522 | _GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode) | ||
523 | _GL_ARG_NONNULL ((2))); | ||
524 | # endif | ||
525 | _GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)); | ||
526 | _GL_CXXALIASWARN (mkfifoat); | ||
527 | #elif defined GNULIB_POSIXCHECK | ||
528 | # undef mkfifoat | ||
529 | # if HAVE_RAW_DECL_MKFIFOAT | ||
530 | _GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - " | ||
531 | "use gnulib module mkfifoat for portability"); | ||
532 | # endif | ||
533 | #endif | ||
534 | |||
535 | |||
536 | #if @GNULIB_MKNOD@ | ||
537 | # if @REPLACE_MKNOD@ | ||
538 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
539 | # undef mknod | ||
540 | # define mknod rpl_mknod | ||
541 | # endif | ||
542 | _GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev) | ||
543 | _GL_ARG_NONNULL ((1))); | ||
544 | _GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)); | ||
545 | # else | ||
546 | # if !@HAVE_MKNOD@ | ||
547 | _GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev) | ||
548 | _GL_ARG_NONNULL ((1))); | ||
549 | # endif | ||
550 | _GL_CXXALIAS_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev)); | ||
551 | # endif | ||
552 | _GL_CXXALIASWARN (mknod); | ||
553 | #elif defined GNULIB_POSIXCHECK | ||
554 | # undef mknod | ||
555 | # if HAVE_RAW_DECL_MKNOD | ||
556 | _GL_WARN_ON_USE (mknod, "mknod is not portable - " | ||
557 | "use gnulib module mknod for portability"); | ||
558 | # endif | ||
559 | #endif | ||
560 | |||
561 | |||
562 | #if @GNULIB_MKNODAT@ | ||
563 | # if !@HAVE_MKNODAT@ | ||
564 | _GL_FUNCDECL_SYS (mknodat, int, | ||
565 | (int fd, char const *file, mode_t mode, dev_t dev) | ||
566 | _GL_ARG_NONNULL ((2))); | ||
567 | # endif | ||
568 | _GL_CXXALIAS_SYS (mknodat, int, | ||
569 | (int fd, char const *file, mode_t mode, dev_t dev)); | ||
570 | _GL_CXXALIASWARN (mknodat); | ||
571 | #elif defined GNULIB_POSIXCHECK | ||
572 | # undef mknodat | ||
573 | # if HAVE_RAW_DECL_MKNODAT | ||
574 | _GL_WARN_ON_USE (mknodat, "mknodat is not portable - " | ||
575 | "use gnulib module mkfifoat for portability"); | ||
576 | # endif | ||
577 | #endif | ||
578 | |||
579 | |||
580 | #if @GNULIB_STAT@ | ||
581 | # if @REPLACE_STAT@ | ||
582 | /* We can't use the object-like #define stat rpl_stat, because of | ||
583 | struct stat. This means that rpl_stat will not be used if the user | ||
584 | does (stat)(a,b). Oh well. */ | ||
585 | # undef stat | ||
586 | # ifdef _LARGE_FILES | ||
587 | /* With _LARGE_FILES defined, AIX (only) defines stat to stat64, | ||
588 | so we have to replace stat64() instead of stat(). */ | ||
589 | # define stat stat64 | ||
590 | # undef stat64 | ||
591 | # define stat64(name, st) rpl_stat (name, st) | ||
592 | # else /* !_LARGE_FILES */ | ||
593 | # define stat(name, st) rpl_stat (name, st) | ||
594 | # endif /* !_LARGE_FILES */ | ||
595 | _GL_EXTERN_C int stat (const char *name, struct stat *buf) _GL_ARG_NONNULL ((1, 2)); | ||
596 | # endif | ||
597 | #elif defined GNULIB_POSIXCHECK | ||
598 | # undef stat | ||
599 | # if HAVE_RAW_DECL_STAT | ||
600 | _GL_WARN_ON_USE (stat, "stat is unportable - " | ||
601 | "use gnulib module stat for portability"); | ||
602 | # endif | ||
603 | #endif | ||
604 | |||
605 | |||
606 | #if @GNULIB_UTIMENSAT@ | ||
607 | # if @REPLACE_UTIMENSAT@ | ||
608 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
609 | # undef utimensat | ||
610 | # define utimensat rpl_utimensat | ||
611 | # endif | ||
612 | _GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name, | ||
613 | struct timespec const times[2], int flag) | ||
614 | _GL_ARG_NONNULL ((2))); | ||
615 | _GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name, | ||
616 | struct timespec const times[2], int flag)); | ||
617 | # else | ||
618 | # if !@HAVE_UTIMENSAT@ | ||
619 | _GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name, | ||
620 | struct timespec const times[2], int flag) | ||
621 | _GL_ARG_NONNULL ((2))); | ||
622 | # endif | ||
623 | _GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name, | ||
624 | struct timespec const times[2], int flag)); | ||
625 | # endif | ||
626 | _GL_CXXALIASWARN (utimensat); | ||
627 | #elif defined GNULIB_POSIXCHECK | ||
628 | # undef utimensat | ||
629 | # if HAVE_RAW_DECL_UTIMENSAT | ||
630 | _GL_WARN_ON_USE (utimensat, "utimensat is not portable - " | ||
631 | "use gnulib module utimensat for portability"); | ||
632 | # endif | ||
633 | #endif | ||
634 | |||
635 | |||
636 | #endif /* _GL_SYS_STAT_H */ | ||
637 | #endif /* _GL_SYS_STAT_H */ | ||
638 | #endif | ||
diff --git a/gl/time.in.h b/gl/time.in.h index dec37e85..8e364feb 100644 --- a/gl/time.in.h +++ b/gl/time.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A more-standard <time.h>. | 1 | /* A more-standard <time.h>. |
2 | 2 | ||
3 | Copyright (C) 2007-2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2007-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -37,9 +37,14 @@ | |||
37 | 37 | ||
38 | # @INCLUDE_NEXT@ @NEXT_TIME_H@ | 38 | # @INCLUDE_NEXT@ @NEXT_TIME_H@ |
39 | 39 | ||
40 | # ifdef __cplusplus | 40 | /* NetBSD 5.0 mis-defines NULL. */ |
41 | extern "C" { | 41 | # include <stddef.h> |
42 | # endif | 42 | |
43 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
44 | |||
45 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
46 | |||
47 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
43 | 48 | ||
44 | /* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). | 49 | /* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). |
45 | Or they define it with the wrong member names or define it in <sys/time.h> | 50 | Or they define it with the wrong member names or define it in <sys/time.h> |
@@ -48,6 +53,11 @@ extern "C" { | |||
48 | # if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ | 53 | # if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ |
49 | # include <sys/time.h> | 54 | # include <sys/time.h> |
50 | # else | 55 | # else |
56 | |||
57 | # ifdef __cplusplus | ||
58 | extern "C" { | ||
59 | # endif | ||
60 | |||
51 | # undef timespec | 61 | # undef timespec |
52 | # define timespec rpl_timespec | 62 | # define timespec rpl_timespec |
53 | struct timespec | 63 | struct timespec |
@@ -55,64 +65,155 @@ struct timespec | |||
55 | time_t tv_sec; | 65 | time_t tv_sec; |
56 | long int tv_nsec; | 66 | long int tv_nsec; |
57 | }; | 67 | }; |
68 | |||
69 | # ifdef __cplusplus | ||
70 | } | ||
71 | # endif | ||
72 | |||
58 | # endif | 73 | # endif |
59 | # endif | 74 | # endif |
60 | 75 | ||
61 | /* Sleep for at least RQTP seconds unless interrupted, If interrupted, | 76 | /* Sleep for at least RQTP seconds unless interrupted, If interrupted, |
62 | return -1 and store the remaining time into RMTP. See | 77 | return -1 and store the remaining time into RMTP. See |
63 | <http://www.opengroup.org/susv3xsh/nanosleep.html>. */ | 78 | <http://www.opengroup.org/susv3xsh/nanosleep.html>. */ |
64 | # if @REPLACE_NANOSLEEP@ | 79 | # if @GNULIB_NANOSLEEP@ |
65 | # define nanosleep rpl_nanosleep | 80 | # if @REPLACE_NANOSLEEP@ |
66 | int nanosleep (struct timespec const *__rqtp, struct timespec *__rmtp); | 81 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
82 | # define nanosleep rpl_nanosleep | ||
83 | # endif | ||
84 | _GL_FUNCDECL_RPL (nanosleep, int, | ||
85 | (struct timespec const *__rqtp, struct timespec *__rmtp) | ||
86 | _GL_ARG_NONNULL ((1))); | ||
87 | _GL_CXXALIAS_RPL (nanosleep, int, | ||
88 | (struct timespec const *__rqtp, struct timespec *__rmtp)); | ||
89 | # else | ||
90 | # if ! @HAVE_NANOSLEEP@ | ||
91 | _GL_FUNCDECL_SYS (nanosleep, int, | ||
92 | (struct timespec const *__rqtp, struct timespec *__rmtp) | ||
93 | _GL_ARG_NONNULL ((1))); | ||
94 | # endif | ||
95 | _GL_CXXALIAS_SYS (nanosleep, int, | ||
96 | (struct timespec const *__rqtp, struct timespec *__rmtp)); | ||
97 | # endif | ||
98 | _GL_CXXALIASWARN (nanosleep); | ||
99 | # endif | ||
100 | |||
101 | /* Return the 'time_t' representation of TP and normalize TP. */ | ||
102 | # if @GNULIB_MKTIME@ | ||
103 | # if @REPLACE_MKTIME@ | ||
104 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
105 | # define mktime rpl_mktime | ||
106 | # endif | ||
107 | _GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1))); | ||
108 | _GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp)); | ||
109 | # else | ||
110 | _GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp)); | ||
111 | # endif | ||
112 | _GL_CXXALIASWARN (mktime); | ||
67 | # endif | 113 | # endif |
68 | 114 | ||
69 | /* Convert TIMER to RESULT, assuming local time and UTC respectively. See | 115 | /* Convert TIMER to RESULT, assuming local time and UTC respectively. See |
70 | <http://www.opengroup.org/susv3xsh/localtime_r.html> and | 116 | <http://www.opengroup.org/susv3xsh/localtime_r.html> and |
71 | <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */ | 117 | <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */ |
72 | # if @REPLACE_LOCALTIME_R@ | 118 | # if @GNULIB_TIME_R@ |
73 | # undef localtime_r | 119 | # if @REPLACE_LOCALTIME_R@ |
74 | # define localtime_r rpl_localtime_r | 120 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
75 | # undef gmtime_r | 121 | # undef localtime_r |
76 | # define gmtime_r rpl_gmtime_r | 122 | # define localtime_r rpl_localtime_r |
77 | struct tm *localtime_r (time_t const *restrict __timer, | 123 | # endif |
78 | struct tm *restrict __result); | 124 | _GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, |
79 | struct tm *gmtime_r (time_t const *restrict __timer, | 125 | struct tm *restrict __result) |
80 | struct tm *restrict __result); | 126 | _GL_ARG_NONNULL ((1, 2))); |
127 | _GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, | ||
128 | struct tm *restrict __result)); | ||
129 | # else | ||
130 | # if ! @HAVE_LOCALTIME_R@ | ||
131 | _GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, | ||
132 | struct tm *restrict __result) | ||
133 | _GL_ARG_NONNULL ((1, 2))); | ||
134 | # endif | ||
135 | _GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, | ||
136 | struct tm *restrict __result)); | ||
137 | # endif | ||
138 | _GL_CXXALIASWARN (localtime_r); | ||
139 | # if @REPLACE_LOCALTIME_R@ | ||
140 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
141 | # undef gmtime_r | ||
142 | # define gmtime_r rpl_gmtime_r | ||
143 | # endif | ||
144 | _GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, | ||
145 | struct tm *restrict __result) | ||
146 | _GL_ARG_NONNULL ((1, 2))); | ||
147 | _GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, | ||
148 | struct tm *restrict __result)); | ||
149 | # else | ||
150 | # if ! @HAVE_LOCALTIME_R@ | ||
151 | _GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, | ||
152 | struct tm *restrict __result) | ||
153 | _GL_ARG_NONNULL ((1, 2))); | ||
154 | # endif | ||
155 | _GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, | ||
156 | struct tm *restrict __result)); | ||
157 | # endif | ||
158 | _GL_CXXALIASWARN (gmtime_r); | ||
81 | # endif | 159 | # endif |
82 | 160 | ||
83 | /* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store | 161 | /* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store |
84 | the resulting broken-down time into TM. See | 162 | the resulting broken-down time into TM. See |
85 | <http://www.opengroup.org/susv3xsh/strptime.html>. */ | 163 | <http://www.opengroup.org/susv3xsh/strptime.html>. */ |
86 | # if @REPLACE_STRPTIME@ | 164 | # if @GNULIB_STRPTIME@ |
87 | # undef strptime | 165 | # if ! @HAVE_STRPTIME@ |
88 | # define strptime rpl_strptime | 166 | _GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf, |
89 | char *strptime (char const *restrict __buf, char const *restrict __format, | 167 | char const *restrict __format, |
90 | struct tm *restrict __tm); | 168 | struct tm *restrict __tm) |
169 | _GL_ARG_NONNULL ((1, 2, 3))); | ||
170 | # endif | ||
171 | _GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf, | ||
172 | char const *restrict __format, | ||
173 | struct tm *restrict __tm)); | ||
174 | _GL_CXXALIASWARN (strptime); | ||
91 | # endif | 175 | # endif |
92 | 176 | ||
93 | /* Convert TM to a time_t value, assuming UTC. */ | 177 | /* Convert TM to a time_t value, assuming UTC. */ |
94 | # if @REPLACE_TIMEGM@ | 178 | # if @GNULIB_TIMEGM@ |
95 | # undef timegm | 179 | # if @REPLACE_TIMEGM@ |
96 | # define timegm rpl_timegm | 180 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
97 | time_t timegm (struct tm *__tm); | 181 | # undef timegm |
182 | # define timegm rpl_timegm | ||
183 | # endif | ||
184 | _GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); | ||
185 | _GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm)); | ||
186 | # else | ||
187 | # if ! @HAVE_TIMEGM@ | ||
188 | _GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); | ||
189 | # endif | ||
190 | _GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm)); | ||
191 | # endif | ||
192 | _GL_CXXALIASWARN (timegm); | ||
98 | # endif | 193 | # endif |
99 | 194 | ||
100 | /* Encourage applications to avoid unsafe functions that can overrun | 195 | /* Encourage applications to avoid unsafe functions that can overrun |
101 | buffers when given outlandish struct tm values. Portable | 196 | buffers when given outlandish struct tm values. Portable |
102 | applications should use strftime (or even sprintf) instead. */ | 197 | applications should use strftime (or even sprintf) instead. */ |
103 | # if GNULIB_PORTCHECK | 198 | # if defined GNULIB_POSIXCHECK |
104 | # undef asctime | 199 | # undef asctime |
105 | # define asctime eschew_asctime | 200 | _GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - " |
201 | "better use strftime (or even sprintf) instead"); | ||
202 | # endif | ||
203 | # if defined GNULIB_POSIXCHECK | ||
106 | # undef asctime_r | 204 | # undef asctime_r |
107 | # define asctime_r eschew_asctime_r | 205 | _GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - " |
206 | "better use strftime (or even sprintf) instead"); | ||
207 | # endif | ||
208 | # if defined GNULIB_POSIXCHECK | ||
108 | # undef ctime | 209 | # undef ctime |
109 | # define ctime eschew_ctime | 210 | _GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - " |
110 | # undef ctime_r | 211 | "better use strftime (or even sprintf) instead"); |
111 | # define ctime_r eschew_ctime_r | ||
112 | # endif | 212 | # endif |
113 | 213 | # if defined GNULIB_POSIXCHECK | |
114 | # ifdef __cplusplus | 214 | # undef ctime_r |
115 | } | 215 | _GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - " |
216 | "better use strftime (or even sprintf) instead"); | ||
116 | # endif | 217 | # endif |
117 | 218 | ||
118 | #endif | 219 | #endif |
diff --git a/gl/time_r.c b/gl/time_r.c index d610e7fe..3b2b3e94 100644 --- a/gl/time_r.c +++ b/gl/time_r.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Reentrant time functions like localtime_r. | 1 | /* Reentrant time functions like localtime_r. |
2 | 2 | ||
3 | Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc. | 3 | Copyright (C) 2003, 2006-2007, 2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -22,8 +22,6 @@ | |||
22 | 22 | ||
23 | #include <time.h> | 23 | #include <time.h> |
24 | 24 | ||
25 | #include <string.h> | ||
26 | |||
27 | static struct tm * | 25 | static struct tm * |
28 | copy_tm_result (struct tm *dest, struct tm const *src) | 26 | copy_tm_result (struct tm *dest, struct tm const *src) |
29 | { | 27 | { |
diff --git a/gl/timegm.c b/gl/timegm.c index 057f6459..e484dddf 100644 --- a/gl/timegm.c +++ b/gl/timegm.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Convert UTC calendar time to simple time. Like mktime but assumes UTC. | 1 | /* Convert UTC calendar time to simple time. Like mktime but assumes UTC. |
2 | 2 | ||
3 | Copyright (C) 1994, 1997, 2003, 2004, 2006, 2007 Free Software | 3 | Copyright (C) 1994, 1997, 2003, 2004, 2006, 2007, 2009, 2010 Free Software |
4 | Foundation, Inc. This file is part of the GNU C Library. | 4 | Foundation, Inc. This file is part of the GNU C Library. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 6 | This program is free software; you can redistribute it and/or modify |
@@ -27,9 +27,7 @@ | |||
27 | # undef __gmtime_r | 27 | # undef __gmtime_r |
28 | # define __gmtime_r gmtime_r | 28 | # define __gmtime_r gmtime_r |
29 | # define __mktime_internal mktime_internal | 29 | # define __mktime_internal mktime_internal |
30 | time_t __mktime_internal (struct tm *, | 30 | # include "mktime-internal.h" |
31 | struct tm * (*) (time_t const *, struct tm *), | ||
32 | time_t *); | ||
33 | #endif | 31 | #endif |
34 | 32 | ||
35 | time_t | 33 | time_t |
diff --git a/gl/unistd--.h b/gl/unistd--.h index 1a7fd785..5283d2c5 100644 --- a/gl/unistd--.h +++ b/gl/unistd--.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Like unistd.h, but redefine some names to avoid glitches. | 1 | /* Like unistd.h, but redefine some names to avoid glitches. |
2 | 2 | ||
3 | Copyright (C) 2005 Free Software Foundation, Inc. | 3 | Copyright (C) 2005, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -25,3 +25,8 @@ | |||
25 | 25 | ||
26 | #undef pipe | 26 | #undef pipe |
27 | #define pipe pipe_safer | 27 | #define pipe pipe_safer |
28 | |||
29 | #if GNULIB_PIPE2_SAFER | ||
30 | # undef pipe2 | ||
31 | # define pipe2 pipe2_safer | ||
32 | #endif | ||
diff --git a/gl/unistd-safer.h b/gl/unistd-safer.h index 033e857d..190f1086 100644 --- a/gl/unistd-safer.h +++ b/gl/unistd-safer.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Invoke unistd-like functions, but avoid some glitches. | 1 | /* Invoke unistd-like functions, but avoid some glitches. |
2 | 2 | ||
3 | Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. | 3 | Copyright (C) 2001, 2003, 2005, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -15,8 +15,17 @@ | |||
15 | You should have received a copy of the GNU General Public License | 15 | You should have received a copy of the GNU General Public License |
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
17 | 17 | ||
18 | /* Written by Paul Eggert. */ | 18 | /* Written by Paul Eggert and Eric Blake. */ |
19 | 19 | ||
20 | int dup_safer (int); | 20 | int dup_safer (int); |
21 | int fd_safer (int); | 21 | int fd_safer (int); |
22 | int pipe_safer (int[2]); | 22 | int pipe_safer (int[2]); |
23 | |||
24 | #if GNULIB_FD_SAFER_FLAG | ||
25 | int dup_safer_flag (int, int); | ||
26 | int fd_safer_flag (int, int); | ||
27 | #endif | ||
28 | |||
29 | #if GNULIB_PIPE2_SAFER | ||
30 | int pipe2_safer (int[2], int); | ||
31 | #endif | ||
diff --git a/gl/unistd.in.h b/gl/unistd.in.h index fa8d84a3..45fc5dcf 100644 --- a/gl/unistd.in.h +++ b/gl/unistd.in.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Substitute for and wrapper around <unistd.h>. | 1 | /* Substitute for and wrapper around <unistd.h>. |
2 | Copyright (C) 2003-2009 Free Software Foundation, Inc. | 2 | Copyright (C) 2003-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -15,77 +15,171 @@ | |||
15 | along with this program; if not, write to the Free Software Foundation, | 15 | along with this program; if not, write to the Free Software Foundation, |
16 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | 16 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
17 | 17 | ||
18 | #ifndef _GL_UNISTD_H | ||
19 | |||
20 | #if __GNUC__ >= 3 | 18 | #if __GNUC__ >= 3 |
21 | @PRAGMA_SYSTEM_HEADER@ | 19 | @PRAGMA_SYSTEM_HEADER@ |
22 | #endif | 20 | #endif |
23 | 21 | ||
22 | /* Special invocation convention: | ||
23 | - On mingw, several headers, including <winsock2.h>, include <unistd.h>, | ||
24 | but we need to ensure that both the system <unistd.h> and <winsock2.h> | ||
25 | are completely included before we replace gethostname. */ | ||
26 | #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \ | ||
27 | && !defined _GL_WINSOCK2_H_WITNESS && defined _WINSOCK2_H | ||
28 | /* <unistd.h> is being indirectly included for the first time from | ||
29 | <winsock2.h>; avoid declaring any overrides. */ | ||
30 | # if @HAVE_UNISTD_H@ | ||
31 | # @INCLUDE_NEXT@ @NEXT_UNISTD_H@ | ||
32 | # else | ||
33 | # error unexpected; report this to bug-gnulib@gnu.org | ||
34 | # endif | ||
35 | # define _GL_WINSOCK2_H_WITNESS | ||
36 | |||
37 | /* Normal invocation. */ | ||
38 | #elif !defined _GL_UNISTD_H | ||
39 | |||
24 | /* The include_next requires a split double-inclusion guard. */ | 40 | /* The include_next requires a split double-inclusion guard. */ |
25 | #if @HAVE_UNISTD_H@ | 41 | #if @HAVE_UNISTD_H@ |
26 | # @INCLUDE_NEXT@ @NEXT_UNISTD_H@ | 42 | # @INCLUDE_NEXT@ @NEXT_UNISTD_H@ |
27 | #endif | 43 | #endif |
28 | 44 | ||
29 | #ifndef _GL_UNISTD_H | 45 | /* Get all possible declarations of gethostname(). */ |
46 | #if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \ | ||
47 | && !defined _GL_INCLUDING_WINSOCK2_H | ||
48 | # define _GL_INCLUDING_WINSOCK2_H | ||
49 | # include <winsock2.h> | ||
50 | # undef _GL_INCLUDING_WINSOCK2_H | ||
51 | #endif | ||
52 | |||
53 | #if !defined _GL_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H | ||
30 | #define _GL_UNISTD_H | 54 | #define _GL_UNISTD_H |
31 | 55 | ||
56 | /* NetBSD 5.0 mis-defines NULL. Also get size_t. */ | ||
57 | #include <stddef.h> | ||
58 | |||
32 | /* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */ | 59 | /* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */ |
33 | #if !(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) | 60 | /* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>. */ |
61 | /* But avoid namespace pollution on glibc systems. */ | ||
62 | #if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \ | ||
63 | || (@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK)) \ | ||
64 | && ! defined __GLIBC__ | ||
34 | # include <stdio.h> | 65 | # include <stdio.h> |
35 | #endif | 66 | #endif |
36 | 67 | ||
68 | /* Cygwin 1.7.1 declares unlinkat in <fcntl.h>, not in <unistd.h>. */ | ||
69 | /* But avoid namespace pollution on glibc systems. */ | ||
70 | #if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ | ||
71 | # include <fcntl.h> | ||
72 | #endif | ||
73 | |||
37 | /* mingw fails to declare _exit in <unistd.h>. */ | 74 | /* mingw fails to declare _exit in <unistd.h>. */ |
38 | /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */ | 75 | /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */ |
39 | #include <stdlib.h> | 76 | /* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>. */ |
77 | /* But avoid namespace pollution on glibc systems. */ | ||
78 | #ifndef __GLIBC__ | ||
79 | # include <stdlib.h> | ||
80 | #endif | ||
40 | 81 | ||
41 | #if @GNULIB_WRITE@ && @REPLACE_WRITE@ && @GNULIB_UNISTD_H_SIGPIPE@ | 82 | /* mingw declares getcwd in <io.h>, not in <unistd.h>. */ |
83 | #if ((@GNULIB_GETCWD@ || defined GNULIB_POSIXCHECK) \ | ||
84 | && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) | ||
85 | # include <io.h> | ||
86 | #endif | ||
87 | |||
88 | #if (@GNULIB_WRITE@ || @GNULIB_READLINK@ || @GNULIB_READLINKAT@ \ | ||
89 | || @GNULIB_PREAD@ || defined GNULIB_POSIXCHECK) | ||
42 | /* Get ssize_t. */ | 90 | /* Get ssize_t. */ |
43 | # include <sys/types.h> | 91 | # include <sys/types.h> |
44 | #endif | 92 | #endif |
45 | 93 | ||
94 | /* Get getopt(), optarg, optind, opterr, optopt. | ||
95 | But avoid namespace pollution on glibc systems. */ | ||
96 | #if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT | ||
97 | # include <getopt.h> | ||
98 | #endif | ||
99 | |||
100 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | ||
101 | |||
102 | /* The definition of _GL_ARG_NONNULL is copied here. */ | ||
103 | |||
104 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
105 | |||
106 | |||
46 | #if @GNULIB_GETHOSTNAME@ | 107 | #if @GNULIB_GETHOSTNAME@ |
47 | /* Get all possible declarations of gethostname(). */ | 108 | /* Get all possible declarations of gethostname(). */ |
48 | # if @UNISTD_H_HAVE_WINSOCK2_H@ | 109 | # if @UNISTD_H_HAVE_WINSOCK2_H@ |
49 | # include <winsock2.h> | ||
50 | # if !defined _GL_SYS_SOCKET_H | 110 | # if !defined _GL_SYS_SOCKET_H |
51 | # undef socket | 111 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
52 | # define socket socket_used_without_including_sys_socket_h | 112 | # undef socket |
53 | # undef connect | 113 | # define socket socket_used_without_including_sys_socket_h |
54 | # define connect connect_used_without_including_sys_socket_h | 114 | # undef connect |
55 | # undef accept | 115 | # define connect connect_used_without_including_sys_socket_h |
56 | # define accept accept_used_without_including_sys_socket_h | 116 | # undef accept |
57 | # undef bind | 117 | # define accept accept_used_without_including_sys_socket_h |
58 | # define bind bind_used_without_including_sys_socket_h | 118 | # undef bind |
59 | # undef getpeername | 119 | # define bind bind_used_without_including_sys_socket_h |
60 | # define getpeername getpeername_used_without_including_sys_socket_h | 120 | # undef getpeername |
61 | # undef getsockname | 121 | # define getpeername getpeername_used_without_including_sys_socket_h |
62 | # define getsockname getsockname_used_without_including_sys_socket_h | 122 | # undef getsockname |
63 | # undef getsockopt | 123 | # define getsockname getsockname_used_without_including_sys_socket_h |
64 | # define getsockopt getsockopt_used_without_including_sys_socket_h | 124 | # undef getsockopt |
65 | # undef listen | 125 | # define getsockopt getsockopt_used_without_including_sys_socket_h |
66 | # define listen listen_used_without_including_sys_socket_h | 126 | # undef listen |
67 | # undef recv | 127 | # define listen listen_used_without_including_sys_socket_h |
68 | # define recv recv_used_without_including_sys_socket_h | 128 | # undef recv |
69 | # undef send | 129 | # define recv recv_used_without_including_sys_socket_h |
70 | # define send send_used_without_including_sys_socket_h | 130 | # undef send |
71 | # undef recvfrom | 131 | # define send send_used_without_including_sys_socket_h |
72 | # define recvfrom recvfrom_used_without_including_sys_socket_h | 132 | # undef recvfrom |
73 | # undef sendto | 133 | # define recvfrom recvfrom_used_without_including_sys_socket_h |
74 | # define sendto sendto_used_without_including_sys_socket_h | 134 | # undef sendto |
75 | # undef setsockopt | 135 | # define sendto sendto_used_without_including_sys_socket_h |
76 | # define setsockopt setsockopt_used_without_including_sys_socket_h | 136 | # undef setsockopt |
77 | # undef shutdown | 137 | # define setsockopt setsockopt_used_without_including_sys_socket_h |
78 | # define shutdown shutdown_used_without_including_sys_socket_h | 138 | # undef shutdown |
139 | # define shutdown shutdown_used_without_including_sys_socket_h | ||
140 | # else | ||
141 | _GL_WARN_ON_USE (socket, | ||
142 | "socket() used without including <sys/socket.h>"); | ||
143 | _GL_WARN_ON_USE (connect, | ||
144 | "connect() used without including <sys/socket.h>"); | ||
145 | _GL_WARN_ON_USE (accept, | ||
146 | "accept() used without including <sys/socket.h>"); | ||
147 | _GL_WARN_ON_USE (bind, | ||
148 | "bind() used without including <sys/socket.h>"); | ||
149 | _GL_WARN_ON_USE (getpeername, | ||
150 | "getpeername() used without including <sys/socket.h>"); | ||
151 | _GL_WARN_ON_USE (getsockname, | ||
152 | "getsockname() used without including <sys/socket.h>"); | ||
153 | _GL_WARN_ON_USE (getsockopt, | ||
154 | "getsockopt() used without including <sys/socket.h>"); | ||
155 | _GL_WARN_ON_USE (listen, | ||
156 | "listen() used without including <sys/socket.h>"); | ||
157 | _GL_WARN_ON_USE (recv, | ||
158 | "recv() used without including <sys/socket.h>"); | ||
159 | _GL_WARN_ON_USE (send, | ||
160 | "send() used without including <sys/socket.h>"); | ||
161 | _GL_WARN_ON_USE (recvfrom, | ||
162 | "recvfrom() used without including <sys/socket.h>"); | ||
163 | _GL_WARN_ON_USE (sendto, | ||
164 | "sendto() used without including <sys/socket.h>"); | ||
165 | _GL_WARN_ON_USE (setsockopt, | ||
166 | "setsockopt() used without including <sys/socket.h>"); | ||
167 | _GL_WARN_ON_USE (shutdown, | ||
168 | "shutdown() used without including <sys/socket.h>"); | ||
169 | # endif | ||
79 | # endif | 170 | # endif |
80 | # if !defined _GL_SYS_SELECT_H | 171 | # if !defined _GL_SYS_SELECT_H |
81 | # undef select | 172 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
82 | # define select select_used_without_including_sys_select_h | 173 | # undef select |
174 | # define select select_used_without_including_sys_select_h | ||
175 | # else | ||
176 | _GL_WARN_ON_USE (select, | ||
177 | "select() used without including <sys/select.h>"); | ||
178 | # endif | ||
83 | # endif | 179 | # endif |
84 | # endif | 180 | # endif |
85 | #endif | 181 | #endif |
86 | 182 | ||
87 | /* The definition of GL_LINK_WARNING is copied here. */ | ||
88 | |||
89 | 183 | ||
90 | /* OS/2 EMX lacks these macros. */ | 184 | /* OS/2 EMX lacks these macros. */ |
91 | #ifndef STDIN_FILENO | 185 | #ifndef STDIN_FILENO |
@@ -98,72 +192,147 @@ | |||
98 | # define STDERR_FILENO 2 | 192 | # define STDERR_FILENO 2 |
99 | #endif | 193 | #endif |
100 | 194 | ||
195 | /* Ensure *_OK macros exist. */ | ||
196 | #ifndef F_OK | ||
197 | # define F_OK 0 | ||
198 | # define X_OK 1 | ||
199 | # define W_OK 2 | ||
200 | # define R_OK 4 | ||
201 | #endif | ||
202 | |||
203 | |||
101 | /* Declare overridden functions. */ | 204 | /* Declare overridden functions. */ |
102 | 205 | ||
103 | #ifdef __cplusplus | 206 | |
104 | extern "C" { | 207 | #if defined GNULIB_POSIXCHECK |
208 | /* The access() function is a security risk. */ | ||
209 | _GL_WARN_ON_USE (access, "the access function is a security risk - " | ||
210 | "use the gnulib module faccessat instead"); | ||
105 | #endif | 211 | #endif |
106 | 212 | ||
107 | 213 | ||
108 | #if @GNULIB_CHOWN@ | 214 | #if @GNULIB_CHOWN@ |
109 | # if @REPLACE_CHOWN@ | ||
110 | # ifndef REPLACE_CHOWN | ||
111 | # define REPLACE_CHOWN 1 | ||
112 | # endif | ||
113 | # if REPLACE_CHOWN | ||
114 | /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE | 215 | /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE |
115 | to GID (if GID is not -1). Follow symbolic links. | 216 | to GID (if GID is not -1). Follow symbolic links. |
116 | Return 0 if successful, otherwise -1 and errno set. | 217 | Return 0 if successful, otherwise -1 and errno set. |
117 | See the POSIX:2001 specification | 218 | See the POSIX:2001 specification |
118 | <http://www.opengroup.org/susv3xsh/chown.html>. */ | 219 | <http://www.opengroup.org/susv3xsh/chown.html>. */ |
220 | # if @REPLACE_CHOWN@ | ||
221 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
222 | # undef chown | ||
119 | # define chown rpl_chown | 223 | # define chown rpl_chown |
120 | extern int chown (const char *file, uid_t uid, gid_t gid); | ||
121 | # endif | 224 | # endif |
225 | _GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid) | ||
226 | _GL_ARG_NONNULL ((1))); | ||
227 | _GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)); | ||
228 | # else | ||
229 | # if !@HAVE_CHOWN@ | ||
230 | _GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid) | ||
231 | _GL_ARG_NONNULL ((1))); | ||
232 | # endif | ||
233 | _GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)); | ||
122 | # endif | 234 | # endif |
235 | _GL_CXXALIASWARN (chown); | ||
123 | #elif defined GNULIB_POSIXCHECK | 236 | #elif defined GNULIB_POSIXCHECK |
124 | # undef chown | 237 | # undef chown |
125 | # define chown(f,u,g) \ | 238 | # if HAVE_RAW_DECL_CHOWN |
126 | (GL_LINK_WARNING ("chown fails to follow symlinks on some systems and " \ | 239 | _GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and " |
127 | "doesn't treat a uid or gid of -1 on some systems - " \ | 240 | "doesn't treat a uid or gid of -1 on some systems - " |
128 | "use gnulib module chown for portability"), \ | 241 | "use gnulib module chown for portability"); |
129 | chown (f, u, g)) | 242 | # endif |
130 | #endif | 243 | #endif |
131 | 244 | ||
132 | 245 | ||
133 | #if @GNULIB_CLOSE@ | 246 | #if @GNULIB_CLOSE@ |
134 | # if @REPLACE_CLOSE@ | 247 | # if @REPLACE_CLOSE@ |
135 | /* Automatically included by modules that need a replacement for close. */ | 248 | /* Automatically included by modules that need a replacement for close. */ |
136 | # undef close | 249 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
137 | # define close rpl_close | 250 | # undef close |
138 | extern int close (int); | 251 | # define close rpl_close |
252 | # endif | ||
253 | _GL_FUNCDECL_RPL (close, int, (int fd)); | ||
254 | _GL_CXXALIAS_RPL (close, int, (int fd)); | ||
255 | # else | ||
256 | _GL_CXXALIAS_SYS (close, int, (int fd)); | ||
139 | # endif | 257 | # endif |
140 | #elif @UNISTD_H_HAVE_WINSOCK2_H@ | 258 | _GL_CXXALIASWARN (close); |
259 | #elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ | ||
141 | # undef close | 260 | # undef close |
142 | # define close close_used_without_requesting_gnulib_module_close | 261 | # define close close_used_without_requesting_gnulib_module_close |
143 | #elif defined GNULIB_POSIXCHECK | 262 | #elif defined GNULIB_POSIXCHECK |
144 | # undef close | 263 | # undef close |
145 | # define close(f) \ | 264 | /* Assume close is always declared. */ |
146 | (GL_LINK_WARNING ("close does not portably work on sockets - " \ | 265 | _GL_WARN_ON_USE (close, "close does not portably work on sockets - " |
147 | "use gnulib module close for portability"), \ | 266 | "use gnulib module close for portability"); |
148 | close (f)) | 267 | #endif |
268 | |||
269 | |||
270 | #if @REPLACE_DUP@ | ||
271 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
272 | # define dup rpl_dup | ||
273 | # endif | ||
274 | _GL_FUNCDECL_RPL (dup, int, (int oldfd)); | ||
275 | _GL_CXXALIAS_RPL (dup, int, (int oldfd)); | ||
276 | #else | ||
277 | _GL_CXXALIAS_SYS (dup, int, (int oldfd)); | ||
149 | #endif | 278 | #endif |
279 | _GL_CXXALIASWARN (dup); | ||
150 | 280 | ||
151 | 281 | ||
152 | #if @GNULIB_DUP2@ | 282 | #if @GNULIB_DUP2@ |
153 | # if !@HAVE_DUP2@ | ||
154 | /* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if | 283 | /* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if |
155 | NEWFD = OLDFD, otherwise close NEWFD first if it is open. | 284 | NEWFD = OLDFD, otherwise close NEWFD first if it is open. |
156 | Return 0 if successful, otherwise -1 and errno set. | 285 | Return newfd if successful, otherwise -1 and errno set. |
157 | See the POSIX:2001 specification | 286 | See the POSIX:2001 specification |
158 | <http://www.opengroup.org/susv3xsh/dup2.html>. */ | 287 | <http://www.opengroup.org/susv3xsh/dup2.html>. */ |
159 | extern int dup2 (int oldfd, int newfd); | 288 | # if @REPLACE_DUP2@ |
289 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
290 | # define dup2 rpl_dup2 | ||
291 | # endif | ||
292 | _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd)); | ||
293 | _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd)); | ||
294 | # else | ||
295 | # if !@HAVE_DUP2@ | ||
296 | _GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd)); | ||
297 | # endif | ||
298 | _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd)); | ||
160 | # endif | 299 | # endif |
300 | _GL_CXXALIASWARN (dup2); | ||
161 | #elif defined GNULIB_POSIXCHECK | 301 | #elif defined GNULIB_POSIXCHECK |
162 | # undef dup2 | 302 | # undef dup2 |
163 | # define dup2(o,n) \ | 303 | # if HAVE_RAW_DECL_DUP2 |
164 | (GL_LINK_WARNING ("dup2 is unportable - " \ | 304 | _GL_WARN_ON_USE (dup2, "dup2 is unportable - " |
165 | "use gnulib module dup2 for portability"), \ | 305 | "use gnulib module dup2 for portability"); |
166 | dup2 (o, n)) | 306 | # endif |
307 | #endif | ||
308 | |||
309 | |||
310 | #if @GNULIB_DUP3@ | ||
311 | /* Copy the file descriptor OLDFD into file descriptor NEWFD, with the | ||
312 | specified flags. | ||
313 | The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>) | ||
314 | and O_TEXT, O_BINARY (defined in "binary-io.h"). | ||
315 | Close NEWFD first if it is open. | ||
316 | Return newfd if successful, otherwise -1 and errno set. | ||
317 | See the Linux man page at | ||
318 | <http://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */ | ||
319 | # if @HAVE_DUP3@ | ||
320 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
321 | # define dup3 rpl_dup3 | ||
322 | # endif | ||
323 | _GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags)); | ||
324 | _GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags)); | ||
325 | # else | ||
326 | _GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags)); | ||
327 | _GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags)); | ||
328 | # endif | ||
329 | _GL_CXXALIASWARN (dup3); | ||
330 | #elif defined GNULIB_POSIXCHECK | ||
331 | # undef dup3 | ||
332 | # if HAVE_RAW_DECL_DUP3 | ||
333 | _GL_WARN_ON_USE (dup3, "dup3 is unportable - " | ||
334 | "use gnulib module dup3 for portability"); | ||
335 | # endif | ||
167 | #endif | 336 | #endif |
168 | 337 | ||
169 | 338 | ||
@@ -175,55 +344,126 @@ extern int dup2 (int oldfd, int newfd); | |||
175 | # include <crt_externs.h> | 344 | # include <crt_externs.h> |
176 | # define environ (*_NSGetEnviron ()) | 345 | # define environ (*_NSGetEnviron ()) |
177 | # else | 346 | # else |
347 | # ifdef __cplusplus | ||
348 | extern "C" { | ||
349 | # endif | ||
178 | extern char **environ; | 350 | extern char **environ; |
351 | # ifdef __cplusplus | ||
352 | } | ||
353 | # endif | ||
179 | # endif | 354 | # endif |
180 | # endif | 355 | # endif |
181 | #elif defined GNULIB_POSIXCHECK | 356 | #elif defined GNULIB_POSIXCHECK |
182 | # undef environ | 357 | # if HAVE_RAW_DECL_ENVIRON |
183 | # define environ \ | 358 | static inline char *** |
184 | (GL_LINK_WARNING ("environ is unportable - " \ | 359 | rpl_environ (void) |
185 | "use gnulib module environ for portability"), \ | 360 | { |
186 | environ) | 361 | return &environ; |
362 | } | ||
363 | _GL_WARN_ON_USE (rpl_environ, "environ is unportable - " | ||
364 | "use gnulib module environ for portability"); | ||
365 | # undef environ | ||
366 | # define environ (*rpl_environ ()) | ||
367 | # endif | ||
187 | #endif | 368 | #endif |
188 | 369 | ||
189 | 370 | ||
190 | #if @GNULIB_EUIDACCESS@ | 371 | #if @GNULIB_EUIDACCESS@ |
191 | # if !@HAVE_EUIDACCESS@ | 372 | /* Like access(), except that it uses the effective user id and group id of |
192 | /* Like access(), except that is uses the effective user id and group id of | ||
193 | the current process. */ | 373 | the current process. */ |
194 | extern int euidaccess (const char *filename, int mode); | 374 | # if !@HAVE_EUIDACCESS@ |
375 | _GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode) | ||
376 | _GL_ARG_NONNULL ((1))); | ||
377 | # endif | ||
378 | _GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode)); | ||
379 | _GL_CXXALIASWARN (euidaccess); | ||
380 | # if defined GNULIB_POSIXCHECK | ||
381 | /* Like access(), this function is a security risk. */ | ||
382 | _GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - " | ||
383 | "use the gnulib module faccessat instead"); | ||
195 | # endif | 384 | # endif |
196 | #elif defined GNULIB_POSIXCHECK | 385 | #elif defined GNULIB_POSIXCHECK |
197 | # undef euidaccess | 386 | # undef euidaccess |
198 | # define euidaccess(f,m) \ | 387 | # if HAVE_RAW_DECL_EUIDACCESS |
199 | (GL_LINK_WARNING ("euidaccess is unportable - " \ | 388 | _GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - " |
200 | "use gnulib module euidaccess for portability"), \ | 389 | "use gnulib module euidaccess for portability"); |
201 | euidaccess (f, m)) | 390 | # endif |
202 | #endif | 391 | #endif |
203 | 392 | ||
204 | 393 | ||
205 | #if @GNULIB_FCHDIR@ | 394 | #if @GNULIB_FACCESSAT@ |
206 | # if @REPLACE_FCHDIR@ | 395 | # if !@HAVE_FACCESSAT@ |
396 | _GL_FUNCDECL_SYS (faccessat, int, | ||
397 | (int fd, char const *file, int mode, int flag) | ||
398 | _GL_ARG_NONNULL ((2))); | ||
399 | # endif | ||
400 | _GL_CXXALIAS_SYS (faccessat, int, | ||
401 | (int fd, char const *file, int mode, int flag)); | ||
402 | _GL_CXXALIASWARN (faccessat); | ||
403 | #elif defined GNULIB_POSIXCHECK | ||
404 | # undef faccessat | ||
405 | # if HAVE_RAW_DECL_FACCESSAT | ||
406 | _GL_WARN_ON_USE (faccessat, "faccessat is not portable - " | ||
407 | "use gnulib module faccessat for portability"); | ||
408 | # endif | ||
409 | #endif | ||
207 | 410 | ||
411 | |||
412 | #if @GNULIB_FCHDIR@ | ||
208 | /* Change the process' current working directory to the directory on which | 413 | /* Change the process' current working directory to the directory on which |
209 | the given file descriptor is open. | 414 | the given file descriptor is open. |
210 | Return 0 if successful, otherwise -1 and errno set. | 415 | Return 0 if successful, otherwise -1 and errno set. |
211 | See the POSIX:2001 specification | 416 | See the POSIX:2001 specification |
212 | <http://www.opengroup.org/susv3xsh/fchdir.html>. */ | 417 | <http://www.opengroup.org/susv3xsh/fchdir.html>. */ |
213 | extern int fchdir (int /*fd*/); | 418 | # if ! @HAVE_FCHDIR@ |
419 | _GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/)); | ||
214 | 420 | ||
215 | # define dup rpl_dup | 421 | /* Gnulib internal hooks needed to maintain the fchdir metadata. */ |
216 | extern int dup (int); | 422 | _GL_EXTERN_C int _gl_register_fd (int fd, const char *filename) |
217 | # define dup2 rpl_dup2 | 423 | _GL_ARG_NONNULL ((2)); |
218 | extern int dup2 (int, int); | 424 | _GL_EXTERN_C void _gl_unregister_fd (int fd); |
425 | _GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd); | ||
426 | _GL_EXTERN_C const char *_gl_directory_name (int fd); | ||
219 | 427 | ||
220 | # endif | 428 | # endif |
429 | _GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/)); | ||
430 | _GL_CXXALIASWARN (fchdir); | ||
221 | #elif defined GNULIB_POSIXCHECK | 431 | #elif defined GNULIB_POSIXCHECK |
222 | # undef fchdir | 432 | # undef fchdir |
223 | # define fchdir(f) \ | 433 | # if HAVE_RAW_DECL_FCHDIR |
224 | (GL_LINK_WARNING ("fchdir is unportable - " \ | 434 | _GL_WARN_ON_USE (fchdir, "fchdir is unportable - " |
225 | "use gnulib module fchdir for portability"), \ | 435 | "use gnulib module fchdir for portability"); |
226 | fchdir (f)) | 436 | # endif |
437 | #endif | ||
438 | |||
439 | |||
440 | #if @GNULIB_FCHOWNAT@ | ||
441 | # if @REPLACE_FCHOWNAT@ | ||
442 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
443 | # undef fchownat | ||
444 | # define fchownat rpl_fchownat | ||
445 | # endif | ||
446 | _GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file, | ||
447 | uid_t owner, gid_t group, int flag) | ||
448 | _GL_ARG_NONNULL ((2))); | ||
449 | _GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file, | ||
450 | uid_t owner, gid_t group, int flag)); | ||
451 | # else | ||
452 | # if !@HAVE_FCHOWNAT@ | ||
453 | _GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file, | ||
454 | uid_t owner, gid_t group, int flag) | ||
455 | _GL_ARG_NONNULL ((2))); | ||
456 | # endif | ||
457 | _GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file, | ||
458 | uid_t owner, gid_t group, int flag)); | ||
459 | # endif | ||
460 | _GL_CXXALIASWARN (fchownat); | ||
461 | #elif defined GNULIB_POSIXCHECK | ||
462 | # undef fchownat | ||
463 | # if HAVE_RAW_DECL_FCHOWNAT | ||
464 | _GL_WARN_ON_USE (fchownat, "fchownat is not portable - " | ||
465 | "use gnulib module openat for portability"); | ||
466 | # endif | ||
227 | #endif | 467 | #endif |
228 | 468 | ||
229 | 469 | ||
@@ -233,39 +473,39 @@ extern int dup2 (int, int); | |||
233 | See POSIX:2001 specification | 473 | See POSIX:2001 specification |
234 | <http://www.opengroup.org/susv3xsh/fsync.html>. */ | 474 | <http://www.opengroup.org/susv3xsh/fsync.html>. */ |
235 | # if !@HAVE_FSYNC@ | 475 | # if !@HAVE_FSYNC@ |
236 | extern int fsync (int fd); | 476 | _GL_FUNCDECL_SYS (fsync, int, (int fd)); |
237 | # endif | 477 | # endif |
478 | _GL_CXXALIAS_SYS (fsync, int, (int fd)); | ||
479 | _GL_CXXALIASWARN (fsync); | ||
238 | #elif defined GNULIB_POSIXCHECK | 480 | #elif defined GNULIB_POSIXCHECK |
239 | # undef fsync | 481 | # undef fsync |
240 | # define fsync(fd) \ | 482 | # if HAVE_RAW_DECL_FSYNC |
241 | (GL_LINK_WARNING ("fsync is unportable - " \ | 483 | _GL_WARN_ON_USE (fsync, "fsync is unportable - " |
242 | "use gnulib module fsync for portability"), \ | 484 | "use gnulib module fsync for portability"); |
243 | fsync (fd)) | 485 | # endif |
244 | #endif | 486 | #endif |
245 | 487 | ||
246 | 488 | ||
247 | #if @GNULIB_FTRUNCATE@ | 489 | #if @GNULIB_FTRUNCATE@ |
248 | # if !@HAVE_FTRUNCATE@ | ||
249 | /* Change the size of the file to which FD is opened to become equal to LENGTH. | 490 | /* Change the size of the file to which FD is opened to become equal to LENGTH. |
250 | Return 0 if successful, otherwise -1 and errno set. | 491 | Return 0 if successful, otherwise -1 and errno set. |
251 | See the POSIX:2001 specification | 492 | See the POSIX:2001 specification |
252 | <http://www.opengroup.org/susv3xsh/ftruncate.html>. */ | 493 | <http://www.opengroup.org/susv3xsh/ftruncate.html>. */ |
253 | extern int ftruncate (int fd, off_t length); | 494 | # if !@HAVE_FTRUNCATE@ |
495 | _GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length)); | ||
254 | # endif | 496 | # endif |
497 | _GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length)); | ||
498 | _GL_CXXALIASWARN (ftruncate); | ||
255 | #elif defined GNULIB_POSIXCHECK | 499 | #elif defined GNULIB_POSIXCHECK |
256 | # undef ftruncate | 500 | # undef ftruncate |
257 | # define ftruncate(f,l) \ | 501 | # if HAVE_RAW_DECL_FTRUNCATE |
258 | (GL_LINK_WARNING ("ftruncate is unportable - " \ | 502 | _GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - " |
259 | "use gnulib module ftruncate for portability"), \ | 503 | "use gnulib module ftruncate for portability"); |
260 | ftruncate (f, l)) | 504 | # endif |
261 | #endif | 505 | #endif |
262 | 506 | ||
263 | 507 | ||
264 | #if @GNULIB_GETCWD@ | 508 | #if @GNULIB_GETCWD@ |
265 | /* Include the headers that might declare getcwd so that they will not | ||
266 | cause confusion if included after this file. */ | ||
267 | # include <stdlib.h> | ||
268 | # if @REPLACE_GETCWD@ | ||
269 | /* Get the name of the current working directory, and put it in SIZE bytes | 509 | /* Get the name of the current working directory, and put it in SIZE bytes |
270 | of BUF. | 510 | of BUF. |
271 | Return BUF if successful, or NULL if the directory couldn't be determined | 511 | Return BUF if successful, or NULL if the directory couldn't be determined |
@@ -276,15 +516,24 @@ extern int ftruncate (int fd, off_t length); | |||
276 | extension: If BUF is NULL, an array is allocated with 'malloc'; the array | 516 | extension: If BUF is NULL, an array is allocated with 'malloc'; the array |
277 | is SIZE bytes long, unless SIZE == 0, in which case it is as big as | 517 | is SIZE bytes long, unless SIZE == 0, in which case it is as big as |
278 | necessary. */ | 518 | necessary. */ |
279 | # define getcwd rpl_getcwd | 519 | # if @REPLACE_GETCWD@ |
280 | extern char * getcwd (char *buf, size_t size); | 520 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
521 | # define getcwd rpl_getcwd | ||
522 | # endif | ||
523 | _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size)); | ||
524 | _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size)); | ||
525 | # else | ||
526 | /* Need to cast, because on mingw, the second parameter is | ||
527 | int size. */ | ||
528 | _GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size)); | ||
281 | # endif | 529 | # endif |
530 | _GL_CXXALIASWARN (getcwd); | ||
282 | #elif defined GNULIB_POSIXCHECK | 531 | #elif defined GNULIB_POSIXCHECK |
283 | # undef getcwd | 532 | # undef getcwd |
284 | # define getcwd(b,s) \ | 533 | # if HAVE_RAW_DECL_GETCWD |
285 | (GL_LINK_WARNING ("getcwd is unportable - " \ | 534 | _GL_WARN_ON_USE (getcwd, "getcwd is unportable - " |
286 | "use gnulib module getcwd for portability"), \ | 535 | "use gnulib module getcwd for portability"); |
287 | getcwd (b, s)) | 536 | # endif |
288 | #endif | 537 | #endif |
289 | 538 | ||
290 | 539 | ||
@@ -300,28 +549,65 @@ extern char * getcwd (char *buf, size_t size); | |||
300 | If the NIS domain name is longer than LEN, set errno = EINVAL and return -1. | 549 | If the NIS domain name is longer than LEN, set errno = EINVAL and return -1. |
301 | Return 0 if successful, otherwise set errno and return -1. */ | 550 | Return 0 if successful, otherwise set errno and return -1. */ |
302 | # if !@HAVE_GETDOMAINNAME@ | 551 | # if !@HAVE_GETDOMAINNAME@ |
303 | extern int getdomainname(char *name, size_t len); | 552 | _GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len) |
553 | _GL_ARG_NONNULL ((1))); | ||
304 | # endif | 554 | # endif |
555 | /* Need to cast, because on MacOS X 10.5 systems, the second parameter is | ||
556 | int len. */ | ||
557 | _GL_CXXALIAS_SYS_CAST (getdomainname, int, (char *name, size_t len)); | ||
558 | _GL_CXXALIASWARN (getdomainname); | ||
305 | #elif defined GNULIB_POSIXCHECK | 559 | #elif defined GNULIB_POSIXCHECK |
306 | # undef getdomainname | 560 | # undef getdomainname |
307 | # define getdomainname(n,l) \ | 561 | # if HAVE_RAW_DECL_GETDOMAINNAME |
308 | (GL_LINK_WARNING ("getdomainname is unportable - " \ | 562 | _GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - " |
309 | "use gnulib module getdomainname for portability"), \ | 563 | "use gnulib module getdomainname for portability"); |
310 | getdomainname (n, l)) | 564 | # endif |
311 | #endif | 565 | #endif |
312 | 566 | ||
313 | 567 | ||
314 | #if @GNULIB_GETDTABLESIZE@ | 568 | #if @GNULIB_GETDTABLESIZE@ |
569 | /* Return the maximum number of file descriptors in the current process. | ||
570 | In POSIX, this is same as sysconf (_SC_OPEN_MAX). */ | ||
315 | # if !@HAVE_GETDTABLESIZE@ | 571 | # if !@HAVE_GETDTABLESIZE@ |
316 | /* Return the maximum number of file descriptors in the current process. */ | 572 | _GL_FUNCDECL_SYS (getdtablesize, int, (void)); |
317 | extern int getdtablesize (void); | ||
318 | # endif | 573 | # endif |
574 | _GL_CXXALIAS_SYS (getdtablesize, int, (void)); | ||
575 | _GL_CXXALIASWARN (getdtablesize); | ||
319 | #elif defined GNULIB_POSIXCHECK | 576 | #elif defined GNULIB_POSIXCHECK |
320 | # undef getdtablesize | 577 | # undef getdtablesize |
321 | # define getdtablesize() \ | 578 | # if HAVE_RAW_DECL_GETDTABLESIZE |
322 | (GL_LINK_WARNING ("getdtablesize is unportable - " \ | 579 | _GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - " |
323 | "use gnulib module getdtablesize for portability"), \ | 580 | "use gnulib module getdtablesize for portability"); |
324 | getdtablesize ()) | 581 | # endif |
582 | #endif | ||
583 | |||
584 | |||
585 | #if @GNULIB_GETGROUPS@ | ||
586 | /* Return the supplemental groups that the current process belongs to. | ||
587 | It is unspecified whether the effective group id is in the list. | ||
588 | If N is 0, return the group count; otherwise, N describes how many | ||
589 | entries are available in GROUPS. Return -1 and set errno if N is | ||
590 | not 0 and not large enough. Fails with ENOSYS on some systems. */ | ||
591 | # if @REPLACE_GETGROUPS@ | ||
592 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
593 | # undef getgroups | ||
594 | # define getgroups rpl_getgroups | ||
595 | # endif | ||
596 | _GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups)); | ||
597 | _GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups)); | ||
598 | # else | ||
599 | # if !@HAVE_GETGROUPS@ | ||
600 | _GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups)); | ||
601 | # endif | ||
602 | _GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups)); | ||
603 | # endif | ||
604 | _GL_CXXALIASWARN (getgroups); | ||
605 | #elif defined GNULIB_POSIXCHECK | ||
606 | # undef getgroups | ||
607 | # if HAVE_RAW_DECL_GETGROUPS | ||
608 | _GL_WARN_ON_USE (getgroups, "getgroups is unportable - " | ||
609 | "use gnulib module getgroups for portability"); | ||
610 | # endif | ||
325 | #endif | 611 | #endif |
326 | 612 | ||
327 | 613 | ||
@@ -334,21 +620,57 @@ extern int getdtablesize (void); | |||
334 | If the host name is longer than LEN, set errno = EINVAL and return -1. | 620 | If the host name is longer than LEN, set errno = EINVAL and return -1. |
335 | Return 0 if successful, otherwise set errno and return -1. */ | 621 | Return 0 if successful, otherwise set errno and return -1. */ |
336 | # if @UNISTD_H_HAVE_WINSOCK2_H@ | 622 | # if @UNISTD_H_HAVE_WINSOCK2_H@ |
337 | # undef gethostname | 623 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
338 | # define gethostname rpl_gethostname | 624 | # undef gethostname |
339 | # endif | 625 | # define gethostname rpl_gethostname |
340 | # if @UNISTD_H_HAVE_WINSOCK2_H@ || !@HAVE_GETHOSTNAME@ | 626 | # endif |
341 | extern int gethostname(char *name, size_t len); | 627 | _GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len) |
628 | _GL_ARG_NONNULL ((1))); | ||
629 | _GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len)); | ||
630 | # else | ||
631 | # if !@HAVE_GETHOSTNAME@ | ||
632 | _GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len) | ||
633 | _GL_ARG_NONNULL ((1))); | ||
634 | # endif | ||
635 | /* Need to cast, because on Solaris 10 systems, the second parameter is | ||
636 | int len. */ | ||
637 | _GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len)); | ||
342 | # endif | 638 | # endif |
639 | _GL_CXXALIASWARN (gethostname); | ||
343 | #elif @UNISTD_H_HAVE_WINSOCK2_H@ | 640 | #elif @UNISTD_H_HAVE_WINSOCK2_H@ |
344 | # undef gethostname | 641 | # undef gethostname |
345 | # define gethostname gethostname_used_without_requesting_gnulib_module_gethostname | 642 | # define gethostname gethostname_used_without_requesting_gnulib_module_gethostname |
346 | #elif defined GNULIB_POSIXCHECK | 643 | #elif defined GNULIB_POSIXCHECK |
347 | # undef gethostname | 644 | # undef gethostname |
348 | # define gethostname(n,l) \ | 645 | # if HAVE_RAW_DECL_GETHOSTNAME |
349 | (GL_LINK_WARNING ("gethostname is unportable - " \ | 646 | _GL_WARN_ON_USE (gethostname, "gethostname is unportable - " |
350 | "use gnulib module gethostname for portability"), \ | 647 | "use gnulib module gethostname for portability"); |
351 | gethostname (n, l)) | 648 | # endif |
649 | #endif | ||
650 | |||
651 | |||
652 | #if @GNULIB_GETLOGIN@ | ||
653 | /* Returns the user's login name, or NULL if it cannot be found. Upon error, | ||
654 | returns NULL with errno set. | ||
655 | |||
656 | See <http://www.opengroup.org/susv3xsh/getlogin.html>. | ||
657 | |||
658 | Most programs don't need to use this function, because the information is | ||
659 | available through environment variables: | ||
660 | ${LOGNAME-$USER} on Unix platforms, | ||
661 | $USERNAME on native Windows platforms. | ||
662 | */ | ||
663 | # if !@HAVE_GETLOGIN@ | ||
664 | _GL_FUNCDECL_SYS (getlogin, char *, (void)); | ||
665 | # endif | ||
666 | _GL_CXXALIAS_SYS (getlogin, char *, (void)); | ||
667 | _GL_CXXALIASWARN (getlogin); | ||
668 | #elif defined GNULIB_POSIXCHECK | ||
669 | # undef getlogin | ||
670 | # if HAVE_RAW_DECL_GETLOGIN | ||
671 | _GL_WARN_ON_USE (getlogin, "getlogin is unportable - " | ||
672 | "use gnulib module getlogin for portability"); | ||
673 | # endif | ||
352 | #endif | 674 | #endif |
353 | 675 | ||
354 | 676 | ||
@@ -361,124 +683,184 @@ extern int gethostname(char *name, size_t len); | |||
361 | provided (this case is hopefully rare but is left open by the POSIX spec). | 683 | provided (this case is hopefully rare but is left open by the POSIX spec). |
362 | 684 | ||
363 | See <http://www.opengroup.org/susv3xsh/getlogin.html>. | 685 | See <http://www.opengroup.org/susv3xsh/getlogin.html>. |
686 | |||
687 | Most programs don't need to use this function, because the information is | ||
688 | available through environment variables: | ||
689 | ${LOGNAME-$USER} on Unix platforms, | ||
690 | $USERNAME on native Windows platforms. | ||
364 | */ | 691 | */ |
365 | # if !@HAVE_DECL_GETLOGIN_R@ | 692 | # if !@HAVE_DECL_GETLOGIN_R@ |
366 | # include <stddef.h> | 693 | _GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size) |
367 | extern int getlogin_r (char *name, size_t size); | 694 | _GL_ARG_NONNULL ((1))); |
368 | # endif | 695 | # endif |
696 | /* Need to cast, because on Solaris 10 systems, the second argument is | ||
697 | int size. */ | ||
698 | _GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size)); | ||
699 | _GL_CXXALIASWARN (getlogin_r); | ||
369 | #elif defined GNULIB_POSIXCHECK | 700 | #elif defined GNULIB_POSIXCHECK |
370 | # undef getlogin_r | 701 | # undef getlogin_r |
371 | # define getlogin_r(n,s) \ | 702 | # if HAVE_RAW_DECL_GETLOGIN_R |
372 | (GL_LINK_WARNING ("getlogin_r is unportable - " \ | 703 | _GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - " |
373 | "use gnulib module getlogin_r for portability"), \ | 704 | "use gnulib module getlogin_r for portability"); |
374 | getlogin_r (n, s)) | 705 | # endif |
375 | #endif | 706 | #endif |
376 | 707 | ||
377 | 708 | ||
378 | #if @GNULIB_GETPAGESIZE@ | 709 | #if @GNULIB_GETPAGESIZE@ |
379 | # if @REPLACE_GETPAGESIZE@ | 710 | # if @REPLACE_GETPAGESIZE@ |
380 | # define getpagesize rpl_getpagesize | 711 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
381 | extern int getpagesize (void); | 712 | # define getpagesize rpl_getpagesize |
382 | # elif !@HAVE_GETPAGESIZE@ | ||
383 | /* This is for POSIX systems. */ | ||
384 | # if !defined getpagesize && defined _SC_PAGESIZE | ||
385 | # if ! (defined __VMS && __VMS_VER < 70000000) | ||
386 | # define getpagesize() sysconf (_SC_PAGESIZE) | ||
387 | # endif | ||
388 | # endif | 713 | # endif |
714 | _GL_FUNCDECL_RPL (getpagesize, int, (void)); | ||
715 | _GL_CXXALIAS_RPL (getpagesize, int, (void)); | ||
716 | # else | ||
717 | # if !@HAVE_GETPAGESIZE@ | ||
718 | # if !defined getpagesize | ||
719 | /* This is for POSIX systems. */ | ||
720 | # if !defined _gl_getpagesize && defined _SC_PAGESIZE | ||
721 | # if ! (defined __VMS && __VMS_VER < 70000000) | ||
722 | # define _gl_getpagesize() sysconf (_SC_PAGESIZE) | ||
723 | # endif | ||
724 | # endif | ||
389 | /* This is for older VMS. */ | 725 | /* This is for older VMS. */ |
390 | # if !defined getpagesize && defined __VMS | 726 | # if !defined _gl_getpagesize && defined __VMS |
391 | # ifdef __ALPHA | 727 | # ifdef __ALPHA |
392 | # define getpagesize() 8192 | 728 | # define _gl_getpagesize() 8192 |
393 | # else | 729 | # else |
394 | # define getpagesize() 512 | 730 | # define _gl_getpagesize() 512 |
395 | # endif | 731 | # endif |
396 | # endif | 732 | # endif |
397 | /* This is for BeOS. */ | 733 | /* This is for BeOS. */ |
398 | # if !defined getpagesize && @HAVE_OS_H@ | 734 | # if !defined _gl_getpagesize && @HAVE_OS_H@ |
399 | # include <OS.h> | 735 | # include <OS.h> |
400 | # if defined B_PAGE_SIZE | 736 | # if defined B_PAGE_SIZE |
401 | # define getpagesize() B_PAGE_SIZE | 737 | # define _gl_getpagesize() B_PAGE_SIZE |
402 | # endif | 738 | # endif |
403 | # endif | 739 | # endif |
404 | /* This is for AmigaOS4.0. */ | 740 | /* This is for AmigaOS4.0. */ |
405 | # if !defined getpagesize && defined __amigaos4__ | 741 | # if !defined _gl_getpagesize && defined __amigaos4__ |
406 | # define getpagesize() 2048 | 742 | # define _gl_getpagesize() 2048 |
407 | # endif | 743 | # endif |
408 | /* This is for older Unix systems. */ | 744 | /* This is for older Unix systems. */ |
409 | # if !defined getpagesize && @HAVE_SYS_PARAM_H@ | 745 | # if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@ |
410 | # include <sys/param.h> | 746 | # include <sys/param.h> |
411 | # ifdef EXEC_PAGESIZE | 747 | # ifdef EXEC_PAGESIZE |
412 | # define getpagesize() EXEC_PAGESIZE | 748 | # define _gl_getpagesize() EXEC_PAGESIZE |
413 | # else | 749 | # else |
414 | # ifdef NBPG | 750 | # ifdef NBPG |
415 | # ifndef CLSIZE | 751 | # ifndef CLSIZE |
416 | # define CLSIZE 1 | 752 | # define CLSIZE 1 |
753 | # endif | ||
754 | # define _gl_getpagesize() (NBPG * CLSIZE) | ||
755 | # else | ||
756 | # ifdef NBPC | ||
757 | # define _gl_getpagesize() NBPC | ||
758 | # endif | ||
759 | # endif | ||
417 | # endif | 760 | # endif |
418 | # define getpagesize() (NBPG * CLSIZE) | 761 | # endif |
762 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
763 | # define getpagesize() _gl_getpagesize () | ||
419 | # else | 764 | # else |
420 | # ifdef NBPC | 765 | static inline int |
421 | # define getpagesize() NBPC | 766 | getpagesize () |
422 | # endif | 767 | { |
768 | return _gl_getpagesize (); | ||
769 | } | ||
423 | # endif | 770 | # endif |
424 | # endif | 771 | # endif |
425 | # endif | 772 | # endif |
773 | /* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */ | ||
774 | _GL_CXXALIAS_SYS_CAST (getpagesize, int, (void)); | ||
775 | # endif | ||
776 | # if @HAVE_DECL_GETPAGESIZE@ | ||
777 | _GL_CXXALIASWARN (getpagesize); | ||
426 | # endif | 778 | # endif |
427 | #elif defined GNULIB_POSIXCHECK | 779 | #elif defined GNULIB_POSIXCHECK |
428 | # undef getpagesize | 780 | # undef getpagesize |
429 | # define getpagesize() \ | 781 | # if HAVE_RAW_DECL_GETPAGESIZE |
430 | (GL_LINK_WARNING ("getpagesize is unportable - " \ | 782 | _GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - " |
431 | "use gnulib module getpagesize for portability"), \ | 783 | "use gnulib module getpagesize for portability"); |
432 | getpagesize ()) | 784 | # endif |
433 | #endif | 785 | #endif |
434 | 786 | ||
435 | 787 | ||
436 | #if @GNULIB_GETUSERSHELL@ | 788 | #if @GNULIB_GETUSERSHELL@ |
437 | # if !@HAVE_GETUSERSHELL@ | ||
438 | /* Return the next valid login shell on the system, or NULL when the end of | 789 | /* Return the next valid login shell on the system, or NULL when the end of |
439 | the list has been reached. */ | 790 | the list has been reached. */ |
440 | extern char *getusershell (void); | 791 | # if !@HAVE_DECL_GETUSERSHELL@ |
792 | _GL_FUNCDECL_SYS (getusershell, char *, (void)); | ||
793 | # endif | ||
794 | _GL_CXXALIAS_SYS (getusershell, char *, (void)); | ||
795 | _GL_CXXALIASWARN (getusershell); | ||
796 | #elif defined GNULIB_POSIXCHECK | ||
797 | # undef getusershell | ||
798 | # if HAVE_RAW_DECL_GETUSERSHELL | ||
799 | _GL_WARN_ON_USE (getusershell, "getusershell is unportable - " | ||
800 | "use gnulib module getusershell for portability"); | ||
801 | # endif | ||
802 | #endif | ||
803 | |||
804 | #if @GNULIB_GETUSERSHELL@ | ||
441 | /* Rewind to pointer that is advanced at each getusershell() call. */ | 805 | /* Rewind to pointer that is advanced at each getusershell() call. */ |
442 | extern void setusershell (void); | 806 | # if !@HAVE_DECL_GETUSERSHELL@ |
807 | _GL_FUNCDECL_SYS (setusershell, void, (void)); | ||
808 | # endif | ||
809 | _GL_CXXALIAS_SYS (setusershell, void, (void)); | ||
810 | _GL_CXXALIASWARN (setusershell); | ||
811 | #elif defined GNULIB_POSIXCHECK | ||
812 | # undef setusershell | ||
813 | # if HAVE_RAW_DECL_SETUSERSHELL | ||
814 | _GL_WARN_ON_USE (setusershell, "setusershell is unportable - " | ||
815 | "use gnulib module getusershell for portability"); | ||
816 | # endif | ||
817 | #endif | ||
818 | |||
819 | #if @GNULIB_GETUSERSHELL@ | ||
443 | /* Free the pointer that is advanced at each getusershell() call and | 820 | /* Free the pointer that is advanced at each getusershell() call and |
444 | associated resources. */ | 821 | associated resources. */ |
445 | extern void endusershell (void); | 822 | # if !@HAVE_DECL_GETUSERSHELL@ |
823 | _GL_FUNCDECL_SYS (endusershell, void, (void)); | ||
446 | # endif | 824 | # endif |
825 | _GL_CXXALIAS_SYS (endusershell, void, (void)); | ||
826 | _GL_CXXALIASWARN (endusershell); | ||
447 | #elif defined GNULIB_POSIXCHECK | 827 | #elif defined GNULIB_POSIXCHECK |
448 | # undef getusershell | ||
449 | # define getusershell() \ | ||
450 | (GL_LINK_WARNING ("getusershell is unportable - " \ | ||
451 | "use gnulib module getusershell for portability"), \ | ||
452 | getusershell ()) | ||
453 | # undef setusershell | ||
454 | # define setusershell() \ | ||
455 | (GL_LINK_WARNING ("setusershell is unportable - " \ | ||
456 | "use gnulib module getusershell for portability"), \ | ||
457 | setusershell ()) | ||
458 | # undef endusershell | 828 | # undef endusershell |
459 | # define endusershell() \ | 829 | # if HAVE_RAW_DECL_ENDUSERSHELL |
460 | (GL_LINK_WARNING ("endusershell is unportable - " \ | 830 | _GL_WARN_ON_USE (endusershell, "endusershell is unportable - " |
461 | "use gnulib module getusershell for portability"), \ | 831 | "use gnulib module getusershell for portability"); |
462 | endusershell ()) | 832 | # endif |
463 | #endif | 833 | #endif |
464 | 834 | ||
465 | 835 | ||
466 | #if @GNULIB_LCHOWN@ | 836 | #if @GNULIB_LCHOWN@ |
467 | # if @REPLACE_LCHOWN@ | ||
468 | /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE | 837 | /* Change the owner of FILE to UID (if UID is not -1) and the group of FILE |
469 | to GID (if GID is not -1). Do not follow symbolic links. | 838 | to GID (if GID is not -1). Do not follow symbolic links. |
470 | Return 0 if successful, otherwise -1 and errno set. | 839 | Return 0 if successful, otherwise -1 and errno set. |
471 | See the POSIX:2001 specification | 840 | See the POSIX:2001 specification |
472 | <http://www.opengroup.org/susv3xsh/lchown.html>. */ | 841 | <http://www.opengroup.org/susv3xsh/lchown.html>. */ |
473 | # define lchown rpl_lchown | 842 | # if @REPLACE_LCHOWN@ |
474 | extern int lchown (char const *file, uid_t owner, gid_t group); | 843 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
844 | # undef lchown | ||
845 | # define lchown rpl_lchown | ||
846 | # endif | ||
847 | _GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group) | ||
848 | _GL_ARG_NONNULL ((1))); | ||
849 | _GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)); | ||
850 | # else | ||
851 | # if !@HAVE_LCHOWN@ | ||
852 | _GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group) | ||
853 | _GL_ARG_NONNULL ((1))); | ||
854 | # endif | ||
855 | _GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)); | ||
475 | # endif | 856 | # endif |
857 | _GL_CXXALIASWARN (lchown); | ||
476 | #elif defined GNULIB_POSIXCHECK | 858 | #elif defined GNULIB_POSIXCHECK |
477 | # undef lchown | 859 | # undef lchown |
478 | # define lchown(f,u,g) \ | 860 | # if HAVE_RAW_DECL_LCHOWN |
479 | (GL_LINK_WARNING ("lchown is unportable to pre-POSIX.1-2001 " \ | 861 | _GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - " |
480 | "systems - use gnulib module lchown for portability"), \ | 862 | "use gnulib module lchown for portability"); |
481 | lchown (f, u, g)) | 863 | # endif |
482 | #endif | 864 | #endif |
483 | 865 | ||
484 | 866 | ||
@@ -487,33 +869,150 @@ extern int lchown (char const *file, uid_t owner, gid_t group); | |||
487 | Return 0 if successful, otherwise -1 and errno set. | 869 | Return 0 if successful, otherwise -1 and errno set. |
488 | See POSIX:2001 specification | 870 | See POSIX:2001 specification |
489 | <http://www.opengroup.org/susv3xsh/link.html>. */ | 871 | <http://www.opengroup.org/susv3xsh/link.html>. */ |
490 | # if !@HAVE_LINK@ | 872 | # if @REPLACE_LINK@ |
491 | extern int link (const char *path1, const char *path2); | 873 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
874 | # define link rpl_link | ||
875 | # endif | ||
876 | _GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2) | ||
877 | _GL_ARG_NONNULL ((1, 2))); | ||
878 | _GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2)); | ||
879 | # else | ||
880 | # if !@HAVE_LINK@ | ||
881 | _GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2) | ||
882 | _GL_ARG_NONNULL ((1, 2))); | ||
883 | # endif | ||
884 | _GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2)); | ||
492 | # endif | 885 | # endif |
886 | _GL_CXXALIASWARN (link); | ||
493 | #elif defined GNULIB_POSIXCHECK | 887 | #elif defined GNULIB_POSIXCHECK |
494 | # undef link | 888 | # undef link |
495 | # define link(path1,path2) \ | 889 | # if HAVE_RAW_DECL_LINK |
496 | (GL_LINK_WARNING ("link is unportable - " \ | 890 | _GL_WARN_ON_USE (link, "link is unportable - " |
497 | "use gnulib module link for portability"), \ | 891 | "use gnulib module link for portability"); |
498 | link (path1, path2)) | 892 | # endif |
893 | #endif | ||
894 | |||
895 | |||
896 | #if @GNULIB_LINKAT@ | ||
897 | /* Create a new hard link for an existing file, relative to two | ||
898 | directories. FLAG controls whether symlinks are followed. | ||
899 | Return 0 if successful, otherwise -1 and errno set. */ | ||
900 | # if @REPLACE_LINKAT@ | ||
901 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
902 | # undef linkat | ||
903 | # define linkat rpl_linkat | ||
904 | # endif | ||
905 | _GL_FUNCDECL_RPL (linkat, int, | ||
906 | (int fd1, const char *path1, int fd2, const char *path2, | ||
907 | int flag) | ||
908 | _GL_ARG_NONNULL ((2, 4))); | ||
909 | _GL_CXXALIAS_RPL (linkat, int, | ||
910 | (int fd1, const char *path1, int fd2, const char *path2, | ||
911 | int flag)); | ||
912 | # else | ||
913 | # if !@HAVE_LINKAT@ | ||
914 | _GL_FUNCDECL_SYS (linkat, int, | ||
915 | (int fd1, const char *path1, int fd2, const char *path2, | ||
916 | int flag) | ||
917 | _GL_ARG_NONNULL ((2, 4))); | ||
918 | # endif | ||
919 | _GL_CXXALIAS_SYS (linkat, int, | ||
920 | (int fd1, const char *path1, int fd2, const char *path2, | ||
921 | int flag)); | ||
922 | # endif | ||
923 | _GL_CXXALIASWARN (linkat); | ||
924 | #elif defined GNULIB_POSIXCHECK | ||
925 | # undef linkat | ||
926 | # if HAVE_RAW_DECL_LINKAT | ||
927 | _GL_WARN_ON_USE (linkat, "linkat is unportable - " | ||
928 | "use gnulib module linkat for portability"); | ||
929 | # endif | ||
499 | #endif | 930 | #endif |
500 | 931 | ||
501 | 932 | ||
502 | #if @GNULIB_LSEEK@ | 933 | #if @GNULIB_LSEEK@ |
503 | # if @REPLACE_LSEEK@ | ||
504 | /* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END. | 934 | /* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END. |
505 | Return the new offset if successful, otherwise -1 and errno set. | 935 | Return the new offset if successful, otherwise -1 and errno set. |
506 | See the POSIX:2001 specification | 936 | See the POSIX:2001 specification |
507 | <http://www.opengroup.org/susv3xsh/lseek.html>. */ | 937 | <http://www.opengroup.org/susv3xsh/lseek.html>. */ |
508 | # define lseek rpl_lseek | 938 | # if @REPLACE_LSEEK@ |
509 | extern off_t lseek (int fd, off_t offset, int whence); | 939 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
940 | # define lseek rpl_lseek | ||
941 | # endif | ||
942 | _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence)); | ||
943 | _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence)); | ||
944 | # else | ||
945 | _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence)); | ||
510 | # endif | 946 | # endif |
947 | _GL_CXXALIASWARN (lseek); | ||
511 | #elif defined GNULIB_POSIXCHECK | 948 | #elif defined GNULIB_POSIXCHECK |
512 | # undef lseek | 949 | # undef lseek |
513 | # define lseek(f,o,w) \ | 950 | # if HAVE_RAW_DECL_LSEEK |
514 | (GL_LINK_WARNING ("lseek does not fail with ESPIPE on pipes on some " \ | 951 | _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some " |
515 | "systems - use gnulib module lseek for portability"), \ | 952 | "systems - use gnulib module lseek for portability"); |
516 | lseek (f, o, w)) | 953 | # endif |
954 | #endif | ||
955 | |||
956 | |||
957 | #if @GNULIB_PIPE2@ | ||
958 | /* Create a pipe, applying the given flags when opening the read-end of the | ||
959 | pipe and the write-end of the pipe. | ||
960 | The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>) | ||
961 | and O_TEXT, O_BINARY (defined in "binary-io.h"). | ||
962 | Store the read-end as fd[0] and the write-end as fd[1]. | ||
963 | Return 0 upon success, or -1 with errno set upon failure. | ||
964 | See also the Linux man page at | ||
965 | <http://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */ | ||
966 | # if @HAVE_PIPE2@ | ||
967 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
968 | # define pipe2 rpl_pipe2 | ||
969 | # endif | ||
970 | _GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); | ||
971 | _GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags)); | ||
972 | # else | ||
973 | _GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1))); | ||
974 | _GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags)); | ||
975 | # endif | ||
976 | _GL_CXXALIASWARN (pipe2); | ||
977 | #elif defined GNULIB_POSIXCHECK | ||
978 | # undef pipe2 | ||
979 | # if HAVE_RAW_DECL_PIPE2 | ||
980 | _GL_WARN_ON_USE (pipe2, "pipe2 is unportable - " | ||
981 | "use gnulib module pipe2 for portability"); | ||
982 | # endif | ||
983 | #endif | ||
984 | |||
985 | |||
986 | #if @GNULIB_PREAD@ | ||
987 | /* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET. | ||
988 | Return the number of bytes placed into BUF if successful, otherwise | ||
989 | set errno and return -1. 0 indicates EOF. See the POSIX:2001 | ||
990 | specification <http://www.opengroup.org/susv3xsh/pread.html>. */ | ||
991 | # if @REPLACE_PREAD@ | ||
992 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
993 | # define pread rpl_pread | ||
994 | # endif | ||
995 | _GL_FUNCDECL_RPL (pread, ssize_t, | ||
996 | (int fd, void *buf, size_t bufsize, off_t offset) | ||
997 | _GL_ARG_NONNULL ((2))); | ||
998 | _GL_CXXALIAS_RPL (pread, ssize_t, | ||
999 | (int fd, void *buf, size_t bufsize, off_t offset)); | ||
1000 | # else | ||
1001 | # if !@HAVE_PREAD@ | ||
1002 | _GL_FUNCDECL_SYS (pread, ssize_t, | ||
1003 | (int fd, void *buf, size_t bufsize, off_t offset) | ||
1004 | _GL_ARG_NONNULL ((2))); | ||
1005 | # endif | ||
1006 | _GL_CXXALIAS_SYS (pread, ssize_t, | ||
1007 | (int fd, void *buf, size_t bufsize, off_t offset)); | ||
1008 | # endif | ||
1009 | _GL_CXXALIASWARN (pread); | ||
1010 | #elif defined GNULIB_POSIXCHECK | ||
1011 | # undef pread | ||
1012 | # if HAVE_RAW_DECL_PREAD | ||
1013 | _GL_WARN_ON_USE (pread, "pread is unportable - " | ||
1014 | "use gnulib module pread for portability"); | ||
1015 | # endif | ||
517 | #endif | 1016 | #endif |
518 | 1017 | ||
519 | 1018 | ||
@@ -523,16 +1022,70 @@ extern int link (const char *path1, const char *path2); | |||
523 | successful, otherwise -1 and errno set. | 1022 | successful, otherwise -1 and errno set. |
524 | See the POSIX:2001 specification | 1023 | See the POSIX:2001 specification |
525 | <http://www.opengroup.org/susv3xsh/readlink.html>. */ | 1024 | <http://www.opengroup.org/susv3xsh/readlink.html>. */ |
526 | # if !@HAVE_READLINK@ | 1025 | # if @REPLACE_READLINK@ |
527 | # include <stddef.h> | 1026 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
528 | extern int readlink (const char *file, char *buf, size_t bufsize); | 1027 | # define readlink rpl_readlink |
1028 | # endif | ||
1029 | _GL_FUNCDECL_RPL (readlink, ssize_t, | ||
1030 | (const char *file, char *buf, size_t bufsize) | ||
1031 | _GL_ARG_NONNULL ((1, 2))); | ||
1032 | _GL_CXXALIAS_RPL (readlink, ssize_t, | ||
1033 | (const char *file, char *buf, size_t bufsize)); | ||
1034 | # else | ||
1035 | # if !@HAVE_READLINK@ | ||
1036 | _GL_FUNCDECL_SYS (readlink, ssize_t, | ||
1037 | (const char *file, char *buf, size_t bufsize) | ||
1038 | _GL_ARG_NONNULL ((1, 2))); | ||
1039 | # endif | ||
1040 | _GL_CXXALIAS_SYS (readlink, ssize_t, | ||
1041 | (const char *file, char *buf, size_t bufsize)); | ||
529 | # endif | 1042 | # endif |
1043 | _GL_CXXALIASWARN (readlink); | ||
530 | #elif defined GNULIB_POSIXCHECK | 1044 | #elif defined GNULIB_POSIXCHECK |
531 | # undef readlink | 1045 | # undef readlink |
532 | # define readlink(f,b,s) \ | 1046 | # if HAVE_RAW_DECL_READLINK |
533 | (GL_LINK_WARNING ("readlink is unportable - " \ | 1047 | _GL_WARN_ON_USE (readlink, "readlink is unportable - " |
534 | "use gnulib module readlink for portability"), \ | 1048 | "use gnulib module readlink for portability"); |
535 | readlink (f, b, s)) | 1049 | # endif |
1050 | #endif | ||
1051 | |||
1052 | |||
1053 | #if @GNULIB_READLINKAT@ | ||
1054 | # if !@HAVE_READLINKAT@ | ||
1055 | _GL_FUNCDECL_SYS (readlinkat, ssize_t, | ||
1056 | (int fd, char const *file, char *buf, size_t len) | ||
1057 | _GL_ARG_NONNULL ((2, 3))); | ||
1058 | # endif | ||
1059 | _GL_CXXALIAS_SYS (readlinkat, ssize_t, | ||
1060 | (int fd, char const *file, char *buf, size_t len)); | ||
1061 | _GL_CXXALIASWARN (readlinkat); | ||
1062 | #elif defined GNULIB_POSIXCHECK | ||
1063 | # undef readlinkat | ||
1064 | # if HAVE_RAW_DECL_READLINKAT | ||
1065 | _GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - " | ||
1066 | "use gnulib module symlinkat for portability"); | ||
1067 | # endif | ||
1068 | #endif | ||
1069 | |||
1070 | |||
1071 | #if @GNULIB_RMDIR@ | ||
1072 | /* Remove the directory DIR. */ | ||
1073 | # if @REPLACE_RMDIR@ | ||
1074 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
1075 | # define rmdir rpl_rmdir | ||
1076 | # endif | ||
1077 | _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1))); | ||
1078 | _GL_CXXALIAS_RPL (rmdir, int, (char const *name)); | ||
1079 | # else | ||
1080 | _GL_CXXALIAS_SYS (rmdir, int, (char const *name)); | ||
1081 | # endif | ||
1082 | _GL_CXXALIASWARN (rmdir); | ||
1083 | #elif defined GNULIB_POSIXCHECK | ||
1084 | # undef rmdir | ||
1085 | # if HAVE_RAW_DECL_RMDIR | ||
1086 | _GL_WARN_ON_USE (rmdir, "rmdir is unportable - " | ||
1087 | "use gnulib module rmdir for portability"); | ||
1088 | # endif | ||
536 | #endif | 1089 | #endif |
537 | 1090 | ||
538 | 1091 | ||
@@ -541,36 +1094,183 @@ extern int readlink (const char *file, char *buf, size_t bufsize); | |||
541 | Returns the number of seconds left to sleep. | 1094 | Returns the number of seconds left to sleep. |
542 | See the POSIX:2001 specification | 1095 | See the POSIX:2001 specification |
543 | <http://www.opengroup.org/susv3xsh/sleep.html>. */ | 1096 | <http://www.opengroup.org/susv3xsh/sleep.html>. */ |
544 | # if !@HAVE_SLEEP@ | 1097 | # if @REPLACE_SLEEP@ |
545 | extern unsigned int sleep (unsigned int n); | 1098 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
1099 | # undef sleep | ||
1100 | # define sleep rpl_sleep | ||
1101 | # endif | ||
1102 | _GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n)); | ||
1103 | _GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n)); | ||
1104 | # else | ||
1105 | # if !@HAVE_SLEEP@ | ||
1106 | _GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n)); | ||
1107 | # endif | ||
1108 | _GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n)); | ||
546 | # endif | 1109 | # endif |
1110 | _GL_CXXALIASWARN (sleep); | ||
547 | #elif defined GNULIB_POSIXCHECK | 1111 | #elif defined GNULIB_POSIXCHECK |
548 | # undef sleep | 1112 | # undef sleep |
549 | # define sleep(n) \ | 1113 | # if HAVE_RAW_DECL_SLEEP |
550 | (GL_LINK_WARNING ("sleep is unportable - " \ | 1114 | _GL_WARN_ON_USE (sleep, "sleep is unportable - " |
551 | "use gnulib module sleep for portability"), \ | 1115 | "use gnulib module sleep for portability"); |
552 | sleep (n)) | 1116 | # endif |
553 | #endif | 1117 | #endif |
554 | 1118 | ||
555 | 1119 | ||
556 | #if @GNULIB_WRITE@ && @REPLACE_WRITE@ && @GNULIB_UNISTD_H_SIGPIPE@ | 1120 | #if @GNULIB_SYMLINK@ |
557 | /* Write up to COUNT bytes starting at BUF to file descriptor FD. | 1121 | # if @REPLACE_SYMLINK@ |
558 | See the POSIX:2001 specification | 1122 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
559 | <http://www.opengroup.org/susv3xsh/write.html>. */ | 1123 | # undef symlink |
560 | # undef write | 1124 | # define symlink rpl_symlink |
561 | # define write rpl_write | 1125 | # endif |
562 | extern ssize_t write (int fd, const void *buf, size_t count); | 1126 | _GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file) |
1127 | _GL_ARG_NONNULL ((1, 2))); | ||
1128 | _GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file)); | ||
1129 | # else | ||
1130 | # if !@HAVE_SYMLINK@ | ||
1131 | _GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file) | ||
1132 | _GL_ARG_NONNULL ((1, 2))); | ||
1133 | # endif | ||
1134 | _GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file)); | ||
1135 | # endif | ||
1136 | _GL_CXXALIASWARN (symlink); | ||
1137 | #elif defined GNULIB_POSIXCHECK | ||
1138 | # undef symlink | ||
1139 | # if HAVE_RAW_DECL_SYMLINK | ||
1140 | _GL_WARN_ON_USE (symlink, "symlink is not portable - " | ||
1141 | "use gnulib module symlink for portability"); | ||
1142 | # endif | ||
563 | #endif | 1143 | #endif |
564 | 1144 | ||
565 | 1145 | ||
566 | #ifdef FCHDIR_REPLACEMENT | 1146 | #if @GNULIB_SYMLINKAT@ |
567 | /* gnulib internal function. */ | 1147 | # if !@HAVE_SYMLINKAT@ |
568 | extern void _gl_unregister_fd (int fd); | 1148 | _GL_FUNCDECL_SYS (symlinkat, int, |
1149 | (char const *contents, int fd, char const *file) | ||
1150 | _GL_ARG_NONNULL ((1, 3))); | ||
1151 | # endif | ||
1152 | _GL_CXXALIAS_SYS (symlinkat, int, | ||
1153 | (char const *contents, int fd, char const *file)); | ||
1154 | _GL_CXXALIASWARN (symlinkat); | ||
1155 | #elif defined GNULIB_POSIXCHECK | ||
1156 | # undef symlinkat | ||
1157 | # if HAVE_RAW_DECL_SYMLINKAT | ||
1158 | _GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - " | ||
1159 | "use gnulib module symlinkat for portability"); | ||
1160 | # endif | ||
569 | #endif | 1161 | #endif |
570 | 1162 | ||
571 | 1163 | ||
572 | #ifdef __cplusplus | 1164 | #if @GNULIB_TTYNAME_R@ |
573 | } | 1165 | /* Store at most BUFLEN characters of the pathname of the terminal FD is |
1166 | open on in BUF. Return 0 on success, otherwise an error number. */ | ||
1167 | # if !@HAVE_TTYNAME_R@ | ||
1168 | _GL_FUNCDECL_SYS (ttyname_r, int, | ||
1169 | (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2))); | ||
1170 | # endif | ||
1171 | _GL_CXXALIAS_SYS (ttyname_r, int, | ||
1172 | (int fd, char *buf, size_t buflen)); | ||
1173 | _GL_CXXALIASWARN (ttyname_r); | ||
1174 | #elif defined GNULIB_POSIXCHECK | ||
1175 | # undef ttyname_r | ||
1176 | # if HAVE_RAW_DECL_TTYNAME_R | ||
1177 | _GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - " | ||
1178 | "use gnulib module ttyname_r for portability"); | ||
1179 | # endif | ||
1180 | #endif | ||
1181 | |||
1182 | |||
1183 | #if @GNULIB_UNLINK@ | ||
1184 | # if @REPLACE_UNLINK@ | ||
1185 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
1186 | # undef unlink | ||
1187 | # define unlink rpl_unlink | ||
1188 | # endif | ||
1189 | _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1))); | ||
1190 | _GL_CXXALIAS_RPL (unlink, int, (char const *file)); | ||
1191 | # else | ||
1192 | _GL_CXXALIAS_SYS (unlink, int, (char const *file)); | ||
1193 | # endif | ||
1194 | _GL_CXXALIASWARN (unlink); | ||
1195 | #elif defined GNULIB_POSIXCHECK | ||
1196 | # undef unlink | ||
1197 | # if HAVE_RAW_DECL_UNLINK | ||
1198 | _GL_WARN_ON_USE (unlink, "unlink is not portable - " | ||
1199 | "use gnulib module unlink for portability"); | ||
1200 | # endif | ||
1201 | #endif | ||
1202 | |||
1203 | |||
1204 | #if @GNULIB_UNLINKAT@ | ||
1205 | # if @REPLACE_UNLINKAT@ | ||
1206 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
1207 | # undef unlinkat | ||
1208 | # define unlinkat rpl_unlinkat | ||
1209 | # endif | ||
1210 | _GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag) | ||
1211 | _GL_ARG_NONNULL ((2))); | ||
1212 | _GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag)); | ||
1213 | # else | ||
1214 | # if !@HAVE_UNLINKAT@ | ||
1215 | _GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag) | ||
1216 | _GL_ARG_NONNULL ((2))); | ||
1217 | # endif | ||
1218 | _GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag)); | ||
1219 | # endif | ||
1220 | _GL_CXXALIASWARN (unlinkat); | ||
1221 | #elif defined GNULIB_POSIXCHECK | ||
1222 | # undef unlinkat | ||
1223 | # if HAVE_RAW_DECL_UNLINKAT | ||
1224 | _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - " | ||
1225 | "use gnulib module openat for portability"); | ||
1226 | # endif | ||
1227 | #endif | ||
1228 | |||
1229 | |||
1230 | #if @GNULIB_USLEEP@ | ||
1231 | /* Pause the execution of the current thread for N microseconds. | ||
1232 | Returns 0 on completion, or -1 on range error. | ||
1233 | See the POSIX:2001 specification | ||
1234 | <http://www.opengroup.org/susv3xsh/sleep.html>. */ | ||
1235 | # if @REPLACE_USLEEP@ | ||
1236 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
1237 | # undef usleep | ||
1238 | # define usleep rpl_usleep | ||
1239 | # endif | ||
1240 | _GL_FUNCDECL_RPL (usleep, int, (useconds_t n)); | ||
1241 | _GL_CXXALIAS_RPL (usleep, int, (useconds_t n)); | ||
1242 | # else | ||
1243 | # if !@HAVE_USLEEP@ | ||
1244 | _GL_FUNCDECL_SYS (usleep, int, (useconds_t n)); | ||
1245 | # endif | ||
1246 | _GL_CXXALIAS_SYS (usleep, int, (useconds_t n)); | ||
1247 | # endif | ||
1248 | _GL_CXXALIASWARN (usleep); | ||
1249 | #elif defined GNULIB_POSIXCHECK | ||
1250 | # undef usleep | ||
1251 | # if HAVE_RAW_DECL_USLEEP | ||
1252 | _GL_WARN_ON_USE (usleep, "usleep is unportable - " | ||
1253 | "use gnulib module usleep for portability"); | ||
1254 | # endif | ||
1255 | #endif | ||
1256 | |||
1257 | |||
1258 | #if @GNULIB_WRITE@ | ||
1259 | /* Write up to COUNT bytes starting at BUF to file descriptor FD. | ||
1260 | See the POSIX:2001 specification | ||
1261 | <http://www.opengroup.org/susv3xsh/write.html>. */ | ||
1262 | # if @REPLACE_WRITE@ && @GNULIB_UNISTD_H_SIGPIPE@ | ||
1263 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
1264 | # undef write | ||
1265 | # define write rpl_write | ||
1266 | # endif | ||
1267 | _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count) | ||
1268 | _GL_ARG_NONNULL ((2))); | ||
1269 | _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count)); | ||
1270 | # else | ||
1271 | _GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count)); | ||
1272 | # endif | ||
1273 | _GL_CXXALIASWARN (write); | ||
574 | #endif | 1274 | #endif |
575 | 1275 | ||
576 | 1276 | ||
diff --git a/gl/vasnprintf.c b/gl/vasnprintf.c index 7ac9f436..99d921e9 100644 --- a/gl/vasnprintf.c +++ b/gl/vasnprintf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* vsprintf with automatic memory allocation. | 1 | /* vsprintf with automatic memory allocation. |
2 | Copyright (C) 1999, 2002-2009 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -67,13 +67,13 @@ | |||
67 | # endif | 67 | # endif |
68 | #endif | 68 | #endif |
69 | 69 | ||
70 | #include <locale.h> /* localeconv() */ | 70 | #include <locale.h> /* localeconv() */ |
71 | #include <stdio.h> /* snprintf(), sprintf() */ | 71 | #include <stdio.h> /* snprintf(), sprintf() */ |
72 | #include <stdlib.h> /* abort(), malloc(), realloc(), free() */ | 72 | #include <stdlib.h> /* abort(), malloc(), realloc(), free() */ |
73 | #include <string.h> /* memcpy(), strlen() */ | 73 | #include <string.h> /* memcpy(), strlen() */ |
74 | #include <errno.h> /* errno */ | 74 | #include <errno.h> /* errno */ |
75 | #include <limits.h> /* CHAR_BIT */ | 75 | #include <limits.h> /* CHAR_BIT */ |
76 | #include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */ | 76 | #include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */ |
77 | #if HAVE_NL_LANGINFO | 77 | #if HAVE_NL_LANGINFO |
78 | # include <langinfo.h> | 78 | # include <langinfo.h> |
79 | #endif | 79 | #endif |
@@ -257,14 +257,14 @@ local_wcsnlen (const wchar_t *s, size_t maxlen) | |||
257 | # ifndef decimal_point_char_defined | 257 | # ifndef decimal_point_char_defined |
258 | # define decimal_point_char_defined 1 | 258 | # define decimal_point_char_defined 1 |
259 | static char | 259 | static char |
260 | decimal_point_char () | 260 | decimal_point_char (void) |
261 | { | 261 | { |
262 | const char *point; | 262 | const char *point; |
263 | /* Determine it in a multithread-safe way. We know nl_langinfo is | 263 | /* Determine it in a multithread-safe way. We know nl_langinfo is |
264 | multithread-safe on glibc systems, but is not required to be multithread- | 264 | multithread-safe on glibc systems and MacOS X systems, but is not required |
265 | safe by POSIX. sprintf(), however, is multithread-safe. localeconv() | 265 | to be multithread-safe by POSIX. sprintf(), however, is multithread-safe. |
266 | is rarely multithread-safe. */ | 266 | localeconv() is rarely multithread-safe. */ |
267 | # if HAVE_NL_LANGINFO && __GLIBC__ | 267 | # if HAVE_NL_LANGINFO && (__GLIBC__ || (defined __APPLE__ && defined __MACH__)) |
268 | point = nl_langinfo (RADIXCHAR); | 268 | point = nl_langinfo (RADIXCHAR); |
269 | # elif 1 | 269 | # elif 1 |
270 | char pointbuf[5]; | 270 | char pointbuf[5]; |
@@ -364,26 +364,26 @@ multiply (mpn_t src1, mpn_t src2, mpn_t *dest) | |||
364 | dlen = len1 + len2; | 364 | dlen = len1 + len2; |
365 | dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t)); | 365 | dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t)); |
366 | if (dp == NULL) | 366 | if (dp == NULL) |
367 | return NULL; | 367 | return NULL; |
368 | for (k = len2; k > 0; ) | 368 | for (k = len2; k > 0; ) |
369 | dp[--k] = 0; | 369 | dp[--k] = 0; |
370 | for (i = 0; i < len1; i++) | 370 | for (i = 0; i < len1; i++) |
371 | { | 371 | { |
372 | mp_limb_t digit1 = p1[i]; | 372 | mp_limb_t digit1 = p1[i]; |
373 | mp_twolimb_t carry = 0; | 373 | mp_twolimb_t carry = 0; |
374 | for (j = 0; j < len2; j++) | 374 | for (j = 0; j < len2; j++) |
375 | { | 375 | { |
376 | mp_limb_t digit2 = p2[j]; | 376 | mp_limb_t digit2 = p2[j]; |
377 | carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; | 377 | carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; |
378 | carry += dp[i + j]; | 378 | carry += dp[i + j]; |
379 | dp[i + j] = (mp_limb_t) carry; | 379 | dp[i + j] = (mp_limb_t) carry; |
380 | carry = carry >> GMP_LIMB_BITS; | 380 | carry = carry >> GMP_LIMB_BITS; |
381 | } | 381 | } |
382 | dp[i + len2] = (mp_limb_t) carry; | 382 | dp[i + len2] = (mp_limb_t) carry; |
383 | } | 383 | } |
384 | /* Normalise. */ | 384 | /* Normalise. */ |
385 | while (dlen > 0 && dp[dlen - 1] == 0) | 385 | while (dlen > 0 && dp[dlen - 1] == 0) |
386 | dlen--; | 386 | dlen--; |
387 | dest->nlimbs = dlen; | 387 | dest->nlimbs = dlen; |
388 | dest->limbs = dp; | 388 | dest->limbs = dp; |
389 | } | 389 | } |
@@ -477,12 +477,12 @@ divide (mpn_t a, mpn_t b, mpn_t *q) | |||
477 | for (;;) | 477 | for (;;) |
478 | { | 478 | { |
479 | if (b_len == 0) | 479 | if (b_len == 0) |
480 | /* Division by zero. */ | 480 | /* Division by zero. */ |
481 | abort (); | 481 | abort (); |
482 | if (b_ptr[b_len - 1] == 0) | 482 | if (b_ptr[b_len - 1] == 0) |
483 | b_len--; | 483 | b_len--; |
484 | else | 484 | else |
485 | break; | 485 | break; |
486 | } | 486 | } |
487 | 487 | ||
488 | /* Here m = a_len >= 0 and n = b_len > 0. */ | 488 | /* Here m = a_len >= 0 and n = b_len > 0. */ |
@@ -499,261 +499,261 @@ divide (mpn_t a, mpn_t b, mpn_t *q) | |||
499 | else if (b_len == 1) | 499 | else if (b_len == 1) |
500 | { | 500 | { |
501 | /* n=1: single precision division. | 501 | /* n=1: single precision division. |
502 | beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */ | 502 | beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */ |
503 | r_ptr = roomptr; | 503 | r_ptr = roomptr; |
504 | q_ptr = roomptr + 1; | 504 | q_ptr = roomptr + 1; |
505 | { | 505 | { |
506 | mp_limb_t den = b_ptr[0]; | 506 | mp_limb_t den = b_ptr[0]; |
507 | mp_limb_t remainder = 0; | 507 | mp_limb_t remainder = 0; |
508 | const mp_limb_t *sourceptr = a_ptr + a_len; | 508 | const mp_limb_t *sourceptr = a_ptr + a_len; |
509 | mp_limb_t *destptr = q_ptr + a_len; | 509 | mp_limb_t *destptr = q_ptr + a_len; |
510 | size_t count; | 510 | size_t count; |
511 | for (count = a_len; count > 0; count--) | 511 | for (count = a_len; count > 0; count--) |
512 | { | 512 | { |
513 | mp_twolimb_t num = | 513 | mp_twolimb_t num = |
514 | ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr; | 514 | ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr; |
515 | *--destptr = num / den; | 515 | *--destptr = num / den; |
516 | remainder = num % den; | 516 | remainder = num % den; |
517 | } | 517 | } |
518 | /* Normalise and store r. */ | 518 | /* Normalise and store r. */ |
519 | if (remainder > 0) | 519 | if (remainder > 0) |
520 | { | 520 | { |
521 | r_ptr[0] = remainder; | 521 | r_ptr[0] = remainder; |
522 | r_len = 1; | 522 | r_len = 1; |
523 | } | 523 | } |
524 | else | 524 | else |
525 | r_len = 0; | 525 | r_len = 0; |
526 | /* Normalise q. */ | 526 | /* Normalise q. */ |
527 | q_len = a_len; | 527 | q_len = a_len; |
528 | if (q_ptr[q_len - 1] == 0) | 528 | if (q_ptr[q_len - 1] == 0) |
529 | q_len--; | 529 | q_len--; |
530 | } | 530 | } |
531 | } | 531 | } |
532 | else | 532 | else |
533 | { | 533 | { |
534 | /* n>1: multiple precision division. | 534 | /* n>1: multiple precision division. |
535 | beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==> | 535 | beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==> |
536 | beta^(m-n-1) <= a/b < beta^(m-n+1). */ | 536 | beta^(m-n-1) <= a/b < beta^(m-n+1). */ |
537 | /* Determine s. */ | 537 | /* Determine s. */ |
538 | size_t s; | 538 | size_t s; |
539 | { | 539 | { |
540 | mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */ | 540 | mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */ |
541 | s = 31; | 541 | s = 31; |
542 | if (msd >= 0x10000) | 542 | if (msd >= 0x10000) |
543 | { | 543 | { |
544 | msd = msd >> 16; | 544 | msd = msd >> 16; |
545 | s -= 16; | 545 | s -= 16; |
546 | } | 546 | } |
547 | if (msd >= 0x100) | 547 | if (msd >= 0x100) |
548 | { | 548 | { |
549 | msd = msd >> 8; | 549 | msd = msd >> 8; |
550 | s -= 8; | 550 | s -= 8; |
551 | } | 551 | } |
552 | if (msd >= 0x10) | 552 | if (msd >= 0x10) |
553 | { | 553 | { |
554 | msd = msd >> 4; | 554 | msd = msd >> 4; |
555 | s -= 4; | 555 | s -= 4; |
556 | } | 556 | } |
557 | if (msd >= 0x4) | 557 | if (msd >= 0x4) |
558 | { | 558 | { |
559 | msd = msd >> 2; | 559 | msd = msd >> 2; |
560 | s -= 2; | 560 | s -= 2; |
561 | } | 561 | } |
562 | if (msd >= 0x2) | 562 | if (msd >= 0x2) |
563 | { | 563 | { |
564 | msd = msd >> 1; | 564 | msd = msd >> 1; |
565 | s -= 1; | 565 | s -= 1; |
566 | } | 566 | } |
567 | } | 567 | } |
568 | /* 0 <= s < GMP_LIMB_BITS. | 568 | /* 0 <= s < GMP_LIMB_BITS. |
569 | Copy b, shifting it left by s bits. */ | 569 | Copy b, shifting it left by s bits. */ |
570 | if (s > 0) | 570 | if (s > 0) |
571 | { | 571 | { |
572 | tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t)); | 572 | tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t)); |
573 | if (tmp_roomptr == NULL) | 573 | if (tmp_roomptr == NULL) |
574 | { | 574 | { |
575 | free (roomptr); | 575 | free (roomptr); |
576 | return NULL; | 576 | return NULL; |
577 | } | 577 | } |
578 | { | 578 | { |
579 | const mp_limb_t *sourceptr = b_ptr; | 579 | const mp_limb_t *sourceptr = b_ptr; |
580 | mp_limb_t *destptr = tmp_roomptr; | 580 | mp_limb_t *destptr = tmp_roomptr; |
581 | mp_twolimb_t accu = 0; | 581 | mp_twolimb_t accu = 0; |
582 | size_t count; | 582 | size_t count; |
583 | for (count = b_len; count > 0; count--) | 583 | for (count = b_len; count > 0; count--) |
584 | { | 584 | { |
585 | accu += (mp_twolimb_t) *sourceptr++ << s; | 585 | accu += (mp_twolimb_t) *sourceptr++ << s; |
586 | *destptr++ = (mp_limb_t) accu; | 586 | *destptr++ = (mp_limb_t) accu; |
587 | accu = accu >> GMP_LIMB_BITS; | 587 | accu = accu >> GMP_LIMB_BITS; |
588 | } | 588 | } |
589 | /* accu must be zero, since that was how s was determined. */ | 589 | /* accu must be zero, since that was how s was determined. */ |
590 | if (accu != 0) | 590 | if (accu != 0) |
591 | abort (); | 591 | abort (); |
592 | } | 592 | } |
593 | b_ptr = tmp_roomptr; | 593 | b_ptr = tmp_roomptr; |
594 | } | 594 | } |
595 | /* Copy a, shifting it left by s bits, yields r. | 595 | /* Copy a, shifting it left by s bits, yields r. |
596 | Memory layout: | 596 | Memory layout: |
597 | At the beginning: r = roomptr[0..a_len], | 597 | At the beginning: r = roomptr[0..a_len], |
598 | at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */ | 598 | at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */ |
599 | r_ptr = roomptr; | 599 | r_ptr = roomptr; |
600 | if (s == 0) | 600 | if (s == 0) |
601 | { | 601 | { |
602 | memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t)); | 602 | memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t)); |
603 | r_ptr[a_len] = 0; | 603 | r_ptr[a_len] = 0; |
604 | } | 604 | } |
605 | else | 605 | else |
606 | { | 606 | { |
607 | const mp_limb_t *sourceptr = a_ptr; | 607 | const mp_limb_t *sourceptr = a_ptr; |
608 | mp_limb_t *destptr = r_ptr; | 608 | mp_limb_t *destptr = r_ptr; |
609 | mp_twolimb_t accu = 0; | 609 | mp_twolimb_t accu = 0; |
610 | size_t count; | 610 | size_t count; |
611 | for (count = a_len; count > 0; count--) | 611 | for (count = a_len; count > 0; count--) |
612 | { | 612 | { |
613 | accu += (mp_twolimb_t) *sourceptr++ << s; | 613 | accu += (mp_twolimb_t) *sourceptr++ << s; |
614 | *destptr++ = (mp_limb_t) accu; | 614 | *destptr++ = (mp_limb_t) accu; |
615 | accu = accu >> GMP_LIMB_BITS; | 615 | accu = accu >> GMP_LIMB_BITS; |
616 | } | 616 | } |
617 | *destptr++ = (mp_limb_t) accu; | 617 | *destptr++ = (mp_limb_t) accu; |
618 | } | 618 | } |
619 | q_ptr = roomptr + b_len; | 619 | q_ptr = roomptr + b_len; |
620 | q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */ | 620 | q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */ |
621 | { | 621 | { |
622 | size_t j = a_len - b_len; /* m-n */ | 622 | size_t j = a_len - b_len; /* m-n */ |
623 | mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */ | 623 | mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */ |
624 | mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */ | 624 | mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */ |
625 | mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */ | 625 | mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */ |
626 | ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd; | 626 | ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd; |
627 | /* Division loop, traversed m-n+1 times. | 627 | /* Division loop, traversed m-n+1 times. |
628 | j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */ | 628 | j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */ |
629 | for (;;) | 629 | for (;;) |
630 | { | 630 | { |
631 | mp_limb_t q_star; | 631 | mp_limb_t q_star; |
632 | mp_limb_t c1; | 632 | mp_limb_t c1; |
633 | if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */ | 633 | if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */ |
634 | { | 634 | { |
635 | /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */ | 635 | /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */ |
636 | mp_twolimb_t num = | 636 | mp_twolimb_t num = |
637 | ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS) | 637 | ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS) |
638 | | r_ptr[j + b_len - 1]; | 638 | | r_ptr[j + b_len - 1]; |
639 | q_star = num / b_msd; | 639 | q_star = num / b_msd; |
640 | c1 = num % b_msd; | 640 | c1 = num % b_msd; |
641 | } | 641 | } |
642 | else | 642 | else |
643 | { | 643 | { |
644 | /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */ | 644 | /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */ |
645 | q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */ | 645 | q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */ |
646 | /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta | 646 | /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta |
647 | <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta | 647 | <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta |
648 | <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) | 648 | <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) |
649 | {<= beta !}. | 649 | {<= beta !}. |
650 | If yes, jump directly to the subtraction loop. | 650 | If yes, jump directly to the subtraction loop. |
651 | (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta | 651 | (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta |
652 | <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */ | 652 | <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */ |
653 | if (r_ptr[j + b_len] > b_msd | 653 | if (r_ptr[j + b_len] > b_msd |
654 | || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd) | 654 | || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd) |
655 | /* r[j+n] >= b[n-1]+1 or | 655 | /* r[j+n] >= b[n-1]+1 or |
656 | r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a | 656 | r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a |
657 | carry. */ | 657 | carry. */ |
658 | goto subtract; | 658 | goto subtract; |
659 | } | 659 | } |
660 | /* q_star = q*, | 660 | /* q_star = q*, |
661 | c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */ | 661 | c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */ |
662 | { | 662 | { |
663 | mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */ | 663 | mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */ |
664 | ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2]; | 664 | ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2]; |
665 | mp_twolimb_t c3 = /* b[n-2] * q* */ | 665 | mp_twolimb_t c3 = /* b[n-2] * q* */ |
666 | (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star; | 666 | (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star; |
667 | /* While c2 < c3, increase c2 and decrease c3. | 667 | /* While c2 < c3, increase c2 and decrease c3. |
668 | Consider c3-c2. While it is > 0, decrease it by | 668 | Consider c3-c2. While it is > 0, decrease it by |
669 | b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2 | 669 | b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2 |
670 | this can happen only twice. */ | 670 | this can happen only twice. */ |
671 | if (c3 > c2) | 671 | if (c3 > c2) |
672 | { | 672 | { |
673 | q_star = q_star - 1; /* q* := q* - 1 */ | 673 | q_star = q_star - 1; /* q* := q* - 1 */ |
674 | if (c3 - c2 > b_msdd) | 674 | if (c3 - c2 > b_msdd) |
675 | q_star = q_star - 1; /* q* := q* - 1 */ | 675 | q_star = q_star - 1; /* q* := q* - 1 */ |
676 | } | 676 | } |
677 | } | 677 | } |
678 | if (q_star > 0) | 678 | if (q_star > 0) |
679 | subtract: | 679 | subtract: |
680 | { | 680 | { |
681 | /* Subtract r := r - b * q* * beta^j. */ | 681 | /* Subtract r := r - b * q* * beta^j. */ |
682 | mp_limb_t cr; | 682 | mp_limb_t cr; |
683 | { | 683 | { |
684 | const mp_limb_t *sourceptr = b_ptr; | 684 | const mp_limb_t *sourceptr = b_ptr; |
685 | mp_limb_t *destptr = r_ptr + j; | 685 | mp_limb_t *destptr = r_ptr + j; |
686 | mp_twolimb_t carry = 0; | 686 | mp_twolimb_t carry = 0; |
687 | size_t count; | 687 | size_t count; |
688 | for (count = b_len; count > 0; count--) | 688 | for (count = b_len; count > 0; count--) |
689 | { | 689 | { |
690 | /* Here 0 <= carry <= q*. */ | 690 | /* Here 0 <= carry <= q*. */ |
691 | carry = | 691 | carry = |
692 | carry | 692 | carry |
693 | + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++ | 693 | + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++ |
694 | + (mp_limb_t) ~(*destptr); | 694 | + (mp_limb_t) ~(*destptr); |
695 | /* Here 0 <= carry <= beta*q* + beta-1. */ | 695 | /* Here 0 <= carry <= beta*q* + beta-1. */ |
696 | *destptr++ = ~(mp_limb_t) carry; | 696 | *destptr++ = ~(mp_limb_t) carry; |
697 | carry = carry >> GMP_LIMB_BITS; /* <= q* */ | 697 | carry = carry >> GMP_LIMB_BITS; /* <= q* */ |
698 | } | 698 | } |
699 | cr = (mp_limb_t) carry; | 699 | cr = (mp_limb_t) carry; |
700 | } | 700 | } |
701 | /* Subtract cr from r_ptr[j + b_len], then forget about | 701 | /* Subtract cr from r_ptr[j + b_len], then forget about |
702 | r_ptr[j + b_len]. */ | 702 | r_ptr[j + b_len]. */ |
703 | if (cr > r_ptr[j + b_len]) | 703 | if (cr > r_ptr[j + b_len]) |
704 | { | 704 | { |
705 | /* Subtraction gave a carry. */ | 705 | /* Subtraction gave a carry. */ |
706 | q_star = q_star - 1; /* q* := q* - 1 */ | 706 | q_star = q_star - 1; /* q* := q* - 1 */ |
707 | /* Add b back. */ | 707 | /* Add b back. */ |
708 | { | 708 | { |
709 | const mp_limb_t *sourceptr = b_ptr; | 709 | const mp_limb_t *sourceptr = b_ptr; |
710 | mp_limb_t *destptr = r_ptr + j; | 710 | mp_limb_t *destptr = r_ptr + j; |
711 | mp_limb_t carry = 0; | 711 | mp_limb_t carry = 0; |
712 | size_t count; | 712 | size_t count; |
713 | for (count = b_len; count > 0; count--) | 713 | for (count = b_len; count > 0; count--) |
714 | { | 714 | { |
715 | mp_limb_t source1 = *sourceptr++; | 715 | mp_limb_t source1 = *sourceptr++; |
716 | mp_limb_t source2 = *destptr; | 716 | mp_limb_t source2 = *destptr; |
717 | *destptr++ = source1 + source2 + carry; | 717 | *destptr++ = source1 + source2 + carry; |
718 | carry = | 718 | carry = |
719 | (carry | 719 | (carry |
720 | ? source1 >= (mp_limb_t) ~source2 | 720 | ? source1 >= (mp_limb_t) ~source2 |
721 | : source1 > (mp_limb_t) ~source2); | 721 | : source1 > (mp_limb_t) ~source2); |
722 | } | 722 | } |
723 | } | 723 | } |
724 | /* Forget about the carry and about r[j+n]. */ | 724 | /* Forget about the carry and about r[j+n]. */ |
725 | } | 725 | } |
726 | } | 726 | } |
727 | /* q* is determined. Store it as q[j]. */ | 727 | /* q* is determined. Store it as q[j]. */ |
728 | q_ptr[j] = q_star; | 728 | q_ptr[j] = q_star; |
729 | if (j == 0) | 729 | if (j == 0) |
730 | break; | 730 | break; |
731 | j--; | 731 | j--; |
732 | } | 732 | } |
733 | } | 733 | } |
734 | r_len = b_len; | 734 | r_len = b_len; |
735 | /* Normalise q. */ | 735 | /* Normalise q. */ |
736 | if (q_ptr[q_len - 1] == 0) | 736 | if (q_ptr[q_len - 1] == 0) |
737 | q_len--; | 737 | q_len--; |
738 | # if 0 /* Not needed here, since we need r only to compare it with b/2, and | 738 | # if 0 /* Not needed here, since we need r only to compare it with b/2, and |
739 | b is shifted left by s bits. */ | 739 | b is shifted left by s bits. */ |
740 | /* Shift r right by s bits. */ | 740 | /* Shift r right by s bits. */ |
741 | if (s > 0) | 741 | if (s > 0) |
742 | { | 742 | { |
743 | mp_limb_t ptr = r_ptr + r_len; | 743 | mp_limb_t ptr = r_ptr + r_len; |
744 | mp_twolimb_t accu = 0; | 744 | mp_twolimb_t accu = 0; |
745 | size_t count; | 745 | size_t count; |
746 | for (count = r_len; count > 0; count--) | 746 | for (count = r_len; count > 0; count--) |
747 | { | 747 | { |
748 | accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS; | 748 | accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS; |
749 | accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s); | 749 | accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s); |
750 | *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS); | 750 | *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS); |
751 | } | 751 | } |
752 | } | 752 | } |
753 | # endif | 753 | # endif |
754 | /* Normalise r. */ | 754 | /* Normalise r. */ |
755 | while (r_len > 0 && r_ptr[r_len - 1] == 0) | 755 | while (r_len > 0 && r_ptr[r_len - 1] == 0) |
756 | r_len--; | 756 | r_len--; |
757 | } | 757 | } |
758 | /* Compare r << 1 with b. */ | 758 | /* Compare r << 1 with b. */ |
759 | if (r_len > b_len) | 759 | if (r_len > b_len) |
@@ -762,17 +762,17 @@ divide (mpn_t a, mpn_t b, mpn_t *q) | |||
762 | size_t i; | 762 | size_t i; |
763 | for (i = b_len;;) | 763 | for (i = b_len;;) |
764 | { | 764 | { |
765 | mp_limb_t r_i = | 765 | mp_limb_t r_i = |
766 | (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0) | 766 | (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0) |
767 | | (i < r_len ? r_ptr[i] << 1 : 0); | 767 | | (i < r_len ? r_ptr[i] << 1 : 0); |
768 | mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0); | 768 | mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0); |
769 | if (r_i > b_i) | 769 | if (r_i > b_i) |
770 | goto increment_q; | 770 | goto increment_q; |
771 | if (r_i < b_i) | 771 | if (r_i < b_i) |
772 | goto keep_q; | 772 | goto keep_q; |
773 | if (i == 0) | 773 | if (i == 0) |
774 | break; | 774 | break; |
775 | i--; | 775 | i--; |
776 | } | 776 | } |
777 | } | 777 | } |
778 | if (q_len > 0 && ((q_ptr[0] & 1) != 0)) | 778 | if (q_len > 0 && ((q_ptr[0] & 1) != 0)) |
@@ -781,8 +781,8 @@ divide (mpn_t a, mpn_t b, mpn_t *q) | |||
781 | { | 781 | { |
782 | size_t i; | 782 | size_t i; |
783 | for (i = 0; i < q_len; i++) | 783 | for (i = 0; i < q_len; i++) |
784 | if (++(q_ptr[i]) != 0) | 784 | if (++(q_ptr[i]) != 0) |
785 | goto keep_q; | 785 | goto keep_q; |
786 | q_ptr[q_len++] = 1; | 786 | q_ptr[q_len++] = 1; |
787 | } | 787 | } |
788 | keep_q: | 788 | keep_q: |
@@ -811,36 +811,36 @@ convert_to_decimal (mpn_t a, size_t extra_zeroes) | |||
811 | { | 811 | { |
812 | char *d_ptr = c_ptr; | 812 | char *d_ptr = c_ptr; |
813 | for (; extra_zeroes > 0; extra_zeroes--) | 813 | for (; extra_zeroes > 0; extra_zeroes--) |
814 | *d_ptr++ = '0'; | 814 | *d_ptr++ = '0'; |
815 | while (a_len > 0) | 815 | while (a_len > 0) |
816 | { | 816 | { |
817 | /* Divide a by 10^9, in-place. */ | 817 | /* Divide a by 10^9, in-place. */ |
818 | mp_limb_t remainder = 0; | 818 | mp_limb_t remainder = 0; |
819 | mp_limb_t *ptr = a_ptr + a_len; | 819 | mp_limb_t *ptr = a_ptr + a_len; |
820 | size_t count; | 820 | size_t count; |
821 | for (count = a_len; count > 0; count--) | 821 | for (count = a_len; count > 0; count--) |
822 | { | 822 | { |
823 | mp_twolimb_t num = | 823 | mp_twolimb_t num = |
824 | ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr; | 824 | ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr; |
825 | *ptr = num / 1000000000; | 825 | *ptr = num / 1000000000; |
826 | remainder = num % 1000000000; | 826 | remainder = num % 1000000000; |
827 | } | 827 | } |
828 | /* Store the remainder as 9 decimal digits. */ | 828 | /* Store the remainder as 9 decimal digits. */ |
829 | for (count = 9; count > 0; count--) | 829 | for (count = 9; count > 0; count--) |
830 | { | 830 | { |
831 | *d_ptr++ = '0' + (remainder % 10); | 831 | *d_ptr++ = '0' + (remainder % 10); |
832 | remainder = remainder / 10; | 832 | remainder = remainder / 10; |
833 | } | 833 | } |
834 | /* Normalize a. */ | 834 | /* Normalize a. */ |
835 | if (a_ptr[a_len - 1] == 0) | 835 | if (a_ptr[a_len - 1] == 0) |
836 | a_len--; | 836 | a_len--; |
837 | } | 837 | } |
838 | /* Remove leading zeroes. */ | 838 | /* Remove leading zeroes. */ |
839 | while (d_ptr > c_ptr && d_ptr[-1] == '0') | 839 | while (d_ptr > c_ptr && d_ptr[-1] == '0') |
840 | d_ptr--; | 840 | d_ptr--; |
841 | /* But keep at least one zero. */ | 841 | /* But keep at least one zero. */ |
842 | if (d_ptr == c_ptr) | 842 | if (d_ptr == c_ptr) |
843 | *d_ptr++ = '0'; | 843 | *d_ptr++ = '0'; |
844 | /* Terminate the string. */ | 844 | /* Terminate the string. */ |
845 | *d_ptr = '\0'; | 845 | *d_ptr = '\0'; |
846 | } | 846 | } |
@@ -885,12 +885,12 @@ decode_long_double (long double x, int *ep, mpn_t *mp) | |||
885 | hi = (int) y; | 885 | hi = (int) y; |
886 | y -= hi; | 886 | y -= hi; |
887 | if (!(y >= 0.0L && y < 1.0L)) | 887 | if (!(y >= 0.0L && y < 1.0L)) |
888 | abort (); | 888 | abort (); |
889 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); | 889 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); |
890 | lo = (int) y; | 890 | lo = (int) y; |
891 | y -= lo; | 891 | y -= lo; |
892 | if (!(y >= 0.0L && y < 1.0L)) | 892 | if (!(y >= 0.0L && y < 1.0L)) |
893 | abort (); | 893 | abort (); |
894 | m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; | 894 | m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; |
895 | } | 895 | } |
896 | # else | 896 | # else |
@@ -900,7 +900,7 @@ decode_long_double (long double x, int *ep, mpn_t *mp) | |||
900 | d = (int) y; | 900 | d = (int) y; |
901 | y -= d; | 901 | y -= d; |
902 | if (!(y >= 0.0L && y < 1.0L)) | 902 | if (!(y >= 0.0L && y < 1.0L)) |
903 | abort (); | 903 | abort (); |
904 | m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d; | 904 | m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d; |
905 | } | 905 | } |
906 | # endif | 906 | # endif |
@@ -912,12 +912,12 @@ decode_long_double (long double x, int *ep, mpn_t *mp) | |||
912 | hi = (int) y; | 912 | hi = (int) y; |
913 | y -= hi; | 913 | y -= hi; |
914 | if (!(y >= 0.0L && y < 1.0L)) | 914 | if (!(y >= 0.0L && y < 1.0L)) |
915 | abort (); | 915 | abort (); |
916 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); | 916 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); |
917 | lo = (int) y; | 917 | lo = (int) y; |
918 | y -= lo; | 918 | y -= lo; |
919 | if (!(y >= 0.0L && y < 1.0L)) | 919 | if (!(y >= 0.0L && y < 1.0L)) |
920 | abort (); | 920 | abort (); |
921 | m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; | 921 | m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; |
922 | } | 922 | } |
923 | #if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess | 923 | #if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess |
@@ -973,12 +973,12 @@ decode_double (double x, int *ep, mpn_t *mp) | |||
973 | hi = (int) y; | 973 | hi = (int) y; |
974 | y -= hi; | 974 | y -= hi; |
975 | if (!(y >= 0.0 && y < 1.0)) | 975 | if (!(y >= 0.0 && y < 1.0)) |
976 | abort (); | 976 | abort (); |
977 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); | 977 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); |
978 | lo = (int) y; | 978 | lo = (int) y; |
979 | y -= lo; | 979 | y -= lo; |
980 | if (!(y >= 0.0 && y < 1.0)) | 980 | if (!(y >= 0.0 && y < 1.0)) |
981 | abort (); | 981 | abort (); |
982 | m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; | 982 | m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; |
983 | } | 983 | } |
984 | # else | 984 | # else |
@@ -988,7 +988,7 @@ decode_double (double x, int *ep, mpn_t *mp) | |||
988 | d = (int) y; | 988 | d = (int) y; |
989 | y -= d; | 989 | y -= d; |
990 | if (!(y >= 0.0 && y < 1.0)) | 990 | if (!(y >= 0.0 && y < 1.0)) |
991 | abort (); | 991 | abort (); |
992 | m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d; | 992 | m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d; |
993 | } | 993 | } |
994 | # endif | 994 | # endif |
@@ -1000,12 +1000,12 @@ decode_double (double x, int *ep, mpn_t *mp) | |||
1000 | hi = (int) y; | 1000 | hi = (int) y; |
1001 | y -= hi; | 1001 | y -= hi; |
1002 | if (!(y >= 0.0 && y < 1.0)) | 1002 | if (!(y >= 0.0 && y < 1.0)) |
1003 | abort (); | 1003 | abort (); |
1004 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); | 1004 | y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); |
1005 | lo = (int) y; | 1005 | lo = (int) y; |
1006 | y -= lo; | 1006 | y -= lo; |
1007 | if (!(y >= 0.0 && y < 1.0)) | 1007 | if (!(y >= 0.0 && y < 1.0)) |
1008 | abort (); | 1008 | abort (); |
1009 | m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; | 1009 | m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; |
1010 | } | 1010 | } |
1011 | if (!(y == 0.0)) | 1011 | if (!(y == 0.0)) |
@@ -1063,8 +1063,8 @@ scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n) | |||
1063 | abs_n = (n >= 0 ? n : -n); | 1063 | abs_n = (n >= 0 ? n : -n); |
1064 | abs_s = (s >= 0 ? s : -s); | 1064 | abs_s = (s >= 0 ? s : -s); |
1065 | pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1 | 1065 | pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1 |
1066 | + abs_s / GMP_LIMB_BITS + 1) | 1066 | + abs_s / GMP_LIMB_BITS + 1) |
1067 | * sizeof (mp_limb_t)); | 1067 | * sizeof (mp_limb_t)); |
1068 | if (pow5_ptr == NULL) | 1068 | if (pow5_ptr == NULL) |
1069 | { | 1069 | { |
1070 | free (memory); | 1070 | free (memory); |
@@ -1077,26 +1077,26 @@ scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n) | |||
1077 | if (abs_n > 0) | 1077 | if (abs_n > 0) |
1078 | { | 1078 | { |
1079 | static mp_limb_t const small_pow5[13 + 1] = | 1079 | static mp_limb_t const small_pow5[13 + 1] = |
1080 | { | 1080 | { |
1081 | 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, | 1081 | 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, |
1082 | 48828125, 244140625, 1220703125 | 1082 | 48828125, 244140625, 1220703125 |
1083 | }; | 1083 | }; |
1084 | unsigned int n13; | 1084 | unsigned int n13; |
1085 | for (n13 = 0; n13 <= abs_n; n13 += 13) | 1085 | for (n13 = 0; n13 <= abs_n; n13 += 13) |
1086 | { | 1086 | { |
1087 | mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13]; | 1087 | mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13]; |
1088 | size_t j; | 1088 | size_t j; |
1089 | mp_twolimb_t carry = 0; | 1089 | mp_twolimb_t carry = 0; |
1090 | for (j = 0; j < pow5_len; j++) | 1090 | for (j = 0; j < pow5_len; j++) |
1091 | { | 1091 | { |
1092 | mp_limb_t digit2 = pow5_ptr[j]; | 1092 | mp_limb_t digit2 = pow5_ptr[j]; |
1093 | carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; | 1093 | carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; |
1094 | pow5_ptr[j] = (mp_limb_t) carry; | 1094 | pow5_ptr[j] = (mp_limb_t) carry; |
1095 | carry = carry >> GMP_LIMB_BITS; | 1095 | carry = carry >> GMP_LIMB_BITS; |
1096 | } | 1096 | } |
1097 | if (carry > 0) | 1097 | if (carry > 0) |
1098 | pow5_ptr[pow5_len++] = (mp_limb_t) carry; | 1098 | pow5_ptr[pow5_len++] = (mp_limb_t) carry; |
1099 | } | 1099 | } |
1100 | } | 1100 | } |
1101 | s_limbs = abs_s / GMP_LIMB_BITS; | 1101 | s_limbs = abs_s / GMP_LIMB_BITS; |
1102 | s_bits = abs_s % GMP_LIMB_BITS; | 1102 | s_bits = abs_s % GMP_LIMB_BITS; |
@@ -1104,129 +1104,129 @@ scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n) | |||
1104 | { | 1104 | { |
1105 | /* Multiply with 2^|s|. */ | 1105 | /* Multiply with 2^|s|. */ |
1106 | if (s_bits > 0) | 1106 | if (s_bits > 0) |
1107 | { | 1107 | { |
1108 | mp_limb_t *ptr = pow5_ptr; | 1108 | mp_limb_t *ptr = pow5_ptr; |
1109 | mp_twolimb_t accu = 0; | 1109 | mp_twolimb_t accu = 0; |
1110 | size_t count; | 1110 | size_t count; |
1111 | for (count = pow5_len; count > 0; count--) | 1111 | for (count = pow5_len; count > 0; count--) |
1112 | { | 1112 | { |
1113 | accu += (mp_twolimb_t) *ptr << s_bits; | 1113 | accu += (mp_twolimb_t) *ptr << s_bits; |
1114 | *ptr++ = (mp_limb_t) accu; | 1114 | *ptr++ = (mp_limb_t) accu; |
1115 | accu = accu >> GMP_LIMB_BITS; | 1115 | accu = accu >> GMP_LIMB_BITS; |
1116 | } | 1116 | } |
1117 | if (accu > 0) | 1117 | if (accu > 0) |
1118 | { | 1118 | { |
1119 | *ptr = (mp_limb_t) accu; | 1119 | *ptr = (mp_limb_t) accu; |
1120 | pow5_len++; | 1120 | pow5_len++; |
1121 | } | 1121 | } |
1122 | } | 1122 | } |
1123 | if (s_limbs > 0) | 1123 | if (s_limbs > 0) |
1124 | { | 1124 | { |
1125 | size_t count; | 1125 | size_t count; |
1126 | for (count = pow5_len; count > 0;) | 1126 | for (count = pow5_len; count > 0;) |
1127 | { | 1127 | { |
1128 | count--; | 1128 | count--; |
1129 | pow5_ptr[s_limbs + count] = pow5_ptr[count]; | 1129 | pow5_ptr[s_limbs + count] = pow5_ptr[count]; |
1130 | } | 1130 | } |
1131 | for (count = s_limbs; count > 0;) | 1131 | for (count = s_limbs; count > 0;) |
1132 | { | 1132 | { |
1133 | count--; | 1133 | count--; |
1134 | pow5_ptr[count] = 0; | 1134 | pow5_ptr[count] = 0; |
1135 | } | 1135 | } |
1136 | pow5_len += s_limbs; | 1136 | pow5_len += s_limbs; |
1137 | } | 1137 | } |
1138 | pow5.limbs = pow5_ptr; | 1138 | pow5.limbs = pow5_ptr; |
1139 | pow5.nlimbs = pow5_len; | 1139 | pow5.nlimbs = pow5_len; |
1140 | if (n >= 0) | 1140 | if (n >= 0) |
1141 | { | 1141 | { |
1142 | /* Multiply m with pow5. No division needed. */ | 1142 | /* Multiply m with pow5. No division needed. */ |
1143 | z_memory = multiply (m, pow5, &z); | 1143 | z_memory = multiply (m, pow5, &z); |
1144 | } | 1144 | } |
1145 | else | 1145 | else |
1146 | { | 1146 | { |
1147 | /* Divide m by pow5 and round. */ | 1147 | /* Divide m by pow5 and round. */ |
1148 | z_memory = divide (m, pow5, &z); | 1148 | z_memory = divide (m, pow5, &z); |
1149 | } | 1149 | } |
1150 | } | 1150 | } |
1151 | else | 1151 | else |
1152 | { | 1152 | { |
1153 | pow5.limbs = pow5_ptr; | 1153 | pow5.limbs = pow5_ptr; |
1154 | pow5.nlimbs = pow5_len; | 1154 | pow5.nlimbs = pow5_len; |
1155 | if (n >= 0) | 1155 | if (n >= 0) |
1156 | { | 1156 | { |
1157 | /* n >= 0, s < 0. | 1157 | /* n >= 0, s < 0. |
1158 | Multiply m with pow5, then divide by 2^|s|. */ | 1158 | Multiply m with pow5, then divide by 2^|s|. */ |
1159 | mpn_t numerator; | 1159 | mpn_t numerator; |
1160 | mpn_t denominator; | 1160 | mpn_t denominator; |
1161 | void *tmp_memory; | 1161 | void *tmp_memory; |
1162 | tmp_memory = multiply (m, pow5, &numerator); | 1162 | tmp_memory = multiply (m, pow5, &numerator); |
1163 | if (tmp_memory == NULL) | 1163 | if (tmp_memory == NULL) |
1164 | { | 1164 | { |
1165 | free (pow5_ptr); | 1165 | free (pow5_ptr); |
1166 | free (memory); | 1166 | free (memory); |
1167 | return NULL; | 1167 | return NULL; |
1168 | } | 1168 | } |
1169 | /* Construct 2^|s|. */ | 1169 | /* Construct 2^|s|. */ |
1170 | { | 1170 | { |
1171 | mp_limb_t *ptr = pow5_ptr + pow5_len; | 1171 | mp_limb_t *ptr = pow5_ptr + pow5_len; |
1172 | size_t i; | 1172 | size_t i; |
1173 | for (i = 0; i < s_limbs; i++) | 1173 | for (i = 0; i < s_limbs; i++) |
1174 | ptr[i] = 0; | 1174 | ptr[i] = 0; |
1175 | ptr[s_limbs] = (mp_limb_t) 1 << s_bits; | 1175 | ptr[s_limbs] = (mp_limb_t) 1 << s_bits; |
1176 | denominator.limbs = ptr; | 1176 | denominator.limbs = ptr; |
1177 | denominator.nlimbs = s_limbs + 1; | 1177 | denominator.nlimbs = s_limbs + 1; |
1178 | } | 1178 | } |
1179 | z_memory = divide (numerator, denominator, &z); | 1179 | z_memory = divide (numerator, denominator, &z); |
1180 | free (tmp_memory); | 1180 | free (tmp_memory); |
1181 | } | 1181 | } |
1182 | else | 1182 | else |
1183 | { | 1183 | { |
1184 | /* n < 0, s > 0. | 1184 | /* n < 0, s > 0. |
1185 | Multiply m with 2^s, then divide by pow5. */ | 1185 | Multiply m with 2^s, then divide by pow5. */ |
1186 | mpn_t numerator; | 1186 | mpn_t numerator; |
1187 | mp_limb_t *num_ptr; | 1187 | mp_limb_t *num_ptr; |
1188 | num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1) | 1188 | num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1) |
1189 | * sizeof (mp_limb_t)); | 1189 | * sizeof (mp_limb_t)); |
1190 | if (num_ptr == NULL) | 1190 | if (num_ptr == NULL) |
1191 | { | 1191 | { |
1192 | free (pow5_ptr); | 1192 | free (pow5_ptr); |
1193 | free (memory); | 1193 | free (memory); |
1194 | return NULL; | 1194 | return NULL; |
1195 | } | 1195 | } |
1196 | { | 1196 | { |
1197 | mp_limb_t *destptr = num_ptr; | 1197 | mp_limb_t *destptr = num_ptr; |
1198 | { | 1198 | { |
1199 | size_t i; | 1199 | size_t i; |
1200 | for (i = 0; i < s_limbs; i++) | 1200 | for (i = 0; i < s_limbs; i++) |
1201 | *destptr++ = 0; | 1201 | *destptr++ = 0; |
1202 | } | 1202 | } |
1203 | if (s_bits > 0) | 1203 | if (s_bits > 0) |
1204 | { | 1204 | { |
1205 | const mp_limb_t *sourceptr = m.limbs; | 1205 | const mp_limb_t *sourceptr = m.limbs; |
1206 | mp_twolimb_t accu = 0; | 1206 | mp_twolimb_t accu = 0; |
1207 | size_t count; | 1207 | size_t count; |
1208 | for (count = m.nlimbs; count > 0; count--) | 1208 | for (count = m.nlimbs; count > 0; count--) |
1209 | { | 1209 | { |
1210 | accu += (mp_twolimb_t) *sourceptr++ << s_bits; | 1210 | accu += (mp_twolimb_t) *sourceptr++ << s_bits; |
1211 | *destptr++ = (mp_limb_t) accu; | 1211 | *destptr++ = (mp_limb_t) accu; |
1212 | accu = accu >> GMP_LIMB_BITS; | 1212 | accu = accu >> GMP_LIMB_BITS; |
1213 | } | 1213 | } |
1214 | if (accu > 0) | 1214 | if (accu > 0) |
1215 | *destptr++ = (mp_limb_t) accu; | 1215 | *destptr++ = (mp_limb_t) accu; |
1216 | } | 1216 | } |
1217 | else | 1217 | else |
1218 | { | 1218 | { |
1219 | const mp_limb_t *sourceptr = m.limbs; | 1219 | const mp_limb_t *sourceptr = m.limbs; |
1220 | size_t count; | 1220 | size_t count; |
1221 | for (count = m.nlimbs; count > 0; count--) | 1221 | for (count = m.nlimbs; count > 0; count--) |
1222 | *destptr++ = *sourceptr++; | 1222 | *destptr++ = *sourceptr++; |
1223 | } | 1223 | } |
1224 | numerator.limbs = num_ptr; | 1224 | numerator.limbs = num_ptr; |
1225 | numerator.nlimbs = destptr - num_ptr; | 1225 | numerator.nlimbs = destptr - num_ptr; |
1226 | } | 1226 | } |
1227 | z_memory = divide (numerator, pow5, &z); | 1227 | z_memory = divide (numerator, pow5, &z); |
1228 | free (num_ptr); | 1228 | free (num_ptr); |
1229 | } | 1229 | } |
1230 | } | 1230 | } |
1231 | free (pow5_ptr); | 1231 | free (pow5_ptr); |
1232 | free (memory); | 1232 | free (memory); |
@@ -1298,35 +1298,35 @@ floorlog10l (long double x) | |||
1298 | if (y < 0.5L) | 1298 | if (y < 0.5L) |
1299 | { | 1299 | { |
1300 | while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) | 1300 | while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) |
1301 | { | 1301 | { |
1302 | y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); | 1302 | y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); |
1303 | exp -= GMP_LIMB_BITS; | 1303 | exp -= GMP_LIMB_BITS; |
1304 | } | 1304 | } |
1305 | if (y < (1.0L / (1 << 16))) | 1305 | if (y < (1.0L / (1 << 16))) |
1306 | { | 1306 | { |
1307 | y *= 1.0L * (1 << 16); | 1307 | y *= 1.0L * (1 << 16); |
1308 | exp -= 16; | 1308 | exp -= 16; |
1309 | } | 1309 | } |
1310 | if (y < (1.0L / (1 << 8))) | 1310 | if (y < (1.0L / (1 << 8))) |
1311 | { | 1311 | { |
1312 | y *= 1.0L * (1 << 8); | 1312 | y *= 1.0L * (1 << 8); |
1313 | exp -= 8; | 1313 | exp -= 8; |
1314 | } | 1314 | } |
1315 | if (y < (1.0L / (1 << 4))) | 1315 | if (y < (1.0L / (1 << 4))) |
1316 | { | 1316 | { |
1317 | y *= 1.0L * (1 << 4); | 1317 | y *= 1.0L * (1 << 4); |
1318 | exp -= 4; | 1318 | exp -= 4; |
1319 | } | 1319 | } |
1320 | if (y < (1.0L / (1 << 2))) | 1320 | if (y < (1.0L / (1 << 2))) |
1321 | { | 1321 | { |
1322 | y *= 1.0L * (1 << 2); | 1322 | y *= 1.0L * (1 << 2); |
1323 | exp -= 2; | 1323 | exp -= 2; |
1324 | } | 1324 | } |
1325 | if (y < (1.0L / (1 << 1))) | 1325 | if (y < (1.0L / (1 << 1))) |
1326 | { | 1326 | { |
1327 | y *= 1.0L * (1 << 1); | 1327 | y *= 1.0L * (1 << 1); |
1328 | exp -= 1; | 1328 | exp -= 1; |
1329 | } | 1329 | } |
1330 | } | 1330 | } |
1331 | if (!(y >= 0.5L && y < 1.0L)) | 1331 | if (!(y >= 0.5L && y < 1.0L)) |
1332 | abort (); | 1332 | abort (); |
@@ -1389,35 +1389,35 @@ floorlog10 (double x) | |||
1389 | if (y < 0.5) | 1389 | if (y < 0.5) |
1390 | { | 1390 | { |
1391 | while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) | 1391 | while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) |
1392 | { | 1392 | { |
1393 | y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); | 1393 | y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); |
1394 | exp -= GMP_LIMB_BITS; | 1394 | exp -= GMP_LIMB_BITS; |
1395 | } | 1395 | } |
1396 | if (y < (1.0 / (1 << 16))) | 1396 | if (y < (1.0 / (1 << 16))) |
1397 | { | 1397 | { |
1398 | y *= 1.0 * (1 << 16); | 1398 | y *= 1.0 * (1 << 16); |
1399 | exp -= 16; | 1399 | exp -= 16; |
1400 | } | 1400 | } |
1401 | if (y < (1.0 / (1 << 8))) | 1401 | if (y < (1.0 / (1 << 8))) |
1402 | { | 1402 | { |
1403 | y *= 1.0 * (1 << 8); | 1403 | y *= 1.0 * (1 << 8); |
1404 | exp -= 8; | 1404 | exp -= 8; |
1405 | } | 1405 | } |
1406 | if (y < (1.0 / (1 << 4))) | 1406 | if (y < (1.0 / (1 << 4))) |
1407 | { | 1407 | { |
1408 | y *= 1.0 * (1 << 4); | 1408 | y *= 1.0 * (1 << 4); |
1409 | exp -= 4; | 1409 | exp -= 4; |
1410 | } | 1410 | } |
1411 | if (y < (1.0 / (1 << 2))) | 1411 | if (y < (1.0 / (1 << 2))) |
1412 | { | 1412 | { |
1413 | y *= 1.0 * (1 << 2); | 1413 | y *= 1.0 * (1 << 2); |
1414 | exp -= 2; | 1414 | exp -= 2; |
1415 | } | 1415 | } |
1416 | if (y < (1.0 / (1 << 1))) | 1416 | if (y < (1.0 / (1 << 1))) |
1417 | { | 1417 | { |
1418 | y *= 1.0 * (1 << 1); | 1418 | y *= 1.0 * (1 << 1); |
1419 | exp -= 1; | 1419 | exp -= 1; |
1420 | } | 1420 | } |
1421 | } | 1421 | } |
1422 | if (!(y >= 0.5 && y < 1.0)) | 1422 | if (!(y >= 0.5 && y < 1.0)) |
1423 | abort (); | 1423 | abort (); |
@@ -1476,7 +1476,7 @@ is_borderline (const char *digits, size_t precision) | |||
1476 | 1476 | ||
1477 | DCHAR_T * | 1477 | DCHAR_T * |
1478 | VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, | 1478 | VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, |
1479 | const FCHAR_T *format, va_list args) | 1479 | const FCHAR_T *format, va_list args) |
1480 | { | 1480 | { |
1481 | DIRECTIVES d; | 1481 | DIRECTIVES d; |
1482 | arguments a; | 1482 | arguments a; |
@@ -1486,8 +1486,8 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, | |||
1486 | return NULL; | 1486 | return NULL; |
1487 | 1487 | ||
1488 | #define CLEANUP() \ | 1488 | #define CLEANUP() \ |
1489 | free (d.dir); \ | 1489 | free (d.dir); \ |
1490 | if (a.arg) \ | 1490 | if (a.arg) \ |
1491 | free (a.arg); | 1491 | free (a.arg); |
1492 | 1492 | ||
1493 | if (PRINTF_FETCHARGS (args, &a) < 0) | 1493 | if (PRINTF_FETCHARGS (args, &a) < 0) |
@@ -1516,30 +1516,30 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, | |||
1516 | #if HAVE_ALLOCA | 1516 | #if HAVE_ALLOCA |
1517 | if (buf_neededlength < 4000 / sizeof (TCHAR_T)) | 1517 | if (buf_neededlength < 4000 / sizeof (TCHAR_T)) |
1518 | { | 1518 | { |
1519 | buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T)); | 1519 | buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T)); |
1520 | buf_malloced = NULL; | 1520 | buf_malloced = NULL; |
1521 | } | 1521 | } |
1522 | else | 1522 | else |
1523 | #endif | 1523 | #endif |
1524 | { | 1524 | { |
1525 | size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T)); | 1525 | size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T)); |
1526 | if (size_overflow_p (buf_memsize)) | 1526 | if (size_overflow_p (buf_memsize)) |
1527 | goto out_of_memory_1; | 1527 | goto out_of_memory_1; |
1528 | buf = (TCHAR_T *) malloc (buf_memsize); | 1528 | buf = (TCHAR_T *) malloc (buf_memsize); |
1529 | if (buf == NULL) | 1529 | if (buf == NULL) |
1530 | goto out_of_memory_1; | 1530 | goto out_of_memory_1; |
1531 | buf_malloced = buf; | 1531 | buf_malloced = buf; |
1532 | } | 1532 | } |
1533 | 1533 | ||
1534 | if (resultbuf != NULL) | 1534 | if (resultbuf != NULL) |
1535 | { | 1535 | { |
1536 | result = resultbuf; | 1536 | result = resultbuf; |
1537 | allocated = *lengthp; | 1537 | allocated = *lengthp; |
1538 | } | 1538 | } |
1539 | else | 1539 | else |
1540 | { | 1540 | { |
1541 | result = NULL; | 1541 | result = NULL; |
1542 | allocated = 0; | 1542 | allocated = 0; |
1543 | } | 1543 | } |
1544 | length = 0; | 1544 | length = 0; |
1545 | /* Invariants: | 1545 | /* Invariants: |
@@ -1549,3881 +1549,3881 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, | |||
1549 | /* Ensures that allocated >= needed. Aborts through a jump to | 1549 | /* Ensures that allocated >= needed. Aborts through a jump to |
1550 | out_of_memory if needed is SIZE_MAX or otherwise too big. */ | 1550 | out_of_memory if needed is SIZE_MAX or otherwise too big. */ |
1551 | #define ENSURE_ALLOCATION(needed) \ | 1551 | #define ENSURE_ALLOCATION(needed) \ |
1552 | if ((needed) > allocated) \ | 1552 | if ((needed) > allocated) \ |
1553 | { \ | 1553 | { \ |
1554 | size_t memory_size; \ | 1554 | size_t memory_size; \ |
1555 | DCHAR_T *memory; \ | 1555 | DCHAR_T *memory; \ |
1556 | \ | 1556 | \ |
1557 | allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ | 1557 | allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ |
1558 | if ((needed) > allocated) \ | 1558 | if ((needed) > allocated) \ |
1559 | allocated = (needed); \ | 1559 | allocated = (needed); \ |
1560 | memory_size = xtimes (allocated, sizeof (DCHAR_T)); \ | 1560 | memory_size = xtimes (allocated, sizeof (DCHAR_T)); \ |
1561 | if (size_overflow_p (memory_size)) \ | 1561 | if (size_overflow_p (memory_size)) \ |
1562 | goto out_of_memory; \ | 1562 | goto out_of_memory; \ |
1563 | if (result == resultbuf || result == NULL) \ | 1563 | if (result == resultbuf || result == NULL) \ |
1564 | memory = (DCHAR_T *) malloc (memory_size); \ | 1564 | memory = (DCHAR_T *) malloc (memory_size); \ |
1565 | else \ | 1565 | else \ |
1566 | memory = (DCHAR_T *) realloc (result, memory_size); \ | 1566 | memory = (DCHAR_T *) realloc (result, memory_size); \ |
1567 | if (memory == NULL) \ | 1567 | if (memory == NULL) \ |
1568 | goto out_of_memory; \ | 1568 | goto out_of_memory; \ |
1569 | if (result == resultbuf && length > 0) \ | 1569 | if (result == resultbuf && length > 0) \ |
1570 | DCHAR_CPY (memory, result, length); \ | 1570 | DCHAR_CPY (memory, result, length); \ |
1571 | result = memory; \ | 1571 | result = memory; \ |
1572 | } | 1572 | } |
1573 | 1573 | ||
1574 | for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) | 1574 | for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) |
1575 | { | 1575 | { |
1576 | if (cp != dp->dir_start) | 1576 | if (cp != dp->dir_start) |
1577 | { | 1577 | { |
1578 | size_t n = dp->dir_start - cp; | 1578 | size_t n = dp->dir_start - cp; |
1579 | size_t augmented_length = xsum (length, n); | 1579 | size_t augmented_length = xsum (length, n); |
1580 | 1580 | ||
1581 | ENSURE_ALLOCATION (augmented_length); | 1581 | ENSURE_ALLOCATION (augmented_length); |
1582 | /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we | 1582 | /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we |
1583 | need that the format string contains only ASCII characters | 1583 | need that the format string contains only ASCII characters |
1584 | if FCHAR_T and DCHAR_T are not the same type. */ | 1584 | if FCHAR_T and DCHAR_T are not the same type. */ |
1585 | if (sizeof (FCHAR_T) == sizeof (DCHAR_T)) | 1585 | if (sizeof (FCHAR_T) == sizeof (DCHAR_T)) |
1586 | { | 1586 | { |
1587 | DCHAR_CPY (result + length, (const DCHAR_T *) cp, n); | 1587 | DCHAR_CPY (result + length, (const DCHAR_T *) cp, n); |
1588 | length = augmented_length; | 1588 | length = augmented_length; |
1589 | } | 1589 | } |
1590 | else | 1590 | else |
1591 | { | 1591 | { |
1592 | do | 1592 | do |
1593 | result[length++] = (unsigned char) *cp++; | 1593 | result[length++] = (unsigned char) *cp++; |
1594 | while (--n > 0); | 1594 | while (--n > 0); |
1595 | } | 1595 | } |
1596 | } | 1596 | } |
1597 | if (i == d.count) | 1597 | if (i == d.count) |
1598 | break; | 1598 | break; |
1599 | 1599 | ||
1600 | /* Execute a single directive. */ | 1600 | /* Execute a single directive. */ |
1601 | if (dp->conversion == '%') | 1601 | if (dp->conversion == '%') |
1602 | { | 1602 | { |
1603 | size_t augmented_length; | 1603 | size_t augmented_length; |
1604 | 1604 | ||
1605 | if (!(dp->arg_index == ARG_NONE)) | 1605 | if (!(dp->arg_index == ARG_NONE)) |
1606 | abort (); | 1606 | abort (); |
1607 | augmented_length = xsum (length, 1); | 1607 | augmented_length = xsum (length, 1); |
1608 | ENSURE_ALLOCATION (augmented_length); | 1608 | ENSURE_ALLOCATION (augmented_length); |
1609 | result[length] = '%'; | 1609 | result[length] = '%'; |
1610 | length = augmented_length; | 1610 | length = augmented_length; |
1611 | } | 1611 | } |
1612 | else | 1612 | else |
1613 | { | 1613 | { |
1614 | if (!(dp->arg_index != ARG_NONE)) | 1614 | if (!(dp->arg_index != ARG_NONE)) |
1615 | abort (); | 1615 | abort (); |
1616 | 1616 | ||
1617 | if (dp->conversion == 'n') | 1617 | if (dp->conversion == 'n') |
1618 | { | 1618 | { |
1619 | switch (a.arg[dp->arg_index].type) | 1619 | switch (a.arg[dp->arg_index].type) |
1620 | { | 1620 | { |
1621 | case TYPE_COUNT_SCHAR_POINTER: | 1621 | case TYPE_COUNT_SCHAR_POINTER: |
1622 | *a.arg[dp->arg_index].a.a_count_schar_pointer = length; | 1622 | *a.arg[dp->arg_index].a.a_count_schar_pointer = length; |
1623 | break; | 1623 | break; |
1624 | case TYPE_COUNT_SHORT_POINTER: | 1624 | case TYPE_COUNT_SHORT_POINTER: |
1625 | *a.arg[dp->arg_index].a.a_count_short_pointer = length; | 1625 | *a.arg[dp->arg_index].a.a_count_short_pointer = length; |
1626 | break; | 1626 | break; |
1627 | case TYPE_COUNT_INT_POINTER: | 1627 | case TYPE_COUNT_INT_POINTER: |
1628 | *a.arg[dp->arg_index].a.a_count_int_pointer = length; | 1628 | *a.arg[dp->arg_index].a.a_count_int_pointer = length; |
1629 | break; | 1629 | break; |
1630 | case TYPE_COUNT_LONGINT_POINTER: | 1630 | case TYPE_COUNT_LONGINT_POINTER: |
1631 | *a.arg[dp->arg_index].a.a_count_longint_pointer = length; | 1631 | *a.arg[dp->arg_index].a.a_count_longint_pointer = length; |
1632 | break; | 1632 | break; |
1633 | #if HAVE_LONG_LONG_INT | 1633 | #if HAVE_LONG_LONG_INT |
1634 | case TYPE_COUNT_LONGLONGINT_POINTER: | 1634 | case TYPE_COUNT_LONGLONGINT_POINTER: |
1635 | *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; | 1635 | *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; |
1636 | break; | 1636 | break; |
1637 | #endif | 1637 | #endif |
1638 | default: | 1638 | default: |
1639 | abort (); | 1639 | abort (); |
1640 | } | 1640 | } |
1641 | } | 1641 | } |
1642 | #if ENABLE_UNISTDIO | 1642 | #if ENABLE_UNISTDIO |
1643 | /* The unistdio extensions. */ | 1643 | /* The unistdio extensions. */ |
1644 | else if (dp->conversion == 'U') | 1644 | else if (dp->conversion == 'U') |
1645 | { | 1645 | { |
1646 | arg_type type = a.arg[dp->arg_index].type; | 1646 | arg_type type = a.arg[dp->arg_index].type; |
1647 | int flags = dp->flags; | 1647 | int flags = dp->flags; |
1648 | int has_width; | 1648 | int has_width; |
1649 | size_t width; | 1649 | size_t width; |
1650 | int has_precision; | 1650 | int has_precision; |
1651 | size_t precision; | 1651 | size_t precision; |
1652 | 1652 | ||
1653 | has_width = 0; | 1653 | has_width = 0; |
1654 | width = 0; | 1654 | width = 0; |
1655 | if (dp->width_start != dp->width_end) | 1655 | if (dp->width_start != dp->width_end) |
1656 | { | 1656 | { |
1657 | if (dp->width_arg_index != ARG_NONE) | 1657 | if (dp->width_arg_index != ARG_NONE) |
1658 | { | 1658 | { |
1659 | int arg; | 1659 | int arg; |
1660 | 1660 | ||
1661 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | 1661 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
1662 | abort (); | 1662 | abort (); |
1663 | arg = a.arg[dp->width_arg_index].a.a_int; | 1663 | arg = a.arg[dp->width_arg_index].a.a_int; |
1664 | if (arg < 0) | 1664 | if (arg < 0) |
1665 | { | 1665 | { |
1666 | /* "A negative field width is taken as a '-' flag | 1666 | /* "A negative field width is taken as a '-' flag |
1667 | followed by a positive field width." */ | 1667 | followed by a positive field width." */ |
1668 | flags |= FLAG_LEFT; | 1668 | flags |= FLAG_LEFT; |
1669 | width = (unsigned int) (-arg); | 1669 | width = (unsigned int) (-arg); |
1670 | } | 1670 | } |
1671 | else | 1671 | else |
1672 | width = arg; | 1672 | width = arg; |
1673 | } | 1673 | } |
1674 | else | 1674 | else |
1675 | { | 1675 | { |
1676 | const FCHAR_T *digitp = dp->width_start; | 1676 | const FCHAR_T *digitp = dp->width_start; |
1677 | 1677 | ||
1678 | do | 1678 | do |
1679 | width = xsum (xtimes (width, 10), *digitp++ - '0'); | 1679 | width = xsum (xtimes (width, 10), *digitp++ - '0'); |
1680 | while (digitp != dp->width_end); | 1680 | while (digitp != dp->width_end); |
1681 | } | 1681 | } |
1682 | has_width = 1; | 1682 | has_width = 1; |
1683 | } | 1683 | } |
1684 | 1684 | ||
1685 | has_precision = 0; | 1685 | has_precision = 0; |
1686 | precision = 0; | 1686 | precision = 0; |
1687 | if (dp->precision_start != dp->precision_end) | 1687 | if (dp->precision_start != dp->precision_end) |
1688 | { | 1688 | { |
1689 | if (dp->precision_arg_index != ARG_NONE) | 1689 | if (dp->precision_arg_index != ARG_NONE) |
1690 | { | 1690 | { |
1691 | int arg; | 1691 | int arg; |
1692 | 1692 | ||
1693 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | 1693 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
1694 | abort (); | 1694 | abort (); |
1695 | arg = a.arg[dp->precision_arg_index].a.a_int; | 1695 | arg = a.arg[dp->precision_arg_index].a.a_int; |
1696 | /* "A negative precision is taken as if the precision | 1696 | /* "A negative precision is taken as if the precision |
1697 | were omitted." */ | 1697 | were omitted." */ |
1698 | if (arg >= 0) | 1698 | if (arg >= 0) |
1699 | { | 1699 | { |
1700 | precision = arg; | 1700 | precision = arg; |
1701 | has_precision = 1; | 1701 | has_precision = 1; |
1702 | } | 1702 | } |
1703 | } | 1703 | } |
1704 | else | 1704 | else |
1705 | { | 1705 | { |
1706 | const FCHAR_T *digitp = dp->precision_start + 1; | 1706 | const FCHAR_T *digitp = dp->precision_start + 1; |
1707 | 1707 | ||
1708 | precision = 0; | 1708 | precision = 0; |
1709 | while (digitp != dp->precision_end) | 1709 | while (digitp != dp->precision_end) |
1710 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); | 1710 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
1711 | has_precision = 1; | 1711 | has_precision = 1; |
1712 | } | 1712 | } |
1713 | } | 1713 | } |
1714 | 1714 | ||
1715 | switch (type) | 1715 | switch (type) |
1716 | { | 1716 | { |
1717 | case TYPE_U8_STRING: | 1717 | case TYPE_U8_STRING: |
1718 | { | 1718 | { |
1719 | const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string; | 1719 | const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string; |
1720 | const uint8_t *arg_end; | 1720 | const uint8_t *arg_end; |
1721 | size_t characters; | 1721 | size_t characters; |
1722 | 1722 | ||
1723 | if (has_precision) | 1723 | if (has_precision) |
1724 | { | 1724 | { |
1725 | /* Use only PRECISION characters, from the left. */ | 1725 | /* Use only PRECISION characters, from the left. */ |
1726 | arg_end = arg; | 1726 | arg_end = arg; |
1727 | characters = 0; | 1727 | characters = 0; |
1728 | for (; precision > 0; precision--) | 1728 | for (; precision > 0; precision--) |
1729 | { | 1729 | { |
1730 | int count = u8_strmblen (arg_end); | 1730 | int count = u8_strmblen (arg_end); |
1731 | if (count == 0) | 1731 | if (count == 0) |
1732 | break; | 1732 | break; |
1733 | if (count < 0) | 1733 | if (count < 0) |
1734 | { | 1734 | { |
1735 | if (!(result == resultbuf || result == NULL)) | 1735 | if (!(result == resultbuf || result == NULL)) |
1736 | free (result); | 1736 | free (result); |
1737 | if (buf_malloced != NULL) | 1737 | if (buf_malloced != NULL) |
1738 | free (buf_malloced); | 1738 | free (buf_malloced); |
1739 | CLEANUP (); | 1739 | CLEANUP (); |
1740 | errno = EILSEQ; | 1740 | errno = EILSEQ; |
1741 | return NULL; | 1741 | return NULL; |
1742 | } | 1742 | } |
1743 | arg_end += count; | 1743 | arg_end += count; |
1744 | characters++; | 1744 | characters++; |
1745 | } | 1745 | } |
1746 | } | 1746 | } |
1747 | else if (has_width) | 1747 | else if (has_width) |
1748 | { | 1748 | { |
1749 | /* Use the entire string, and count the number of | 1749 | /* Use the entire string, and count the number of |
1750 | characters. */ | 1750 | characters. */ |
1751 | arg_end = arg; | 1751 | arg_end = arg; |
1752 | characters = 0; | 1752 | characters = 0; |
1753 | for (;;) | 1753 | for (;;) |
1754 | { | 1754 | { |
1755 | int count = u8_strmblen (arg_end); | 1755 | int count = u8_strmblen (arg_end); |
1756 | if (count == 0) | 1756 | if (count == 0) |
1757 | break; | 1757 | break; |
1758 | if (count < 0) | 1758 | if (count < 0) |
1759 | { | 1759 | { |
1760 | if (!(result == resultbuf || result == NULL)) | 1760 | if (!(result == resultbuf || result == NULL)) |
1761 | free (result); | 1761 | free (result); |
1762 | if (buf_malloced != NULL) | 1762 | if (buf_malloced != NULL) |
1763 | free (buf_malloced); | 1763 | free (buf_malloced); |
1764 | CLEANUP (); | 1764 | CLEANUP (); |
1765 | errno = EILSEQ; | 1765 | errno = EILSEQ; |
1766 | return NULL; | 1766 | return NULL; |
1767 | } | 1767 | } |
1768 | arg_end += count; | 1768 | arg_end += count; |
1769 | characters++; | 1769 | characters++; |
1770 | } | 1770 | } |
1771 | } | 1771 | } |
1772 | else | 1772 | else |
1773 | { | 1773 | { |
1774 | /* Use the entire string. */ | 1774 | /* Use the entire string. */ |
1775 | arg_end = arg + u8_strlen (arg); | 1775 | arg_end = arg + u8_strlen (arg); |
1776 | /* The number of characters doesn't matter. */ | 1776 | /* The number of characters doesn't matter. */ |
1777 | characters = 0; | 1777 | characters = 0; |
1778 | } | 1778 | } |
1779 | 1779 | ||
1780 | if (has_width && width > characters | 1780 | if (has_width && width > characters |
1781 | && !(dp->flags & FLAG_LEFT)) | 1781 | && !(dp->flags & FLAG_LEFT)) |
1782 | { | 1782 | { |
1783 | size_t n = width - characters; | 1783 | size_t n = width - characters; |
1784 | ENSURE_ALLOCATION (xsum (length, n)); | 1784 | ENSURE_ALLOCATION (xsum (length, n)); |
1785 | DCHAR_SET (result + length, ' ', n); | 1785 | DCHAR_SET (result + length, ' ', n); |
1786 | length += n; | 1786 | length += n; |
1787 | } | 1787 | } |
1788 | 1788 | ||
1789 | # if DCHAR_IS_UINT8_T | 1789 | # if DCHAR_IS_UINT8_T |
1790 | { | 1790 | { |
1791 | size_t n = arg_end - arg; | 1791 | size_t n = arg_end - arg; |
1792 | ENSURE_ALLOCATION (xsum (length, n)); | 1792 | ENSURE_ALLOCATION (xsum (length, n)); |
1793 | DCHAR_CPY (result + length, arg, n); | 1793 | DCHAR_CPY (result + length, arg, n); |
1794 | length += n; | 1794 | length += n; |
1795 | } | 1795 | } |
1796 | # else | 1796 | # else |
1797 | { /* Convert. */ | 1797 | { /* Convert. */ |
1798 | DCHAR_T *converted = result + length; | 1798 | DCHAR_T *converted = result + length; |
1799 | size_t converted_len = allocated - length; | 1799 | size_t converted_len = allocated - length; |
1800 | # if DCHAR_IS_TCHAR | 1800 | # if DCHAR_IS_TCHAR |
1801 | /* Convert from UTF-8 to locale encoding. */ | 1801 | /* Convert from UTF-8 to locale encoding. */ |
1802 | converted = | 1802 | converted = |
1803 | u8_conv_to_encoding (locale_charset (), | 1803 | u8_conv_to_encoding (locale_charset (), |
1804 | iconveh_question_mark, | 1804 | iconveh_question_mark, |
1805 | arg, arg_end - arg, NULL, | 1805 | arg, arg_end - arg, NULL, |
1806 | converted, &converted_len); | 1806 | converted, &converted_len); |
1807 | # else | 1807 | # else |
1808 | /* Convert from UTF-8 to UTF-16/UTF-32. */ | 1808 | /* Convert from UTF-8 to UTF-16/UTF-32. */ |
1809 | converted = | 1809 | converted = |
1810 | U8_TO_DCHAR (arg, arg_end - arg, | 1810 | U8_TO_DCHAR (arg, arg_end - arg, |
1811 | converted, &converted_len); | 1811 | converted, &converted_len); |
1812 | # endif | 1812 | # endif |
1813 | if (converted == NULL) | 1813 | if (converted == NULL) |
1814 | { | 1814 | { |
1815 | int saved_errno = errno; | 1815 | int saved_errno = errno; |
1816 | if (!(result == resultbuf || result == NULL)) | 1816 | if (!(result == resultbuf || result == NULL)) |
1817 | free (result); | 1817 | free (result); |
1818 | if (buf_malloced != NULL) | 1818 | if (buf_malloced != NULL) |
1819 | free (buf_malloced); | 1819 | free (buf_malloced); |
1820 | CLEANUP (); | 1820 | CLEANUP (); |
1821 | errno = saved_errno; | 1821 | errno = saved_errno; |
1822 | return NULL; | 1822 | return NULL; |
1823 | } | 1823 | } |
1824 | if (converted != result + length) | 1824 | if (converted != result + length) |
1825 | { | 1825 | { |
1826 | ENSURE_ALLOCATION (xsum (length, converted_len)); | 1826 | ENSURE_ALLOCATION (xsum (length, converted_len)); |
1827 | DCHAR_CPY (result + length, converted, converted_len); | 1827 | DCHAR_CPY (result + length, converted, converted_len); |
1828 | free (converted); | 1828 | free (converted); |
1829 | } | 1829 | } |
1830 | length += converted_len; | 1830 | length += converted_len; |
1831 | } | 1831 | } |
1832 | # endif | 1832 | # endif |
1833 | 1833 | ||
1834 | if (has_width && width > characters | 1834 | if (has_width && width > characters |
1835 | && (dp->flags & FLAG_LEFT)) | 1835 | && (dp->flags & FLAG_LEFT)) |
1836 | { | 1836 | { |
1837 | size_t n = width - characters; | 1837 | size_t n = width - characters; |
1838 | ENSURE_ALLOCATION (xsum (length, n)); | 1838 | ENSURE_ALLOCATION (xsum (length, n)); |
1839 | DCHAR_SET (result + length, ' ', n); | 1839 | DCHAR_SET (result + length, ' ', n); |
1840 | length += n; | 1840 | length += n; |
1841 | } | 1841 | } |
1842 | } | 1842 | } |
1843 | break; | 1843 | break; |
1844 | 1844 | ||
1845 | case TYPE_U16_STRING: | 1845 | case TYPE_U16_STRING: |
1846 | { | 1846 | { |
1847 | const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string; | 1847 | const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string; |
1848 | const uint16_t *arg_end; | 1848 | const uint16_t *arg_end; |
1849 | size_t characters; | 1849 | size_t characters; |
1850 | 1850 | ||
1851 | if (has_precision) | 1851 | if (has_precision) |
1852 | { | 1852 | { |
1853 | /* Use only PRECISION characters, from the left. */ | 1853 | /* Use only PRECISION characters, from the left. */ |
1854 | arg_end = arg; | 1854 | arg_end = arg; |
1855 | characters = 0; | 1855 | characters = 0; |
1856 | for (; precision > 0; precision--) | 1856 | for (; precision > 0; precision--) |
1857 | { | 1857 | { |
1858 | int count = u16_strmblen (arg_end); | 1858 | int count = u16_strmblen (arg_end); |
1859 | if (count == 0) | 1859 | if (count == 0) |
1860 | break; | 1860 | break; |
1861 | if (count < 0) | 1861 | if (count < 0) |
1862 | { | 1862 | { |
1863 | if (!(result == resultbuf || result == NULL)) | 1863 | if (!(result == resultbuf || result == NULL)) |
1864 | free (result); | 1864 | free (result); |
1865 | if (buf_malloced != NULL) | 1865 | if (buf_malloced != NULL) |
1866 | free (buf_malloced); | 1866 | free (buf_malloced); |
1867 | CLEANUP (); | 1867 | CLEANUP (); |
1868 | errno = EILSEQ; | 1868 | errno = EILSEQ; |
1869 | return NULL; | 1869 | return NULL; |
1870 | } | 1870 | } |
1871 | arg_end += count; | 1871 | arg_end += count; |
1872 | characters++; | 1872 | characters++; |
1873 | } | 1873 | } |
1874 | } | 1874 | } |
1875 | else if (has_width) | 1875 | else if (has_width) |
1876 | { | 1876 | { |
1877 | /* Use the entire string, and count the number of | 1877 | /* Use the entire string, and count the number of |
1878 | characters. */ | 1878 | characters. */ |
1879 | arg_end = arg; | 1879 | arg_end = arg; |
1880 | characters = 0; | 1880 | characters = 0; |
1881 | for (;;) | 1881 | for (;;) |
1882 | { | 1882 | { |
1883 | int count = u16_strmblen (arg_end); | 1883 | int count = u16_strmblen (arg_end); |
1884 | if (count == 0) | 1884 | if (count == 0) |
1885 | break; | 1885 | break; |
1886 | if (count < 0) | 1886 | if (count < 0) |
1887 | { | 1887 | { |
1888 | if (!(result == resultbuf || result == NULL)) | 1888 | if (!(result == resultbuf || result == NULL)) |
1889 | free (result); | 1889 | free (result); |
1890 | if (buf_malloced != NULL) | 1890 | if (buf_malloced != NULL) |
1891 | free (buf_malloced); | 1891 | free (buf_malloced); |
1892 | CLEANUP (); | 1892 | CLEANUP (); |
1893 | errno = EILSEQ; | 1893 | errno = EILSEQ; |
1894 | return NULL; | 1894 | return NULL; |
1895 | } | 1895 | } |
1896 | arg_end += count; | 1896 | arg_end += count; |
1897 | characters++; | 1897 | characters++; |
1898 | } | 1898 | } |
1899 | } | 1899 | } |
1900 | else | 1900 | else |
1901 | { | 1901 | { |
1902 | /* Use the entire string. */ | 1902 | /* Use the entire string. */ |
1903 | arg_end = arg + u16_strlen (arg); | 1903 | arg_end = arg + u16_strlen (arg); |
1904 | /* The number of characters doesn't matter. */ | 1904 | /* The number of characters doesn't matter. */ |
1905 | characters = 0; | 1905 | characters = 0; |
1906 | } | 1906 | } |
1907 | 1907 | ||
1908 | if (has_width && width > characters | 1908 | if (has_width && width > characters |
1909 | && !(dp->flags & FLAG_LEFT)) | 1909 | && !(dp->flags & FLAG_LEFT)) |
1910 | { | 1910 | { |
1911 | size_t n = width - characters; | 1911 | size_t n = width - characters; |
1912 | ENSURE_ALLOCATION (xsum (length, n)); | 1912 | ENSURE_ALLOCATION (xsum (length, n)); |
1913 | DCHAR_SET (result + length, ' ', n); | 1913 | DCHAR_SET (result + length, ' ', n); |
1914 | length += n; | 1914 | length += n; |
1915 | } | 1915 | } |
1916 | 1916 | ||
1917 | # if DCHAR_IS_UINT16_T | 1917 | # if DCHAR_IS_UINT16_T |
1918 | { | 1918 | { |
1919 | size_t n = arg_end - arg; | 1919 | size_t n = arg_end - arg; |
1920 | ENSURE_ALLOCATION (xsum (length, n)); | 1920 | ENSURE_ALLOCATION (xsum (length, n)); |
1921 | DCHAR_CPY (result + length, arg, n); | 1921 | DCHAR_CPY (result + length, arg, n); |
1922 | length += n; | 1922 | length += n; |
1923 | } | 1923 | } |
1924 | # else | 1924 | # else |
1925 | { /* Convert. */ | 1925 | { /* Convert. */ |
1926 | DCHAR_T *converted = result + length; | 1926 | DCHAR_T *converted = result + length; |
1927 | size_t converted_len = allocated - length; | 1927 | size_t converted_len = allocated - length; |
1928 | # if DCHAR_IS_TCHAR | 1928 | # if DCHAR_IS_TCHAR |
1929 | /* Convert from UTF-16 to locale encoding. */ | 1929 | /* Convert from UTF-16 to locale encoding. */ |
1930 | converted = | 1930 | converted = |
1931 | u16_conv_to_encoding (locale_charset (), | 1931 | u16_conv_to_encoding (locale_charset (), |
1932 | iconveh_question_mark, | 1932 | iconveh_question_mark, |
1933 | arg, arg_end - arg, NULL, | 1933 | arg, arg_end - arg, NULL, |
1934 | converted, &converted_len); | 1934 | converted, &converted_len); |
1935 | # else | 1935 | # else |
1936 | /* Convert from UTF-16 to UTF-8/UTF-32. */ | 1936 | /* Convert from UTF-16 to UTF-8/UTF-32. */ |
1937 | converted = | 1937 | converted = |
1938 | U16_TO_DCHAR (arg, arg_end - arg, | 1938 | U16_TO_DCHAR (arg, arg_end - arg, |
1939 | converted, &converted_len); | 1939 | converted, &converted_len); |
1940 | # endif | 1940 | # endif |
1941 | if (converted == NULL) | 1941 | if (converted == NULL) |
1942 | { | 1942 | { |
1943 | int saved_errno = errno; | 1943 | int saved_errno = errno; |
1944 | if (!(result == resultbuf || result == NULL)) | 1944 | if (!(result == resultbuf || result == NULL)) |
1945 | free (result); | 1945 | free (result); |
1946 | if (buf_malloced != NULL) | 1946 | if (buf_malloced != NULL) |
1947 | free (buf_malloced); | 1947 | free (buf_malloced); |
1948 | CLEANUP (); | 1948 | CLEANUP (); |
1949 | errno = saved_errno; | 1949 | errno = saved_errno; |
1950 | return NULL; | 1950 | return NULL; |
1951 | } | 1951 | } |
1952 | if (converted != result + length) | 1952 | if (converted != result + length) |
1953 | { | 1953 | { |
1954 | ENSURE_ALLOCATION (xsum (length, converted_len)); | 1954 | ENSURE_ALLOCATION (xsum (length, converted_len)); |
1955 | DCHAR_CPY (result + length, converted, converted_len); | 1955 | DCHAR_CPY (result + length, converted, converted_len); |
1956 | free (converted); | 1956 | free (converted); |
1957 | } | 1957 | } |
1958 | length += converted_len; | 1958 | length += converted_len; |
1959 | } | 1959 | } |
1960 | # endif | 1960 | # endif |
1961 | 1961 | ||
1962 | if (has_width && width > characters | 1962 | if (has_width && width > characters |
1963 | && (dp->flags & FLAG_LEFT)) | 1963 | && (dp->flags & FLAG_LEFT)) |
1964 | { | 1964 | { |
1965 | size_t n = width - characters; | 1965 | size_t n = width - characters; |
1966 | ENSURE_ALLOCATION (xsum (length, n)); | 1966 | ENSURE_ALLOCATION (xsum (length, n)); |
1967 | DCHAR_SET (result + length, ' ', n); | 1967 | DCHAR_SET (result + length, ' ', n); |
1968 | length += n; | 1968 | length += n; |
1969 | } | 1969 | } |
1970 | } | 1970 | } |
1971 | break; | 1971 | break; |
1972 | 1972 | ||
1973 | case TYPE_U32_STRING: | 1973 | case TYPE_U32_STRING: |
1974 | { | 1974 | { |
1975 | const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string; | 1975 | const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string; |
1976 | const uint32_t *arg_end; | 1976 | const uint32_t *arg_end; |
1977 | size_t characters; | 1977 | size_t characters; |
1978 | 1978 | ||
1979 | if (has_precision) | 1979 | if (has_precision) |
1980 | { | 1980 | { |
1981 | /* Use only PRECISION characters, from the left. */ | 1981 | /* Use only PRECISION characters, from the left. */ |
1982 | arg_end = arg; | 1982 | arg_end = arg; |
1983 | characters = 0; | 1983 | characters = 0; |
1984 | for (; precision > 0; precision--) | 1984 | for (; precision > 0; precision--) |
1985 | { | 1985 | { |
1986 | int count = u32_strmblen (arg_end); | 1986 | int count = u32_strmblen (arg_end); |
1987 | if (count == 0) | 1987 | if (count == 0) |
1988 | break; | 1988 | break; |
1989 | if (count < 0) | 1989 | if (count < 0) |
1990 | { | 1990 | { |
1991 | if (!(result == resultbuf || result == NULL)) | 1991 | if (!(result == resultbuf || result == NULL)) |
1992 | free (result); | 1992 | free (result); |
1993 | if (buf_malloced != NULL) | 1993 | if (buf_malloced != NULL) |
1994 | free (buf_malloced); | 1994 | free (buf_malloced); |
1995 | CLEANUP (); | 1995 | CLEANUP (); |
1996 | errno = EILSEQ; | 1996 | errno = EILSEQ; |
1997 | return NULL; | 1997 | return NULL; |
1998 | } | 1998 | } |
1999 | arg_end += count; | 1999 | arg_end += count; |
2000 | characters++; | 2000 | characters++; |
2001 | } | 2001 | } |
2002 | } | 2002 | } |
2003 | else if (has_width) | 2003 | else if (has_width) |
2004 | { | 2004 | { |
2005 | /* Use the entire string, and count the number of | 2005 | /* Use the entire string, and count the number of |
2006 | characters. */ | 2006 | characters. */ |
2007 | arg_end = arg; | 2007 | arg_end = arg; |
2008 | characters = 0; | 2008 | characters = 0; |
2009 | for (;;) | 2009 | for (;;) |
2010 | { | 2010 | { |
2011 | int count = u32_strmblen (arg_end); | 2011 | int count = u32_strmblen (arg_end); |
2012 | if (count == 0) | 2012 | if (count == 0) |
2013 | break; | 2013 | break; |
2014 | if (count < 0) | 2014 | if (count < 0) |
2015 | { | 2015 | { |
2016 | if (!(result == resultbuf || result == NULL)) | 2016 | if (!(result == resultbuf || result == NULL)) |
2017 | free (result); | 2017 | free (result); |
2018 | if (buf_malloced != NULL) | 2018 | if (buf_malloced != NULL) |
2019 | free (buf_malloced); | 2019 | free (buf_malloced); |
2020 | CLEANUP (); | 2020 | CLEANUP (); |
2021 | errno = EILSEQ; | 2021 | errno = EILSEQ; |
2022 | return NULL; | 2022 | return NULL; |
2023 | } | 2023 | } |
2024 | arg_end += count; | 2024 | arg_end += count; |
2025 | characters++; | 2025 | characters++; |
2026 | } | 2026 | } |
2027 | } | 2027 | } |
2028 | else | 2028 | else |
2029 | { | 2029 | { |
2030 | /* Use the entire string. */ | 2030 | /* Use the entire string. */ |
2031 | arg_end = arg + u32_strlen (arg); | 2031 | arg_end = arg + u32_strlen (arg); |
2032 | /* The number of characters doesn't matter. */ | 2032 | /* The number of characters doesn't matter. */ |
2033 | characters = 0; | 2033 | characters = 0; |
2034 | } | 2034 | } |
2035 | 2035 | ||
2036 | if (has_width && width > characters | 2036 | if (has_width && width > characters |
2037 | && !(dp->flags & FLAG_LEFT)) | 2037 | && !(dp->flags & FLAG_LEFT)) |
2038 | { | 2038 | { |
2039 | size_t n = width - characters; | 2039 | size_t n = width - characters; |
2040 | ENSURE_ALLOCATION (xsum (length, n)); | 2040 | ENSURE_ALLOCATION (xsum (length, n)); |
2041 | DCHAR_SET (result + length, ' ', n); | 2041 | DCHAR_SET (result + length, ' ', n); |
2042 | length += n; | 2042 | length += n; |
2043 | } | 2043 | } |
2044 | 2044 | ||
2045 | # if DCHAR_IS_UINT32_T | 2045 | # if DCHAR_IS_UINT32_T |
2046 | { | 2046 | { |
2047 | size_t n = arg_end - arg; | 2047 | size_t n = arg_end - arg; |
2048 | ENSURE_ALLOCATION (xsum (length, n)); | 2048 | ENSURE_ALLOCATION (xsum (length, n)); |
2049 | DCHAR_CPY (result + length, arg, n); | 2049 | DCHAR_CPY (result + length, arg, n); |
2050 | length += n; | 2050 | length += n; |
2051 | } | 2051 | } |
2052 | # else | 2052 | # else |
2053 | { /* Convert. */ | 2053 | { /* Convert. */ |
2054 | DCHAR_T *converted = result + length; | 2054 | DCHAR_T *converted = result + length; |
2055 | size_t converted_len = allocated - length; | 2055 | size_t converted_len = allocated - length; |
2056 | # if DCHAR_IS_TCHAR | 2056 | # if DCHAR_IS_TCHAR |
2057 | /* Convert from UTF-32 to locale encoding. */ | 2057 | /* Convert from UTF-32 to locale encoding. */ |
2058 | converted = | 2058 | converted = |
2059 | u32_conv_to_encoding (locale_charset (), | 2059 | u32_conv_to_encoding (locale_charset (), |
2060 | iconveh_question_mark, | 2060 | iconveh_question_mark, |
2061 | arg, arg_end - arg, NULL, | 2061 | arg, arg_end - arg, NULL, |
2062 | converted, &converted_len); | 2062 | converted, &converted_len); |
2063 | # else | 2063 | # else |
2064 | /* Convert from UTF-32 to UTF-8/UTF-16. */ | 2064 | /* Convert from UTF-32 to UTF-8/UTF-16. */ |
2065 | converted = | 2065 | converted = |
2066 | U32_TO_DCHAR (arg, arg_end - arg, | 2066 | U32_TO_DCHAR (arg, arg_end - arg, |
2067 | converted, &converted_len); | 2067 | converted, &converted_len); |
2068 | # endif | 2068 | # endif |
2069 | if (converted == NULL) | 2069 | if (converted == NULL) |
2070 | { | 2070 | { |
2071 | int saved_errno = errno; | 2071 | int saved_errno = errno; |
2072 | if (!(result == resultbuf || result == NULL)) | 2072 | if (!(result == resultbuf || result == NULL)) |
2073 | free (result); | 2073 | free (result); |
2074 | if (buf_malloced != NULL) | 2074 | if (buf_malloced != NULL) |
2075 | free (buf_malloced); | 2075 | free (buf_malloced); |
2076 | CLEANUP (); | 2076 | CLEANUP (); |
2077 | errno = saved_errno; | 2077 | errno = saved_errno; |
2078 | return NULL; | 2078 | return NULL; |
2079 | } | 2079 | } |
2080 | if (converted != result + length) | 2080 | if (converted != result + length) |
2081 | { | 2081 | { |
2082 | ENSURE_ALLOCATION (xsum (length, converted_len)); | 2082 | ENSURE_ALLOCATION (xsum (length, converted_len)); |
2083 | DCHAR_CPY (result + length, converted, converted_len); | 2083 | DCHAR_CPY (result + length, converted, converted_len); |
2084 | free (converted); | 2084 | free (converted); |
2085 | } | 2085 | } |
2086 | length += converted_len; | 2086 | length += converted_len; |
2087 | } | 2087 | } |
2088 | # endif | 2088 | # endif |
2089 | 2089 | ||
2090 | if (has_width && width > characters | 2090 | if (has_width && width > characters |
2091 | && (dp->flags & FLAG_LEFT)) | 2091 | && (dp->flags & FLAG_LEFT)) |
2092 | { | 2092 | { |
2093 | size_t n = width - characters; | 2093 | size_t n = width - characters; |
2094 | ENSURE_ALLOCATION (xsum (length, n)); | 2094 | ENSURE_ALLOCATION (xsum (length, n)); |
2095 | DCHAR_SET (result + length, ' ', n); | 2095 | DCHAR_SET (result + length, ' ', n); |
2096 | length += n; | 2096 | length += n; |
2097 | } | 2097 | } |
2098 | } | 2098 | } |
2099 | break; | 2099 | break; |
2100 | 2100 | ||
2101 | default: | 2101 | default: |
2102 | abort (); | 2102 | abort (); |
2103 | } | 2103 | } |
2104 | } | 2104 | } |
2105 | #endif | 2105 | #endif |
2106 | #if (!USE_SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T | 2106 | #if (!USE_SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T |
2107 | else if (dp->conversion == 's' | 2107 | else if (dp->conversion == 's' |
2108 | # if WIDE_CHAR_VERSION | 2108 | # if WIDE_CHAR_VERSION |
2109 | && a.arg[dp->arg_index].type != TYPE_WIDE_STRING | 2109 | && a.arg[dp->arg_index].type != TYPE_WIDE_STRING |
2110 | # else | 2110 | # else |
2111 | && a.arg[dp->arg_index].type == TYPE_WIDE_STRING | 2111 | && a.arg[dp->arg_index].type == TYPE_WIDE_STRING |
2112 | # endif | 2112 | # endif |
2113 | ) | 2113 | ) |
2114 | { | 2114 | { |
2115 | /* The normal handling of the 's' directive below requires | 2115 | /* The normal handling of the 's' directive below requires |
2116 | allocating a temporary buffer. The determination of its | 2116 | allocating a temporary buffer. The determination of its |
2117 | length (tmp_length), in the case when a precision is | 2117 | length (tmp_length), in the case when a precision is |
2118 | specified, below requires a conversion between a char[] | 2118 | specified, below requires a conversion between a char[] |
2119 | string and a wchar_t[] wide string. It could be done, but | 2119 | string and a wchar_t[] wide string. It could be done, but |
2120 | we have no guarantee that the implementation of sprintf will | 2120 | we have no guarantee that the implementation of sprintf will |
2121 | use the exactly same algorithm. Without this guarantee, it | 2121 | use the exactly same algorithm. Without this guarantee, it |
2122 | is possible to have buffer overrun bugs. In order to avoid | 2122 | is possible to have buffer overrun bugs. In order to avoid |
2123 | such bugs, we implement the entire processing of the 's' | 2123 | such bugs, we implement the entire processing of the 's' |
2124 | directive ourselves. */ | 2124 | directive ourselves. */ |
2125 | int flags = dp->flags; | 2125 | int flags = dp->flags; |
2126 | int has_width; | 2126 | int has_width; |
2127 | size_t width; | 2127 | size_t width; |
2128 | int has_precision; | 2128 | int has_precision; |
2129 | size_t precision; | 2129 | size_t precision; |
2130 | 2130 | ||
2131 | has_width = 0; | 2131 | has_width = 0; |
2132 | width = 0; | 2132 | width = 0; |
2133 | if (dp->width_start != dp->width_end) | 2133 | if (dp->width_start != dp->width_end) |
2134 | { | 2134 | { |
2135 | if (dp->width_arg_index != ARG_NONE) | 2135 | if (dp->width_arg_index != ARG_NONE) |
2136 | { | 2136 | { |
2137 | int arg; | 2137 | int arg; |
2138 | 2138 | ||
2139 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | 2139 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
2140 | abort (); | 2140 | abort (); |
2141 | arg = a.arg[dp->width_arg_index].a.a_int; | 2141 | arg = a.arg[dp->width_arg_index].a.a_int; |
2142 | if (arg < 0) | 2142 | if (arg < 0) |
2143 | { | 2143 | { |
2144 | /* "A negative field width is taken as a '-' flag | 2144 | /* "A negative field width is taken as a '-' flag |
2145 | followed by a positive field width." */ | 2145 | followed by a positive field width." */ |
2146 | flags |= FLAG_LEFT; | 2146 | flags |= FLAG_LEFT; |
2147 | width = (unsigned int) (-arg); | 2147 | width = (unsigned int) (-arg); |
2148 | } | 2148 | } |
2149 | else | 2149 | else |
2150 | width = arg; | 2150 | width = arg; |
2151 | } | 2151 | } |
2152 | else | 2152 | else |
2153 | { | 2153 | { |
2154 | const FCHAR_T *digitp = dp->width_start; | 2154 | const FCHAR_T *digitp = dp->width_start; |
2155 | 2155 | ||
2156 | do | 2156 | do |
2157 | width = xsum (xtimes (width, 10), *digitp++ - '0'); | 2157 | width = xsum (xtimes (width, 10), *digitp++ - '0'); |
2158 | while (digitp != dp->width_end); | 2158 | while (digitp != dp->width_end); |
2159 | } | 2159 | } |
2160 | has_width = 1; | 2160 | has_width = 1; |
2161 | } | 2161 | } |
2162 | 2162 | ||
2163 | has_precision = 0; | 2163 | has_precision = 0; |
2164 | precision = 6; | 2164 | precision = 6; |
2165 | if (dp->precision_start != dp->precision_end) | 2165 | if (dp->precision_start != dp->precision_end) |
2166 | { | 2166 | { |
2167 | if (dp->precision_arg_index != ARG_NONE) | 2167 | if (dp->precision_arg_index != ARG_NONE) |
2168 | { | 2168 | { |
2169 | int arg; | 2169 | int arg; |
2170 | 2170 | ||
2171 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | 2171 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
2172 | abort (); | 2172 | abort (); |
2173 | arg = a.arg[dp->precision_arg_index].a.a_int; | 2173 | arg = a.arg[dp->precision_arg_index].a.a_int; |
2174 | /* "A negative precision is taken as if the precision | 2174 | /* "A negative precision is taken as if the precision |
2175 | were omitted." */ | 2175 | were omitted." */ |
2176 | if (arg >= 0) | 2176 | if (arg >= 0) |
2177 | { | 2177 | { |
2178 | precision = arg; | 2178 | precision = arg; |
2179 | has_precision = 1; | 2179 | has_precision = 1; |
2180 | } | 2180 | } |
2181 | } | 2181 | } |
2182 | else | 2182 | else |
2183 | { | 2183 | { |
2184 | const FCHAR_T *digitp = dp->precision_start + 1; | 2184 | const FCHAR_T *digitp = dp->precision_start + 1; |
2185 | 2185 | ||
2186 | precision = 0; | 2186 | precision = 0; |
2187 | while (digitp != dp->precision_end) | 2187 | while (digitp != dp->precision_end) |
2188 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); | 2188 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
2189 | has_precision = 1; | 2189 | has_precision = 1; |
2190 | } | 2190 | } |
2191 | } | 2191 | } |
2192 | 2192 | ||
2193 | # if WIDE_CHAR_VERSION | 2193 | # if WIDE_CHAR_VERSION |
2194 | /* %s in vasnwprintf. See the specification of fwprintf. */ | 2194 | /* %s in vasnwprintf. See the specification of fwprintf. */ |
2195 | { | 2195 | { |
2196 | const char *arg = a.arg[dp->arg_index].a.a_string; | 2196 | const char *arg = a.arg[dp->arg_index].a.a_string; |
2197 | const char *arg_end; | 2197 | const char *arg_end; |
2198 | size_t characters; | 2198 | size_t characters; |
2199 | 2199 | ||
2200 | if (has_precision) | 2200 | if (has_precision) |
2201 | { | 2201 | { |
2202 | /* Use only as many bytes as needed to produce PRECISION | 2202 | /* Use only as many bytes as needed to produce PRECISION |
2203 | wide characters, from the left. */ | 2203 | wide characters, from the left. */ |
2204 | # if HAVE_MBRTOWC | 2204 | # if HAVE_MBRTOWC |
2205 | mbstate_t state; | 2205 | mbstate_t state; |
2206 | memset (&state, '\0', sizeof (mbstate_t)); | 2206 | memset (&state, '\0', sizeof (mbstate_t)); |
2207 | # endif | 2207 | # endif |
2208 | arg_end = arg; | 2208 | arg_end = arg; |
2209 | characters = 0; | 2209 | characters = 0; |
2210 | for (; precision > 0; precision--) | 2210 | for (; precision > 0; precision--) |
2211 | { | 2211 | { |
2212 | int count; | 2212 | int count; |
2213 | # if HAVE_MBRTOWC | 2213 | # if HAVE_MBRTOWC |
2214 | count = mbrlen (arg_end, MB_CUR_MAX, &state); | 2214 | count = mbrlen (arg_end, MB_CUR_MAX, &state); |
2215 | # else | 2215 | # else |
2216 | count = mblen (arg_end, MB_CUR_MAX); | 2216 | count = mblen (arg_end, MB_CUR_MAX); |
2217 | # endif | 2217 | # endif |
2218 | if (count == 0) | 2218 | if (count == 0) |
2219 | /* Found the terminating NUL. */ | 2219 | /* Found the terminating NUL. */ |
2220 | break; | 2220 | break; |
2221 | if (count < 0) | 2221 | if (count < 0) |
2222 | { | 2222 | { |
2223 | /* Invalid or incomplete multibyte character. */ | 2223 | /* Invalid or incomplete multibyte character. */ |
2224 | if (!(result == resultbuf || result == NULL)) | 2224 | if (!(result == resultbuf || result == NULL)) |
2225 | free (result); | 2225 | free (result); |
2226 | if (buf_malloced != NULL) | 2226 | if (buf_malloced != NULL) |
2227 | free (buf_malloced); | 2227 | free (buf_malloced); |
2228 | CLEANUP (); | 2228 | CLEANUP (); |
2229 | errno = EILSEQ; | 2229 | errno = EILSEQ; |
2230 | return NULL; | 2230 | return NULL; |
2231 | } | 2231 | } |
2232 | arg_end += count; | 2232 | arg_end += count; |
2233 | characters++; | 2233 | characters++; |
2234 | } | 2234 | } |
2235 | } | 2235 | } |
2236 | else if (has_width) | 2236 | else if (has_width) |
2237 | { | 2237 | { |
2238 | /* Use the entire string, and count the number of wide | 2238 | /* Use the entire string, and count the number of wide |
2239 | characters. */ | 2239 | characters. */ |
2240 | # if HAVE_MBRTOWC | 2240 | # if HAVE_MBRTOWC |
2241 | mbstate_t state; | 2241 | mbstate_t state; |
2242 | memset (&state, '\0', sizeof (mbstate_t)); | 2242 | memset (&state, '\0', sizeof (mbstate_t)); |
2243 | # endif | 2243 | # endif |
2244 | arg_end = arg; | 2244 | arg_end = arg; |
2245 | characters = 0; | 2245 | characters = 0; |
2246 | for (;;) | 2246 | for (;;) |
2247 | { | 2247 | { |
2248 | int count; | 2248 | int count; |
2249 | # if HAVE_MBRTOWC | 2249 | # if HAVE_MBRTOWC |
2250 | count = mbrlen (arg_end, MB_CUR_MAX, &state); | 2250 | count = mbrlen (arg_end, MB_CUR_MAX, &state); |
2251 | # else | 2251 | # else |
2252 | count = mblen (arg_end, MB_CUR_MAX); | 2252 | count = mblen (arg_end, MB_CUR_MAX); |
2253 | # endif | 2253 | # endif |
2254 | if (count == 0) | 2254 | if (count == 0) |
2255 | /* Found the terminating NUL. */ | 2255 | /* Found the terminating NUL. */ |
2256 | break; | 2256 | break; |
2257 | if (count < 0) | 2257 | if (count < 0) |
2258 | { | 2258 | { |
2259 | /* Invalid or incomplete multibyte character. */ | 2259 | /* Invalid or incomplete multibyte character. */ |
2260 | if (!(result == resultbuf || result == NULL)) | 2260 | if (!(result == resultbuf || result == NULL)) |
2261 | free (result); | 2261 | free (result); |
2262 | if (buf_malloced != NULL) | 2262 | if (buf_malloced != NULL) |
2263 | free (buf_malloced); | 2263 | free (buf_malloced); |
2264 | CLEANUP (); | 2264 | CLEANUP (); |
2265 | errno = EILSEQ; | 2265 | errno = EILSEQ; |
2266 | return NULL; | 2266 | return NULL; |
2267 | } | 2267 | } |
2268 | arg_end += count; | 2268 | arg_end += count; |
2269 | characters++; | 2269 | characters++; |
2270 | } | 2270 | } |
2271 | } | 2271 | } |
2272 | else | 2272 | else |
2273 | { | 2273 | { |
2274 | /* Use the entire string. */ | 2274 | /* Use the entire string. */ |
2275 | arg_end = arg + strlen (arg); | 2275 | arg_end = arg + strlen (arg); |
2276 | /* The number of characters doesn't matter. */ | 2276 | /* The number of characters doesn't matter. */ |
2277 | characters = 0; | 2277 | characters = 0; |
2278 | } | 2278 | } |
2279 | 2279 | ||
2280 | if (has_width && width > characters | 2280 | if (has_width && width > characters |
2281 | && !(dp->flags & FLAG_LEFT)) | 2281 | && !(dp->flags & FLAG_LEFT)) |
2282 | { | 2282 | { |
2283 | size_t n = width - characters; | 2283 | size_t n = width - characters; |
2284 | ENSURE_ALLOCATION (xsum (length, n)); | 2284 | ENSURE_ALLOCATION (xsum (length, n)); |
2285 | DCHAR_SET (result + length, ' ', n); | 2285 | DCHAR_SET (result + length, ' ', n); |
2286 | length += n; | 2286 | length += n; |
2287 | } | 2287 | } |
2288 | 2288 | ||
2289 | if (has_precision || has_width) | 2289 | if (has_precision || has_width) |
2290 | { | 2290 | { |
2291 | /* We know the number of wide characters in advance. */ | 2291 | /* We know the number of wide characters in advance. */ |
2292 | size_t remaining; | 2292 | size_t remaining; |
2293 | # if HAVE_MBRTOWC | 2293 | # if HAVE_MBRTOWC |
2294 | mbstate_t state; | 2294 | mbstate_t state; |
2295 | memset (&state, '\0', sizeof (mbstate_t)); | 2295 | memset (&state, '\0', sizeof (mbstate_t)); |
2296 | # endif | 2296 | # endif |
2297 | ENSURE_ALLOCATION (xsum (length, characters)); | 2297 | ENSURE_ALLOCATION (xsum (length, characters)); |
2298 | for (remaining = characters; remaining > 0; remaining--) | 2298 | for (remaining = characters; remaining > 0; remaining--) |
2299 | { | 2299 | { |
2300 | wchar_t wc; | 2300 | wchar_t wc; |
2301 | int count; | 2301 | int count; |
2302 | # if HAVE_MBRTOWC | 2302 | # if HAVE_MBRTOWC |
2303 | count = mbrtowc (&wc, arg, arg_end - arg, &state); | 2303 | count = mbrtowc (&wc, arg, arg_end - arg, &state); |
2304 | # else | 2304 | # else |
2305 | count = mbtowc (&wc, arg, arg_end - arg); | 2305 | count = mbtowc (&wc, arg, arg_end - arg); |
2306 | # endif | 2306 | # endif |
2307 | if (count <= 0) | 2307 | if (count <= 0) |
2308 | /* mbrtowc not consistent with mbrlen, or mbtowc | 2308 | /* mbrtowc not consistent with mbrlen, or mbtowc |
2309 | not consistent with mblen. */ | 2309 | not consistent with mblen. */ |
2310 | abort (); | 2310 | abort (); |
2311 | result[length++] = wc; | 2311 | result[length++] = wc; |
2312 | arg += count; | 2312 | arg += count; |
2313 | } | 2313 | } |
2314 | if (!(arg == arg_end)) | 2314 | if (!(arg == arg_end)) |
2315 | abort (); | 2315 | abort (); |
2316 | } | 2316 | } |
2317 | else | 2317 | else |
2318 | { | 2318 | { |
2319 | # if HAVE_MBRTOWC | 2319 | # if HAVE_MBRTOWC |
2320 | mbstate_t state; | 2320 | mbstate_t state; |
2321 | memset (&state, '\0', sizeof (mbstate_t)); | 2321 | memset (&state, '\0', sizeof (mbstate_t)); |
2322 | # endif | 2322 | # endif |
2323 | while (arg < arg_end) | 2323 | while (arg < arg_end) |
2324 | { | 2324 | { |
2325 | wchar_t wc; | 2325 | wchar_t wc; |
2326 | int count; | 2326 | int count; |
2327 | # if HAVE_MBRTOWC | 2327 | # if HAVE_MBRTOWC |
2328 | count = mbrtowc (&wc, arg, arg_end - arg, &state); | 2328 | count = mbrtowc (&wc, arg, arg_end - arg, &state); |
2329 | # else | 2329 | # else |
2330 | count = mbtowc (&wc, arg, arg_end - arg); | 2330 | count = mbtowc (&wc, arg, arg_end - arg); |
2331 | # endif | 2331 | # endif |
2332 | if (count <= 0) | 2332 | if (count <= 0) |
2333 | /* mbrtowc not consistent with mbrlen, or mbtowc | 2333 | /* mbrtowc not consistent with mbrlen, or mbtowc |
2334 | not consistent with mblen. */ | 2334 | not consistent with mblen. */ |
2335 | abort (); | 2335 | abort (); |
2336 | ENSURE_ALLOCATION (xsum (length, 1)); | 2336 | ENSURE_ALLOCATION (xsum (length, 1)); |
2337 | result[length++] = wc; | 2337 | result[length++] = wc; |
2338 | arg += count; | 2338 | arg += count; |
2339 | } | 2339 | } |
2340 | } | 2340 | } |
2341 | 2341 | ||
2342 | if (has_width && width > characters | 2342 | if (has_width && width > characters |
2343 | && (dp->flags & FLAG_LEFT)) | 2343 | && (dp->flags & FLAG_LEFT)) |
2344 | { | 2344 | { |
2345 | size_t n = width - characters; | 2345 | size_t n = width - characters; |
2346 | ENSURE_ALLOCATION (xsum (length, n)); | 2346 | ENSURE_ALLOCATION (xsum (length, n)); |
2347 | DCHAR_SET (result + length, ' ', n); | 2347 | DCHAR_SET (result + length, ' ', n); |
2348 | length += n; | 2348 | length += n; |
2349 | } | 2349 | } |
2350 | } | 2350 | } |
2351 | # else | 2351 | # else |
2352 | /* %ls in vasnprintf. See the specification of fprintf. */ | 2352 | /* %ls in vasnprintf. See the specification of fprintf. */ |
2353 | { | 2353 | { |
2354 | const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; | 2354 | const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; |
2355 | const wchar_t *arg_end; | 2355 | const wchar_t *arg_end; |
2356 | size_t characters; | 2356 | size_t characters; |
2357 | # if !DCHAR_IS_TCHAR | 2357 | # if !DCHAR_IS_TCHAR |
2358 | /* This code assumes that TCHAR_T is 'char'. */ | 2358 | /* This code assumes that TCHAR_T is 'char'. */ |
2359 | typedef int TCHAR_T_verify[2 * (sizeof (TCHAR_T) == 1) - 1]; | 2359 | typedef int TCHAR_T_verify[2 * (sizeof (TCHAR_T) == 1) - 1]; |
2360 | TCHAR_T *tmpsrc; | 2360 | TCHAR_T *tmpsrc; |
2361 | DCHAR_T *tmpdst; | 2361 | DCHAR_T *tmpdst; |
2362 | size_t tmpdst_len; | 2362 | size_t tmpdst_len; |
2363 | # endif | 2363 | # endif |
2364 | size_t w; | 2364 | size_t w; |
2365 | 2365 | ||
2366 | if (has_precision) | 2366 | if (has_precision) |
2367 | { | 2367 | { |
2368 | /* Use only as many wide characters as needed to produce | 2368 | /* Use only as many wide characters as needed to produce |
2369 | at most PRECISION bytes, from the left. */ | 2369 | at most PRECISION bytes, from the left. */ |
2370 | # if HAVE_WCRTOMB | 2370 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2371 | mbstate_t state; | 2371 | mbstate_t state; |
2372 | memset (&state, '\0', sizeof (mbstate_t)); | 2372 | memset (&state, '\0', sizeof (mbstate_t)); |
2373 | # endif | 2373 | # endif |
2374 | arg_end = arg; | 2374 | arg_end = arg; |
2375 | characters = 0; | 2375 | characters = 0; |
2376 | while (precision > 0) | 2376 | while (precision > 0) |
2377 | { | 2377 | { |
2378 | char buf[64]; /* Assume MB_CUR_MAX <= 64. */ | 2378 | char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ |
2379 | int count; | 2379 | int count; |
2380 | 2380 | ||
2381 | if (*arg_end == 0) | 2381 | if (*arg_end == 0) |
2382 | /* Found the terminating null wide character. */ | 2382 | /* Found the terminating null wide character. */ |
2383 | break; | 2383 | break; |
2384 | # if HAVE_WCRTOMB | 2384 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2385 | count = wcrtomb (buf, *arg_end, &state); | 2385 | count = wcrtomb (cbuf, *arg_end, &state); |
2386 | # else | 2386 | # else |
2387 | count = wctomb (buf, *arg_end); | 2387 | count = wctomb (cbuf, *arg_end); |
2388 | # endif | 2388 | # endif |
2389 | if (count < 0) | 2389 | if (count < 0) |
2390 | { | 2390 | { |
2391 | /* Cannot convert. */ | 2391 | /* Cannot convert. */ |
2392 | if (!(result == resultbuf || result == NULL)) | 2392 | if (!(result == resultbuf || result == NULL)) |
2393 | free (result); | 2393 | free (result); |
2394 | if (buf_malloced != NULL) | 2394 | if (buf_malloced != NULL) |
2395 | free (buf_malloced); | 2395 | free (buf_malloced); |
2396 | CLEANUP (); | 2396 | CLEANUP (); |
2397 | errno = EILSEQ; | 2397 | errno = EILSEQ; |
2398 | return NULL; | 2398 | return NULL; |
2399 | } | 2399 | } |
2400 | if (precision < count) | 2400 | if (precision < count) |
2401 | break; | 2401 | break; |
2402 | arg_end++; | 2402 | arg_end++; |
2403 | characters += count; | 2403 | characters += count; |
2404 | precision -= count; | 2404 | precision -= count; |
2405 | } | 2405 | } |
2406 | } | 2406 | } |
2407 | # if DCHAR_IS_TCHAR | 2407 | # if DCHAR_IS_TCHAR |
2408 | else if (has_width) | 2408 | else if (has_width) |
2409 | # else | 2409 | # else |
2410 | else | 2410 | else |
2411 | # endif | 2411 | # endif |
2412 | { | 2412 | { |
2413 | /* Use the entire string, and count the number of | 2413 | /* Use the entire string, and count the number of |
2414 | bytes. */ | 2414 | bytes. */ |
2415 | # if HAVE_WCRTOMB | 2415 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2416 | mbstate_t state; | 2416 | mbstate_t state; |
2417 | memset (&state, '\0', sizeof (mbstate_t)); | 2417 | memset (&state, '\0', sizeof (mbstate_t)); |
2418 | # endif | 2418 | # endif |
2419 | arg_end = arg; | 2419 | arg_end = arg; |
2420 | characters = 0; | 2420 | characters = 0; |
2421 | for (;;) | 2421 | for (;;) |
2422 | { | 2422 | { |
2423 | char buf[64]; /* Assume MB_CUR_MAX <= 64. */ | 2423 | char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ |
2424 | int count; | 2424 | int count; |
2425 | 2425 | ||
2426 | if (*arg_end == 0) | 2426 | if (*arg_end == 0) |
2427 | /* Found the terminating null wide character. */ | 2427 | /* Found the terminating null wide character. */ |
2428 | break; | 2428 | break; |
2429 | # if HAVE_WCRTOMB | 2429 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2430 | count = wcrtomb (buf, *arg_end, &state); | 2430 | count = wcrtomb (cbuf, *arg_end, &state); |
2431 | # else | 2431 | # else |
2432 | count = wctomb (buf, *arg_end); | 2432 | count = wctomb (cbuf, *arg_end); |
2433 | # endif | 2433 | # endif |
2434 | if (count < 0) | 2434 | if (count < 0) |
2435 | { | 2435 | { |
2436 | /* Cannot convert. */ | 2436 | /* Cannot convert. */ |
2437 | if (!(result == resultbuf || result == NULL)) | 2437 | if (!(result == resultbuf || result == NULL)) |
2438 | free (result); | 2438 | free (result); |
2439 | if (buf_malloced != NULL) | 2439 | if (buf_malloced != NULL) |
2440 | free (buf_malloced); | 2440 | free (buf_malloced); |
2441 | CLEANUP (); | 2441 | CLEANUP (); |
2442 | errno = EILSEQ; | 2442 | errno = EILSEQ; |
2443 | return NULL; | 2443 | return NULL; |
2444 | } | 2444 | } |
2445 | arg_end++; | 2445 | arg_end++; |
2446 | characters += count; | 2446 | characters += count; |
2447 | } | 2447 | } |
2448 | } | 2448 | } |
2449 | # if DCHAR_IS_TCHAR | 2449 | # if DCHAR_IS_TCHAR |
2450 | else | 2450 | else |
2451 | { | 2451 | { |
2452 | /* Use the entire string. */ | 2452 | /* Use the entire string. */ |
2453 | arg_end = arg + local_wcslen (arg); | 2453 | arg_end = arg + local_wcslen (arg); |
2454 | /* The number of bytes doesn't matter. */ | 2454 | /* The number of bytes doesn't matter. */ |
2455 | characters = 0; | 2455 | characters = 0; |
2456 | } | 2456 | } |
2457 | # endif | 2457 | # endif |
2458 | 2458 | ||
2459 | # if !DCHAR_IS_TCHAR | 2459 | # if !DCHAR_IS_TCHAR |
2460 | /* Convert the string into a piece of temporary memory. */ | 2460 | /* Convert the string into a piece of temporary memory. */ |
2461 | tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T)); | 2461 | tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T)); |
2462 | if (tmpsrc == NULL) | 2462 | if (tmpsrc == NULL) |
2463 | goto out_of_memory; | 2463 | goto out_of_memory; |
2464 | { | 2464 | { |
2465 | TCHAR_T *tmpptr = tmpsrc; | 2465 | TCHAR_T *tmpptr = tmpsrc; |
2466 | size_t remaining; | 2466 | size_t remaining; |
2467 | # if HAVE_WCRTOMB | 2467 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2468 | mbstate_t state; | 2468 | mbstate_t state; |
2469 | memset (&state, '\0', sizeof (mbstate_t)); | 2469 | memset (&state, '\0', sizeof (mbstate_t)); |
2470 | # endif | 2470 | # endif |
2471 | for (remaining = characters; remaining > 0; ) | 2471 | for (remaining = characters; remaining > 0; ) |
2472 | { | 2472 | { |
2473 | char buf[64]; /* Assume MB_CUR_MAX <= 64. */ | 2473 | char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ |
2474 | int count; | 2474 | int count; |
2475 | 2475 | ||
2476 | if (*arg == 0) | 2476 | if (*arg == 0) |
2477 | abort (); | 2477 | abort (); |
2478 | # if HAVE_WCRTOMB | 2478 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2479 | count = wcrtomb (buf, *arg, &state); | 2479 | count = wcrtomb (cbuf, *arg, &state); |
2480 | # else | 2480 | # else |
2481 | count = wctomb (buf, *arg); | 2481 | count = wctomb (cbuf, *arg); |
2482 | # endif | 2482 | # endif |
2483 | if (count <= 0) | 2483 | if (count <= 0) |
2484 | /* Inconsistency. */ | 2484 | /* Inconsistency. */ |
2485 | abort (); | 2485 | abort (); |
2486 | memcpy (tmpptr, buf, count); | 2486 | memcpy (tmpptr, cbuf, count); |
2487 | tmpptr += count; | 2487 | tmpptr += count; |
2488 | arg++; | 2488 | arg++; |
2489 | remaining -= count; | 2489 | remaining -= count; |
2490 | } | 2490 | } |
2491 | if (!(arg == arg_end)) | 2491 | if (!(arg == arg_end)) |
2492 | abort (); | 2492 | abort (); |
2493 | } | 2493 | } |
2494 | 2494 | ||
2495 | /* Convert from TCHAR_T[] to DCHAR_T[]. */ | 2495 | /* Convert from TCHAR_T[] to DCHAR_T[]. */ |
2496 | tmpdst = | 2496 | tmpdst = |
2497 | DCHAR_CONV_FROM_ENCODING (locale_charset (), | 2497 | DCHAR_CONV_FROM_ENCODING (locale_charset (), |
2498 | iconveh_question_mark, | 2498 | iconveh_question_mark, |
2499 | tmpsrc, characters, | 2499 | tmpsrc, characters, |
2500 | NULL, | 2500 | NULL, |
2501 | NULL, &tmpdst_len); | 2501 | NULL, &tmpdst_len); |
2502 | if (tmpdst == NULL) | 2502 | if (tmpdst == NULL) |
2503 | { | 2503 | { |
2504 | int saved_errno = errno; | 2504 | int saved_errno = errno; |
2505 | free (tmpsrc); | 2505 | free (tmpsrc); |
2506 | if (!(result == resultbuf || result == NULL)) | 2506 | if (!(result == resultbuf || result == NULL)) |
2507 | free (result); | 2507 | free (result); |
2508 | if (buf_malloced != NULL) | 2508 | if (buf_malloced != NULL) |
2509 | free (buf_malloced); | 2509 | free (buf_malloced); |
2510 | CLEANUP (); | 2510 | CLEANUP (); |
2511 | errno = saved_errno; | 2511 | errno = saved_errno; |
2512 | return NULL; | 2512 | return NULL; |
2513 | } | 2513 | } |
2514 | free (tmpsrc); | 2514 | free (tmpsrc); |
2515 | # endif | 2515 | # endif |
2516 | 2516 | ||
2517 | if (has_width) | 2517 | if (has_width) |
2518 | { | 2518 | { |
2519 | # if ENABLE_UNISTDIO | 2519 | # if ENABLE_UNISTDIO |
2520 | /* Outside POSIX, it's preferrable to compare the width | 2520 | /* Outside POSIX, it's preferrable to compare the width |
2521 | against the number of _characters_ of the converted | 2521 | against the number of _characters_ of the converted |
2522 | value. */ | 2522 | value. */ |
2523 | w = DCHAR_MBSNLEN (result + length, characters); | 2523 | w = DCHAR_MBSNLEN (result + length, characters); |
2524 | # else | 2524 | # else |
2525 | /* The width is compared against the number of _bytes_ | 2525 | /* The width is compared against the number of _bytes_ |
2526 | of the converted value, says POSIX. */ | 2526 | of the converted value, says POSIX. */ |
2527 | w = characters; | 2527 | w = characters; |
2528 | # endif | 2528 | # endif |
2529 | } | 2529 | } |
2530 | else | 2530 | else |
2531 | /* w doesn't matter. */ | 2531 | /* w doesn't matter. */ |
2532 | w = 0; | 2532 | w = 0; |
2533 | 2533 | ||
2534 | if (has_width && width > w | 2534 | if (has_width && width > w |
2535 | && !(dp->flags & FLAG_LEFT)) | 2535 | && !(dp->flags & FLAG_LEFT)) |
2536 | { | 2536 | { |
2537 | size_t n = width - w; | 2537 | size_t n = width - w; |
2538 | ENSURE_ALLOCATION (xsum (length, n)); | 2538 | ENSURE_ALLOCATION (xsum (length, n)); |
2539 | DCHAR_SET (result + length, ' ', n); | 2539 | DCHAR_SET (result + length, ' ', n); |
2540 | length += n; | 2540 | length += n; |
2541 | } | 2541 | } |
2542 | 2542 | ||
2543 | # if DCHAR_IS_TCHAR | 2543 | # if DCHAR_IS_TCHAR |
2544 | if (has_precision || has_width) | 2544 | if (has_precision || has_width) |
2545 | { | 2545 | { |
2546 | /* We know the number of bytes in advance. */ | 2546 | /* We know the number of bytes in advance. */ |
2547 | size_t remaining; | 2547 | size_t remaining; |
2548 | # if HAVE_WCRTOMB | 2548 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2549 | mbstate_t state; | 2549 | mbstate_t state; |
2550 | memset (&state, '\0', sizeof (mbstate_t)); | 2550 | memset (&state, '\0', sizeof (mbstate_t)); |
2551 | # endif | 2551 | # endif |
2552 | ENSURE_ALLOCATION (xsum (length, characters)); | 2552 | ENSURE_ALLOCATION (xsum (length, characters)); |
2553 | for (remaining = characters; remaining > 0; ) | 2553 | for (remaining = characters; remaining > 0; ) |
2554 | { | 2554 | { |
2555 | char buf[64]; /* Assume MB_CUR_MAX <= 64. */ | 2555 | char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ |
2556 | int count; | 2556 | int count; |
2557 | 2557 | ||
2558 | if (*arg == 0) | 2558 | if (*arg == 0) |
2559 | abort (); | 2559 | abort (); |
2560 | # if HAVE_WCRTOMB | 2560 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2561 | count = wcrtomb (buf, *arg, &state); | 2561 | count = wcrtomb (cbuf, *arg, &state); |
2562 | # else | 2562 | # else |
2563 | count = wctomb (buf, *arg); | 2563 | count = wctomb (cbuf, *arg); |
2564 | # endif | 2564 | # endif |
2565 | if (count <= 0) | 2565 | if (count <= 0) |
2566 | /* Inconsistency. */ | 2566 | /* Inconsistency. */ |
2567 | abort (); | 2567 | abort (); |
2568 | memcpy (result + length, buf, count); | 2568 | memcpy (result + length, cbuf, count); |
2569 | length += count; | 2569 | length += count; |
2570 | arg++; | 2570 | arg++; |
2571 | remaining -= count; | 2571 | remaining -= count; |
2572 | } | 2572 | } |
2573 | if (!(arg == arg_end)) | 2573 | if (!(arg == arg_end)) |
2574 | abort (); | 2574 | abort (); |
2575 | } | 2575 | } |
2576 | else | 2576 | else |
2577 | { | 2577 | { |
2578 | # if HAVE_WCRTOMB | 2578 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2579 | mbstate_t state; | 2579 | mbstate_t state; |
2580 | memset (&state, '\0', sizeof (mbstate_t)); | 2580 | memset (&state, '\0', sizeof (mbstate_t)); |
2581 | # endif | 2581 | # endif |
2582 | while (arg < arg_end) | 2582 | while (arg < arg_end) |
2583 | { | 2583 | { |
2584 | char buf[64]; /* Assume MB_CUR_MAX <= 64. */ | 2584 | char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */ |
2585 | int count; | 2585 | int count; |
2586 | 2586 | ||
2587 | if (*arg == 0) | 2587 | if (*arg == 0) |
2588 | abort (); | 2588 | abort (); |
2589 | # if HAVE_WCRTOMB | 2589 | # if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t |
2590 | count = wcrtomb (buf, *arg, &state); | 2590 | count = wcrtomb (cbuf, *arg, &state); |
2591 | # else | 2591 | # else |
2592 | count = wctomb (buf, *arg); | 2592 | count = wctomb (cbuf, *arg); |
2593 | # endif | 2593 | # endif |
2594 | if (count <= 0) | 2594 | if (count <= 0) |
2595 | /* Inconsistency. */ | 2595 | /* Inconsistency. */ |
2596 | abort (); | 2596 | abort (); |
2597 | ENSURE_ALLOCATION (xsum (length, count)); | 2597 | ENSURE_ALLOCATION (xsum (length, count)); |
2598 | memcpy (result + length, buf, count); | 2598 | memcpy (result + length, cbuf, count); |
2599 | length += count; | 2599 | length += count; |
2600 | arg++; | 2600 | arg++; |
2601 | } | 2601 | } |
2602 | } | 2602 | } |
2603 | # else | 2603 | # else |
2604 | ENSURE_ALLOCATION (xsum (length, tmpdst_len)); | 2604 | ENSURE_ALLOCATION (xsum (length, tmpdst_len)); |
2605 | DCHAR_CPY (result + length, tmpdst, tmpdst_len); | 2605 | DCHAR_CPY (result + length, tmpdst, tmpdst_len); |
2606 | free (tmpdst); | 2606 | free (tmpdst); |
2607 | length += tmpdst_len; | 2607 | length += tmpdst_len; |
2608 | # endif | 2608 | # endif |
2609 | 2609 | ||
2610 | if (has_width && width > w | 2610 | if (has_width && width > w |
2611 | && (dp->flags & FLAG_LEFT)) | 2611 | && (dp->flags & FLAG_LEFT)) |
2612 | { | 2612 | { |
2613 | size_t n = width - w; | 2613 | size_t n = width - w; |
2614 | ENSURE_ALLOCATION (xsum (length, n)); | 2614 | ENSURE_ALLOCATION (xsum (length, n)); |
2615 | DCHAR_SET (result + length, ' ', n); | 2615 | DCHAR_SET (result + length, ' ', n); |
2616 | length += n; | 2616 | length += n; |
2617 | } | 2617 | } |
2618 | } | 2618 | } |
2619 | } | 2619 | } |
2620 | # endif | 2620 | # endif |
2621 | #endif | 2621 | #endif |
2622 | #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL | 2622 | #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL |
2623 | else if ((dp->conversion == 'a' || dp->conversion == 'A') | 2623 | else if ((dp->conversion == 'a' || dp->conversion == 'A') |
2624 | # if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE)) | 2624 | # if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE)) |
2625 | && (0 | 2625 | && (0 |
2626 | # if NEED_PRINTF_DOUBLE | 2626 | # if NEED_PRINTF_DOUBLE |
2627 | || a.arg[dp->arg_index].type == TYPE_DOUBLE | 2627 | || a.arg[dp->arg_index].type == TYPE_DOUBLE |
2628 | # endif | 2628 | # endif |
2629 | # if NEED_PRINTF_LONG_DOUBLE | 2629 | # if NEED_PRINTF_LONG_DOUBLE |
2630 | || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE | 2630 | || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE |
2631 | # endif | 2631 | # endif |
2632 | ) | 2632 | ) |
2633 | # endif | 2633 | # endif |
2634 | ) | 2634 | ) |
2635 | { | 2635 | { |
2636 | arg_type type = a.arg[dp->arg_index].type; | 2636 | arg_type type = a.arg[dp->arg_index].type; |
2637 | int flags = dp->flags; | 2637 | int flags = dp->flags; |
2638 | int has_width; | 2638 | int has_width; |
2639 | size_t width; | 2639 | size_t width; |
2640 | int has_precision; | 2640 | int has_precision; |
2641 | size_t precision; | 2641 | size_t precision; |
2642 | size_t tmp_length; | 2642 | size_t tmp_length; |
2643 | DCHAR_T tmpbuf[700]; | 2643 | DCHAR_T tmpbuf[700]; |
2644 | DCHAR_T *tmp; | 2644 | DCHAR_T *tmp; |
2645 | DCHAR_T *pad_ptr; | 2645 | DCHAR_T *pad_ptr; |
2646 | DCHAR_T *p; | 2646 | DCHAR_T *p; |
2647 | 2647 | ||
2648 | has_width = 0; | 2648 | has_width = 0; |
2649 | width = 0; | 2649 | width = 0; |
2650 | if (dp->width_start != dp->width_end) | 2650 | if (dp->width_start != dp->width_end) |
2651 | { | 2651 | { |
2652 | if (dp->width_arg_index != ARG_NONE) | 2652 | if (dp->width_arg_index != ARG_NONE) |
2653 | { | 2653 | { |
2654 | int arg; | 2654 | int arg; |
2655 | 2655 | ||
2656 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | 2656 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
2657 | abort (); | 2657 | abort (); |
2658 | arg = a.arg[dp->width_arg_index].a.a_int; | 2658 | arg = a.arg[dp->width_arg_index].a.a_int; |
2659 | if (arg < 0) | 2659 | if (arg < 0) |
2660 | { | 2660 | { |
2661 | /* "A negative field width is taken as a '-' flag | 2661 | /* "A negative field width is taken as a '-' flag |
2662 | followed by a positive field width." */ | 2662 | followed by a positive field width." */ |
2663 | flags |= FLAG_LEFT; | 2663 | flags |= FLAG_LEFT; |
2664 | width = (unsigned int) (-arg); | 2664 | width = (unsigned int) (-arg); |
2665 | } | 2665 | } |
2666 | else | 2666 | else |
2667 | width = arg; | 2667 | width = arg; |
2668 | } | 2668 | } |
2669 | else | 2669 | else |
2670 | { | 2670 | { |
2671 | const FCHAR_T *digitp = dp->width_start; | 2671 | const FCHAR_T *digitp = dp->width_start; |
2672 | 2672 | ||
2673 | do | 2673 | do |
2674 | width = xsum (xtimes (width, 10), *digitp++ - '0'); | 2674 | width = xsum (xtimes (width, 10), *digitp++ - '0'); |
2675 | while (digitp != dp->width_end); | 2675 | while (digitp != dp->width_end); |
2676 | } | 2676 | } |
2677 | has_width = 1; | 2677 | has_width = 1; |
2678 | } | 2678 | } |
2679 | 2679 | ||
2680 | has_precision = 0; | 2680 | has_precision = 0; |
2681 | precision = 0; | 2681 | precision = 0; |
2682 | if (dp->precision_start != dp->precision_end) | 2682 | if (dp->precision_start != dp->precision_end) |
2683 | { | 2683 | { |
2684 | if (dp->precision_arg_index != ARG_NONE) | 2684 | if (dp->precision_arg_index != ARG_NONE) |
2685 | { | 2685 | { |
2686 | int arg; | 2686 | int arg; |
2687 | 2687 | ||
2688 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | 2688 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
2689 | abort (); | 2689 | abort (); |
2690 | arg = a.arg[dp->precision_arg_index].a.a_int; | 2690 | arg = a.arg[dp->precision_arg_index].a.a_int; |
2691 | /* "A negative precision is taken as if the precision | 2691 | /* "A negative precision is taken as if the precision |
2692 | were omitted." */ | 2692 | were omitted." */ |
2693 | if (arg >= 0) | 2693 | if (arg >= 0) |
2694 | { | 2694 | { |
2695 | precision = arg; | 2695 | precision = arg; |
2696 | has_precision = 1; | 2696 | has_precision = 1; |
2697 | } | 2697 | } |
2698 | } | 2698 | } |
2699 | else | 2699 | else |
2700 | { | 2700 | { |
2701 | const FCHAR_T *digitp = dp->precision_start + 1; | 2701 | const FCHAR_T *digitp = dp->precision_start + 1; |
2702 | 2702 | ||
2703 | precision = 0; | 2703 | precision = 0; |
2704 | while (digitp != dp->precision_end) | 2704 | while (digitp != dp->precision_end) |
2705 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); | 2705 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
2706 | has_precision = 1; | 2706 | has_precision = 1; |
2707 | } | 2707 | } |
2708 | } | 2708 | } |
2709 | 2709 | ||
2710 | /* Allocate a temporary buffer of sufficient size. */ | 2710 | /* Allocate a temporary buffer of sufficient size. */ |
2711 | if (type == TYPE_LONGDOUBLE) | 2711 | if (type == TYPE_LONGDOUBLE) |
2712 | tmp_length = | 2712 | tmp_length = |
2713 | (unsigned int) ((LDBL_DIG + 1) | 2713 | (unsigned int) ((LDBL_DIG + 1) |
2714 | * 0.831 /* decimal -> hexadecimal */ | 2714 | * 0.831 /* decimal -> hexadecimal */ |
2715 | ) | 2715 | ) |
2716 | + 1; /* turn floor into ceil */ | 2716 | + 1; /* turn floor into ceil */ |
2717 | else | 2717 | else |
2718 | tmp_length = | 2718 | tmp_length = |
2719 | (unsigned int) ((DBL_DIG + 1) | 2719 | (unsigned int) ((DBL_DIG + 1) |
2720 | * 0.831 /* decimal -> hexadecimal */ | 2720 | * 0.831 /* decimal -> hexadecimal */ |
2721 | ) | 2721 | ) |
2722 | + 1; /* turn floor into ceil */ | 2722 | + 1; /* turn floor into ceil */ |
2723 | if (tmp_length < precision) | 2723 | if (tmp_length < precision) |
2724 | tmp_length = precision; | 2724 | tmp_length = precision; |
2725 | /* Account for sign, decimal point etc. */ | 2725 | /* Account for sign, decimal point etc. */ |
2726 | tmp_length = xsum (tmp_length, 12); | 2726 | tmp_length = xsum (tmp_length, 12); |
2727 | 2727 | ||
2728 | if (tmp_length < width) | 2728 | if (tmp_length < width) |
2729 | tmp_length = width; | 2729 | tmp_length = width; |
2730 | 2730 | ||
2731 | tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ | 2731 | tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ |
2732 | 2732 | ||
2733 | if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) | 2733 | if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) |
2734 | tmp = tmpbuf; | 2734 | tmp = tmpbuf; |
2735 | else | 2735 | else |
2736 | { | 2736 | { |
2737 | size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); | 2737 | size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); |
2738 | 2738 | ||
2739 | if (size_overflow_p (tmp_memsize)) | 2739 | if (size_overflow_p (tmp_memsize)) |
2740 | /* Overflow, would lead to out of memory. */ | 2740 | /* Overflow, would lead to out of memory. */ |
2741 | goto out_of_memory; | 2741 | goto out_of_memory; |
2742 | tmp = (DCHAR_T *) malloc (tmp_memsize); | 2742 | tmp = (DCHAR_T *) malloc (tmp_memsize); |
2743 | if (tmp == NULL) | 2743 | if (tmp == NULL) |
2744 | /* Out of memory. */ | 2744 | /* Out of memory. */ |
2745 | goto out_of_memory; | 2745 | goto out_of_memory; |
2746 | } | 2746 | } |
2747 | 2747 | ||
2748 | pad_ptr = NULL; | 2748 | pad_ptr = NULL; |
2749 | p = tmp; | 2749 | p = tmp; |
2750 | if (type == TYPE_LONGDOUBLE) | 2750 | if (type == TYPE_LONGDOUBLE) |
2751 | { | 2751 | { |
2752 | # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE | 2752 | # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE |
2753 | long double arg = a.arg[dp->arg_index].a.a_longdouble; | 2753 | long double arg = a.arg[dp->arg_index].a.a_longdouble; |
2754 | 2754 | ||
2755 | if (isnanl (arg)) | 2755 | if (isnanl (arg)) |
2756 | { | 2756 | { |
2757 | if (dp->conversion == 'A') | 2757 | if (dp->conversion == 'A') |
2758 | { | 2758 | { |
2759 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; | 2759 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
2760 | } | 2760 | } |
2761 | else | 2761 | else |
2762 | { | 2762 | { |
2763 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; | 2763 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
2764 | } | 2764 | } |
2765 | } | 2765 | } |
2766 | else | 2766 | else |
2767 | { | 2767 | { |
2768 | int sign = 0; | 2768 | int sign = 0; |
2769 | DECL_LONG_DOUBLE_ROUNDING | 2769 | DECL_LONG_DOUBLE_ROUNDING |
2770 | 2770 | ||
2771 | BEGIN_LONG_DOUBLE_ROUNDING (); | 2771 | BEGIN_LONG_DOUBLE_ROUNDING (); |
2772 | 2772 | ||
2773 | if (signbit (arg)) /* arg < 0.0L or negative zero */ | 2773 | if (signbit (arg)) /* arg < 0.0L or negative zero */ |
2774 | { | 2774 | { |
2775 | sign = -1; | 2775 | sign = -1; |
2776 | arg = -arg; | 2776 | arg = -arg; |
2777 | } | 2777 | } |
2778 | 2778 | ||
2779 | if (sign < 0) | 2779 | if (sign < 0) |
2780 | *p++ = '-'; | 2780 | *p++ = '-'; |
2781 | else if (flags & FLAG_SHOWSIGN) | 2781 | else if (flags & FLAG_SHOWSIGN) |
2782 | *p++ = '+'; | 2782 | *p++ = '+'; |
2783 | else if (flags & FLAG_SPACE) | 2783 | else if (flags & FLAG_SPACE) |
2784 | *p++ = ' '; | 2784 | *p++ = ' '; |
2785 | 2785 | ||
2786 | if (arg > 0.0L && arg + arg == arg) | 2786 | if (arg > 0.0L && arg + arg == arg) |
2787 | { | 2787 | { |
2788 | if (dp->conversion == 'A') | 2788 | if (dp->conversion == 'A') |
2789 | { | 2789 | { |
2790 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; | 2790 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
2791 | } | 2791 | } |
2792 | else | 2792 | else |
2793 | { | 2793 | { |
2794 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; | 2794 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
2795 | } | 2795 | } |
2796 | } | 2796 | } |
2797 | else | 2797 | else |
2798 | { | 2798 | { |
2799 | int exponent; | 2799 | int exponent; |
2800 | long double mantissa; | 2800 | long double mantissa; |
2801 | 2801 | ||
2802 | if (arg > 0.0L) | 2802 | if (arg > 0.0L) |
2803 | mantissa = printf_frexpl (arg, &exponent); | 2803 | mantissa = printf_frexpl (arg, &exponent); |
2804 | else | 2804 | else |
2805 | { | 2805 | { |
2806 | exponent = 0; | 2806 | exponent = 0; |
2807 | mantissa = 0.0L; | 2807 | mantissa = 0.0L; |
2808 | } | 2808 | } |
2809 | 2809 | ||
2810 | if (has_precision | 2810 | if (has_precision |
2811 | && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) | 2811 | && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) |
2812 | { | 2812 | { |
2813 | /* Round the mantissa. */ | 2813 | /* Round the mantissa. */ |
2814 | long double tail = mantissa; | 2814 | long double tail = mantissa; |
2815 | size_t q; | 2815 | size_t q; |
2816 | 2816 | ||
2817 | for (q = precision; ; q--) | 2817 | for (q = precision; ; q--) |
2818 | { | 2818 | { |
2819 | int digit = (int) tail; | 2819 | int digit = (int) tail; |
2820 | tail -= digit; | 2820 | tail -= digit; |
2821 | if (q == 0) | 2821 | if (q == 0) |
2822 | { | 2822 | { |
2823 | if (digit & 1 ? tail >= 0.5L : tail > 0.5L) | 2823 | if (digit & 1 ? tail >= 0.5L : tail > 0.5L) |
2824 | tail = 1 - tail; | 2824 | tail = 1 - tail; |
2825 | else | 2825 | else |
2826 | tail = - tail; | 2826 | tail = - tail; |
2827 | break; | 2827 | break; |
2828 | } | 2828 | } |
2829 | tail *= 16.0L; | 2829 | tail *= 16.0L; |
2830 | } | 2830 | } |
2831 | if (tail != 0.0L) | 2831 | if (tail != 0.0L) |
2832 | for (q = precision; q > 0; q--) | 2832 | for (q = precision; q > 0; q--) |
2833 | tail *= 0.0625L; | 2833 | tail *= 0.0625L; |
2834 | mantissa += tail; | 2834 | mantissa += tail; |
2835 | } | 2835 | } |
2836 | 2836 | ||
2837 | *p++ = '0'; | 2837 | *p++ = '0'; |
2838 | *p++ = dp->conversion - 'A' + 'X'; | 2838 | *p++ = dp->conversion - 'A' + 'X'; |
2839 | pad_ptr = p; | 2839 | pad_ptr = p; |
2840 | { | 2840 | { |
2841 | int digit; | 2841 | int digit; |
2842 | 2842 | ||
2843 | digit = (int) mantissa; | 2843 | digit = (int) mantissa; |
2844 | mantissa -= digit; | 2844 | mantissa -= digit; |
2845 | *p++ = '0' + digit; | 2845 | *p++ = '0' + digit; |
2846 | if ((flags & FLAG_ALT) | 2846 | if ((flags & FLAG_ALT) |
2847 | || mantissa > 0.0L || precision > 0) | 2847 | || mantissa > 0.0L || precision > 0) |
2848 | { | 2848 | { |
2849 | *p++ = decimal_point_char (); | 2849 | *p++ = decimal_point_char (); |
2850 | /* This loop terminates because we assume | 2850 | /* This loop terminates because we assume |
2851 | that FLT_RADIX is a power of 2. */ | 2851 | that FLT_RADIX is a power of 2. */ |
2852 | while (mantissa > 0.0L) | 2852 | while (mantissa > 0.0L) |
2853 | { | 2853 | { |
2854 | mantissa *= 16.0L; | 2854 | mantissa *= 16.0L; |
2855 | digit = (int) mantissa; | 2855 | digit = (int) mantissa; |
2856 | mantissa -= digit; | 2856 | mantissa -= digit; |
2857 | *p++ = digit | 2857 | *p++ = digit |
2858 | + (digit < 10 | 2858 | + (digit < 10 |
2859 | ? '0' | 2859 | ? '0' |
2860 | : dp->conversion - 10); | 2860 | : dp->conversion - 10); |
2861 | if (precision > 0) | 2861 | if (precision > 0) |
2862 | precision--; | 2862 | precision--; |
2863 | } | 2863 | } |
2864 | while (precision > 0) | 2864 | while (precision > 0) |
2865 | { | 2865 | { |
2866 | *p++ = '0'; | 2866 | *p++ = '0'; |
2867 | precision--; | 2867 | precision--; |
2868 | } | 2868 | } |
2869 | } | 2869 | } |
2870 | } | 2870 | } |
2871 | *p++ = dp->conversion - 'A' + 'P'; | 2871 | *p++ = dp->conversion - 'A' + 'P'; |
2872 | # if WIDE_CHAR_VERSION | 2872 | # if WIDE_CHAR_VERSION |
2873 | { | 2873 | { |
2874 | static const wchar_t decimal_format[] = | 2874 | static const wchar_t decimal_format[] = |
2875 | { '%', '+', 'd', '\0' }; | 2875 | { '%', '+', 'd', '\0' }; |
2876 | SNPRINTF (p, 6 + 1, decimal_format, exponent); | 2876 | SNPRINTF (p, 6 + 1, decimal_format, exponent); |
2877 | } | 2877 | } |
2878 | while (*p != '\0') | 2878 | while (*p != '\0') |
2879 | p++; | 2879 | p++; |
2880 | # else | 2880 | # else |
2881 | if (sizeof (DCHAR_T) == 1) | 2881 | if (sizeof (DCHAR_T) == 1) |
2882 | { | 2882 | { |
2883 | sprintf ((char *) p, "%+d", exponent); | 2883 | sprintf ((char *) p, "%+d", exponent); |
2884 | while (*p != '\0') | 2884 | while (*p != '\0') |
2885 | p++; | 2885 | p++; |
2886 | } | 2886 | } |
2887 | else | 2887 | else |
2888 | { | 2888 | { |
2889 | char expbuf[6 + 1]; | 2889 | char expbuf[6 + 1]; |
2890 | const char *ep; | 2890 | const char *ep; |
2891 | sprintf (expbuf, "%+d", exponent); | 2891 | sprintf (expbuf, "%+d", exponent); |
2892 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) | 2892 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) |
2893 | p++; | 2893 | p++; |
2894 | } | 2894 | } |
2895 | # endif | 2895 | # endif |
2896 | } | 2896 | } |
2897 | 2897 | ||
2898 | END_LONG_DOUBLE_ROUNDING (); | 2898 | END_LONG_DOUBLE_ROUNDING (); |
2899 | } | 2899 | } |
2900 | # else | 2900 | # else |
2901 | abort (); | 2901 | abort (); |
2902 | # endif | 2902 | # endif |
2903 | } | 2903 | } |
2904 | else | 2904 | else |
2905 | { | 2905 | { |
2906 | # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE | 2906 | # if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE |
2907 | double arg = a.arg[dp->arg_index].a.a_double; | 2907 | double arg = a.arg[dp->arg_index].a.a_double; |
2908 | 2908 | ||
2909 | if (isnand (arg)) | 2909 | if (isnand (arg)) |
2910 | { | 2910 | { |
2911 | if (dp->conversion == 'A') | 2911 | if (dp->conversion == 'A') |
2912 | { | 2912 | { |
2913 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; | 2913 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
2914 | } | 2914 | } |
2915 | else | 2915 | else |
2916 | { | 2916 | { |
2917 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; | 2917 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
2918 | } | 2918 | } |
2919 | } | 2919 | } |
2920 | else | 2920 | else |
2921 | { | 2921 | { |
2922 | int sign = 0; | 2922 | int sign = 0; |
2923 | 2923 | ||
2924 | if (signbit (arg)) /* arg < 0.0 or negative zero */ | 2924 | if (signbit (arg)) /* arg < 0.0 or negative zero */ |
2925 | { | 2925 | { |
2926 | sign = -1; | 2926 | sign = -1; |
2927 | arg = -arg; | 2927 | arg = -arg; |
2928 | } | 2928 | } |
2929 | 2929 | ||
2930 | if (sign < 0) | 2930 | if (sign < 0) |
2931 | *p++ = '-'; | 2931 | *p++ = '-'; |
2932 | else if (flags & FLAG_SHOWSIGN) | 2932 | else if (flags & FLAG_SHOWSIGN) |
2933 | *p++ = '+'; | 2933 | *p++ = '+'; |
2934 | else if (flags & FLAG_SPACE) | 2934 | else if (flags & FLAG_SPACE) |
2935 | *p++ = ' '; | 2935 | *p++ = ' '; |
2936 | 2936 | ||
2937 | if (arg > 0.0 && arg + arg == arg) | 2937 | if (arg > 0.0 && arg + arg == arg) |
2938 | { | 2938 | { |
2939 | if (dp->conversion == 'A') | 2939 | if (dp->conversion == 'A') |
2940 | { | 2940 | { |
2941 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; | 2941 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
2942 | } | 2942 | } |
2943 | else | 2943 | else |
2944 | { | 2944 | { |
2945 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; | 2945 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
2946 | } | 2946 | } |
2947 | } | 2947 | } |
2948 | else | 2948 | else |
2949 | { | 2949 | { |
2950 | int exponent; | 2950 | int exponent; |
2951 | double mantissa; | 2951 | double mantissa; |
2952 | 2952 | ||
2953 | if (arg > 0.0) | 2953 | if (arg > 0.0) |
2954 | mantissa = printf_frexp (arg, &exponent); | 2954 | mantissa = printf_frexp (arg, &exponent); |
2955 | else | 2955 | else |
2956 | { | 2956 | { |
2957 | exponent = 0; | 2957 | exponent = 0; |
2958 | mantissa = 0.0; | 2958 | mantissa = 0.0; |
2959 | } | 2959 | } |
2960 | 2960 | ||
2961 | if (has_precision | 2961 | if (has_precision |
2962 | && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) | 2962 | && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) |
2963 | { | 2963 | { |
2964 | /* Round the mantissa. */ | 2964 | /* Round the mantissa. */ |
2965 | double tail = mantissa; | 2965 | double tail = mantissa; |
2966 | size_t q; | 2966 | size_t q; |
2967 | 2967 | ||
2968 | for (q = precision; ; q--) | 2968 | for (q = precision; ; q--) |
2969 | { | 2969 | { |
2970 | int digit = (int) tail; | 2970 | int digit = (int) tail; |
2971 | tail -= digit; | 2971 | tail -= digit; |
2972 | if (q == 0) | 2972 | if (q == 0) |
2973 | { | 2973 | { |
2974 | if (digit & 1 ? tail >= 0.5 : tail > 0.5) | 2974 | if (digit & 1 ? tail >= 0.5 : tail > 0.5) |
2975 | tail = 1 - tail; | 2975 | tail = 1 - tail; |
2976 | else | 2976 | else |
2977 | tail = - tail; | 2977 | tail = - tail; |
2978 | break; | 2978 | break; |
2979 | } | 2979 | } |
2980 | tail *= 16.0; | 2980 | tail *= 16.0; |
2981 | } | 2981 | } |
2982 | if (tail != 0.0) | 2982 | if (tail != 0.0) |
2983 | for (q = precision; q > 0; q--) | 2983 | for (q = precision; q > 0; q--) |
2984 | tail *= 0.0625; | 2984 | tail *= 0.0625; |
2985 | mantissa += tail; | 2985 | mantissa += tail; |
2986 | } | 2986 | } |
2987 | 2987 | ||
2988 | *p++ = '0'; | 2988 | *p++ = '0'; |
2989 | *p++ = dp->conversion - 'A' + 'X'; | 2989 | *p++ = dp->conversion - 'A' + 'X'; |
2990 | pad_ptr = p; | 2990 | pad_ptr = p; |
2991 | { | 2991 | { |
2992 | int digit; | 2992 | int digit; |
2993 | 2993 | ||
2994 | digit = (int) mantissa; | 2994 | digit = (int) mantissa; |
2995 | mantissa -= digit; | 2995 | mantissa -= digit; |
2996 | *p++ = '0' + digit; | 2996 | *p++ = '0' + digit; |
2997 | if ((flags & FLAG_ALT) | 2997 | if ((flags & FLAG_ALT) |
2998 | || mantissa > 0.0 || precision > 0) | 2998 | || mantissa > 0.0 || precision > 0) |
2999 | { | 2999 | { |
3000 | *p++ = decimal_point_char (); | 3000 | *p++ = decimal_point_char (); |
3001 | /* This loop terminates because we assume | 3001 | /* This loop terminates because we assume |
3002 | that FLT_RADIX is a power of 2. */ | 3002 | that FLT_RADIX is a power of 2. */ |
3003 | while (mantissa > 0.0) | 3003 | while (mantissa > 0.0) |
3004 | { | 3004 | { |
3005 | mantissa *= 16.0; | 3005 | mantissa *= 16.0; |
3006 | digit = (int) mantissa; | 3006 | digit = (int) mantissa; |
3007 | mantissa -= digit; | 3007 | mantissa -= digit; |
3008 | *p++ = digit | 3008 | *p++ = digit |
3009 | + (digit < 10 | 3009 | + (digit < 10 |
3010 | ? '0' | 3010 | ? '0' |
3011 | : dp->conversion - 10); | 3011 | : dp->conversion - 10); |
3012 | if (precision > 0) | 3012 | if (precision > 0) |
3013 | precision--; | 3013 | precision--; |
3014 | } | 3014 | } |
3015 | while (precision > 0) | 3015 | while (precision > 0) |
3016 | { | 3016 | { |
3017 | *p++ = '0'; | 3017 | *p++ = '0'; |
3018 | precision--; | 3018 | precision--; |
3019 | } | 3019 | } |
3020 | } | 3020 | } |
3021 | } | 3021 | } |
3022 | *p++ = dp->conversion - 'A' + 'P'; | 3022 | *p++ = dp->conversion - 'A' + 'P'; |
3023 | # if WIDE_CHAR_VERSION | 3023 | # if WIDE_CHAR_VERSION |
3024 | { | 3024 | { |
3025 | static const wchar_t decimal_format[] = | 3025 | static const wchar_t decimal_format[] = |
3026 | { '%', '+', 'd', '\0' }; | 3026 | { '%', '+', 'd', '\0' }; |
3027 | SNPRINTF (p, 6 + 1, decimal_format, exponent); | 3027 | SNPRINTF (p, 6 + 1, decimal_format, exponent); |
3028 | } | 3028 | } |
3029 | while (*p != '\0') | 3029 | while (*p != '\0') |
3030 | p++; | 3030 | p++; |
3031 | # else | 3031 | # else |
3032 | if (sizeof (DCHAR_T) == 1) | 3032 | if (sizeof (DCHAR_T) == 1) |
3033 | { | 3033 | { |
3034 | sprintf ((char *) p, "%+d", exponent); | 3034 | sprintf ((char *) p, "%+d", exponent); |
3035 | while (*p != '\0') | 3035 | while (*p != '\0') |
3036 | p++; | 3036 | p++; |
3037 | } | 3037 | } |
3038 | else | 3038 | else |
3039 | { | 3039 | { |
3040 | char expbuf[6 + 1]; | 3040 | char expbuf[6 + 1]; |
3041 | const char *ep; | 3041 | const char *ep; |
3042 | sprintf (expbuf, "%+d", exponent); | 3042 | sprintf (expbuf, "%+d", exponent); |
3043 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) | 3043 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) |
3044 | p++; | 3044 | p++; |
3045 | } | 3045 | } |
3046 | # endif | 3046 | # endif |
3047 | } | 3047 | } |
3048 | } | 3048 | } |
3049 | # else | 3049 | # else |
3050 | abort (); | 3050 | abort (); |
3051 | # endif | 3051 | # endif |
3052 | } | 3052 | } |
3053 | /* The generated string now extends from tmp to p, with the | 3053 | /* The generated string now extends from tmp to p, with the |
3054 | zero padding insertion point being at pad_ptr. */ | 3054 | zero padding insertion point being at pad_ptr. */ |
3055 | if (has_width && p - tmp < width) | 3055 | if (has_width && p - tmp < width) |
3056 | { | 3056 | { |
3057 | size_t pad = width - (p - tmp); | 3057 | size_t pad = width - (p - tmp); |
3058 | DCHAR_T *end = p + pad; | 3058 | DCHAR_T *end = p + pad; |
3059 | 3059 | ||
3060 | if (flags & FLAG_LEFT) | 3060 | if (flags & FLAG_LEFT) |
3061 | { | 3061 | { |
3062 | /* Pad with spaces on the right. */ | 3062 | /* Pad with spaces on the right. */ |
3063 | for (; pad > 0; pad--) | 3063 | for (; pad > 0; pad--) |
3064 | *p++ = ' '; | 3064 | *p++ = ' '; |
3065 | } | 3065 | } |
3066 | else if ((flags & FLAG_ZERO) && pad_ptr != NULL) | 3066 | else if ((flags & FLAG_ZERO) && pad_ptr != NULL) |
3067 | { | 3067 | { |
3068 | /* Pad with zeroes. */ | 3068 | /* Pad with zeroes. */ |
3069 | DCHAR_T *q = end; | 3069 | DCHAR_T *q = end; |
3070 | 3070 | ||
3071 | while (p > pad_ptr) | 3071 | while (p > pad_ptr) |
3072 | *--q = *--p; | 3072 | *--q = *--p; |
3073 | for (; pad > 0; pad--) | 3073 | for (; pad > 0; pad--) |
3074 | *p++ = '0'; | 3074 | *p++ = '0'; |
3075 | } | 3075 | } |
3076 | else | 3076 | else |
3077 | { | 3077 | { |
3078 | /* Pad with spaces on the left. */ | 3078 | /* Pad with spaces on the left. */ |
3079 | DCHAR_T *q = end; | 3079 | DCHAR_T *q = end; |
3080 | 3080 | ||
3081 | while (p > tmp) | 3081 | while (p > tmp) |
3082 | *--q = *--p; | 3082 | *--q = *--p; |
3083 | for (; pad > 0; pad--) | 3083 | for (; pad > 0; pad--) |
3084 | *p++ = ' '; | 3084 | *p++ = ' '; |
3085 | } | 3085 | } |
3086 | 3086 | ||
3087 | p = end; | 3087 | p = end; |
3088 | } | 3088 | } |
3089 | 3089 | ||
3090 | { | 3090 | { |
3091 | size_t count = p - tmp; | 3091 | size_t count = p - tmp; |
3092 | 3092 | ||
3093 | if (count >= tmp_length) | 3093 | if (count >= tmp_length) |
3094 | /* tmp_length was incorrectly calculated - fix the | 3094 | /* tmp_length was incorrectly calculated - fix the |
3095 | code above! */ | 3095 | code above! */ |
3096 | abort (); | 3096 | abort (); |
3097 | 3097 | ||
3098 | /* Make room for the result. */ | 3098 | /* Make room for the result. */ |
3099 | if (count >= allocated - length) | 3099 | if (count >= allocated - length) |
3100 | { | 3100 | { |
3101 | size_t n = xsum (length, count); | 3101 | size_t n = xsum (length, count); |
3102 | 3102 | ||
3103 | ENSURE_ALLOCATION (n); | 3103 | ENSURE_ALLOCATION (n); |
3104 | } | 3104 | } |
3105 | 3105 | ||
3106 | /* Append the result. */ | 3106 | /* Append the result. */ |
3107 | memcpy (result + length, tmp, count * sizeof (DCHAR_T)); | 3107 | memcpy (result + length, tmp, count * sizeof (DCHAR_T)); |
3108 | if (tmp != tmpbuf) | 3108 | if (tmp != tmpbuf) |
3109 | free (tmp); | 3109 | free (tmp); |
3110 | length += count; | 3110 | length += count; |
3111 | } | 3111 | } |
3112 | } | 3112 | } |
3113 | #endif | 3113 | #endif |
3114 | #if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL | 3114 | #if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL |
3115 | else if ((dp->conversion == 'f' || dp->conversion == 'F' | 3115 | else if ((dp->conversion == 'f' || dp->conversion == 'F' |
3116 | || dp->conversion == 'e' || dp->conversion == 'E' | 3116 | || dp->conversion == 'e' || dp->conversion == 'E' |
3117 | || dp->conversion == 'g' || dp->conversion == 'G' | 3117 | || dp->conversion == 'g' || dp->conversion == 'G' |
3118 | || dp->conversion == 'a' || dp->conversion == 'A') | 3118 | || dp->conversion == 'a' || dp->conversion == 'A') |
3119 | && (0 | 3119 | && (0 |
3120 | # if NEED_PRINTF_DOUBLE | 3120 | # if NEED_PRINTF_DOUBLE |
3121 | || a.arg[dp->arg_index].type == TYPE_DOUBLE | 3121 | || a.arg[dp->arg_index].type == TYPE_DOUBLE |
3122 | # elif NEED_PRINTF_INFINITE_DOUBLE | 3122 | # elif NEED_PRINTF_INFINITE_DOUBLE |
3123 | || (a.arg[dp->arg_index].type == TYPE_DOUBLE | 3123 | || (a.arg[dp->arg_index].type == TYPE_DOUBLE |
3124 | /* The systems (mingw) which produce wrong output | 3124 | /* The systems (mingw) which produce wrong output |
3125 | for Inf, -Inf, and NaN also do so for -0.0. | 3125 | for Inf, -Inf, and NaN also do so for -0.0. |
3126 | Therefore we treat this case here as well. */ | 3126 | Therefore we treat this case here as well. */ |
3127 | && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double)) | 3127 | && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double)) |
3128 | # endif | 3128 | # endif |
3129 | # if NEED_PRINTF_LONG_DOUBLE | 3129 | # if NEED_PRINTF_LONG_DOUBLE |
3130 | || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE | 3130 | || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE |
3131 | # elif NEED_PRINTF_INFINITE_LONG_DOUBLE | 3131 | # elif NEED_PRINTF_INFINITE_LONG_DOUBLE |
3132 | || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE | 3132 | || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE |
3133 | /* Some systems produce wrong output for Inf, | 3133 | /* Some systems produce wrong output for Inf, |
3134 | -Inf, and NaN. Some systems in this category | 3134 | -Inf, and NaN. Some systems in this category |
3135 | (IRIX 5.3) also do so for -0.0. Therefore we | 3135 | (IRIX 5.3) also do so for -0.0. Therefore we |
3136 | treat this case here as well. */ | 3136 | treat this case here as well. */ |
3137 | && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble)) | 3137 | && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble)) |
3138 | # endif | 3138 | # endif |
3139 | )) | 3139 | )) |
3140 | { | 3140 | { |
3141 | # if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) | 3141 | # if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) |
3142 | arg_type type = a.arg[dp->arg_index].type; | 3142 | arg_type type = a.arg[dp->arg_index].type; |
3143 | # endif | 3143 | # endif |
3144 | int flags = dp->flags; | 3144 | int flags = dp->flags; |
3145 | int has_width; | 3145 | int has_width; |
3146 | size_t width; | 3146 | size_t width; |
3147 | int has_precision; | 3147 | int has_precision; |
3148 | size_t precision; | 3148 | size_t precision; |
3149 | size_t tmp_length; | 3149 | size_t tmp_length; |
3150 | DCHAR_T tmpbuf[700]; | 3150 | DCHAR_T tmpbuf[700]; |
3151 | DCHAR_T *tmp; | 3151 | DCHAR_T *tmp; |
3152 | DCHAR_T *pad_ptr; | 3152 | DCHAR_T *pad_ptr; |
3153 | DCHAR_T *p; | 3153 | DCHAR_T *p; |
3154 | 3154 | ||
3155 | has_width = 0; | 3155 | has_width = 0; |
3156 | width = 0; | 3156 | width = 0; |
3157 | if (dp->width_start != dp->width_end) | 3157 | if (dp->width_start != dp->width_end) |
3158 | { | 3158 | { |
3159 | if (dp->width_arg_index != ARG_NONE) | 3159 | if (dp->width_arg_index != ARG_NONE) |
3160 | { | 3160 | { |
3161 | int arg; | 3161 | int arg; |
3162 | 3162 | ||
3163 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | 3163 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
3164 | abort (); | 3164 | abort (); |
3165 | arg = a.arg[dp->width_arg_index].a.a_int; | 3165 | arg = a.arg[dp->width_arg_index].a.a_int; |
3166 | if (arg < 0) | 3166 | if (arg < 0) |
3167 | { | 3167 | { |
3168 | /* "A negative field width is taken as a '-' flag | 3168 | /* "A negative field width is taken as a '-' flag |
3169 | followed by a positive field width." */ | 3169 | followed by a positive field width." */ |
3170 | flags |= FLAG_LEFT; | 3170 | flags |= FLAG_LEFT; |
3171 | width = (unsigned int) (-arg); | 3171 | width = (unsigned int) (-arg); |
3172 | } | 3172 | } |
3173 | else | 3173 | else |
3174 | width = arg; | 3174 | width = arg; |
3175 | } | 3175 | } |
3176 | else | 3176 | else |
3177 | { | 3177 | { |
3178 | const FCHAR_T *digitp = dp->width_start; | 3178 | const FCHAR_T *digitp = dp->width_start; |
3179 | 3179 | ||
3180 | do | 3180 | do |
3181 | width = xsum (xtimes (width, 10), *digitp++ - '0'); | 3181 | width = xsum (xtimes (width, 10), *digitp++ - '0'); |
3182 | while (digitp != dp->width_end); | 3182 | while (digitp != dp->width_end); |
3183 | } | 3183 | } |
3184 | has_width = 1; | 3184 | has_width = 1; |
3185 | } | 3185 | } |
3186 | 3186 | ||
3187 | has_precision = 0; | 3187 | has_precision = 0; |
3188 | precision = 0; | 3188 | precision = 0; |
3189 | if (dp->precision_start != dp->precision_end) | 3189 | if (dp->precision_start != dp->precision_end) |
3190 | { | 3190 | { |
3191 | if (dp->precision_arg_index != ARG_NONE) | 3191 | if (dp->precision_arg_index != ARG_NONE) |
3192 | { | 3192 | { |
3193 | int arg; | 3193 | int arg; |
3194 | 3194 | ||
3195 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | 3195 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
3196 | abort (); | 3196 | abort (); |
3197 | arg = a.arg[dp->precision_arg_index].a.a_int; | 3197 | arg = a.arg[dp->precision_arg_index].a.a_int; |
3198 | /* "A negative precision is taken as if the precision | 3198 | /* "A negative precision is taken as if the precision |
3199 | were omitted." */ | 3199 | were omitted." */ |
3200 | if (arg >= 0) | 3200 | if (arg >= 0) |
3201 | { | 3201 | { |
3202 | precision = arg; | 3202 | precision = arg; |
3203 | has_precision = 1; | 3203 | has_precision = 1; |
3204 | } | 3204 | } |
3205 | } | 3205 | } |
3206 | else | 3206 | else |
3207 | { | 3207 | { |
3208 | const FCHAR_T *digitp = dp->precision_start + 1; | 3208 | const FCHAR_T *digitp = dp->precision_start + 1; |
3209 | 3209 | ||
3210 | precision = 0; | 3210 | precision = 0; |
3211 | while (digitp != dp->precision_end) | 3211 | while (digitp != dp->precision_end) |
3212 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); | 3212 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
3213 | has_precision = 1; | 3213 | has_precision = 1; |
3214 | } | 3214 | } |
3215 | } | 3215 | } |
3216 | 3216 | ||
3217 | /* POSIX specifies the default precision to be 6 for %f, %F, | 3217 | /* POSIX specifies the default precision to be 6 for %f, %F, |
3218 | %e, %E, but not for %g, %G. Implementations appear to use | 3218 | %e, %E, but not for %g, %G. Implementations appear to use |
3219 | the same default precision also for %g, %G. But for %a, %A, | 3219 | the same default precision also for %g, %G. But for %a, %A, |
3220 | the default precision is 0. */ | 3220 | the default precision is 0. */ |
3221 | if (!has_precision) | 3221 | if (!has_precision) |
3222 | if (!(dp->conversion == 'a' || dp->conversion == 'A')) | 3222 | if (!(dp->conversion == 'a' || dp->conversion == 'A')) |
3223 | precision = 6; | 3223 | precision = 6; |
3224 | 3224 | ||
3225 | /* Allocate a temporary buffer of sufficient size. */ | 3225 | /* Allocate a temporary buffer of sufficient size. */ |
3226 | # if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE | 3226 | # if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE |
3227 | tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1); | 3227 | tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1); |
3228 | # elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE | 3228 | # elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE |
3229 | tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0); | 3229 | tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0); |
3230 | # elif NEED_PRINTF_LONG_DOUBLE | 3230 | # elif NEED_PRINTF_LONG_DOUBLE |
3231 | tmp_length = LDBL_DIG + 1; | 3231 | tmp_length = LDBL_DIG + 1; |
3232 | # elif NEED_PRINTF_DOUBLE | 3232 | # elif NEED_PRINTF_DOUBLE |
3233 | tmp_length = DBL_DIG + 1; | 3233 | tmp_length = DBL_DIG + 1; |
3234 | # else | 3234 | # else |
3235 | tmp_length = 0; | 3235 | tmp_length = 0; |
3236 | # endif | 3236 | # endif |
3237 | if (tmp_length < precision) | 3237 | if (tmp_length < precision) |
3238 | tmp_length = precision; | 3238 | tmp_length = precision; |
3239 | # if NEED_PRINTF_LONG_DOUBLE | 3239 | # if NEED_PRINTF_LONG_DOUBLE |
3240 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE | 3240 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE |
3241 | if (type == TYPE_LONGDOUBLE) | 3241 | if (type == TYPE_LONGDOUBLE) |
3242 | # endif | 3242 | # endif |
3243 | if (dp->conversion == 'f' || dp->conversion == 'F') | 3243 | if (dp->conversion == 'f' || dp->conversion == 'F') |
3244 | { | 3244 | { |
3245 | long double arg = a.arg[dp->arg_index].a.a_longdouble; | 3245 | long double arg = a.arg[dp->arg_index].a.a_longdouble; |
3246 | if (!(isnanl (arg) || arg + arg == arg)) | 3246 | if (!(isnanl (arg) || arg + arg == arg)) |
3247 | { | 3247 | { |
3248 | /* arg is finite and nonzero. */ | 3248 | /* arg is finite and nonzero. */ |
3249 | int exponent = floorlog10l (arg < 0 ? -arg : arg); | 3249 | int exponent = floorlog10l (arg < 0 ? -arg : arg); |
3250 | if (exponent >= 0 && tmp_length < exponent + precision) | 3250 | if (exponent >= 0 && tmp_length < exponent + precision) |
3251 | tmp_length = exponent + precision; | 3251 | tmp_length = exponent + precision; |
3252 | } | 3252 | } |
3253 | } | 3253 | } |
3254 | # endif | 3254 | # endif |
3255 | # if NEED_PRINTF_DOUBLE | 3255 | # if NEED_PRINTF_DOUBLE |
3256 | # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE | 3256 | # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE |
3257 | if (type == TYPE_DOUBLE) | 3257 | if (type == TYPE_DOUBLE) |
3258 | # endif | 3258 | # endif |
3259 | if (dp->conversion == 'f' || dp->conversion == 'F') | 3259 | if (dp->conversion == 'f' || dp->conversion == 'F') |
3260 | { | 3260 | { |
3261 | double arg = a.arg[dp->arg_index].a.a_double; | 3261 | double arg = a.arg[dp->arg_index].a.a_double; |
3262 | if (!(isnand (arg) || arg + arg == arg)) | 3262 | if (!(isnand (arg) || arg + arg == arg)) |
3263 | { | 3263 | { |
3264 | /* arg is finite and nonzero. */ | 3264 | /* arg is finite and nonzero. */ |
3265 | int exponent = floorlog10 (arg < 0 ? -arg : arg); | 3265 | int exponent = floorlog10 (arg < 0 ? -arg : arg); |
3266 | if (exponent >= 0 && tmp_length < exponent + precision) | 3266 | if (exponent >= 0 && tmp_length < exponent + precision) |
3267 | tmp_length = exponent + precision; | 3267 | tmp_length = exponent + precision; |
3268 | } | 3268 | } |
3269 | } | 3269 | } |
3270 | # endif | 3270 | # endif |
3271 | /* Account for sign, decimal point etc. */ | 3271 | /* Account for sign, decimal point etc. */ |
3272 | tmp_length = xsum (tmp_length, 12); | 3272 | tmp_length = xsum (tmp_length, 12); |
3273 | 3273 | ||
3274 | if (tmp_length < width) | 3274 | if (tmp_length < width) |
3275 | tmp_length = width; | 3275 | tmp_length = width; |
3276 | 3276 | ||
3277 | tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ | 3277 | tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ |
3278 | 3278 | ||
3279 | if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) | 3279 | if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) |
3280 | tmp = tmpbuf; | 3280 | tmp = tmpbuf; |
3281 | else | 3281 | else |
3282 | { | 3282 | { |
3283 | size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); | 3283 | size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); |
3284 | 3284 | ||
3285 | if (size_overflow_p (tmp_memsize)) | 3285 | if (size_overflow_p (tmp_memsize)) |
3286 | /* Overflow, would lead to out of memory. */ | 3286 | /* Overflow, would lead to out of memory. */ |
3287 | goto out_of_memory; | 3287 | goto out_of_memory; |
3288 | tmp = (DCHAR_T *) malloc (tmp_memsize); | 3288 | tmp = (DCHAR_T *) malloc (tmp_memsize); |
3289 | if (tmp == NULL) | 3289 | if (tmp == NULL) |
3290 | /* Out of memory. */ | 3290 | /* Out of memory. */ |
3291 | goto out_of_memory; | 3291 | goto out_of_memory; |
3292 | } | 3292 | } |
3293 | 3293 | ||
3294 | pad_ptr = NULL; | 3294 | pad_ptr = NULL; |
3295 | p = tmp; | 3295 | p = tmp; |
3296 | 3296 | ||
3297 | # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE | 3297 | # if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE |
3298 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE | 3298 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE |
3299 | if (type == TYPE_LONGDOUBLE) | 3299 | if (type == TYPE_LONGDOUBLE) |
3300 | # endif | 3300 | # endif |
3301 | { | 3301 | { |
3302 | long double arg = a.arg[dp->arg_index].a.a_longdouble; | 3302 | long double arg = a.arg[dp->arg_index].a.a_longdouble; |
3303 | 3303 | ||
3304 | if (isnanl (arg)) | 3304 | if (isnanl (arg)) |
3305 | { | 3305 | { |
3306 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') | 3306 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') |
3307 | { | 3307 | { |
3308 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; | 3308 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
3309 | } | 3309 | } |
3310 | else | 3310 | else |
3311 | { | 3311 | { |
3312 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; | 3312 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
3313 | } | 3313 | } |
3314 | } | 3314 | } |
3315 | else | 3315 | else |
3316 | { | 3316 | { |
3317 | int sign = 0; | 3317 | int sign = 0; |
3318 | DECL_LONG_DOUBLE_ROUNDING | 3318 | DECL_LONG_DOUBLE_ROUNDING |
3319 | 3319 | ||
3320 | BEGIN_LONG_DOUBLE_ROUNDING (); | 3320 | BEGIN_LONG_DOUBLE_ROUNDING (); |
3321 | 3321 | ||
3322 | if (signbit (arg)) /* arg < 0.0L or negative zero */ | 3322 | if (signbit (arg)) /* arg < 0.0L or negative zero */ |
3323 | { | 3323 | { |
3324 | sign = -1; | 3324 | sign = -1; |
3325 | arg = -arg; | 3325 | arg = -arg; |
3326 | } | 3326 | } |
3327 | 3327 | ||
3328 | if (sign < 0) | 3328 | if (sign < 0) |
3329 | *p++ = '-'; | 3329 | *p++ = '-'; |
3330 | else if (flags & FLAG_SHOWSIGN) | 3330 | else if (flags & FLAG_SHOWSIGN) |
3331 | *p++ = '+'; | 3331 | *p++ = '+'; |
3332 | else if (flags & FLAG_SPACE) | 3332 | else if (flags & FLAG_SPACE) |
3333 | *p++ = ' '; | 3333 | *p++ = ' '; |
3334 | 3334 | ||
3335 | if (arg > 0.0L && arg + arg == arg) | 3335 | if (arg > 0.0L && arg + arg == arg) |
3336 | { | 3336 | { |
3337 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') | 3337 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') |
3338 | { | 3338 | { |
3339 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; | 3339 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
3340 | } | 3340 | } |
3341 | else | 3341 | else |
3342 | { | 3342 | { |
3343 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; | 3343 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
3344 | } | 3344 | } |
3345 | } | 3345 | } |
3346 | else | 3346 | else |
3347 | { | 3347 | { |
3348 | # if NEED_PRINTF_LONG_DOUBLE | 3348 | # if NEED_PRINTF_LONG_DOUBLE |
3349 | pad_ptr = p; | 3349 | pad_ptr = p; |
3350 | 3350 | ||
3351 | if (dp->conversion == 'f' || dp->conversion == 'F') | 3351 | if (dp->conversion == 'f' || dp->conversion == 'F') |
3352 | { | 3352 | { |
3353 | char *digits; | 3353 | char *digits; |
3354 | size_t ndigits; | 3354 | size_t ndigits; |
3355 | 3355 | ||
3356 | digits = | 3356 | digits = |
3357 | scale10_round_decimal_long_double (arg, precision); | 3357 | scale10_round_decimal_long_double (arg, precision); |
3358 | if (digits == NULL) | 3358 | if (digits == NULL) |
3359 | { | 3359 | { |
3360 | END_LONG_DOUBLE_ROUNDING (); | 3360 | END_LONG_DOUBLE_ROUNDING (); |
3361 | goto out_of_memory; | 3361 | goto out_of_memory; |
3362 | } | 3362 | } |
3363 | ndigits = strlen (digits); | 3363 | ndigits = strlen (digits); |
3364 | 3364 | ||
3365 | if (ndigits > precision) | 3365 | if (ndigits > precision) |
3366 | do | 3366 | do |
3367 | { | 3367 | { |
3368 | --ndigits; | 3368 | --ndigits; |
3369 | *p++ = digits[ndigits]; | 3369 | *p++ = digits[ndigits]; |
3370 | } | 3370 | } |
3371 | while (ndigits > precision); | 3371 | while (ndigits > precision); |
3372 | else | 3372 | else |
3373 | *p++ = '0'; | 3373 | *p++ = '0'; |
3374 | /* Here ndigits <= precision. */ | 3374 | /* Here ndigits <= precision. */ |
3375 | if ((flags & FLAG_ALT) || precision > 0) | 3375 | if ((flags & FLAG_ALT) || precision > 0) |
3376 | { | 3376 | { |
3377 | *p++ = decimal_point_char (); | 3377 | *p++ = decimal_point_char (); |
3378 | for (; precision > ndigits; precision--) | 3378 | for (; precision > ndigits; precision--) |
3379 | *p++ = '0'; | 3379 | *p++ = '0'; |
3380 | while (ndigits > 0) | 3380 | while (ndigits > 0) |
3381 | { | 3381 | { |
3382 | --ndigits; | 3382 | --ndigits; |
3383 | *p++ = digits[ndigits]; | 3383 | *p++ = digits[ndigits]; |
3384 | } | 3384 | } |
3385 | } | 3385 | } |
3386 | 3386 | ||
3387 | free (digits); | 3387 | free (digits); |
3388 | } | 3388 | } |
3389 | else if (dp->conversion == 'e' || dp->conversion == 'E') | 3389 | else if (dp->conversion == 'e' || dp->conversion == 'E') |
3390 | { | 3390 | { |
3391 | int exponent; | 3391 | int exponent; |
3392 | 3392 | ||
3393 | if (arg == 0.0L) | 3393 | if (arg == 0.0L) |
3394 | { | 3394 | { |
3395 | exponent = 0; | 3395 | exponent = 0; |
3396 | *p++ = '0'; | 3396 | *p++ = '0'; |
3397 | if ((flags & FLAG_ALT) || precision > 0) | 3397 | if ((flags & FLAG_ALT) || precision > 0) |
3398 | { | 3398 | { |
3399 | *p++ = decimal_point_char (); | 3399 | *p++ = decimal_point_char (); |
3400 | for (; precision > 0; precision--) | 3400 | for (; precision > 0; precision--) |
3401 | *p++ = '0'; | 3401 | *p++ = '0'; |
3402 | } | 3402 | } |
3403 | } | 3403 | } |
3404 | else | 3404 | else |
3405 | { | 3405 | { |
3406 | /* arg > 0.0L. */ | 3406 | /* arg > 0.0L. */ |
3407 | int adjusted; | 3407 | int adjusted; |
3408 | char *digits; | 3408 | char *digits; |
3409 | size_t ndigits; | 3409 | size_t ndigits; |
3410 | 3410 | ||
3411 | exponent = floorlog10l (arg); | 3411 | exponent = floorlog10l (arg); |
3412 | adjusted = 0; | 3412 | adjusted = 0; |
3413 | for (;;) | 3413 | for (;;) |
3414 | { | 3414 | { |
3415 | digits = | 3415 | digits = |
3416 | scale10_round_decimal_long_double (arg, | 3416 | scale10_round_decimal_long_double (arg, |
3417 | (int)precision - exponent); | 3417 | (int)precision - exponent); |
3418 | if (digits == NULL) | 3418 | if (digits == NULL) |
3419 | { | 3419 | { |
3420 | END_LONG_DOUBLE_ROUNDING (); | 3420 | END_LONG_DOUBLE_ROUNDING (); |
3421 | goto out_of_memory; | 3421 | goto out_of_memory; |
3422 | } | 3422 | } |
3423 | ndigits = strlen (digits); | 3423 | ndigits = strlen (digits); |
3424 | 3424 | ||
3425 | if (ndigits == precision + 1) | 3425 | if (ndigits == precision + 1) |
3426 | break; | 3426 | break; |
3427 | if (ndigits < precision | 3427 | if (ndigits < precision |
3428 | || ndigits > precision + 2) | 3428 | || ndigits > precision + 2) |
3429 | /* The exponent was not guessed | 3429 | /* The exponent was not guessed |
3430 | precisely enough. */ | 3430 | precisely enough. */ |
3431 | abort (); | 3431 | abort (); |
3432 | if (adjusted) | 3432 | if (adjusted) |
3433 | /* None of two values of exponent is | 3433 | /* None of two values of exponent is |
3434 | the right one. Prevent an endless | 3434 | the right one. Prevent an endless |
3435 | loop. */ | 3435 | loop. */ |
3436 | abort (); | 3436 | abort (); |
3437 | free (digits); | 3437 | free (digits); |
3438 | if (ndigits == precision) | 3438 | if (ndigits == precision) |
3439 | exponent -= 1; | 3439 | exponent -= 1; |
3440 | else | 3440 | else |
3441 | exponent += 1; | 3441 | exponent += 1; |
3442 | adjusted = 1; | 3442 | adjusted = 1; |
3443 | } | 3443 | } |
3444 | /* Here ndigits = precision+1. */ | 3444 | /* Here ndigits = precision+1. */ |
3445 | if (is_borderline (digits, precision)) | 3445 | if (is_borderline (digits, precision)) |
3446 | { | 3446 | { |
3447 | /* Maybe the exponent guess was too high | 3447 | /* Maybe the exponent guess was too high |
3448 | and a smaller exponent can be reached | 3448 | and a smaller exponent can be reached |
3449 | by turning a 10...0 into 9...9x. */ | 3449 | by turning a 10...0 into 9...9x. */ |
3450 | char *digits2 = | 3450 | char *digits2 = |
3451 | scale10_round_decimal_long_double (arg, | 3451 | scale10_round_decimal_long_double (arg, |
3452 | (int)precision - exponent + 1); | 3452 | (int)precision - exponent + 1); |
3453 | if (digits2 == NULL) | 3453 | if (digits2 == NULL) |
3454 | { | 3454 | { |
3455 | free (digits); | 3455 | free (digits); |
3456 | END_LONG_DOUBLE_ROUNDING (); | 3456 | END_LONG_DOUBLE_ROUNDING (); |
3457 | goto out_of_memory; | 3457 | goto out_of_memory; |
3458 | } | 3458 | } |
3459 | if (strlen (digits2) == precision + 1) | 3459 | if (strlen (digits2) == precision + 1) |
3460 | { | 3460 | { |
3461 | free (digits); | 3461 | free (digits); |
3462 | digits = digits2; | 3462 | digits = digits2; |
3463 | exponent -= 1; | 3463 | exponent -= 1; |
3464 | } | 3464 | } |
3465 | else | 3465 | else |
3466 | free (digits2); | 3466 | free (digits2); |
3467 | } | 3467 | } |
3468 | /* Here ndigits = precision+1. */ | 3468 | /* Here ndigits = precision+1. */ |
3469 | 3469 | ||
3470 | *p++ = digits[--ndigits]; | 3470 | *p++ = digits[--ndigits]; |
3471 | if ((flags & FLAG_ALT) || precision > 0) | 3471 | if ((flags & FLAG_ALT) || precision > 0) |
3472 | { | 3472 | { |
3473 | *p++ = decimal_point_char (); | 3473 | *p++ = decimal_point_char (); |
3474 | while (ndigits > 0) | 3474 | while (ndigits > 0) |
3475 | { | 3475 | { |
3476 | --ndigits; | 3476 | --ndigits; |
3477 | *p++ = digits[ndigits]; | 3477 | *p++ = digits[ndigits]; |
3478 | } | 3478 | } |
3479 | } | 3479 | } |
3480 | 3480 | ||
3481 | free (digits); | 3481 | free (digits); |
3482 | } | 3482 | } |
3483 | 3483 | ||
3484 | *p++ = dp->conversion; /* 'e' or 'E' */ | 3484 | *p++ = dp->conversion; /* 'e' or 'E' */ |
3485 | # if WIDE_CHAR_VERSION | 3485 | # if WIDE_CHAR_VERSION |
3486 | { | 3486 | { |
3487 | static const wchar_t decimal_format[] = | 3487 | static const wchar_t decimal_format[] = |
3488 | { '%', '+', '.', '2', 'd', '\0' }; | 3488 | { '%', '+', '.', '2', 'd', '\0' }; |
3489 | SNPRINTF (p, 6 + 1, decimal_format, exponent); | 3489 | SNPRINTF (p, 6 + 1, decimal_format, exponent); |
3490 | } | 3490 | } |
3491 | while (*p != '\0') | 3491 | while (*p != '\0') |
3492 | p++; | 3492 | p++; |
3493 | # else | 3493 | # else |
3494 | if (sizeof (DCHAR_T) == 1) | 3494 | if (sizeof (DCHAR_T) == 1) |
3495 | { | 3495 | { |
3496 | sprintf ((char *) p, "%+.2d", exponent); | 3496 | sprintf ((char *) p, "%+.2d", exponent); |
3497 | while (*p != '\0') | 3497 | while (*p != '\0') |
3498 | p++; | 3498 | p++; |
3499 | } | 3499 | } |
3500 | else | 3500 | else |
3501 | { | 3501 | { |
3502 | char expbuf[6 + 1]; | 3502 | char expbuf[6 + 1]; |
3503 | const char *ep; | 3503 | const char *ep; |
3504 | sprintf (expbuf, "%+.2d", exponent); | 3504 | sprintf (expbuf, "%+.2d", exponent); |
3505 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) | 3505 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) |
3506 | p++; | 3506 | p++; |
3507 | } | 3507 | } |
3508 | # endif | 3508 | # endif |
3509 | } | 3509 | } |
3510 | else if (dp->conversion == 'g' || dp->conversion == 'G') | 3510 | else if (dp->conversion == 'g' || dp->conversion == 'G') |
3511 | { | 3511 | { |
3512 | if (precision == 0) | 3512 | if (precision == 0) |
3513 | precision = 1; | 3513 | precision = 1; |
3514 | /* precision >= 1. */ | 3514 | /* precision >= 1. */ |
3515 | 3515 | ||
3516 | if (arg == 0.0L) | 3516 | if (arg == 0.0L) |
3517 | /* The exponent is 0, >= -4, < precision. | 3517 | /* The exponent is 0, >= -4, < precision. |
3518 | Use fixed-point notation. */ | 3518 | Use fixed-point notation. */ |
3519 | { | 3519 | { |
3520 | size_t ndigits = precision; | 3520 | size_t ndigits = precision; |
3521 | /* Number of trailing zeroes that have to be | 3521 | /* Number of trailing zeroes that have to be |
3522 | dropped. */ | 3522 | dropped. */ |
3523 | size_t nzeroes = | 3523 | size_t nzeroes = |
3524 | (flags & FLAG_ALT ? 0 : precision - 1); | 3524 | (flags & FLAG_ALT ? 0 : precision - 1); |
3525 | 3525 | ||
3526 | --ndigits; | 3526 | --ndigits; |
3527 | *p++ = '0'; | 3527 | *p++ = '0'; |
3528 | if ((flags & FLAG_ALT) || ndigits > nzeroes) | 3528 | if ((flags & FLAG_ALT) || ndigits > nzeroes) |
3529 | { | 3529 | { |
3530 | *p++ = decimal_point_char (); | 3530 | *p++ = decimal_point_char (); |
3531 | while (ndigits > nzeroes) | 3531 | while (ndigits > nzeroes) |
3532 | { | 3532 | { |
3533 | --ndigits; | 3533 | --ndigits; |
3534 | *p++ = '0'; | 3534 | *p++ = '0'; |
3535 | } | 3535 | } |
3536 | } | 3536 | } |
3537 | } | 3537 | } |
3538 | else | 3538 | else |
3539 | { | 3539 | { |
3540 | /* arg > 0.0L. */ | 3540 | /* arg > 0.0L. */ |
3541 | int exponent; | 3541 | int exponent; |
3542 | int adjusted; | 3542 | int adjusted; |
3543 | char *digits; | 3543 | char *digits; |
3544 | size_t ndigits; | 3544 | size_t ndigits; |
3545 | size_t nzeroes; | 3545 | size_t nzeroes; |
3546 | 3546 | ||
3547 | exponent = floorlog10l (arg); | 3547 | exponent = floorlog10l (arg); |
3548 | adjusted = 0; | 3548 | adjusted = 0; |
3549 | for (;;) | 3549 | for (;;) |
3550 | { | 3550 | { |
3551 | digits = | 3551 | digits = |
3552 | scale10_round_decimal_long_double (arg, | 3552 | scale10_round_decimal_long_double (arg, |
3553 | (int)(precision - 1) - exponent); | 3553 | (int)(precision - 1) - exponent); |
3554 | if (digits == NULL) | 3554 | if (digits == NULL) |
3555 | { | 3555 | { |
3556 | END_LONG_DOUBLE_ROUNDING (); | 3556 | END_LONG_DOUBLE_ROUNDING (); |
3557 | goto out_of_memory; | 3557 | goto out_of_memory; |
3558 | } | 3558 | } |
3559 | ndigits = strlen (digits); | 3559 | ndigits = strlen (digits); |
3560 | 3560 | ||
3561 | if (ndigits == precision) | 3561 | if (ndigits == precision) |
3562 | break; | 3562 | break; |
3563 | if (ndigits < precision - 1 | 3563 | if (ndigits < precision - 1 |
3564 | || ndigits > precision + 1) | 3564 | || ndigits > precision + 1) |
3565 | /* The exponent was not guessed | 3565 | /* The exponent was not guessed |
3566 | precisely enough. */ | 3566 | precisely enough. */ |
3567 | abort (); | 3567 | abort (); |
3568 | if (adjusted) | 3568 | if (adjusted) |
3569 | /* None of two values of exponent is | 3569 | /* None of two values of exponent is |
3570 | the right one. Prevent an endless | 3570 | the right one. Prevent an endless |
3571 | loop. */ | 3571 | loop. */ |
3572 | abort (); | 3572 | abort (); |
3573 | free (digits); | 3573 | free (digits); |
3574 | if (ndigits < precision) | 3574 | if (ndigits < precision) |
3575 | exponent -= 1; | 3575 | exponent -= 1; |
3576 | else | 3576 | else |
3577 | exponent += 1; | 3577 | exponent += 1; |
3578 | adjusted = 1; | 3578 | adjusted = 1; |
3579 | } | 3579 | } |
3580 | /* Here ndigits = precision. */ | 3580 | /* Here ndigits = precision. */ |
3581 | if (is_borderline (digits, precision - 1)) | 3581 | if (is_borderline (digits, precision - 1)) |
3582 | { | 3582 | { |
3583 | /* Maybe the exponent guess was too high | 3583 | /* Maybe the exponent guess was too high |
3584 | and a smaller exponent can be reached | 3584 | and a smaller exponent can be reached |
3585 | by turning a 10...0 into 9...9x. */ | 3585 | by turning a 10...0 into 9...9x. */ |
3586 | char *digits2 = | 3586 | char *digits2 = |
3587 | scale10_round_decimal_long_double (arg, | 3587 | scale10_round_decimal_long_double (arg, |
3588 | (int)(precision - 1) - exponent + 1); | 3588 | (int)(precision - 1) - exponent + 1); |
3589 | if (digits2 == NULL) | 3589 | if (digits2 == NULL) |
3590 | { | 3590 | { |
3591 | free (digits); | 3591 | free (digits); |
3592 | END_LONG_DOUBLE_ROUNDING (); | 3592 | END_LONG_DOUBLE_ROUNDING (); |
3593 | goto out_of_memory; | 3593 | goto out_of_memory; |
3594 | } | 3594 | } |
3595 | if (strlen (digits2) == precision) | 3595 | if (strlen (digits2) == precision) |
3596 | { | 3596 | { |
3597 | free (digits); | 3597 | free (digits); |
3598 | digits = digits2; | 3598 | digits = digits2; |
3599 | exponent -= 1; | 3599 | exponent -= 1; |
3600 | } | 3600 | } |
3601 | else | 3601 | else |
3602 | free (digits2); | 3602 | free (digits2); |
3603 | } | 3603 | } |
3604 | /* Here ndigits = precision. */ | 3604 | /* Here ndigits = precision. */ |
3605 | 3605 | ||
3606 | /* Determine the number of trailing zeroes | 3606 | /* Determine the number of trailing zeroes |
3607 | that have to be dropped. */ | 3607 | that have to be dropped. */ |
3608 | nzeroes = 0; | 3608 | nzeroes = 0; |
3609 | if ((flags & FLAG_ALT) == 0) | 3609 | if ((flags & FLAG_ALT) == 0) |
3610 | while (nzeroes < ndigits | 3610 | while (nzeroes < ndigits |
3611 | && digits[nzeroes] == '0') | 3611 | && digits[nzeroes] == '0') |
3612 | nzeroes++; | 3612 | nzeroes++; |
3613 | 3613 | ||
3614 | /* The exponent is now determined. */ | 3614 | /* The exponent is now determined. */ |
3615 | if (exponent >= -4 | 3615 | if (exponent >= -4 |
3616 | && exponent < (long)precision) | 3616 | && exponent < (long)precision) |
3617 | { | 3617 | { |
3618 | /* Fixed-point notation: | 3618 | /* Fixed-point notation: |
3619 | max(exponent,0)+1 digits, then the | 3619 | max(exponent,0)+1 digits, then the |
3620 | decimal point, then the remaining | 3620 | decimal point, then the remaining |
3621 | digits without trailing zeroes. */ | 3621 | digits without trailing zeroes. */ |
3622 | if (exponent >= 0) | 3622 | if (exponent >= 0) |
3623 | { | 3623 | { |
3624 | size_t count = exponent + 1; | 3624 | size_t count = exponent + 1; |
3625 | /* Note: count <= precision = ndigits. */ | 3625 | /* Note: count <= precision = ndigits. */ |
3626 | for (; count > 0; count--) | 3626 | for (; count > 0; count--) |
3627 | *p++ = digits[--ndigits]; | 3627 | *p++ = digits[--ndigits]; |
3628 | if ((flags & FLAG_ALT) || ndigits > nzeroes) | 3628 | if ((flags & FLAG_ALT) || ndigits > nzeroes) |
3629 | { | 3629 | { |
3630 | *p++ = decimal_point_char (); | 3630 | *p++ = decimal_point_char (); |
3631 | while (ndigits > nzeroes) | 3631 | while (ndigits > nzeroes) |
3632 | { | 3632 | { |
3633 | --ndigits; | 3633 | --ndigits; |
3634 | *p++ = digits[ndigits]; | 3634 | *p++ = digits[ndigits]; |
3635 | } | 3635 | } |
3636 | } | 3636 | } |
3637 | } | 3637 | } |
3638 | else | 3638 | else |
3639 | { | 3639 | { |
3640 | size_t count = -exponent - 1; | 3640 | size_t count = -exponent - 1; |
3641 | *p++ = '0'; | 3641 | *p++ = '0'; |
3642 | *p++ = decimal_point_char (); | 3642 | *p++ = decimal_point_char (); |
3643 | for (; count > 0; count--) | 3643 | for (; count > 0; count--) |
3644 | *p++ = '0'; | 3644 | *p++ = '0'; |
3645 | while (ndigits > nzeroes) | 3645 | while (ndigits > nzeroes) |
3646 | { | 3646 | { |
3647 | --ndigits; | 3647 | --ndigits; |
3648 | *p++ = digits[ndigits]; | 3648 | *p++ = digits[ndigits]; |
3649 | } | 3649 | } |
3650 | } | 3650 | } |
3651 | } | 3651 | } |
3652 | else | 3652 | else |
3653 | { | 3653 | { |
3654 | /* Exponential notation. */ | 3654 | /* Exponential notation. */ |
3655 | *p++ = digits[--ndigits]; | 3655 | *p++ = digits[--ndigits]; |
3656 | if ((flags & FLAG_ALT) || ndigits > nzeroes) | 3656 | if ((flags & FLAG_ALT) || ndigits > nzeroes) |
3657 | { | 3657 | { |
3658 | *p++ = decimal_point_char (); | 3658 | *p++ = decimal_point_char (); |
3659 | while (ndigits > nzeroes) | 3659 | while (ndigits > nzeroes) |
3660 | { | 3660 | { |
3661 | --ndigits; | 3661 | --ndigits; |
3662 | *p++ = digits[ndigits]; | 3662 | *p++ = digits[ndigits]; |
3663 | } | 3663 | } |
3664 | } | 3664 | } |
3665 | *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ | 3665 | *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ |
3666 | # if WIDE_CHAR_VERSION | 3666 | # if WIDE_CHAR_VERSION |
3667 | { | 3667 | { |
3668 | static const wchar_t decimal_format[] = | 3668 | static const wchar_t decimal_format[] = |
3669 | { '%', '+', '.', '2', 'd', '\0' }; | 3669 | { '%', '+', '.', '2', 'd', '\0' }; |
3670 | SNPRINTF (p, 6 + 1, decimal_format, exponent); | 3670 | SNPRINTF (p, 6 + 1, decimal_format, exponent); |
3671 | } | 3671 | } |
3672 | while (*p != '\0') | 3672 | while (*p != '\0') |
3673 | p++; | 3673 | p++; |
3674 | # else | 3674 | # else |
3675 | if (sizeof (DCHAR_T) == 1) | 3675 | if (sizeof (DCHAR_T) == 1) |
3676 | { | 3676 | { |
3677 | sprintf ((char *) p, "%+.2d", exponent); | 3677 | sprintf ((char *) p, "%+.2d", exponent); |
3678 | while (*p != '\0') | 3678 | while (*p != '\0') |
3679 | p++; | 3679 | p++; |
3680 | } | 3680 | } |
3681 | else | 3681 | else |
3682 | { | 3682 | { |
3683 | char expbuf[6 + 1]; | 3683 | char expbuf[6 + 1]; |
3684 | const char *ep; | 3684 | const char *ep; |
3685 | sprintf (expbuf, "%+.2d", exponent); | 3685 | sprintf (expbuf, "%+.2d", exponent); |
3686 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) | 3686 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) |
3687 | p++; | 3687 | p++; |
3688 | } | 3688 | } |
3689 | # endif | 3689 | # endif |
3690 | } | 3690 | } |
3691 | 3691 | ||
3692 | free (digits); | 3692 | free (digits); |
3693 | } | 3693 | } |
3694 | } | 3694 | } |
3695 | else | 3695 | else |
3696 | abort (); | 3696 | abort (); |
3697 | # else | 3697 | # else |
3698 | /* arg is finite. */ | 3698 | /* arg is finite. */ |
3699 | if (!(arg == 0.0L)) | 3699 | if (!(arg == 0.0L)) |
3700 | abort (); | 3700 | abort (); |
3701 | 3701 | ||
3702 | pad_ptr = p; | 3702 | pad_ptr = p; |
3703 | 3703 | ||
3704 | if (dp->conversion == 'f' || dp->conversion == 'F') | 3704 | if (dp->conversion == 'f' || dp->conversion == 'F') |
3705 | { | 3705 | { |
3706 | *p++ = '0'; | 3706 | *p++ = '0'; |
3707 | if ((flags & FLAG_ALT) || precision > 0) | 3707 | if ((flags & FLAG_ALT) || precision > 0) |
3708 | { | 3708 | { |
3709 | *p++ = decimal_point_char (); | 3709 | *p++ = decimal_point_char (); |
3710 | for (; precision > 0; precision--) | 3710 | for (; precision > 0; precision--) |
3711 | *p++ = '0'; | 3711 | *p++ = '0'; |
3712 | } | 3712 | } |
3713 | } | 3713 | } |
3714 | else if (dp->conversion == 'e' || dp->conversion == 'E') | 3714 | else if (dp->conversion == 'e' || dp->conversion == 'E') |
3715 | { | 3715 | { |
3716 | *p++ = '0'; | 3716 | *p++ = '0'; |
3717 | if ((flags & FLAG_ALT) || precision > 0) | 3717 | if ((flags & FLAG_ALT) || precision > 0) |
3718 | { | 3718 | { |
3719 | *p++ = decimal_point_char (); | 3719 | *p++ = decimal_point_char (); |
3720 | for (; precision > 0; precision--) | 3720 | for (; precision > 0; precision--) |
3721 | *p++ = '0'; | 3721 | *p++ = '0'; |
3722 | } | 3722 | } |
3723 | *p++ = dp->conversion; /* 'e' or 'E' */ | 3723 | *p++ = dp->conversion; /* 'e' or 'E' */ |
3724 | *p++ = '+'; | 3724 | *p++ = '+'; |
3725 | *p++ = '0'; | 3725 | *p++ = '0'; |
3726 | *p++ = '0'; | 3726 | *p++ = '0'; |
3727 | } | 3727 | } |
3728 | else if (dp->conversion == 'g' || dp->conversion == 'G') | 3728 | else if (dp->conversion == 'g' || dp->conversion == 'G') |
3729 | { | 3729 | { |
3730 | *p++ = '0'; | 3730 | *p++ = '0'; |
3731 | if (flags & FLAG_ALT) | 3731 | if (flags & FLAG_ALT) |
3732 | { | 3732 | { |
3733 | size_t ndigits = | 3733 | size_t ndigits = |
3734 | (precision > 0 ? precision - 1 : 0); | 3734 | (precision > 0 ? precision - 1 : 0); |
3735 | *p++ = decimal_point_char (); | 3735 | *p++ = decimal_point_char (); |
3736 | for (; ndigits > 0; --ndigits) | 3736 | for (; ndigits > 0; --ndigits) |
3737 | *p++ = '0'; | 3737 | *p++ = '0'; |
3738 | } | 3738 | } |
3739 | } | 3739 | } |
3740 | else if (dp->conversion == 'a' || dp->conversion == 'A') | 3740 | else if (dp->conversion == 'a' || dp->conversion == 'A') |
3741 | { | 3741 | { |
3742 | *p++ = '0'; | 3742 | *p++ = '0'; |
3743 | *p++ = dp->conversion - 'A' + 'X'; | 3743 | *p++ = dp->conversion - 'A' + 'X'; |
3744 | pad_ptr = p; | 3744 | pad_ptr = p; |
3745 | *p++ = '0'; | 3745 | *p++ = '0'; |
3746 | if ((flags & FLAG_ALT) || precision > 0) | 3746 | if ((flags & FLAG_ALT) || precision > 0) |
3747 | { | 3747 | { |
3748 | *p++ = decimal_point_char (); | 3748 | *p++ = decimal_point_char (); |
3749 | for (; precision > 0; precision--) | 3749 | for (; precision > 0; precision--) |
3750 | *p++ = '0'; | 3750 | *p++ = '0'; |
3751 | } | 3751 | } |
3752 | *p++ = dp->conversion - 'A' + 'P'; | 3752 | *p++ = dp->conversion - 'A' + 'P'; |
3753 | *p++ = '+'; | 3753 | *p++ = '+'; |
3754 | *p++ = '0'; | 3754 | *p++ = '0'; |
3755 | } | 3755 | } |
3756 | else | 3756 | else |
3757 | abort (); | 3757 | abort (); |
3758 | # endif | 3758 | # endif |
3759 | } | 3759 | } |
3760 | 3760 | ||
3761 | END_LONG_DOUBLE_ROUNDING (); | 3761 | END_LONG_DOUBLE_ROUNDING (); |
3762 | } | 3762 | } |
3763 | } | 3763 | } |
3764 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE | 3764 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE |
3765 | else | 3765 | else |
3766 | # endif | 3766 | # endif |
3767 | # endif | 3767 | # endif |
3768 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE | 3768 | # if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE |
3769 | { | 3769 | { |
3770 | double arg = a.arg[dp->arg_index].a.a_double; | 3770 | double arg = a.arg[dp->arg_index].a.a_double; |
3771 | 3771 | ||
3772 | if (isnand (arg)) | 3772 | if (isnand (arg)) |
3773 | { | 3773 | { |
3774 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') | 3774 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') |
3775 | { | 3775 | { |
3776 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; | 3776 | *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
3777 | } | 3777 | } |
3778 | else | 3778 | else |
3779 | { | 3779 | { |
3780 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; | 3780 | *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
3781 | } | 3781 | } |
3782 | } | 3782 | } |
3783 | else | 3783 | else |
3784 | { | 3784 | { |
3785 | int sign = 0; | 3785 | int sign = 0; |
3786 | 3786 | ||
3787 | if (signbit (arg)) /* arg < 0.0 or negative zero */ | 3787 | if (signbit (arg)) /* arg < 0.0 or negative zero */ |
3788 | { | 3788 | { |
3789 | sign = -1; | 3789 | sign = -1; |
3790 | arg = -arg; | 3790 | arg = -arg; |
3791 | } | 3791 | } |
3792 | 3792 | ||
3793 | if (sign < 0) | 3793 | if (sign < 0) |
3794 | *p++ = '-'; | 3794 | *p++ = '-'; |
3795 | else if (flags & FLAG_SHOWSIGN) | 3795 | else if (flags & FLAG_SHOWSIGN) |
3796 | *p++ = '+'; | 3796 | *p++ = '+'; |
3797 | else if (flags & FLAG_SPACE) | 3797 | else if (flags & FLAG_SPACE) |
3798 | *p++ = ' '; | 3798 | *p++ = ' '; |
3799 | 3799 | ||
3800 | if (arg > 0.0 && arg + arg == arg) | 3800 | if (arg > 0.0 && arg + arg == arg) |
3801 | { | 3801 | { |
3802 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') | 3802 | if (dp->conversion >= 'A' && dp->conversion <= 'Z') |
3803 | { | 3803 | { |
3804 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; | 3804 | *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
3805 | } | 3805 | } |
3806 | else | 3806 | else |
3807 | { | 3807 | { |
3808 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; | 3808 | *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
3809 | } | 3809 | } |
3810 | } | 3810 | } |
3811 | else | 3811 | else |
3812 | { | 3812 | { |
3813 | # if NEED_PRINTF_DOUBLE | 3813 | # if NEED_PRINTF_DOUBLE |
3814 | pad_ptr = p; | 3814 | pad_ptr = p; |
3815 | 3815 | ||
3816 | if (dp->conversion == 'f' || dp->conversion == 'F') | 3816 | if (dp->conversion == 'f' || dp->conversion == 'F') |
3817 | { | 3817 | { |
3818 | char *digits; | 3818 | char *digits; |
3819 | size_t ndigits; | 3819 | size_t ndigits; |
3820 | 3820 | ||
3821 | digits = | 3821 | digits = |
3822 | scale10_round_decimal_double (arg, precision); | 3822 | scale10_round_decimal_double (arg, precision); |
3823 | if (digits == NULL) | 3823 | if (digits == NULL) |
3824 | goto out_of_memory; | 3824 | goto out_of_memory; |
3825 | ndigits = strlen (digits); | 3825 | ndigits = strlen (digits); |
3826 | 3826 | ||
3827 | if (ndigits > precision) | 3827 | if (ndigits > precision) |
3828 | do | 3828 | do |
3829 | { | 3829 | { |
3830 | --ndigits; | 3830 | --ndigits; |
3831 | *p++ = digits[ndigits]; | 3831 | *p++ = digits[ndigits]; |
3832 | } | 3832 | } |
3833 | while (ndigits > precision); | 3833 | while (ndigits > precision); |
3834 | else | 3834 | else |
3835 | *p++ = '0'; | 3835 | *p++ = '0'; |
3836 | /* Here ndigits <= precision. */ | 3836 | /* Here ndigits <= precision. */ |
3837 | if ((flags & FLAG_ALT) || precision > 0) | 3837 | if ((flags & FLAG_ALT) || precision > 0) |
3838 | { | 3838 | { |
3839 | *p++ = decimal_point_char (); | 3839 | *p++ = decimal_point_char (); |
3840 | for (; precision > ndigits; precision--) | 3840 | for (; precision > ndigits; precision--) |
3841 | *p++ = '0'; | 3841 | *p++ = '0'; |
3842 | while (ndigits > 0) | 3842 | while (ndigits > 0) |
3843 | { | 3843 | { |
3844 | --ndigits; | 3844 | --ndigits; |
3845 | *p++ = digits[ndigits]; | 3845 | *p++ = digits[ndigits]; |
3846 | } | 3846 | } |
3847 | } | 3847 | } |
3848 | 3848 | ||
3849 | free (digits); | 3849 | free (digits); |
3850 | } | 3850 | } |
3851 | else if (dp->conversion == 'e' || dp->conversion == 'E') | 3851 | else if (dp->conversion == 'e' || dp->conversion == 'E') |
3852 | { | 3852 | { |
3853 | int exponent; | 3853 | int exponent; |
3854 | 3854 | ||
3855 | if (arg == 0.0) | 3855 | if (arg == 0.0) |
3856 | { | 3856 | { |
3857 | exponent = 0; | 3857 | exponent = 0; |
3858 | *p++ = '0'; | 3858 | *p++ = '0'; |
3859 | if ((flags & FLAG_ALT) || precision > 0) | 3859 | if ((flags & FLAG_ALT) || precision > 0) |
3860 | { | 3860 | { |
3861 | *p++ = decimal_point_char (); | 3861 | *p++ = decimal_point_char (); |
3862 | for (; precision > 0; precision--) | 3862 | for (; precision > 0; precision--) |
3863 | *p++ = '0'; | 3863 | *p++ = '0'; |
3864 | } | 3864 | } |
3865 | } | 3865 | } |
3866 | else | 3866 | else |
3867 | { | 3867 | { |
3868 | /* arg > 0.0. */ | 3868 | /* arg > 0.0. */ |
3869 | int adjusted; | 3869 | int adjusted; |
3870 | char *digits; | 3870 | char *digits; |
3871 | size_t ndigits; | 3871 | size_t ndigits; |
3872 | 3872 | ||
3873 | exponent = floorlog10 (arg); | 3873 | exponent = floorlog10 (arg); |
3874 | adjusted = 0; | 3874 | adjusted = 0; |
3875 | for (;;) | 3875 | for (;;) |
3876 | { | 3876 | { |
3877 | digits = | 3877 | digits = |
3878 | scale10_round_decimal_double (arg, | 3878 | scale10_round_decimal_double (arg, |
3879 | (int)precision - exponent); | 3879 | (int)precision - exponent); |
3880 | if (digits == NULL) | 3880 | if (digits == NULL) |
3881 | goto out_of_memory; | 3881 | goto out_of_memory; |
3882 | ndigits = strlen (digits); | 3882 | ndigits = strlen (digits); |
3883 | 3883 | ||
3884 | if (ndigits == precision + 1) | 3884 | if (ndigits == precision + 1) |
3885 | break; | 3885 | break; |
3886 | if (ndigits < precision | 3886 | if (ndigits < precision |
3887 | || ndigits > precision + 2) | 3887 | || ndigits > precision + 2) |
3888 | /* The exponent was not guessed | 3888 | /* The exponent was not guessed |
3889 | precisely enough. */ | 3889 | precisely enough. */ |
3890 | abort (); | 3890 | abort (); |
3891 | if (adjusted) | 3891 | if (adjusted) |
3892 | /* None of two values of exponent is | 3892 | /* None of two values of exponent is |
3893 | the right one. Prevent an endless | 3893 | the right one. Prevent an endless |
3894 | loop. */ | 3894 | loop. */ |
3895 | abort (); | 3895 | abort (); |
3896 | free (digits); | 3896 | free (digits); |
3897 | if (ndigits == precision) | 3897 | if (ndigits == precision) |
3898 | exponent -= 1; | 3898 | exponent -= 1; |
3899 | else | 3899 | else |
3900 | exponent += 1; | 3900 | exponent += 1; |
3901 | adjusted = 1; | 3901 | adjusted = 1; |
3902 | } | 3902 | } |
3903 | /* Here ndigits = precision+1. */ | 3903 | /* Here ndigits = precision+1. */ |
3904 | if (is_borderline (digits, precision)) | 3904 | if (is_borderline (digits, precision)) |
3905 | { | 3905 | { |
3906 | /* Maybe the exponent guess was too high | 3906 | /* Maybe the exponent guess was too high |
3907 | and a smaller exponent can be reached | 3907 | and a smaller exponent can be reached |
3908 | by turning a 10...0 into 9...9x. */ | 3908 | by turning a 10...0 into 9...9x. */ |
3909 | char *digits2 = | 3909 | char *digits2 = |
3910 | scale10_round_decimal_double (arg, | 3910 | scale10_round_decimal_double (arg, |
3911 | (int)precision - exponent + 1); | 3911 | (int)precision - exponent + 1); |
3912 | if (digits2 == NULL) | 3912 | if (digits2 == NULL) |
3913 | { | 3913 | { |
3914 | free (digits); | 3914 | free (digits); |
3915 | goto out_of_memory; | 3915 | goto out_of_memory; |
3916 | } | 3916 | } |
3917 | if (strlen (digits2) == precision + 1) | 3917 | if (strlen (digits2) == precision + 1) |
3918 | { | 3918 | { |
3919 | free (digits); | 3919 | free (digits); |
3920 | digits = digits2; | 3920 | digits = digits2; |
3921 | exponent -= 1; | 3921 | exponent -= 1; |
3922 | } | 3922 | } |
3923 | else | 3923 | else |
3924 | free (digits2); | 3924 | free (digits2); |
3925 | } | 3925 | } |
3926 | /* Here ndigits = precision+1. */ | 3926 | /* Here ndigits = precision+1. */ |
3927 | 3927 | ||
3928 | *p++ = digits[--ndigits]; | 3928 | *p++ = digits[--ndigits]; |
3929 | if ((flags & FLAG_ALT) || precision > 0) | 3929 | if ((flags & FLAG_ALT) || precision > 0) |
3930 | { | 3930 | { |
3931 | *p++ = decimal_point_char (); | 3931 | *p++ = decimal_point_char (); |
3932 | while (ndigits > 0) | 3932 | while (ndigits > 0) |
3933 | { | 3933 | { |
3934 | --ndigits; | 3934 | --ndigits; |
3935 | *p++ = digits[ndigits]; | 3935 | *p++ = digits[ndigits]; |
3936 | } | 3936 | } |
3937 | } | 3937 | } |
3938 | 3938 | ||
3939 | free (digits); | 3939 | free (digits); |
3940 | } | 3940 | } |
3941 | 3941 | ||
3942 | *p++ = dp->conversion; /* 'e' or 'E' */ | 3942 | *p++ = dp->conversion; /* 'e' or 'E' */ |
3943 | # if WIDE_CHAR_VERSION | 3943 | # if WIDE_CHAR_VERSION |
3944 | { | 3944 | { |
3945 | static const wchar_t decimal_format[] = | 3945 | static const wchar_t decimal_format[] = |
3946 | /* Produce the same number of exponent digits | 3946 | /* Produce the same number of exponent digits |
3947 | as the native printf implementation. */ | 3947 | as the native printf implementation. */ |
3948 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 3948 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
3949 | { '%', '+', '.', '3', 'd', '\0' }; | 3949 | { '%', '+', '.', '3', 'd', '\0' }; |
3950 | # else | 3950 | # else |
3951 | { '%', '+', '.', '2', 'd', '\0' }; | 3951 | { '%', '+', '.', '2', 'd', '\0' }; |
3952 | # endif | 3952 | # endif |
3953 | SNPRINTF (p, 6 + 1, decimal_format, exponent); | 3953 | SNPRINTF (p, 6 + 1, decimal_format, exponent); |
3954 | } | 3954 | } |
3955 | while (*p != '\0') | 3955 | while (*p != '\0') |
3956 | p++; | 3956 | p++; |
3957 | # else | 3957 | # else |
3958 | { | 3958 | { |
3959 | static const char decimal_format[] = | 3959 | static const char decimal_format[] = |
3960 | /* Produce the same number of exponent digits | 3960 | /* Produce the same number of exponent digits |
3961 | as the native printf implementation. */ | 3961 | as the native printf implementation. */ |
3962 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 3962 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
3963 | "%+.3d"; | 3963 | "%+.3d"; |
3964 | # else | 3964 | # else |
3965 | "%+.2d"; | 3965 | "%+.2d"; |
3966 | # endif | 3966 | # endif |
3967 | if (sizeof (DCHAR_T) == 1) | 3967 | if (sizeof (DCHAR_T) == 1) |
3968 | { | 3968 | { |
3969 | sprintf ((char *) p, decimal_format, exponent); | 3969 | sprintf ((char *) p, decimal_format, exponent); |
3970 | while (*p != '\0') | 3970 | while (*p != '\0') |
3971 | p++; | 3971 | p++; |
3972 | } | 3972 | } |
3973 | else | 3973 | else |
3974 | { | 3974 | { |
3975 | char expbuf[6 + 1]; | 3975 | char expbuf[6 + 1]; |
3976 | const char *ep; | 3976 | const char *ep; |
3977 | sprintf (expbuf, decimal_format, exponent); | 3977 | sprintf (expbuf, decimal_format, exponent); |
3978 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) | 3978 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) |
3979 | p++; | 3979 | p++; |
3980 | } | 3980 | } |
3981 | } | 3981 | } |
3982 | # endif | 3982 | # endif |
3983 | } | 3983 | } |
3984 | else if (dp->conversion == 'g' || dp->conversion == 'G') | 3984 | else if (dp->conversion == 'g' || dp->conversion == 'G') |
3985 | { | 3985 | { |
3986 | if (precision == 0) | 3986 | if (precision == 0) |
3987 | precision = 1; | 3987 | precision = 1; |
3988 | /* precision >= 1. */ | 3988 | /* precision >= 1. */ |
3989 | 3989 | ||
3990 | if (arg == 0.0) | 3990 | if (arg == 0.0) |
3991 | /* The exponent is 0, >= -4, < precision. | 3991 | /* The exponent is 0, >= -4, < precision. |
3992 | Use fixed-point notation. */ | 3992 | Use fixed-point notation. */ |
3993 | { | 3993 | { |
3994 | size_t ndigits = precision; | 3994 | size_t ndigits = precision; |
3995 | /* Number of trailing zeroes that have to be | 3995 | /* Number of trailing zeroes that have to be |
3996 | dropped. */ | 3996 | dropped. */ |
3997 | size_t nzeroes = | 3997 | size_t nzeroes = |
3998 | (flags & FLAG_ALT ? 0 : precision - 1); | 3998 | (flags & FLAG_ALT ? 0 : precision - 1); |
3999 | 3999 | ||
4000 | --ndigits; | 4000 | --ndigits; |
4001 | *p++ = '0'; | 4001 | *p++ = '0'; |
4002 | if ((flags & FLAG_ALT) || ndigits > nzeroes) | 4002 | if ((flags & FLAG_ALT) || ndigits > nzeroes) |
4003 | { | 4003 | { |
4004 | *p++ = decimal_point_char (); | 4004 | *p++ = decimal_point_char (); |
4005 | while (ndigits > nzeroes) | 4005 | while (ndigits > nzeroes) |
4006 | { | 4006 | { |
4007 | --ndigits; | 4007 | --ndigits; |
4008 | *p++ = '0'; | 4008 | *p++ = '0'; |
4009 | } | 4009 | } |
4010 | } | 4010 | } |
4011 | } | 4011 | } |
4012 | else | 4012 | else |
4013 | { | 4013 | { |
4014 | /* arg > 0.0. */ | 4014 | /* arg > 0.0. */ |
4015 | int exponent; | 4015 | int exponent; |
4016 | int adjusted; | 4016 | int adjusted; |
4017 | char *digits; | 4017 | char *digits; |
4018 | size_t ndigits; | 4018 | size_t ndigits; |
4019 | size_t nzeroes; | 4019 | size_t nzeroes; |
4020 | 4020 | ||
4021 | exponent = floorlog10 (arg); | 4021 | exponent = floorlog10 (arg); |
4022 | adjusted = 0; | 4022 | adjusted = 0; |
4023 | for (;;) | 4023 | for (;;) |
4024 | { | 4024 | { |
4025 | digits = | 4025 | digits = |
4026 | scale10_round_decimal_double (arg, | 4026 | scale10_round_decimal_double (arg, |
4027 | (int)(precision - 1) - exponent); | 4027 | (int)(precision - 1) - exponent); |
4028 | if (digits == NULL) | 4028 | if (digits == NULL) |
4029 | goto out_of_memory; | 4029 | goto out_of_memory; |
4030 | ndigits = strlen (digits); | 4030 | ndigits = strlen (digits); |
4031 | 4031 | ||
4032 | if (ndigits == precision) | 4032 | if (ndigits == precision) |
4033 | break; | 4033 | break; |
4034 | if (ndigits < precision - 1 | 4034 | if (ndigits < precision - 1 |
4035 | || ndigits > precision + 1) | 4035 | || ndigits > precision + 1) |
4036 | /* The exponent was not guessed | 4036 | /* The exponent was not guessed |
4037 | precisely enough. */ | 4037 | precisely enough. */ |
4038 | abort (); | 4038 | abort (); |
4039 | if (adjusted) | 4039 | if (adjusted) |
4040 | /* None of two values of exponent is | 4040 | /* None of two values of exponent is |
4041 | the right one. Prevent an endless | 4041 | the right one. Prevent an endless |
4042 | loop. */ | 4042 | loop. */ |
4043 | abort (); | 4043 | abort (); |
4044 | free (digits); | 4044 | free (digits); |
4045 | if (ndigits < precision) | 4045 | if (ndigits < precision) |
4046 | exponent -= 1; | 4046 | exponent -= 1; |
4047 | else | 4047 | else |
4048 | exponent += 1; | 4048 | exponent += 1; |
4049 | adjusted = 1; | 4049 | adjusted = 1; |
4050 | } | 4050 | } |
4051 | /* Here ndigits = precision. */ | 4051 | /* Here ndigits = precision. */ |
4052 | if (is_borderline (digits, precision - 1)) | 4052 | if (is_borderline (digits, precision - 1)) |
4053 | { | 4053 | { |
4054 | /* Maybe the exponent guess was too high | 4054 | /* Maybe the exponent guess was too high |
4055 | and a smaller exponent can be reached | 4055 | and a smaller exponent can be reached |
4056 | by turning a 10...0 into 9...9x. */ | 4056 | by turning a 10...0 into 9...9x. */ |
4057 | char *digits2 = | 4057 | char *digits2 = |
4058 | scale10_round_decimal_double (arg, | 4058 | scale10_round_decimal_double (arg, |
4059 | (int)(precision - 1) - exponent + 1); | 4059 | (int)(precision - 1) - exponent + 1); |
4060 | if (digits2 == NULL) | 4060 | if (digits2 == NULL) |
4061 | { | 4061 | { |
4062 | free (digits); | 4062 | free (digits); |
4063 | goto out_of_memory; | 4063 | goto out_of_memory; |
4064 | } | 4064 | } |
4065 | if (strlen (digits2) == precision) | 4065 | if (strlen (digits2) == precision) |
4066 | { | 4066 | { |
4067 | free (digits); | 4067 | free (digits); |
4068 | digits = digits2; | 4068 | digits = digits2; |
4069 | exponent -= 1; | 4069 | exponent -= 1; |
4070 | } | 4070 | } |
4071 | else | 4071 | else |
4072 | free (digits2); | 4072 | free (digits2); |
4073 | } | 4073 | } |
4074 | /* Here ndigits = precision. */ | 4074 | /* Here ndigits = precision. */ |
4075 | 4075 | ||
4076 | /* Determine the number of trailing zeroes | 4076 | /* Determine the number of trailing zeroes |
4077 | that have to be dropped. */ | 4077 | that have to be dropped. */ |
4078 | nzeroes = 0; | 4078 | nzeroes = 0; |
4079 | if ((flags & FLAG_ALT) == 0) | 4079 | if ((flags & FLAG_ALT) == 0) |
4080 | while (nzeroes < ndigits | 4080 | while (nzeroes < ndigits |
4081 | && digits[nzeroes] == '0') | 4081 | && digits[nzeroes] == '0') |
4082 | nzeroes++; | 4082 | nzeroes++; |
4083 | 4083 | ||
4084 | /* The exponent is now determined. */ | 4084 | /* The exponent is now determined. */ |
4085 | if (exponent >= -4 | 4085 | if (exponent >= -4 |
4086 | && exponent < (long)precision) | 4086 | && exponent < (long)precision) |
4087 | { | 4087 | { |
4088 | /* Fixed-point notation: | 4088 | /* Fixed-point notation: |
4089 | max(exponent,0)+1 digits, then the | 4089 | max(exponent,0)+1 digits, then the |
4090 | decimal point, then the remaining | 4090 | decimal point, then the remaining |
4091 | digits without trailing zeroes. */ | 4091 | digits without trailing zeroes. */ |
4092 | if (exponent >= 0) | 4092 | if (exponent >= 0) |
4093 | { | 4093 | { |
4094 | size_t count = exponent + 1; | 4094 | size_t count = exponent + 1; |
4095 | /* Note: count <= precision = ndigits. */ | 4095 | /* Note: count <= precision = ndigits. */ |
4096 | for (; count > 0; count--) | 4096 | for (; count > 0; count--) |
4097 | *p++ = digits[--ndigits]; | 4097 | *p++ = digits[--ndigits]; |
4098 | if ((flags & FLAG_ALT) || ndigits > nzeroes) | 4098 | if ((flags & FLAG_ALT) || ndigits > nzeroes) |
4099 | { | 4099 | { |
4100 | *p++ = decimal_point_char (); | 4100 | *p++ = decimal_point_char (); |
4101 | while (ndigits > nzeroes) | 4101 | while (ndigits > nzeroes) |
4102 | { | 4102 | { |
4103 | --ndigits; | 4103 | --ndigits; |
4104 | *p++ = digits[ndigits]; | 4104 | *p++ = digits[ndigits]; |
4105 | } | 4105 | } |
4106 | } | 4106 | } |
4107 | } | 4107 | } |
4108 | else | 4108 | else |
4109 | { | 4109 | { |
4110 | size_t count = -exponent - 1; | 4110 | size_t count = -exponent - 1; |
4111 | *p++ = '0'; | 4111 | *p++ = '0'; |
4112 | *p++ = decimal_point_char (); | 4112 | *p++ = decimal_point_char (); |
4113 | for (; count > 0; count--) | 4113 | for (; count > 0; count--) |
4114 | *p++ = '0'; | 4114 | *p++ = '0'; |
4115 | while (ndigits > nzeroes) | 4115 | while (ndigits > nzeroes) |
4116 | { | 4116 | { |
4117 | --ndigits; | 4117 | --ndigits; |
4118 | *p++ = digits[ndigits]; | 4118 | *p++ = digits[ndigits]; |
4119 | } | 4119 | } |
4120 | } | 4120 | } |
4121 | } | 4121 | } |
4122 | else | 4122 | else |
4123 | { | 4123 | { |
4124 | /* Exponential notation. */ | 4124 | /* Exponential notation. */ |
4125 | *p++ = digits[--ndigits]; | 4125 | *p++ = digits[--ndigits]; |
4126 | if ((flags & FLAG_ALT) || ndigits > nzeroes) | 4126 | if ((flags & FLAG_ALT) || ndigits > nzeroes) |
4127 | { | 4127 | { |
4128 | *p++ = decimal_point_char (); | 4128 | *p++ = decimal_point_char (); |
4129 | while (ndigits > nzeroes) | 4129 | while (ndigits > nzeroes) |
4130 | { | 4130 | { |
4131 | --ndigits; | 4131 | --ndigits; |
4132 | *p++ = digits[ndigits]; | 4132 | *p++ = digits[ndigits]; |
4133 | } | 4133 | } |
4134 | } | 4134 | } |
4135 | *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ | 4135 | *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ |
4136 | # if WIDE_CHAR_VERSION | 4136 | # if WIDE_CHAR_VERSION |
4137 | { | 4137 | { |
4138 | static const wchar_t decimal_format[] = | 4138 | static const wchar_t decimal_format[] = |
4139 | /* Produce the same number of exponent digits | 4139 | /* Produce the same number of exponent digits |
4140 | as the native printf implementation. */ | 4140 | as the native printf implementation. */ |
4141 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 4141 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
4142 | { '%', '+', '.', '3', 'd', '\0' }; | 4142 | { '%', '+', '.', '3', 'd', '\0' }; |
4143 | # else | 4143 | # else |
4144 | { '%', '+', '.', '2', 'd', '\0' }; | 4144 | { '%', '+', '.', '2', 'd', '\0' }; |
4145 | # endif | 4145 | # endif |
4146 | SNPRINTF (p, 6 + 1, decimal_format, exponent); | 4146 | SNPRINTF (p, 6 + 1, decimal_format, exponent); |
4147 | } | 4147 | } |
4148 | while (*p != '\0') | 4148 | while (*p != '\0') |
4149 | p++; | 4149 | p++; |
4150 | # else | 4150 | # else |
4151 | { | 4151 | { |
4152 | static const char decimal_format[] = | 4152 | static const char decimal_format[] = |
4153 | /* Produce the same number of exponent digits | 4153 | /* Produce the same number of exponent digits |
4154 | as the native printf implementation. */ | 4154 | as the native printf implementation. */ |
4155 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 4155 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
4156 | "%+.3d"; | 4156 | "%+.3d"; |
4157 | # else | 4157 | # else |
4158 | "%+.2d"; | 4158 | "%+.2d"; |
4159 | # endif | 4159 | # endif |
4160 | if (sizeof (DCHAR_T) == 1) | 4160 | if (sizeof (DCHAR_T) == 1) |
4161 | { | 4161 | { |
4162 | sprintf ((char *) p, decimal_format, exponent); | 4162 | sprintf ((char *) p, decimal_format, exponent); |
4163 | while (*p != '\0') | 4163 | while (*p != '\0') |
4164 | p++; | 4164 | p++; |
4165 | } | 4165 | } |
4166 | else | 4166 | else |
4167 | { | 4167 | { |
4168 | char expbuf[6 + 1]; | 4168 | char expbuf[6 + 1]; |
4169 | const char *ep; | 4169 | const char *ep; |
4170 | sprintf (expbuf, decimal_format, exponent); | 4170 | sprintf (expbuf, decimal_format, exponent); |
4171 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) | 4171 | for (ep = expbuf; (*p = *ep) != '\0'; ep++) |
4172 | p++; | 4172 | p++; |
4173 | } | 4173 | } |
4174 | } | 4174 | } |
4175 | # endif | 4175 | # endif |
4176 | } | 4176 | } |
4177 | 4177 | ||
4178 | free (digits); | 4178 | free (digits); |
4179 | } | 4179 | } |
4180 | } | 4180 | } |
4181 | else | 4181 | else |
4182 | abort (); | 4182 | abort (); |
4183 | # else | 4183 | # else |
4184 | /* arg is finite. */ | 4184 | /* arg is finite. */ |
4185 | if (!(arg == 0.0)) | 4185 | if (!(arg == 0.0)) |
4186 | abort (); | 4186 | abort (); |
4187 | 4187 | ||
4188 | pad_ptr = p; | 4188 | pad_ptr = p; |
4189 | 4189 | ||
4190 | if (dp->conversion == 'f' || dp->conversion == 'F') | 4190 | if (dp->conversion == 'f' || dp->conversion == 'F') |
4191 | { | 4191 | { |
4192 | *p++ = '0'; | 4192 | *p++ = '0'; |
4193 | if ((flags & FLAG_ALT) || precision > 0) | 4193 | if ((flags & FLAG_ALT) || precision > 0) |
4194 | { | 4194 | { |
4195 | *p++ = decimal_point_char (); | 4195 | *p++ = decimal_point_char (); |
4196 | for (; precision > 0; precision--) | 4196 | for (; precision > 0; precision--) |
4197 | *p++ = '0'; | 4197 | *p++ = '0'; |
4198 | } | 4198 | } |
4199 | } | 4199 | } |
4200 | else if (dp->conversion == 'e' || dp->conversion == 'E') | 4200 | else if (dp->conversion == 'e' || dp->conversion == 'E') |
4201 | { | 4201 | { |
4202 | *p++ = '0'; | 4202 | *p++ = '0'; |
4203 | if ((flags & FLAG_ALT) || precision > 0) | 4203 | if ((flags & FLAG_ALT) || precision > 0) |
4204 | { | 4204 | { |
4205 | *p++ = decimal_point_char (); | 4205 | *p++ = decimal_point_char (); |
4206 | for (; precision > 0; precision--) | 4206 | for (; precision > 0; precision--) |
4207 | *p++ = '0'; | 4207 | *p++ = '0'; |
4208 | } | 4208 | } |
4209 | *p++ = dp->conversion; /* 'e' or 'E' */ | 4209 | *p++ = dp->conversion; /* 'e' or 'E' */ |
4210 | *p++ = '+'; | 4210 | *p++ = '+'; |
4211 | /* Produce the same number of exponent digits as | 4211 | /* Produce the same number of exponent digits as |
4212 | the native printf implementation. */ | 4212 | the native printf implementation. */ |
4213 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 4213 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
4214 | *p++ = '0'; | 4214 | *p++ = '0'; |
4215 | # endif | 4215 | # endif |
4216 | *p++ = '0'; | 4216 | *p++ = '0'; |
4217 | *p++ = '0'; | 4217 | *p++ = '0'; |
4218 | } | 4218 | } |
4219 | else if (dp->conversion == 'g' || dp->conversion == 'G') | 4219 | else if (dp->conversion == 'g' || dp->conversion == 'G') |
4220 | { | 4220 | { |
4221 | *p++ = '0'; | 4221 | *p++ = '0'; |
4222 | if (flags & FLAG_ALT) | 4222 | if (flags & FLAG_ALT) |
4223 | { | 4223 | { |
4224 | size_t ndigits = | 4224 | size_t ndigits = |
4225 | (precision > 0 ? precision - 1 : 0); | 4225 | (precision > 0 ? precision - 1 : 0); |
4226 | *p++ = decimal_point_char (); | 4226 | *p++ = decimal_point_char (); |
4227 | for (; ndigits > 0; --ndigits) | 4227 | for (; ndigits > 0; --ndigits) |
4228 | *p++ = '0'; | 4228 | *p++ = '0'; |
4229 | } | 4229 | } |
4230 | } | 4230 | } |
4231 | else | 4231 | else |
4232 | abort (); | 4232 | abort (); |
4233 | # endif | 4233 | # endif |
4234 | } | 4234 | } |
4235 | } | 4235 | } |
4236 | } | 4236 | } |
4237 | # endif | 4237 | # endif |
4238 | 4238 | ||
4239 | /* The generated string now extends from tmp to p, with the | 4239 | /* The generated string now extends from tmp to p, with the |
4240 | zero padding insertion point being at pad_ptr. */ | 4240 | zero padding insertion point being at pad_ptr. */ |
4241 | if (has_width && p - tmp < width) | 4241 | if (has_width && p - tmp < width) |
4242 | { | 4242 | { |
4243 | size_t pad = width - (p - tmp); | 4243 | size_t pad = width - (p - tmp); |
4244 | DCHAR_T *end = p + pad; | 4244 | DCHAR_T *end = p + pad; |
4245 | 4245 | ||
4246 | if (flags & FLAG_LEFT) | 4246 | if (flags & FLAG_LEFT) |
4247 | { | 4247 | { |
4248 | /* Pad with spaces on the right. */ | 4248 | /* Pad with spaces on the right. */ |
4249 | for (; pad > 0; pad--) | 4249 | for (; pad > 0; pad--) |
4250 | *p++ = ' '; | 4250 | *p++ = ' '; |
4251 | } | 4251 | } |
4252 | else if ((flags & FLAG_ZERO) && pad_ptr != NULL) | 4252 | else if ((flags & FLAG_ZERO) && pad_ptr != NULL) |
4253 | { | 4253 | { |
4254 | /* Pad with zeroes. */ | 4254 | /* Pad with zeroes. */ |
4255 | DCHAR_T *q = end; | 4255 | DCHAR_T *q = end; |
4256 | 4256 | ||
4257 | while (p > pad_ptr) | 4257 | while (p > pad_ptr) |
4258 | *--q = *--p; | 4258 | *--q = *--p; |
4259 | for (; pad > 0; pad--) | 4259 | for (; pad > 0; pad--) |
4260 | *p++ = '0'; | 4260 | *p++ = '0'; |
4261 | } | 4261 | } |
4262 | else | 4262 | else |
4263 | { | 4263 | { |
4264 | /* Pad with spaces on the left. */ | 4264 | /* Pad with spaces on the left. */ |
4265 | DCHAR_T *q = end; | 4265 | DCHAR_T *q = end; |
4266 | 4266 | ||
4267 | while (p > tmp) | 4267 | while (p > tmp) |
4268 | *--q = *--p; | 4268 | *--q = *--p; |
4269 | for (; pad > 0; pad--) | 4269 | for (; pad > 0; pad--) |
4270 | *p++ = ' '; | 4270 | *p++ = ' '; |
4271 | } | 4271 | } |
4272 | 4272 | ||
4273 | p = end; | 4273 | p = end; |
4274 | } | 4274 | } |
4275 | 4275 | ||
4276 | { | 4276 | { |
4277 | size_t count = p - tmp; | 4277 | size_t count = p - tmp; |
4278 | 4278 | ||
4279 | if (count >= tmp_length) | 4279 | if (count >= tmp_length) |
4280 | /* tmp_length was incorrectly calculated - fix the | 4280 | /* tmp_length was incorrectly calculated - fix the |
4281 | code above! */ | 4281 | code above! */ |
4282 | abort (); | 4282 | abort (); |
4283 | 4283 | ||
4284 | /* Make room for the result. */ | 4284 | /* Make room for the result. */ |
4285 | if (count >= allocated - length) | 4285 | if (count >= allocated - length) |
4286 | { | 4286 | { |
4287 | size_t n = xsum (length, count); | 4287 | size_t n = xsum (length, count); |
4288 | 4288 | ||
4289 | ENSURE_ALLOCATION (n); | 4289 | ENSURE_ALLOCATION (n); |
4290 | } | 4290 | } |
4291 | 4291 | ||
4292 | /* Append the result. */ | 4292 | /* Append the result. */ |
4293 | memcpy (result + length, tmp, count * sizeof (DCHAR_T)); | 4293 | memcpy (result + length, tmp, count * sizeof (DCHAR_T)); |
4294 | if (tmp != tmpbuf) | 4294 | if (tmp != tmpbuf) |
4295 | free (tmp); | 4295 | free (tmp); |
4296 | length += count; | 4296 | length += count; |
4297 | } | 4297 | } |
4298 | } | 4298 | } |
4299 | #endif | 4299 | #endif |
4300 | else | 4300 | else |
4301 | { | 4301 | { |
4302 | arg_type type = a.arg[dp->arg_index].type; | 4302 | arg_type type = a.arg[dp->arg_index].type; |
4303 | int flags = dp->flags; | 4303 | int flags = dp->flags; |
4304 | #if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION | 4304 | #if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION |
4305 | int has_width; | 4305 | int has_width; |
4306 | size_t width; | 4306 | size_t width; |
4307 | #endif | 4307 | #endif |
4308 | #if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION | 4308 | #if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION |
4309 | int has_precision; | 4309 | int has_precision; |
4310 | size_t precision; | 4310 | size_t precision; |
4311 | #endif | 4311 | #endif |
4312 | #if NEED_PRINTF_UNBOUNDED_PRECISION | 4312 | #if NEED_PRINTF_UNBOUNDED_PRECISION |
4313 | int prec_ourselves; | 4313 | int prec_ourselves; |
4314 | #else | 4314 | #else |
4315 | # define prec_ourselves 0 | 4315 | # define prec_ourselves 0 |
4316 | #endif | 4316 | #endif |
4317 | #if NEED_PRINTF_FLAG_LEFTADJUST | 4317 | #if NEED_PRINTF_FLAG_LEFTADJUST |
4318 | # define pad_ourselves 1 | 4318 | # define pad_ourselves 1 |
4319 | #elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION | 4319 | #elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION |
4320 | int pad_ourselves; | 4320 | int pad_ourselves; |
4321 | #else | 4321 | #else |
4322 | # define pad_ourselves 0 | 4322 | # define pad_ourselves 0 |
4323 | #endif | 4323 | #endif |
4324 | TCHAR_T *fbp; | 4324 | TCHAR_T *fbp; |
4325 | unsigned int prefix_count; | 4325 | unsigned int prefix_count; |
4326 | int prefixes[2] IF_LINT (= { 0 }); | 4326 | int prefixes[2] IF_LINT (= { 0 }); |
4327 | #if !USE_SNPRINTF | 4327 | #if !USE_SNPRINTF |
4328 | size_t tmp_length; | 4328 | size_t tmp_length; |
4329 | TCHAR_T tmpbuf[700]; | 4329 | TCHAR_T tmpbuf[700]; |
4330 | TCHAR_T *tmp; | 4330 | TCHAR_T *tmp; |
4331 | #endif | 4331 | #endif |
4332 | 4332 | ||
4333 | #if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION | 4333 | #if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION |
4334 | has_width = 0; | 4334 | has_width = 0; |
4335 | width = 0; | 4335 | width = 0; |
4336 | if (dp->width_start != dp->width_end) | 4336 | if (dp->width_start != dp->width_end) |
4337 | { | 4337 | { |
4338 | if (dp->width_arg_index != ARG_NONE) | 4338 | if (dp->width_arg_index != ARG_NONE) |
4339 | { | 4339 | { |
4340 | int arg; | 4340 | int arg; |
4341 | 4341 | ||
4342 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | 4342 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
4343 | abort (); | 4343 | abort (); |
4344 | arg = a.arg[dp->width_arg_index].a.a_int; | 4344 | arg = a.arg[dp->width_arg_index].a.a_int; |
4345 | if (arg < 0) | 4345 | if (arg < 0) |
4346 | { | 4346 | { |
4347 | /* "A negative field width is taken as a '-' flag | 4347 | /* "A negative field width is taken as a '-' flag |
4348 | followed by a positive field width." */ | 4348 | followed by a positive field width." */ |
4349 | flags |= FLAG_LEFT; | 4349 | flags |= FLAG_LEFT; |
4350 | width = (unsigned int) (-arg); | 4350 | width = (unsigned int) (-arg); |
4351 | } | 4351 | } |
4352 | else | 4352 | else |
4353 | width = arg; | 4353 | width = arg; |
4354 | } | 4354 | } |
4355 | else | 4355 | else |
4356 | { | 4356 | { |
4357 | const FCHAR_T *digitp = dp->width_start; | 4357 | const FCHAR_T *digitp = dp->width_start; |
4358 | 4358 | ||
4359 | do | 4359 | do |
4360 | width = xsum (xtimes (width, 10), *digitp++ - '0'); | 4360 | width = xsum (xtimes (width, 10), *digitp++ - '0'); |
4361 | while (digitp != dp->width_end); | 4361 | while (digitp != dp->width_end); |
4362 | } | 4362 | } |
4363 | has_width = 1; | 4363 | has_width = 1; |
4364 | } | 4364 | } |
4365 | #endif | 4365 | #endif |
4366 | 4366 | ||
4367 | #if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION | 4367 | #if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION |
4368 | has_precision = 0; | 4368 | has_precision = 0; |
4369 | precision = 6; | 4369 | precision = 6; |
4370 | if (dp->precision_start != dp->precision_end) | 4370 | if (dp->precision_start != dp->precision_end) |
4371 | { | 4371 | { |
4372 | if (dp->precision_arg_index != ARG_NONE) | 4372 | if (dp->precision_arg_index != ARG_NONE) |
4373 | { | 4373 | { |
4374 | int arg; | 4374 | int arg; |
4375 | 4375 | ||
4376 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | 4376 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
4377 | abort (); | 4377 | abort (); |
4378 | arg = a.arg[dp->precision_arg_index].a.a_int; | 4378 | arg = a.arg[dp->precision_arg_index].a.a_int; |
4379 | /* "A negative precision is taken as if the precision | 4379 | /* "A negative precision is taken as if the precision |
4380 | were omitted." */ | 4380 | were omitted." */ |
4381 | if (arg >= 0) | 4381 | if (arg >= 0) |
4382 | { | 4382 | { |
4383 | precision = arg; | 4383 | precision = arg; |
4384 | has_precision = 1; | 4384 | has_precision = 1; |
4385 | } | 4385 | } |
4386 | } | 4386 | } |
4387 | else | 4387 | else |
4388 | { | 4388 | { |
4389 | const FCHAR_T *digitp = dp->precision_start + 1; | 4389 | const FCHAR_T *digitp = dp->precision_start + 1; |
4390 | 4390 | ||
4391 | precision = 0; | 4391 | precision = 0; |
4392 | while (digitp != dp->precision_end) | 4392 | while (digitp != dp->precision_end) |
4393 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); | 4393 | precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
4394 | has_precision = 1; | 4394 | has_precision = 1; |
4395 | } | 4395 | } |
4396 | } | 4396 | } |
4397 | #endif | 4397 | #endif |
4398 | 4398 | ||
4399 | /* Decide whether to handle the precision ourselves. */ | 4399 | /* Decide whether to handle the precision ourselves. */ |
4400 | #if NEED_PRINTF_UNBOUNDED_PRECISION | 4400 | #if NEED_PRINTF_UNBOUNDED_PRECISION |
4401 | switch (dp->conversion) | 4401 | switch (dp->conversion) |
4402 | { | 4402 | { |
4403 | case 'd': case 'i': case 'u': | 4403 | case 'd': case 'i': case 'u': |
4404 | case 'o': | 4404 | case 'o': |
4405 | case 'x': case 'X': case 'p': | 4405 | case 'x': case 'X': case 'p': |
4406 | prec_ourselves = has_precision && (precision > 0); | 4406 | prec_ourselves = has_precision && (precision > 0); |
4407 | break; | 4407 | break; |
4408 | default: | 4408 | default: |
4409 | prec_ourselves = 0; | 4409 | prec_ourselves = 0; |
4410 | break; | 4410 | break; |
4411 | } | 4411 | } |
4412 | #endif | 4412 | #endif |
4413 | 4413 | ||
4414 | /* Decide whether to perform the padding ourselves. */ | 4414 | /* Decide whether to perform the padding ourselves. */ |
4415 | #if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION) | 4415 | #if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION) |
4416 | switch (dp->conversion) | 4416 | switch (dp->conversion) |
4417 | { | 4417 | { |
4418 | # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO | 4418 | # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO |
4419 | /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need | 4419 | /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need |
4420 | to perform the padding after this conversion. Functions | 4420 | to perform the padding after this conversion. Functions |
4421 | with unistdio extensions perform the padding based on | 4421 | with unistdio extensions perform the padding based on |
4422 | character count rather than element count. */ | 4422 | character count rather than element count. */ |
4423 | case 'c': case 's': | 4423 | case 'c': case 's': |
4424 | # endif | 4424 | # endif |
4425 | # if NEED_PRINTF_FLAG_ZERO | 4425 | # if NEED_PRINTF_FLAG_ZERO |
4426 | case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': | 4426 | case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': |
4427 | case 'a': case 'A': | 4427 | case 'a': case 'A': |
4428 | # endif | 4428 | # endif |
4429 | pad_ourselves = 1; | 4429 | pad_ourselves = 1; |
4430 | break; | 4430 | break; |
4431 | default: | 4431 | default: |
4432 | pad_ourselves = prec_ourselves; | 4432 | pad_ourselves = prec_ourselves; |
4433 | break; | 4433 | break; |
4434 | } | 4434 | } |
4435 | #endif | 4435 | #endif |
4436 | 4436 | ||
4437 | #if !USE_SNPRINTF | 4437 | #if !USE_SNPRINTF |
4438 | /* Allocate a temporary buffer of sufficient size for calling | 4438 | /* Allocate a temporary buffer of sufficient size for calling |
4439 | sprintf. */ | 4439 | sprintf. */ |
4440 | { | 4440 | { |
4441 | switch (dp->conversion) | 4441 | switch (dp->conversion) |
4442 | { | 4442 | { |
4443 | 4443 | ||
4444 | case 'd': case 'i': case 'u': | 4444 | case 'd': case 'i': case 'u': |
4445 | # if HAVE_LONG_LONG_INT | 4445 | # if HAVE_LONG_LONG_INT |
4446 | if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | 4446 | if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
4447 | tmp_length = | 4447 | tmp_length = |
4448 | (unsigned int) (sizeof (unsigned long long) * CHAR_BIT | 4448 | (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
4449 | * 0.30103 /* binary -> decimal */ | 4449 | * 0.30103 /* binary -> decimal */ |
4450 | ) | 4450 | ) |
4451 | + 1; /* turn floor into ceil */ | 4451 | + 1; /* turn floor into ceil */ |
4452 | else | 4452 | else |
4453 | # endif | 4453 | # endif |
4454 | if (type == TYPE_LONGINT || type == TYPE_ULONGINT) | 4454 | if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
4455 | tmp_length = | 4455 | tmp_length = |
4456 | (unsigned int) (sizeof (unsigned long) * CHAR_BIT | 4456 | (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
4457 | * 0.30103 /* binary -> decimal */ | 4457 | * 0.30103 /* binary -> decimal */ |
4458 | ) | 4458 | ) |
4459 | + 1; /* turn floor into ceil */ | 4459 | + 1; /* turn floor into ceil */ |
4460 | else | 4460 | else |
4461 | tmp_length = | 4461 | tmp_length = |
4462 | (unsigned int) (sizeof (unsigned int) * CHAR_BIT | 4462 | (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
4463 | * 0.30103 /* binary -> decimal */ | 4463 | * 0.30103 /* binary -> decimal */ |
4464 | ) | 4464 | ) |
4465 | + 1; /* turn floor into ceil */ | 4465 | + 1; /* turn floor into ceil */ |
4466 | if (tmp_length < precision) | 4466 | if (tmp_length < precision) |
4467 | tmp_length = precision; | 4467 | tmp_length = precision; |
4468 | /* Multiply by 2, as an estimate for FLAG_GROUP. */ | 4468 | /* Multiply by 2, as an estimate for FLAG_GROUP. */ |
4469 | tmp_length = xsum (tmp_length, tmp_length); | 4469 | tmp_length = xsum (tmp_length, tmp_length); |
4470 | /* Add 1, to account for a leading sign. */ | 4470 | /* Add 1, to account for a leading sign. */ |
4471 | tmp_length = xsum (tmp_length, 1); | 4471 | tmp_length = xsum (tmp_length, 1); |
4472 | break; | 4472 | break; |
4473 | 4473 | ||
4474 | case 'o': | 4474 | case 'o': |
4475 | # if HAVE_LONG_LONG_INT | 4475 | # if HAVE_LONG_LONG_INT |
4476 | if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | 4476 | if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
4477 | tmp_length = | 4477 | tmp_length = |
4478 | (unsigned int) (sizeof (unsigned long long) * CHAR_BIT | 4478 | (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
4479 | * 0.333334 /* binary -> octal */ | 4479 | * 0.333334 /* binary -> octal */ |
4480 | ) | 4480 | ) |
4481 | + 1; /* turn floor into ceil */ | 4481 | + 1; /* turn floor into ceil */ |
4482 | else | 4482 | else |
4483 | # endif | 4483 | # endif |
4484 | if (type == TYPE_LONGINT || type == TYPE_ULONGINT) | 4484 | if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
4485 | tmp_length = | 4485 | tmp_length = |
4486 | (unsigned int) (sizeof (unsigned long) * CHAR_BIT | 4486 | (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
4487 | * 0.333334 /* binary -> octal */ | 4487 | * 0.333334 /* binary -> octal */ |
4488 | ) | 4488 | ) |
4489 | + 1; /* turn floor into ceil */ | 4489 | + 1; /* turn floor into ceil */ |
4490 | else | 4490 | else |
4491 | tmp_length = | 4491 | tmp_length = |
4492 | (unsigned int) (sizeof (unsigned int) * CHAR_BIT | 4492 | (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
4493 | * 0.333334 /* binary -> octal */ | 4493 | * 0.333334 /* binary -> octal */ |
4494 | ) | 4494 | ) |
4495 | + 1; /* turn floor into ceil */ | 4495 | + 1; /* turn floor into ceil */ |
4496 | if (tmp_length < precision) | 4496 | if (tmp_length < precision) |
4497 | tmp_length = precision; | 4497 | tmp_length = precision; |
4498 | /* Add 1, to account for a leading sign. */ | 4498 | /* Add 1, to account for a leading sign. */ |
4499 | tmp_length = xsum (tmp_length, 1); | 4499 | tmp_length = xsum (tmp_length, 1); |
4500 | break; | 4500 | break; |
4501 | 4501 | ||
4502 | case 'x': case 'X': | 4502 | case 'x': case 'X': |
4503 | # if HAVE_LONG_LONG_INT | 4503 | # if HAVE_LONG_LONG_INT |
4504 | if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | 4504 | if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
4505 | tmp_length = | 4505 | tmp_length = |
4506 | (unsigned int) (sizeof (unsigned long long) * CHAR_BIT | 4506 | (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
4507 | * 0.25 /* binary -> hexadecimal */ | 4507 | * 0.25 /* binary -> hexadecimal */ |
4508 | ) | 4508 | ) |
4509 | + 1; /* turn floor into ceil */ | 4509 | + 1; /* turn floor into ceil */ |
4510 | else | 4510 | else |
4511 | # endif | 4511 | # endif |
4512 | if (type == TYPE_LONGINT || type == TYPE_ULONGINT) | 4512 | if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
4513 | tmp_length = | 4513 | tmp_length = |
4514 | (unsigned int) (sizeof (unsigned long) * CHAR_BIT | 4514 | (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
4515 | * 0.25 /* binary -> hexadecimal */ | 4515 | * 0.25 /* binary -> hexadecimal */ |
4516 | ) | 4516 | ) |
4517 | + 1; /* turn floor into ceil */ | 4517 | + 1; /* turn floor into ceil */ |
4518 | else | 4518 | else |
4519 | tmp_length = | 4519 | tmp_length = |
4520 | (unsigned int) (sizeof (unsigned int) * CHAR_BIT | 4520 | (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
4521 | * 0.25 /* binary -> hexadecimal */ | 4521 | * 0.25 /* binary -> hexadecimal */ |
4522 | ) | 4522 | ) |
4523 | + 1; /* turn floor into ceil */ | 4523 | + 1; /* turn floor into ceil */ |
4524 | if (tmp_length < precision) | 4524 | if (tmp_length < precision) |
4525 | tmp_length = precision; | 4525 | tmp_length = precision; |
4526 | /* Add 2, to account for a leading sign or alternate form. */ | 4526 | /* Add 2, to account for a leading sign or alternate form. */ |
4527 | tmp_length = xsum (tmp_length, 2); | 4527 | tmp_length = xsum (tmp_length, 2); |
4528 | break; | 4528 | break; |
4529 | 4529 | ||
4530 | case 'f': case 'F': | 4530 | case 'f': case 'F': |
4531 | if (type == TYPE_LONGDOUBLE) | 4531 | if (type == TYPE_LONGDOUBLE) |
4532 | tmp_length = | 4532 | tmp_length = |
4533 | (unsigned int) (LDBL_MAX_EXP | 4533 | (unsigned int) (LDBL_MAX_EXP |
4534 | * 0.30103 /* binary -> decimal */ | 4534 | * 0.30103 /* binary -> decimal */ |
4535 | * 2 /* estimate for FLAG_GROUP */ | 4535 | * 2 /* estimate for FLAG_GROUP */ |
4536 | ) | 4536 | ) |
4537 | + 1 /* turn floor into ceil */ | 4537 | + 1 /* turn floor into ceil */ |
4538 | + 10; /* sign, decimal point etc. */ | 4538 | + 10; /* sign, decimal point etc. */ |
4539 | else | 4539 | else |
4540 | tmp_length = | 4540 | tmp_length = |
4541 | (unsigned int) (DBL_MAX_EXP | 4541 | (unsigned int) (DBL_MAX_EXP |
4542 | * 0.30103 /* binary -> decimal */ | 4542 | * 0.30103 /* binary -> decimal */ |
4543 | * 2 /* estimate for FLAG_GROUP */ | 4543 | * 2 /* estimate for FLAG_GROUP */ |
4544 | ) | 4544 | ) |
4545 | + 1 /* turn floor into ceil */ | 4545 | + 1 /* turn floor into ceil */ |
4546 | + 10; /* sign, decimal point etc. */ | 4546 | + 10; /* sign, decimal point etc. */ |
4547 | tmp_length = xsum (tmp_length, precision); | 4547 | tmp_length = xsum (tmp_length, precision); |
4548 | break; | 4548 | break; |
4549 | 4549 | ||
4550 | case 'e': case 'E': case 'g': case 'G': | 4550 | case 'e': case 'E': case 'g': case 'G': |
4551 | tmp_length = | 4551 | tmp_length = |
4552 | 12; /* sign, decimal point, exponent etc. */ | 4552 | 12; /* sign, decimal point, exponent etc. */ |
4553 | tmp_length = xsum (tmp_length, precision); | 4553 | tmp_length = xsum (tmp_length, precision); |
4554 | break; | 4554 | break; |
4555 | 4555 | ||
4556 | case 'a': case 'A': | 4556 | case 'a': case 'A': |
4557 | if (type == TYPE_LONGDOUBLE) | 4557 | if (type == TYPE_LONGDOUBLE) |
4558 | tmp_length = | 4558 | tmp_length = |
4559 | (unsigned int) (LDBL_DIG | 4559 | (unsigned int) (LDBL_DIG |
4560 | * 0.831 /* decimal -> hexadecimal */ | 4560 | * 0.831 /* decimal -> hexadecimal */ |
4561 | ) | 4561 | ) |
4562 | + 1; /* turn floor into ceil */ | 4562 | + 1; /* turn floor into ceil */ |
4563 | else | 4563 | else |
4564 | tmp_length = | 4564 | tmp_length = |
4565 | (unsigned int) (DBL_DIG | 4565 | (unsigned int) (DBL_DIG |
4566 | * 0.831 /* decimal -> hexadecimal */ | 4566 | * 0.831 /* decimal -> hexadecimal */ |
4567 | ) | 4567 | ) |
4568 | + 1; /* turn floor into ceil */ | 4568 | + 1; /* turn floor into ceil */ |
4569 | if (tmp_length < precision) | 4569 | if (tmp_length < precision) |
4570 | tmp_length = precision; | 4570 | tmp_length = precision; |
4571 | /* Account for sign, decimal point etc. */ | 4571 | /* Account for sign, decimal point etc. */ |
4572 | tmp_length = xsum (tmp_length, 12); | 4572 | tmp_length = xsum (tmp_length, 12); |
4573 | break; | 4573 | break; |
4574 | 4574 | ||
4575 | case 'c': | 4575 | case 'c': |
4576 | # if HAVE_WINT_T && !WIDE_CHAR_VERSION | 4576 | # if HAVE_WINT_T && !WIDE_CHAR_VERSION |
4577 | if (type == TYPE_WIDE_CHAR) | 4577 | if (type == TYPE_WIDE_CHAR) |
4578 | tmp_length = MB_CUR_MAX; | 4578 | tmp_length = MB_CUR_MAX; |
4579 | else | 4579 | else |
4580 | # endif | 4580 | # endif |
4581 | tmp_length = 1; | 4581 | tmp_length = 1; |
4582 | break; | 4582 | break; |
4583 | 4583 | ||
4584 | case 's': | 4584 | case 's': |
4585 | # if HAVE_WCHAR_T | 4585 | # if HAVE_WCHAR_T |
4586 | if (type == TYPE_WIDE_STRING) | 4586 | if (type == TYPE_WIDE_STRING) |
4587 | { | 4587 | { |
4588 | # if WIDE_CHAR_VERSION | 4588 | # if WIDE_CHAR_VERSION |
4589 | /* ISO C says about %ls in fwprintf: | 4589 | /* ISO C says about %ls in fwprintf: |
4590 | "If the precision is not specified or is greater | 4590 | "If the precision is not specified or is greater |
4591 | than the size of the array, the array shall | 4591 | than the size of the array, the array shall |
4592 | contain a null wide character." | 4592 | contain a null wide character." |
4593 | So if there is a precision, we must not use | 4593 | So if there is a precision, we must not use |
4594 | wcslen. */ | 4594 | wcslen. */ |
4595 | const wchar_t *arg = | 4595 | const wchar_t *arg = |
4596 | a.arg[dp->arg_index].a.a_wide_string; | 4596 | a.arg[dp->arg_index].a.a_wide_string; |
4597 | 4597 | ||
4598 | if (has_precision) | 4598 | if (has_precision) |
4599 | tmp_length = local_wcsnlen (arg, precision); | 4599 | tmp_length = local_wcsnlen (arg, precision); |
4600 | else | 4600 | else |
4601 | tmp_length = local_wcslen (arg); | 4601 | tmp_length = local_wcslen (arg); |
4602 | # else | 4602 | # else |
4603 | /* ISO C says about %ls in fprintf: | 4603 | /* ISO C says about %ls in fprintf: |
4604 | "If a precision is specified, no more than that | 4604 | "If a precision is specified, no more than that |
4605 | many bytes are written (including shift | 4605 | many bytes are written (including shift |
4606 | sequences, if any), and the array shall contain | 4606 | sequences, if any), and the array shall contain |
4607 | a null wide character if, to equal the | 4607 | a null wide character if, to equal the |
4608 | multibyte character sequence length given by | 4608 | multibyte character sequence length given by |
4609 | the precision, the function would need to | 4609 | the precision, the function would need to |
4610 | access a wide character one past the end of the | 4610 | access a wide character one past the end of the |
4611 | array." | 4611 | array." |
4612 | So if there is a precision, we must not use | 4612 | So if there is a precision, we must not use |
4613 | wcslen. */ | 4613 | wcslen. */ |
4614 | /* This case has already been handled above. */ | 4614 | /* This case has already been handled above. */ |
4615 | abort (); | 4615 | abort (); |
4616 | # endif | 4616 | # endif |
4617 | } | 4617 | } |
4618 | else | 4618 | else |
4619 | # endif | 4619 | # endif |
4620 | { | 4620 | { |
4621 | # if WIDE_CHAR_VERSION | 4621 | # if WIDE_CHAR_VERSION |
4622 | /* ISO C says about %s in fwprintf: | 4622 | /* ISO C says about %s in fwprintf: |
4623 | "If the precision is not specified or is greater | 4623 | "If the precision is not specified or is greater |
4624 | than the size of the converted array, the | 4624 | than the size of the converted array, the |
4625 | converted array shall contain a null wide | 4625 | converted array shall contain a null wide |
4626 | character." | 4626 | character." |
4627 | So if there is a precision, we must not use | 4627 | So if there is a precision, we must not use |
4628 | strlen. */ | 4628 | strlen. */ |
4629 | /* This case has already been handled above. */ | 4629 | /* This case has already been handled above. */ |
4630 | abort (); | 4630 | abort (); |
4631 | # else | 4631 | # else |
4632 | /* ISO C says about %s in fprintf: | 4632 | /* ISO C says about %s in fprintf: |
4633 | "If the precision is not specified or greater | 4633 | "If the precision is not specified or greater |
4634 | than the size of the array, the array shall | 4634 | than the size of the array, the array shall |
4635 | contain a null character." | 4635 | contain a null character." |
4636 | So if there is a precision, we must not use | 4636 | So if there is a precision, we must not use |
4637 | strlen. */ | 4637 | strlen. */ |
4638 | const char *arg = a.arg[dp->arg_index].a.a_string; | 4638 | const char *arg = a.arg[dp->arg_index].a.a_string; |
4639 | 4639 | ||
4640 | if (has_precision) | 4640 | if (has_precision) |
4641 | tmp_length = local_strnlen (arg, precision); | 4641 | tmp_length = local_strnlen (arg, precision); |
4642 | else | 4642 | else |
4643 | tmp_length = strlen (arg); | 4643 | tmp_length = strlen (arg); |
4644 | # endif | 4644 | # endif |
4645 | } | 4645 | } |
4646 | break; | 4646 | break; |
4647 | 4647 | ||
4648 | case 'p': | 4648 | case 'p': |
4649 | tmp_length = | 4649 | tmp_length = |
4650 | (unsigned int) (sizeof (void *) * CHAR_BIT | 4650 | (unsigned int) (sizeof (void *) * CHAR_BIT |
4651 | * 0.25 /* binary -> hexadecimal */ | 4651 | * 0.25 /* binary -> hexadecimal */ |
4652 | ) | 4652 | ) |
4653 | + 1 /* turn floor into ceil */ | 4653 | + 1 /* turn floor into ceil */ |
4654 | + 2; /* account for leading 0x */ | 4654 | + 2; /* account for leading 0x */ |
4655 | break; | 4655 | break; |
4656 | 4656 | ||
4657 | default: | 4657 | default: |
4658 | abort (); | 4658 | abort (); |
4659 | } | 4659 | } |
4660 | 4660 | ||
4661 | if (!pad_ourselves) | 4661 | if (!pad_ourselves) |
4662 | { | 4662 | { |
4663 | # if ENABLE_UNISTDIO | 4663 | # if ENABLE_UNISTDIO |
4664 | /* Padding considers the number of characters, therefore | 4664 | /* Padding considers the number of characters, therefore |
4665 | the number of elements after padding may be | 4665 | the number of elements after padding may be |
4666 | > max (tmp_length, width) | 4666 | > max (tmp_length, width) |
4667 | but is certainly | 4667 | but is certainly |
4668 | <= tmp_length + width. */ | 4668 | <= tmp_length + width. */ |
4669 | tmp_length = xsum (tmp_length, width); | 4669 | tmp_length = xsum (tmp_length, width); |
4670 | # else | 4670 | # else |
4671 | /* Padding considers the number of elements, | 4671 | /* Padding considers the number of elements, |
4672 | says POSIX. */ | 4672 | says POSIX. */ |
4673 | if (tmp_length < width) | 4673 | if (tmp_length < width) |
4674 | tmp_length = width; | 4674 | tmp_length = width; |
4675 | # endif | 4675 | # endif |
4676 | } | 4676 | } |
4677 | 4677 | ||
4678 | tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ | 4678 | tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ |
4679 | } | 4679 | } |
4680 | 4680 | ||
4681 | if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T)) | 4681 | if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T)) |
4682 | tmp = tmpbuf; | 4682 | tmp = tmpbuf; |
4683 | else | 4683 | else |
4684 | { | 4684 | { |
4685 | size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T)); | 4685 | size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T)); |
4686 | 4686 | ||
4687 | if (size_overflow_p (tmp_memsize)) | 4687 | if (size_overflow_p (tmp_memsize)) |
4688 | /* Overflow, would lead to out of memory. */ | 4688 | /* Overflow, would lead to out of memory. */ |
4689 | goto out_of_memory; | 4689 | goto out_of_memory; |
4690 | tmp = (TCHAR_T *) malloc (tmp_memsize); | 4690 | tmp = (TCHAR_T *) malloc (tmp_memsize); |
4691 | if (tmp == NULL) | 4691 | if (tmp == NULL) |
4692 | /* Out of memory. */ | 4692 | /* Out of memory. */ |
4693 | goto out_of_memory; | 4693 | goto out_of_memory; |
4694 | } | 4694 | } |
4695 | #endif | 4695 | #endif |
4696 | 4696 | ||
4697 | /* Construct the format string for calling snprintf or | 4697 | /* Construct the format string for calling snprintf or |
4698 | sprintf. */ | 4698 | sprintf. */ |
4699 | fbp = buf; | 4699 | fbp = buf; |
4700 | *fbp++ = '%'; | 4700 | *fbp++ = '%'; |
4701 | #if NEED_PRINTF_FLAG_GROUPING | 4701 | #if NEED_PRINTF_FLAG_GROUPING |
4702 | /* The underlying implementation doesn't support the ' flag. | 4702 | /* The underlying implementation doesn't support the ' flag. |
4703 | Produce no grouping characters in this case; this is | 4703 | Produce no grouping characters in this case; this is |
4704 | acceptable because the grouping is locale dependent. */ | 4704 | acceptable because the grouping is locale dependent. */ |
4705 | #else | 4705 | #else |
4706 | if (flags & FLAG_GROUP) | 4706 | if (flags & FLAG_GROUP) |
4707 | *fbp++ = '\''; | 4707 | *fbp++ = '\''; |
4708 | #endif | 4708 | #endif |
4709 | if (flags & FLAG_LEFT) | 4709 | if (flags & FLAG_LEFT) |
4710 | *fbp++ = '-'; | 4710 | *fbp++ = '-'; |
4711 | if (flags & FLAG_SHOWSIGN) | 4711 | if (flags & FLAG_SHOWSIGN) |
4712 | *fbp++ = '+'; | 4712 | *fbp++ = '+'; |
4713 | if (flags & FLAG_SPACE) | 4713 | if (flags & FLAG_SPACE) |
4714 | *fbp++ = ' '; | 4714 | *fbp++ = ' '; |
4715 | if (flags & FLAG_ALT) | 4715 | if (flags & FLAG_ALT) |
4716 | *fbp++ = '#'; | 4716 | *fbp++ = '#'; |
4717 | if (!pad_ourselves) | 4717 | if (!pad_ourselves) |
4718 | { | 4718 | { |
4719 | if (flags & FLAG_ZERO) | 4719 | if (flags & FLAG_ZERO) |
4720 | *fbp++ = '0'; | 4720 | *fbp++ = '0'; |
4721 | if (dp->width_start != dp->width_end) | 4721 | if (dp->width_start != dp->width_end) |
4722 | { | 4722 | { |
4723 | size_t n = dp->width_end - dp->width_start; | 4723 | size_t n = dp->width_end - dp->width_start; |
4724 | /* The width specification is known to consist only | 4724 | /* The width specification is known to consist only |
4725 | of standard ASCII characters. */ | 4725 | of standard ASCII characters. */ |
4726 | if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) | 4726 | if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) |
4727 | { | 4727 | { |
4728 | memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T)); | 4728 | memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T)); |
4729 | fbp += n; | 4729 | fbp += n; |
4730 | } | 4730 | } |
4731 | else | 4731 | else |
4732 | { | 4732 | { |
4733 | const FCHAR_T *mp = dp->width_start; | 4733 | const FCHAR_T *mp = dp->width_start; |
4734 | do | 4734 | do |
4735 | *fbp++ = (unsigned char) *mp++; | 4735 | *fbp++ = (unsigned char) *mp++; |
4736 | while (--n > 0); | 4736 | while (--n > 0); |
4737 | } | 4737 | } |
4738 | } | 4738 | } |
4739 | } | 4739 | } |
4740 | if (!prec_ourselves) | 4740 | if (!prec_ourselves) |
4741 | { | 4741 | { |
4742 | if (dp->precision_start != dp->precision_end) | 4742 | if (dp->precision_start != dp->precision_end) |
4743 | { | 4743 | { |
4744 | size_t n = dp->precision_end - dp->precision_start; | 4744 | size_t n = dp->precision_end - dp->precision_start; |
4745 | /* The precision specification is known to consist only | 4745 | /* The precision specification is known to consist only |
4746 | of standard ASCII characters. */ | 4746 | of standard ASCII characters. */ |
4747 | if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) | 4747 | if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) |
4748 | { | 4748 | { |
4749 | memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T)); | 4749 | memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T)); |
4750 | fbp += n; | 4750 | fbp += n; |
4751 | } | 4751 | } |
4752 | else | 4752 | else |
4753 | { | 4753 | { |
4754 | const FCHAR_T *mp = dp->precision_start; | 4754 | const FCHAR_T *mp = dp->precision_start; |
4755 | do | 4755 | do |
4756 | *fbp++ = (unsigned char) *mp++; | 4756 | *fbp++ = (unsigned char) *mp++; |
4757 | while (--n > 0); | 4757 | while (--n > 0); |
4758 | } | 4758 | } |
4759 | } | 4759 | } |
4760 | } | 4760 | } |
4761 | 4761 | ||
4762 | switch (type) | 4762 | switch (type) |
4763 | { | 4763 | { |
4764 | #if HAVE_LONG_LONG_INT | 4764 | #if HAVE_LONG_LONG_INT |
4765 | case TYPE_LONGLONGINT: | 4765 | case TYPE_LONGLONGINT: |
4766 | case TYPE_ULONGLONGINT: | 4766 | case TYPE_ULONGLONGINT: |
4767 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | 4767 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
4768 | *fbp++ = 'I'; | 4768 | *fbp++ = 'I'; |
4769 | *fbp++ = '6'; | 4769 | *fbp++ = '6'; |
4770 | *fbp++ = '4'; | 4770 | *fbp++ = '4'; |
4771 | break; | 4771 | break; |
4772 | # else | 4772 | # else |
4773 | *fbp++ = 'l'; | 4773 | *fbp++ = 'l'; |
4774 | /*FALLTHROUGH*/ | 4774 | /*FALLTHROUGH*/ |
4775 | # endif | 4775 | # endif |
4776 | #endif | 4776 | #endif |
4777 | case TYPE_LONGINT: | 4777 | case TYPE_LONGINT: |
4778 | case TYPE_ULONGINT: | 4778 | case TYPE_ULONGINT: |
4779 | #if HAVE_WINT_T | 4779 | #if HAVE_WINT_T |
4780 | case TYPE_WIDE_CHAR: | 4780 | case TYPE_WIDE_CHAR: |
4781 | #endif | 4781 | #endif |
4782 | #if HAVE_WCHAR_T | 4782 | #if HAVE_WCHAR_T |
4783 | case TYPE_WIDE_STRING: | 4783 | case TYPE_WIDE_STRING: |
4784 | #endif | 4784 | #endif |
4785 | *fbp++ = 'l'; | 4785 | *fbp++ = 'l'; |
4786 | break; | 4786 | break; |
4787 | case TYPE_LONGDOUBLE: | 4787 | case TYPE_LONGDOUBLE: |
4788 | *fbp++ = 'L'; | 4788 | *fbp++ = 'L'; |
4789 | break; | 4789 | break; |
4790 | default: | 4790 | default: |
4791 | break; | 4791 | break; |
4792 | } | 4792 | } |
4793 | #if NEED_PRINTF_DIRECTIVE_F | 4793 | #if NEED_PRINTF_DIRECTIVE_F |
4794 | if (dp->conversion == 'F') | 4794 | if (dp->conversion == 'F') |
4795 | *fbp = 'f'; | 4795 | *fbp = 'f'; |
4796 | else | 4796 | else |
4797 | #endif | 4797 | #endif |
4798 | *fbp = dp->conversion; | 4798 | *fbp = dp->conversion; |
4799 | #if USE_SNPRINTF | 4799 | #if USE_SNPRINTF |
4800 | # if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) | 4800 | # if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) |
4801 | fbp[1] = '%'; | 4801 | fbp[1] = '%'; |
4802 | fbp[2] = 'n'; | 4802 | fbp[2] = 'n'; |
4803 | fbp[3] = '\0'; | 4803 | fbp[3] = '\0'; |
4804 | # else | 4804 | # else |
4805 | /* On glibc2 systems from glibc >= 2.3 - probably also older | 4805 | /* On glibc2 systems from glibc >= 2.3 - probably also older |
4806 | ones - we know that snprintf's returns value conforms to | 4806 | ones - we know that snprintf's returns value conforms to |
4807 | ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes. | 4807 | ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes. |
4808 | Therefore we can avoid using %n in this situation. | 4808 | Therefore we can avoid using %n in this situation. |
4809 | On glibc2 systems from 2004-10-18 or newer, the use of %n | 4809 | On glibc2 systems from 2004-10-18 or newer, the use of %n |
4810 | in format strings in writable memory may crash the program | 4810 | in format strings in writable memory may crash the program |
4811 | (if compiled with _FORTIFY_SOURCE=2), so we should avoid it | 4811 | (if compiled with _FORTIFY_SOURCE=2), so we should avoid it |
4812 | in this situation. */ | 4812 | in this situation. */ |
4813 | /* On native Win32 systems (such as mingw), we can avoid using | 4813 | /* On native Win32 systems (such as mingw), we can avoid using |
4814 | %n because: | 4814 | %n because: |
4815 | - Although the gl_SNPRINTF_TRUNCATION_C99 test fails, | 4815 | - Although the gl_SNPRINTF_TRUNCATION_C99 test fails, |
4816 | snprintf does not write more than the specified number | 4816 | snprintf does not write more than the specified number |
4817 | of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes | 4817 | of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes |
4818 | '4', '5', '6' into buf, not '4', '5', '\0'.) | 4818 | '4', '5', '6' into buf, not '4', '5', '\0'.) |
4819 | - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf | 4819 | - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf |
4820 | allows us to recognize the case of an insufficient | 4820 | allows us to recognize the case of an insufficient |
4821 | buffer size: it returns -1 in this case. | 4821 | buffer size: it returns -1 in this case. |
4822 | On native Win32 systems (such as mingw) where the OS is | 4822 | On native Win32 systems (such as mingw) where the OS is |
4823 | Windows Vista, the use of %n in format strings by default | 4823 | Windows Vista, the use of %n in format strings by default |
4824 | crashes the program. See | 4824 | crashes the program. See |
4825 | <http://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and | 4825 | <http://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and |
4826 | <http://msdn2.microsoft.com/en-us/library/ms175782(VS.80).aspx> | 4826 | <http://msdn2.microsoft.com/en-us/library/ms175782(VS.80).aspx> |
4827 | So we should avoid %n in this situation. */ | 4827 | So we should avoid %n in this situation. */ |
4828 | fbp[1] = '\0'; | 4828 | fbp[1] = '\0'; |
4829 | # endif | 4829 | # endif |
4830 | #else | 4830 | #else |
4831 | fbp[1] = '\0'; | 4831 | fbp[1] = '\0'; |
4832 | #endif | 4832 | #endif |
4833 | 4833 | ||
4834 | /* Construct the arguments for calling snprintf or sprintf. */ | 4834 | /* Construct the arguments for calling snprintf or sprintf. */ |
4835 | prefix_count = 0; | 4835 | prefix_count = 0; |
4836 | if (!pad_ourselves && dp->width_arg_index != ARG_NONE) | 4836 | if (!pad_ourselves && dp->width_arg_index != ARG_NONE) |
4837 | { | 4837 | { |
4838 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | 4838 | if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
4839 | abort (); | 4839 | abort (); |
4840 | prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; | 4840 | prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; |
4841 | } | 4841 | } |
4842 | if (!prec_ourselves && dp->precision_arg_index != ARG_NONE) | 4842 | if (!prec_ourselves && dp->precision_arg_index != ARG_NONE) |
4843 | { | 4843 | { |
4844 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | 4844 | if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
4845 | abort (); | 4845 | abort (); |
4846 | prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; | 4846 | prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; |
4847 | } | 4847 | } |
4848 | 4848 | ||
4849 | #if USE_SNPRINTF | 4849 | #if USE_SNPRINTF |
4850 | /* The SNPRINTF result is appended after result[0..length]. | 4850 | /* The SNPRINTF result is appended after result[0..length]. |
4851 | The latter is an array of DCHAR_T; SNPRINTF appends an | 4851 | The latter is an array of DCHAR_T; SNPRINTF appends an |
4852 | array of TCHAR_T to it. This is possible because | 4852 | array of TCHAR_T to it. This is possible because |
4853 | sizeof (TCHAR_T) divides sizeof (DCHAR_T) and | 4853 | sizeof (TCHAR_T) divides sizeof (DCHAR_T) and |
4854 | alignof (TCHAR_T) <= alignof (DCHAR_T). */ | 4854 | alignof (TCHAR_T) <= alignof (DCHAR_T). */ |
4855 | # define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T)) | 4855 | # define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T)) |
4856 | /* Ensure that maxlen below will be >= 2. Needed on BeOS, | 4856 | /* Ensure that maxlen below will be >= 2. Needed on BeOS, |
4857 | where an snprintf() with maxlen==1 acts like sprintf(). */ | 4857 | where an snprintf() with maxlen==1 acts like sprintf(). */ |
4858 | ENSURE_ALLOCATION (xsum (length, | 4858 | ENSURE_ALLOCATION (xsum (length, |
4859 | (2 + TCHARS_PER_DCHAR - 1) | 4859 | (2 + TCHARS_PER_DCHAR - 1) |
4860 | / TCHARS_PER_DCHAR)); | 4860 | / TCHARS_PER_DCHAR)); |
4861 | /* Prepare checking whether snprintf returns the count | 4861 | /* Prepare checking whether snprintf returns the count |
4862 | via %n. */ | 4862 | via %n. */ |
4863 | *(TCHAR_T *) (result + length) = '\0'; | 4863 | *(TCHAR_T *) (result + length) = '\0'; |
4864 | #endif | 4864 | #endif |
4865 | 4865 | ||
4866 | for (;;) | 4866 | for (;;) |
4867 | { | 4867 | { |
4868 | int count = -1; | 4868 | int count = -1; |
4869 | 4869 | ||
4870 | #if USE_SNPRINTF | 4870 | #if USE_SNPRINTF |
4871 | int retcount = 0; | 4871 | int retcount = 0; |
4872 | size_t maxlen = allocated - length; | 4872 | size_t maxlen = allocated - length; |
4873 | /* SNPRINTF can fail if its second argument is | 4873 | /* SNPRINTF can fail if its second argument is |
4874 | > INT_MAX. */ | 4874 | > INT_MAX. */ |
4875 | if (maxlen > INT_MAX / TCHARS_PER_DCHAR) | 4875 | if (maxlen > INT_MAX / TCHARS_PER_DCHAR) |
4876 | maxlen = INT_MAX / TCHARS_PER_DCHAR; | 4876 | maxlen = INT_MAX / TCHARS_PER_DCHAR; |
4877 | maxlen = maxlen * TCHARS_PER_DCHAR; | 4877 | maxlen = maxlen * TCHARS_PER_DCHAR; |
4878 | # define SNPRINTF_BUF(arg) \ | 4878 | # define SNPRINTF_BUF(arg) \ |
4879 | switch (prefix_count) \ | 4879 | switch (prefix_count) \ |
4880 | { \ | 4880 | { \ |
4881 | case 0: \ | 4881 | case 0: \ |
4882 | retcount = SNPRINTF ((TCHAR_T *) (result + length), \ | 4882 | retcount = SNPRINTF ((TCHAR_T *) (result + length), \ |
4883 | maxlen, buf, \ | 4883 | maxlen, buf, \ |
4884 | arg, &count); \ | 4884 | arg, &count); \ |
4885 | break; \ | 4885 | break; \ |
4886 | case 1: \ | 4886 | case 1: \ |
4887 | retcount = SNPRINTF ((TCHAR_T *) (result + length), \ | 4887 | retcount = SNPRINTF ((TCHAR_T *) (result + length), \ |
4888 | maxlen, buf, \ | 4888 | maxlen, buf, \ |
4889 | prefixes[0], arg, &count); \ | 4889 | prefixes[0], arg, &count); \ |
4890 | break; \ | 4890 | break; \ |
4891 | case 2: \ | 4891 | case 2: \ |
4892 | retcount = SNPRINTF ((TCHAR_T *) (result + length), \ | 4892 | retcount = SNPRINTF ((TCHAR_T *) (result + length), \ |
4893 | maxlen, buf, \ | 4893 | maxlen, buf, \ |
4894 | prefixes[0], prefixes[1], arg, \ | 4894 | prefixes[0], prefixes[1], arg, \ |
4895 | &count); \ | 4895 | &count); \ |
4896 | break; \ | 4896 | break; \ |
4897 | default: \ | 4897 | default: \ |
4898 | abort (); \ | 4898 | abort (); \ |
4899 | } | 4899 | } |
4900 | #else | 4900 | #else |
4901 | # define SNPRINTF_BUF(arg) \ | 4901 | # define SNPRINTF_BUF(arg) \ |
4902 | switch (prefix_count) \ | 4902 | switch (prefix_count) \ |
4903 | { \ | 4903 | { \ |
4904 | case 0: \ | 4904 | case 0: \ |
4905 | count = sprintf (tmp, buf, arg); \ | 4905 | count = sprintf (tmp, buf, arg); \ |
4906 | break; \ | 4906 | break; \ |
4907 | case 1: \ | 4907 | case 1: \ |
4908 | count = sprintf (tmp, buf, prefixes[0], arg); \ | 4908 | count = sprintf (tmp, buf, prefixes[0], arg); \ |
4909 | break; \ | 4909 | break; \ |
4910 | case 2: \ | 4910 | case 2: \ |
4911 | count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ | 4911 | count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ |
4912 | arg); \ | 4912 | arg); \ |
4913 | break; \ | 4913 | break; \ |
4914 | default: \ | 4914 | default: \ |
4915 | abort (); \ | 4915 | abort (); \ |
4916 | } | 4916 | } |
4917 | #endif | 4917 | #endif |
4918 | 4918 | ||
4919 | switch (type) | 4919 | switch (type) |
4920 | { | 4920 | { |
4921 | case TYPE_SCHAR: | 4921 | case TYPE_SCHAR: |
4922 | { | 4922 | { |
4923 | int arg = a.arg[dp->arg_index].a.a_schar; | 4923 | int arg = a.arg[dp->arg_index].a.a_schar; |
4924 | SNPRINTF_BUF (arg); | 4924 | SNPRINTF_BUF (arg); |
4925 | } | 4925 | } |
4926 | break; | 4926 | break; |
4927 | case TYPE_UCHAR: | 4927 | case TYPE_UCHAR: |
4928 | { | 4928 | { |
4929 | unsigned int arg = a.arg[dp->arg_index].a.a_uchar; | 4929 | unsigned int arg = a.arg[dp->arg_index].a.a_uchar; |
4930 | SNPRINTF_BUF (arg); | 4930 | SNPRINTF_BUF (arg); |
4931 | } | 4931 | } |
4932 | break; | 4932 | break; |
4933 | case TYPE_SHORT: | 4933 | case TYPE_SHORT: |
4934 | { | 4934 | { |
4935 | int arg = a.arg[dp->arg_index].a.a_short; | 4935 | int arg = a.arg[dp->arg_index].a.a_short; |
4936 | SNPRINTF_BUF (arg); | 4936 | SNPRINTF_BUF (arg); |
4937 | } | 4937 | } |
4938 | break; | 4938 | break; |
4939 | case TYPE_USHORT: | 4939 | case TYPE_USHORT: |
4940 | { | 4940 | { |
4941 | unsigned int arg = a.arg[dp->arg_index].a.a_ushort; | 4941 | unsigned int arg = a.arg[dp->arg_index].a.a_ushort; |
4942 | SNPRINTF_BUF (arg); | 4942 | SNPRINTF_BUF (arg); |
4943 | } | 4943 | } |
4944 | break; | 4944 | break; |
4945 | case TYPE_INT: | 4945 | case TYPE_INT: |
4946 | { | 4946 | { |
4947 | int arg = a.arg[dp->arg_index].a.a_int; | 4947 | int arg = a.arg[dp->arg_index].a.a_int; |
4948 | SNPRINTF_BUF (arg); | 4948 | SNPRINTF_BUF (arg); |
4949 | } | 4949 | } |
4950 | break; | 4950 | break; |
4951 | case TYPE_UINT: | 4951 | case TYPE_UINT: |
4952 | { | 4952 | { |
4953 | unsigned int arg = a.arg[dp->arg_index].a.a_uint; | 4953 | unsigned int arg = a.arg[dp->arg_index].a.a_uint; |
4954 | SNPRINTF_BUF (arg); | 4954 | SNPRINTF_BUF (arg); |
4955 | } | 4955 | } |
4956 | break; | 4956 | break; |
4957 | case TYPE_LONGINT: | 4957 | case TYPE_LONGINT: |
4958 | { | 4958 | { |
4959 | long int arg = a.arg[dp->arg_index].a.a_longint; | 4959 | long int arg = a.arg[dp->arg_index].a.a_longint; |
4960 | SNPRINTF_BUF (arg); | 4960 | SNPRINTF_BUF (arg); |
4961 | } | 4961 | } |
4962 | break; | 4962 | break; |
4963 | case TYPE_ULONGINT: | 4963 | case TYPE_ULONGINT: |
4964 | { | 4964 | { |
4965 | unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; | 4965 | unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; |
4966 | SNPRINTF_BUF (arg); | 4966 | SNPRINTF_BUF (arg); |
4967 | } | 4967 | } |
4968 | break; | 4968 | break; |
4969 | #if HAVE_LONG_LONG_INT | 4969 | #if HAVE_LONG_LONG_INT |
4970 | case TYPE_LONGLONGINT: | 4970 | case TYPE_LONGLONGINT: |
4971 | { | 4971 | { |
4972 | long long int arg = a.arg[dp->arg_index].a.a_longlongint; | 4972 | long long int arg = a.arg[dp->arg_index].a.a_longlongint; |
4973 | SNPRINTF_BUF (arg); | 4973 | SNPRINTF_BUF (arg); |
4974 | } | 4974 | } |
4975 | break; | 4975 | break; |
4976 | case TYPE_ULONGLONGINT: | 4976 | case TYPE_ULONGLONGINT: |
4977 | { | 4977 | { |
4978 | unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; | 4978 | unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; |
4979 | SNPRINTF_BUF (arg); | 4979 | SNPRINTF_BUF (arg); |
4980 | } | 4980 | } |
4981 | break; | 4981 | break; |
4982 | #endif | 4982 | #endif |
4983 | case TYPE_DOUBLE: | 4983 | case TYPE_DOUBLE: |
4984 | { | 4984 | { |
4985 | double arg = a.arg[dp->arg_index].a.a_double; | 4985 | double arg = a.arg[dp->arg_index].a.a_double; |
4986 | SNPRINTF_BUF (arg); | 4986 | SNPRINTF_BUF (arg); |
4987 | } | 4987 | } |
4988 | break; | 4988 | break; |
4989 | case TYPE_LONGDOUBLE: | 4989 | case TYPE_LONGDOUBLE: |
4990 | { | 4990 | { |
4991 | long double arg = a.arg[dp->arg_index].a.a_longdouble; | 4991 | long double arg = a.arg[dp->arg_index].a.a_longdouble; |
4992 | SNPRINTF_BUF (arg); | 4992 | SNPRINTF_BUF (arg); |
4993 | } | 4993 | } |
4994 | break; | 4994 | break; |
4995 | case TYPE_CHAR: | 4995 | case TYPE_CHAR: |
4996 | { | 4996 | { |
4997 | int arg = a.arg[dp->arg_index].a.a_char; | 4997 | int arg = a.arg[dp->arg_index].a.a_char; |
4998 | SNPRINTF_BUF (arg); | 4998 | SNPRINTF_BUF (arg); |
4999 | } | 4999 | } |
5000 | break; | 5000 | break; |
5001 | #if HAVE_WINT_T | 5001 | #if HAVE_WINT_T |
5002 | case TYPE_WIDE_CHAR: | 5002 | case TYPE_WIDE_CHAR: |
5003 | { | 5003 | { |
5004 | wint_t arg = a.arg[dp->arg_index].a.a_wide_char; | 5004 | wint_t arg = a.arg[dp->arg_index].a.a_wide_char; |
5005 | SNPRINTF_BUF (arg); | 5005 | SNPRINTF_BUF (arg); |
5006 | } | 5006 | } |
5007 | break; | 5007 | break; |
5008 | #endif | 5008 | #endif |
5009 | case TYPE_STRING: | 5009 | case TYPE_STRING: |
5010 | { | 5010 | { |
5011 | const char *arg = a.arg[dp->arg_index].a.a_string; | 5011 | const char *arg = a.arg[dp->arg_index].a.a_string; |
5012 | SNPRINTF_BUF (arg); | 5012 | SNPRINTF_BUF (arg); |
5013 | } | 5013 | } |
5014 | break; | 5014 | break; |
5015 | #if HAVE_WCHAR_T | 5015 | #if HAVE_WCHAR_T |
5016 | case TYPE_WIDE_STRING: | 5016 | case TYPE_WIDE_STRING: |
5017 | { | 5017 | { |
5018 | const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; | 5018 | const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; |
5019 | SNPRINTF_BUF (arg); | 5019 | SNPRINTF_BUF (arg); |
5020 | } | 5020 | } |
5021 | break; | 5021 | break; |
5022 | #endif | 5022 | #endif |
5023 | case TYPE_POINTER: | 5023 | case TYPE_POINTER: |
5024 | { | 5024 | { |
5025 | void *arg = a.arg[dp->arg_index].a.a_pointer; | 5025 | void *arg = a.arg[dp->arg_index].a.a_pointer; |
5026 | SNPRINTF_BUF (arg); | 5026 | SNPRINTF_BUF (arg); |
5027 | } | 5027 | } |
5028 | break; | 5028 | break; |
5029 | default: | 5029 | default: |
5030 | abort (); | 5030 | abort (); |
5031 | } | 5031 | } |
5032 | 5032 | ||
5033 | #if USE_SNPRINTF | 5033 | #if USE_SNPRINTF |
5034 | /* Portability: Not all implementations of snprintf() | 5034 | /* Portability: Not all implementations of snprintf() |
5035 | are ISO C 99 compliant. Determine the number of | 5035 | are ISO C 99 compliant. Determine the number of |
5036 | bytes that snprintf() has produced or would have | 5036 | bytes that snprintf() has produced or would have |
5037 | produced. */ | 5037 | produced. */ |
5038 | if (count >= 0) | 5038 | if (count >= 0) |
5039 | { | 5039 | { |
5040 | /* Verify that snprintf() has NUL-terminated its | 5040 | /* Verify that snprintf() has NUL-terminated its |
5041 | result. */ | 5041 | result. */ |
5042 | if (count < maxlen | 5042 | if (count < maxlen |
5043 | && ((TCHAR_T *) (result + length)) [count] != '\0') | 5043 | && ((TCHAR_T *) (result + length)) [count] != '\0') |
5044 | abort (); | 5044 | abort (); |
5045 | /* Portability hack. */ | 5045 | /* Portability hack. */ |
5046 | if (retcount > count) | 5046 | if (retcount > count) |
5047 | count = retcount; | 5047 | count = retcount; |
5048 | } | 5048 | } |
5049 | else | 5049 | else |
5050 | { | 5050 | { |
5051 | /* snprintf() doesn't understand the '%n' | 5051 | /* snprintf() doesn't understand the '%n' |
5052 | directive. */ | 5052 | directive. */ |
5053 | if (fbp[1] != '\0') | 5053 | if (fbp[1] != '\0') |
5054 | { | 5054 | { |
5055 | /* Don't use the '%n' directive; instead, look | 5055 | /* Don't use the '%n' directive; instead, look |
5056 | at the snprintf() return value. */ | 5056 | at the snprintf() return value. */ |
5057 | fbp[1] = '\0'; | 5057 | fbp[1] = '\0'; |
5058 | continue; | 5058 | continue; |
5059 | } | 5059 | } |
5060 | else | 5060 | else |
5061 | { | 5061 | { |
5062 | /* Look at the snprintf() return value. */ | 5062 | /* Look at the snprintf() return value. */ |
5063 | if (retcount < 0) | 5063 | if (retcount < 0) |
5064 | { | 5064 | { |
5065 | /* HP-UX 10.20 snprintf() is doubly deficient: | 5065 | /* HP-UX 10.20 snprintf() is doubly deficient: |
5066 | It doesn't understand the '%n' directive, | 5066 | It doesn't understand the '%n' directive, |
5067 | *and* it returns -1 (rather than the length | 5067 | *and* it returns -1 (rather than the length |
5068 | that would have been required) when the | 5068 | that would have been required) when the |
5069 | buffer is too small. */ | 5069 | buffer is too small. */ |
5070 | size_t bigger_need = | 5070 | size_t bigger_need = |
5071 | xsum (xtimes (allocated, 2), 12); | 5071 | xsum (xtimes (allocated, 2), 12); |
5072 | ENSURE_ALLOCATION (bigger_need); | 5072 | ENSURE_ALLOCATION (bigger_need); |
5073 | continue; | 5073 | continue; |
5074 | } | 5074 | } |
5075 | else | 5075 | else |
5076 | count = retcount; | 5076 | count = retcount; |
5077 | } | 5077 | } |
5078 | } | 5078 | } |
5079 | #endif | 5079 | #endif |
5080 | 5080 | ||
5081 | /* Attempt to handle failure. */ | 5081 | /* Attempt to handle failure. */ |
5082 | if (count < 0) | 5082 | if (count < 0) |
5083 | { | 5083 | { |
5084 | if (!(result == resultbuf || result == NULL)) | 5084 | if (!(result == resultbuf || result == NULL)) |
5085 | free (result); | 5085 | free (result); |
5086 | if (buf_malloced != NULL) | 5086 | if (buf_malloced != NULL) |
5087 | free (buf_malloced); | 5087 | free (buf_malloced); |
5088 | CLEANUP (); | 5088 | CLEANUP (); |
5089 | errno = EINVAL; | 5089 | errno = EINVAL; |
5090 | return NULL; | 5090 | return NULL; |
5091 | } | 5091 | } |
5092 | 5092 | ||
5093 | #if USE_SNPRINTF | 5093 | #if USE_SNPRINTF |
5094 | /* Handle overflow of the allocated buffer. | 5094 | /* Handle overflow of the allocated buffer. |
5095 | If such an overflow occurs, a C99 compliant snprintf() | 5095 | If such an overflow occurs, a C99 compliant snprintf() |
5096 | returns a count >= maxlen. However, a non-compliant | 5096 | returns a count >= maxlen. However, a non-compliant |
5097 | snprintf() function returns only count = maxlen - 1. To | 5097 | snprintf() function returns only count = maxlen - 1. To |
5098 | cover both cases, test whether count >= maxlen - 1. */ | 5098 | cover both cases, test whether count >= maxlen - 1. */ |
5099 | if ((unsigned int) count + 1 >= maxlen) | 5099 | if ((unsigned int) count + 1 >= maxlen) |
5100 | { | 5100 | { |
5101 | /* If maxlen already has attained its allowed maximum, | 5101 | /* If maxlen already has attained its allowed maximum, |
5102 | allocating more memory will not increase maxlen. | 5102 | allocating more memory will not increase maxlen. |
5103 | Instead of looping, bail out. */ | 5103 | Instead of looping, bail out. */ |
5104 | if (maxlen == INT_MAX / TCHARS_PER_DCHAR) | 5104 | if (maxlen == INT_MAX / TCHARS_PER_DCHAR) |
5105 | goto overflow; | 5105 | goto overflow; |
5106 | else | 5106 | else |
5107 | { | 5107 | { |
5108 | /* Need at least (count + 1) * sizeof (TCHAR_T) | 5108 | /* Need at least (count + 1) * sizeof (TCHAR_T) |
5109 | bytes. (The +1 is for the trailing NUL.) | 5109 | bytes. (The +1 is for the trailing NUL.) |
5110 | But ask for (count + 2) * sizeof (TCHAR_T) | 5110 | But ask for (count + 2) * sizeof (TCHAR_T) |
5111 | bytes, so that in the next round, we likely get | 5111 | bytes, so that in the next round, we likely get |
5112 | maxlen > (unsigned int) count + 1 | 5112 | maxlen > (unsigned int) count + 1 |
5113 | and so we don't get here again. | 5113 | and so we don't get here again. |
5114 | And allocate proportionally, to avoid looping | 5114 | And allocate proportionally, to avoid looping |
5115 | eternally if snprintf() reports a too small | 5115 | eternally if snprintf() reports a too small |
5116 | count. */ | 5116 | count. */ |
5117 | size_t n = | 5117 | size_t n = |
5118 | xmax (xsum (length, | 5118 | xmax (xsum (length, |
5119 | ((unsigned int) count + 2 | 5119 | ((unsigned int) count + 2 |
5120 | + TCHARS_PER_DCHAR - 1) | 5120 | + TCHARS_PER_DCHAR - 1) |
5121 | / TCHARS_PER_DCHAR), | 5121 | / TCHARS_PER_DCHAR), |
5122 | xtimes (allocated, 2)); | 5122 | xtimes (allocated, 2)); |
5123 | 5123 | ||
5124 | ENSURE_ALLOCATION (n); | 5124 | ENSURE_ALLOCATION (n); |
5125 | continue; | 5125 | continue; |
5126 | } | 5126 | } |
5127 | } | 5127 | } |
5128 | #endif | 5128 | #endif |
5129 | 5129 | ||
5130 | #if NEED_PRINTF_UNBOUNDED_PRECISION | 5130 | #if NEED_PRINTF_UNBOUNDED_PRECISION |
5131 | if (prec_ourselves) | 5131 | if (prec_ourselves) |
5132 | { | 5132 | { |
5133 | /* Handle the precision. */ | 5133 | /* Handle the precision. */ |
5134 | TCHAR_T *prec_ptr = | 5134 | TCHAR_T *prec_ptr = |
5135 | # if USE_SNPRINTF | 5135 | # if USE_SNPRINTF |
5136 | (TCHAR_T *) (result + length); | 5136 | (TCHAR_T *) (result + length); |
5137 | # else | 5137 | # else |
5138 | tmp; | 5138 | tmp; |
5139 | # endif | 5139 | # endif |
5140 | size_t prefix_count; | 5140 | size_t prefix_count; |
5141 | size_t move; | 5141 | size_t move; |
5142 | 5142 | ||
5143 | prefix_count = 0; | 5143 | prefix_count = 0; |
5144 | /* Put the additional zeroes after the sign. */ | 5144 | /* Put the additional zeroes after the sign. */ |
5145 | if (count >= 1 | 5145 | if (count >= 1 |
5146 | && (*prec_ptr == '-' || *prec_ptr == '+' | 5146 | && (*prec_ptr == '-' || *prec_ptr == '+' |
5147 | || *prec_ptr == ' ')) | 5147 | || *prec_ptr == ' ')) |
5148 | prefix_count = 1; | 5148 | prefix_count = 1; |
5149 | /* Put the additional zeroes after the 0x prefix if | 5149 | /* Put the additional zeroes after the 0x prefix if |
5150 | (flags & FLAG_ALT) || (dp->conversion == 'p'). */ | 5150 | (flags & FLAG_ALT) || (dp->conversion == 'p'). */ |
5151 | else if (count >= 2 | 5151 | else if (count >= 2 |
5152 | && prec_ptr[0] == '0' | 5152 | && prec_ptr[0] == '0' |
5153 | && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X')) | 5153 | && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X')) |
5154 | prefix_count = 2; | 5154 | prefix_count = 2; |
5155 | 5155 | ||
5156 | move = count - prefix_count; | 5156 | move = count - prefix_count; |
5157 | if (precision > move) | 5157 | if (precision > move) |
5158 | { | 5158 | { |
5159 | /* Insert zeroes. */ | 5159 | /* Insert zeroes. */ |
5160 | size_t insert = precision - move; | 5160 | size_t insert = precision - move; |
5161 | TCHAR_T *prec_end; | 5161 | TCHAR_T *prec_end; |
5162 | 5162 | ||
5163 | # if USE_SNPRINTF | 5163 | # if USE_SNPRINTF |
5164 | size_t n = | 5164 | size_t n = |
5165 | xsum (length, | 5165 | xsum (length, |
5166 | (count + insert + TCHARS_PER_DCHAR - 1) | 5166 | (count + insert + TCHARS_PER_DCHAR - 1) |
5167 | / TCHARS_PER_DCHAR); | 5167 | / TCHARS_PER_DCHAR); |
5168 | length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; | 5168 | length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; |
5169 | ENSURE_ALLOCATION (n); | 5169 | ENSURE_ALLOCATION (n); |
5170 | length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; | 5170 | length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; |
5171 | prec_ptr = (TCHAR_T *) (result + length); | 5171 | prec_ptr = (TCHAR_T *) (result + length); |
5172 | # endif | 5172 | # endif |
5173 | 5173 | ||
5174 | prec_end = prec_ptr + count; | 5174 | prec_end = prec_ptr + count; |
5175 | prec_ptr += prefix_count; | 5175 | prec_ptr += prefix_count; |
5176 | 5176 | ||
5177 | while (prec_end > prec_ptr) | 5177 | while (prec_end > prec_ptr) |
5178 | { | 5178 | { |
5179 | prec_end--; | 5179 | prec_end--; |
5180 | prec_end[insert] = prec_end[0]; | 5180 | prec_end[insert] = prec_end[0]; |
5181 | } | 5181 | } |
5182 | 5182 | ||
5183 | prec_end += insert; | 5183 | prec_end += insert; |
5184 | do | 5184 | do |
5185 | *--prec_end = '0'; | 5185 | *--prec_end = '0'; |
5186 | while (prec_end > prec_ptr); | 5186 | while (prec_end > prec_ptr); |
5187 | 5187 | ||
5188 | count += insert; | 5188 | count += insert; |
5189 | } | 5189 | } |
5190 | } | 5190 | } |
5191 | #endif | 5191 | #endif |
5192 | 5192 | ||
5193 | #if !USE_SNPRINTF | 5193 | #if !USE_SNPRINTF |
5194 | if (count >= tmp_length) | 5194 | if (count >= tmp_length) |
5195 | /* tmp_length was incorrectly calculated - fix the | 5195 | /* tmp_length was incorrectly calculated - fix the |
5196 | code above! */ | 5196 | code above! */ |
5197 | abort (); | 5197 | abort (); |
5198 | #endif | 5198 | #endif |
5199 | 5199 | ||
5200 | #if !DCHAR_IS_TCHAR | 5200 | #if !DCHAR_IS_TCHAR |
5201 | /* Convert from TCHAR_T[] to DCHAR_T[]. */ | 5201 | /* Convert from TCHAR_T[] to DCHAR_T[]. */ |
5202 | if (dp->conversion == 'c' || dp->conversion == 's') | 5202 | if (dp->conversion == 'c' || dp->conversion == 's') |
5203 | { | 5203 | { |
5204 | /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING | 5204 | /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING |
5205 | TYPE_WIDE_STRING. | 5205 | TYPE_WIDE_STRING. |
5206 | The result string is not certainly ASCII. */ | 5206 | The result string is not certainly ASCII. */ |
5207 | const TCHAR_T *tmpsrc; | 5207 | const TCHAR_T *tmpsrc; |
5208 | DCHAR_T *tmpdst; | 5208 | DCHAR_T *tmpdst; |
5209 | size_t tmpdst_len; | 5209 | size_t tmpdst_len; |
5210 | /* This code assumes that TCHAR_T is 'char'. */ | 5210 | /* This code assumes that TCHAR_T is 'char'. */ |
5211 | typedef int TCHAR_T_verify | 5211 | typedef int TCHAR_T_verify |
5212 | [2 * (sizeof (TCHAR_T) == 1) - 1]; | 5212 | [2 * (sizeof (TCHAR_T) == 1) - 1]; |
5213 | # if USE_SNPRINTF | 5213 | # if USE_SNPRINTF |
5214 | tmpsrc = (TCHAR_T *) (result + length); | 5214 | tmpsrc = (TCHAR_T *) (result + length); |
5215 | # else | 5215 | # else |
5216 | tmpsrc = tmp; | 5216 | tmpsrc = tmp; |
5217 | # endif | 5217 | # endif |
5218 | tmpdst = | 5218 | tmpdst = |
5219 | DCHAR_CONV_FROM_ENCODING (locale_charset (), | 5219 | DCHAR_CONV_FROM_ENCODING (locale_charset (), |
5220 | iconveh_question_mark, | 5220 | iconveh_question_mark, |
5221 | tmpsrc, count, | 5221 | tmpsrc, count, |
5222 | NULL, | 5222 | NULL, |
5223 | NULL, &tmpdst_len); | 5223 | NULL, &tmpdst_len); |
5224 | if (tmpdst == NULL) | 5224 | if (tmpdst == NULL) |
5225 | { | 5225 | { |
5226 | int saved_errno = errno; | 5226 | int saved_errno = errno; |
5227 | if (!(result == resultbuf || result == NULL)) | 5227 | if (!(result == resultbuf || result == NULL)) |
5228 | free (result); | 5228 | free (result); |
5229 | if (buf_malloced != NULL) | 5229 | if (buf_malloced != NULL) |
5230 | free (buf_malloced); | 5230 | free (buf_malloced); |
5231 | CLEANUP (); | 5231 | CLEANUP (); |
5232 | errno = saved_errno; | 5232 | errno = saved_errno; |
5233 | return NULL; | 5233 | return NULL; |
5234 | } | 5234 | } |
5235 | ENSURE_ALLOCATION (xsum (length, tmpdst_len)); | 5235 | ENSURE_ALLOCATION (xsum (length, tmpdst_len)); |
5236 | DCHAR_CPY (result + length, tmpdst, tmpdst_len); | 5236 | DCHAR_CPY (result + length, tmpdst, tmpdst_len); |
5237 | free (tmpdst); | 5237 | free (tmpdst); |
5238 | count = tmpdst_len; | 5238 | count = tmpdst_len; |
5239 | } | 5239 | } |
5240 | else | 5240 | else |
5241 | { | 5241 | { |
5242 | /* The result string is ASCII. | 5242 | /* The result string is ASCII. |
5243 | Simple 1:1 conversion. */ | 5243 | Simple 1:1 conversion. */ |
5244 | # if USE_SNPRINTF | 5244 | # if USE_SNPRINTF |
5245 | /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a | 5245 | /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a |
5246 | no-op conversion, in-place on the array starting | 5246 | no-op conversion, in-place on the array starting |
5247 | at (result + length). */ | 5247 | at (result + length). */ |
5248 | if (sizeof (DCHAR_T) != sizeof (TCHAR_T)) | 5248 | if (sizeof (DCHAR_T) != sizeof (TCHAR_T)) |
5249 | # endif | 5249 | # endif |
5250 | { | 5250 | { |
5251 | const TCHAR_T *tmpsrc; | 5251 | const TCHAR_T *tmpsrc; |
5252 | DCHAR_T *tmpdst; | 5252 | DCHAR_T *tmpdst; |
5253 | size_t n; | 5253 | size_t n; |
5254 | 5254 | ||
5255 | # if USE_SNPRINTF | 5255 | # if USE_SNPRINTF |
5256 | if (result == resultbuf) | 5256 | if (result == resultbuf) |
5257 | { | 5257 | { |
5258 | tmpsrc = (TCHAR_T *) (result + length); | 5258 | tmpsrc = (TCHAR_T *) (result + length); |
5259 | /* ENSURE_ALLOCATION will not move tmpsrc | 5259 | /* ENSURE_ALLOCATION will not move tmpsrc |
5260 | (because it's part of resultbuf). */ | 5260 | (because it's part of resultbuf). */ |
5261 | ENSURE_ALLOCATION (xsum (length, count)); | 5261 | ENSURE_ALLOCATION (xsum (length, count)); |
5262 | } | 5262 | } |
5263 | else | 5263 | else |
5264 | { | 5264 | { |
5265 | /* ENSURE_ALLOCATION will move the array | 5265 | /* ENSURE_ALLOCATION will move the array |
5266 | (because it uses realloc(). */ | 5266 | (because it uses realloc(). */ |
5267 | ENSURE_ALLOCATION (xsum (length, count)); | 5267 | ENSURE_ALLOCATION (xsum (length, count)); |
5268 | tmpsrc = (TCHAR_T *) (result + length); | 5268 | tmpsrc = (TCHAR_T *) (result + length); |
5269 | } | 5269 | } |
5270 | # else | 5270 | # else |
5271 | tmpsrc = tmp; | 5271 | tmpsrc = tmp; |
5272 | ENSURE_ALLOCATION (xsum (length, count)); | 5272 | ENSURE_ALLOCATION (xsum (length, count)); |
5273 | # endif | 5273 | # endif |
5274 | tmpdst = result + length; | 5274 | tmpdst = result + length; |
5275 | /* Copy backwards, because of overlapping. */ | 5275 | /* Copy backwards, because of overlapping. */ |
5276 | tmpsrc += count; | 5276 | tmpsrc += count; |
5277 | tmpdst += count; | 5277 | tmpdst += count; |
5278 | for (n = count; n > 0; n--) | 5278 | for (n = count; n > 0; n--) |
5279 | *--tmpdst = (unsigned char) *--tmpsrc; | 5279 | *--tmpdst = (unsigned char) *--tmpsrc; |
5280 | } | 5280 | } |
5281 | } | 5281 | } |
5282 | #endif | 5282 | #endif |
5283 | 5283 | ||
5284 | #if DCHAR_IS_TCHAR && !USE_SNPRINTF | 5284 | #if DCHAR_IS_TCHAR && !USE_SNPRINTF |
5285 | /* Make room for the result. */ | 5285 | /* Make room for the result. */ |
5286 | if (count > allocated - length) | 5286 | if (count > allocated - length) |
5287 | { | 5287 | { |
5288 | /* Need at least count elements. But allocate | 5288 | /* Need at least count elements. But allocate |
5289 | proportionally. */ | 5289 | proportionally. */ |
5290 | size_t n = | 5290 | size_t n = |
5291 | xmax (xsum (length, count), xtimes (allocated, 2)); | 5291 | xmax (xsum (length, count), xtimes (allocated, 2)); |
5292 | 5292 | ||
5293 | ENSURE_ALLOCATION (n); | 5293 | ENSURE_ALLOCATION (n); |
5294 | } | 5294 | } |
5295 | #endif | 5295 | #endif |
5296 | 5296 | ||
5297 | /* Here count <= allocated - length. */ | 5297 | /* Here count <= allocated - length. */ |
5298 | 5298 | ||
5299 | /* Perform padding. */ | 5299 | /* Perform padding. */ |
5300 | #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION | 5300 | #if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION |
5301 | if (pad_ourselves && has_width) | 5301 | if (pad_ourselves && has_width) |
5302 | { | 5302 | { |
5303 | size_t w; | 5303 | size_t w; |
5304 | # if ENABLE_UNISTDIO | 5304 | # if ENABLE_UNISTDIO |
5305 | /* Outside POSIX, it's preferrable to compare the width | 5305 | /* Outside POSIX, it's preferrable to compare the width |
5306 | against the number of _characters_ of the converted | 5306 | against the number of _characters_ of the converted |
5307 | value. */ | 5307 | value. */ |
5308 | w = DCHAR_MBSNLEN (result + length, count); | 5308 | w = DCHAR_MBSNLEN (result + length, count); |
5309 | # else | 5309 | # else |
5310 | /* The width is compared against the number of _bytes_ | 5310 | /* The width is compared against the number of _bytes_ |
5311 | of the converted value, says POSIX. */ | 5311 | of the converted value, says POSIX. */ |
5312 | w = count; | 5312 | w = count; |
5313 | # endif | 5313 | # endif |
5314 | if (w < width) | 5314 | if (w < width) |
5315 | { | 5315 | { |
5316 | size_t pad = width - w; | 5316 | size_t pad = width - w; |
5317 | 5317 | ||
5318 | /* Make room for the result. */ | 5318 | /* Make room for the result. */ |
5319 | if (xsum (count, pad) > allocated - length) | 5319 | if (xsum (count, pad) > allocated - length) |
5320 | { | 5320 | { |
5321 | /* Need at least count + pad elements. But | 5321 | /* Need at least count + pad elements. But |
5322 | allocate proportionally. */ | 5322 | allocate proportionally. */ |
5323 | size_t n = | 5323 | size_t n = |
5324 | xmax (xsum3 (length, count, pad), | 5324 | xmax (xsum3 (length, count, pad), |
5325 | xtimes (allocated, 2)); | 5325 | xtimes (allocated, 2)); |
5326 | 5326 | ||
5327 | # if USE_SNPRINTF | 5327 | # if USE_SNPRINTF |
5328 | length += count; | 5328 | length += count; |
5329 | ENSURE_ALLOCATION (n); | 5329 | ENSURE_ALLOCATION (n); |
5330 | length -= count; | 5330 | length -= count; |
5331 | # else | 5331 | # else |
5332 | ENSURE_ALLOCATION (n); | 5332 | ENSURE_ALLOCATION (n); |
5333 | # endif | 5333 | # endif |
5334 | } | 5334 | } |
5335 | /* Here count + pad <= allocated - length. */ | 5335 | /* Here count + pad <= allocated - length. */ |
5336 | 5336 | ||
5337 | { | 5337 | { |
5338 | # if !DCHAR_IS_TCHAR || USE_SNPRINTF | 5338 | # if !DCHAR_IS_TCHAR || USE_SNPRINTF |
5339 | DCHAR_T * const rp = result + length; | 5339 | DCHAR_T * const rp = result + length; |
5340 | # else | 5340 | # else |
5341 | DCHAR_T * const rp = tmp; | 5341 | DCHAR_T * const rp = tmp; |
5342 | # endif | 5342 | # endif |
5343 | DCHAR_T *p = rp + count; | 5343 | DCHAR_T *p = rp + count; |
5344 | DCHAR_T *end = p + pad; | 5344 | DCHAR_T *end = p + pad; |
5345 | DCHAR_T *pad_ptr; | 5345 | DCHAR_T *pad_ptr; |
5346 | # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO | 5346 | # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO |
5347 | if (dp->conversion == 'c' | 5347 | if (dp->conversion == 'c' |
5348 | || dp->conversion == 's') | 5348 | || dp->conversion == 's') |
5349 | /* No zero-padding for string directives. */ | 5349 | /* No zero-padding for string directives. */ |
5350 | pad_ptr = NULL; | 5350 | pad_ptr = NULL; |
5351 | else | 5351 | else |
5352 | # endif | 5352 | # endif |
5353 | { | 5353 | { |
5354 | pad_ptr = (*rp == '-' ? rp + 1 : rp); | 5354 | pad_ptr = (*rp == '-' ? rp + 1 : rp); |
5355 | /* No zero-padding of "inf" and "nan". */ | 5355 | /* No zero-padding of "inf" and "nan". */ |
5356 | if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z') | 5356 | if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z') |
5357 | || (*pad_ptr >= 'a' && *pad_ptr <= 'z')) | 5357 | || (*pad_ptr >= 'a' && *pad_ptr <= 'z')) |
5358 | pad_ptr = NULL; | 5358 | pad_ptr = NULL; |
5359 | } | 5359 | } |
5360 | /* The generated string now extends from rp to p, | 5360 | /* The generated string now extends from rp to p, |
5361 | with the zero padding insertion point being at | 5361 | with the zero padding insertion point being at |
5362 | pad_ptr. */ | 5362 | pad_ptr. */ |
5363 | 5363 | ||
5364 | count = count + pad; /* = end - rp */ | 5364 | count = count + pad; /* = end - rp */ |
5365 | 5365 | ||
5366 | if (flags & FLAG_LEFT) | 5366 | if (flags & FLAG_LEFT) |
5367 | { | 5367 | { |
5368 | /* Pad with spaces on the right. */ | 5368 | /* Pad with spaces on the right. */ |
5369 | for (; pad > 0; pad--) | 5369 | for (; pad > 0; pad--) |
5370 | *p++ = ' '; | 5370 | *p++ = ' '; |
5371 | } | 5371 | } |
5372 | else if ((flags & FLAG_ZERO) && pad_ptr != NULL) | 5372 | else if ((flags & FLAG_ZERO) && pad_ptr != NULL) |
5373 | { | 5373 | { |
5374 | /* Pad with zeroes. */ | 5374 | /* Pad with zeroes. */ |
5375 | DCHAR_T *q = end; | 5375 | DCHAR_T *q = end; |
5376 | 5376 | ||
5377 | while (p > pad_ptr) | 5377 | while (p > pad_ptr) |
5378 | *--q = *--p; | 5378 | *--q = *--p; |
5379 | for (; pad > 0; pad--) | 5379 | for (; pad > 0; pad--) |
5380 | *p++ = '0'; | 5380 | *p++ = '0'; |
5381 | } | 5381 | } |
5382 | else | 5382 | else |
5383 | { | 5383 | { |
5384 | /* Pad with spaces on the left. */ | 5384 | /* Pad with spaces on the left. */ |
5385 | DCHAR_T *q = end; | 5385 | DCHAR_T *q = end; |
5386 | 5386 | ||
5387 | while (p > rp) | 5387 | while (p > rp) |
5388 | *--q = *--p; | 5388 | *--q = *--p; |
5389 | for (; pad > 0; pad--) | 5389 | for (; pad > 0; pad--) |
5390 | *p++ = ' '; | 5390 | *p++ = ' '; |
5391 | } | 5391 | } |
5392 | } | 5392 | } |
5393 | } | 5393 | } |
5394 | } | 5394 | } |
5395 | #endif | 5395 | #endif |
5396 | 5396 | ||
5397 | /* Here still count <= allocated - length. */ | 5397 | /* Here still count <= allocated - length. */ |
5398 | 5398 | ||
5399 | #if !DCHAR_IS_TCHAR || USE_SNPRINTF | 5399 | #if !DCHAR_IS_TCHAR || USE_SNPRINTF |
5400 | /* The snprintf() result did fit. */ | 5400 | /* The snprintf() result did fit. */ |
5401 | #else | 5401 | #else |
5402 | /* Append the sprintf() result. */ | 5402 | /* Append the sprintf() result. */ |
5403 | memcpy (result + length, tmp, count * sizeof (DCHAR_T)); | 5403 | memcpy (result + length, tmp, count * sizeof (DCHAR_T)); |
5404 | #endif | 5404 | #endif |
5405 | #if !USE_SNPRINTF | 5405 | #if !USE_SNPRINTF |
5406 | if (tmp != tmpbuf) | 5406 | if (tmp != tmpbuf) |
5407 | free (tmp); | 5407 | free (tmp); |
5408 | #endif | 5408 | #endif |
5409 | 5409 | ||
5410 | #if NEED_PRINTF_DIRECTIVE_F | 5410 | #if NEED_PRINTF_DIRECTIVE_F |
5411 | if (dp->conversion == 'F') | 5411 | if (dp->conversion == 'F') |
5412 | { | 5412 | { |
5413 | /* Convert the %f result to upper case for %F. */ | 5413 | /* Convert the %f result to upper case for %F. */ |
5414 | DCHAR_T *rp = result + length; | 5414 | DCHAR_T *rp = result + length; |
5415 | size_t rc; | 5415 | size_t rc; |
5416 | for (rc = count; rc > 0; rc--, rp++) | 5416 | for (rc = count; rc > 0; rc--, rp++) |
5417 | if (*rp >= 'a' && *rp <= 'z') | 5417 | if (*rp >= 'a' && *rp <= 'z') |
5418 | *rp = *rp - 'a' + 'A'; | 5418 | *rp = *rp - 'a' + 'A'; |
5419 | } | 5419 | } |
5420 | #endif | 5420 | #endif |
5421 | 5421 | ||
5422 | length += count; | 5422 | length += count; |
5423 | break; | 5423 | break; |
5424 | } | 5424 | } |
5425 | } | 5425 | } |
5426 | } | 5426 | } |
5427 | } | 5427 | } |
5428 | 5428 | ||
5429 | /* Add the final NUL. */ | 5429 | /* Add the final NUL. */ |
@@ -5432,12 +5432,12 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, | |||
5432 | 5432 | ||
5433 | if (result != resultbuf && length + 1 < allocated) | 5433 | if (result != resultbuf && length + 1 < allocated) |
5434 | { | 5434 | { |
5435 | /* Shrink the allocated memory if possible. */ | 5435 | /* Shrink the allocated memory if possible. */ |
5436 | DCHAR_T *memory; | 5436 | DCHAR_T *memory; |
5437 | 5437 | ||
5438 | memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T)); | 5438 | memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T)); |
5439 | if (memory != NULL) | 5439 | if (memory != NULL) |
5440 | result = memory; | 5440 | result = memory; |
5441 | } | 5441 | } |
5442 | 5442 | ||
5443 | if (buf_malloced != NULL) | 5443 | if (buf_malloced != NULL) |
@@ -5476,6 +5476,7 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, | |||
5476 | #undef TCHARS_PER_DCHAR | 5476 | #undef TCHARS_PER_DCHAR |
5477 | #undef SNPRINTF | 5477 | #undef SNPRINTF |
5478 | #undef USE_SNPRINTF | 5478 | #undef USE_SNPRINTF |
5479 | #undef DCHAR_SET | ||
5479 | #undef DCHAR_CPY | 5480 | #undef DCHAR_CPY |
5480 | #undef PRINTF_PARSE | 5481 | #undef PRINTF_PARSE |
5481 | #undef DIRECTIVES | 5482 | #undef DIRECTIVES |
diff --git a/gl/vasnprintf.h b/gl/vasnprintf.h index b9a3d6ed..a689bad2 100644 --- a/gl/vasnprintf.h +++ b/gl/vasnprintf.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* vsprintf with automatic memory allocation. | 1 | /* vsprintf with automatic memory allocation. |
2 | Copyright (C) 2002-2004, 2007-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2002-2004, 2007-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -25,15 +25,14 @@ | |||
25 | #include <stddef.h> | 25 | #include <stddef.h> |
26 | 26 | ||
27 | #ifndef __attribute__ | 27 | #ifndef __attribute__ |
28 | /* This feature is available in gcc versions 2.5 and later. */ | 28 | /* The __attribute__ feature is available in gcc versions 2.5 and later. |
29 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) | 29 | The __-protected variants of the attributes 'format' and 'printf' are |
30 | # define __attribute__(Spec) /* empty */ | 30 | accepted by gcc versions 2.6.4 (effectively 2.7) and later. |
31 | # endif | 31 | We enable __attribute__ only if these are supported too, because |
32 | /* The __-protected variants of `format' and `printf' attributes | 32 | gnulib and libintl do '#define printf __printf__' when they override |
33 | are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ | 33 | the 'printf' function. */ |
34 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) | 34 | # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) |
35 | # define __format__ format | 35 | # define __attribute__(Spec) /* empty */ |
36 | # define __printf__ printf | ||
37 | # endif | 36 | # endif |
38 | #endif | 37 | #endif |
39 | 38 | ||
diff --git a/gl/vasprintf.c b/gl/vasprintf.c index d1b81373..46486f3d 100644 --- a/gl/vasprintf.c +++ b/gl/vasprintf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Formatted output to strings. | 1 | /* Formatted output to strings. |
2 | Copyright (C) 1999, 2002, 2006-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc. |
3 | 3 | ||
4 | This program is free software; you can redistribute it and/or modify | 4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/verify.h b/gl/verify.h index fac53f6f..bcd3f5a0 100644 --- a/gl/verify.h +++ b/gl/verify.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Compile-time assert-like macros. | 1 | /* Compile-time assert-like macros. |
2 | 2 | ||
3 | Copyright (C) 2005, 2006 Free Software Foundation, Inc. | 3 | Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -110,8 +110,8 @@ | |||
110 | 110 | ||
111 | #if 4 <= __GNUC__ | 111 | #if 4 <= __GNUC__ |
112 | # define verify(R) \ | 112 | # define verify(R) \ |
113 | extern int (* verify_function__ (void)) \ | 113 | extern int (* verify_function__ (void)) \ |
114 | [__builtin_constant_p (R) && (R) ? 1 : -1] | 114 | [__builtin_constant_p (R) && (R) ? 1 : -1] |
115 | #endif | 115 | #endif |
116 | 116 | ||
117 | * In C++, any struct definition inside sizeof is invalid. | 117 | * In C++, any struct definition inside sizeof is invalid. |
diff --git a/gl/vsnprintf.c b/gl/vsnprintf.c index 02af2520..d447cc2d 100644 --- a/gl/vsnprintf.c +++ b/gl/vsnprintf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Formatted output to strings. | 1 | /* Formatted output to strings. |
2 | Copyright (C) 2004, 2006-2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2004, 2006-2010 Free Software Foundation, Inc. |
3 | Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>. | 3 | Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -52,11 +52,11 @@ vsnprintf (char *str, size_t size, const char *format, va_list args) | |||
52 | if (output != str) | 52 | if (output != str) |
53 | { | 53 | { |
54 | if (size) | 54 | if (size) |
55 | { | 55 | { |
56 | size_t pruned_len = (len < size ? len : size - 1); | 56 | size_t pruned_len = (len < size ? len : size - 1); |
57 | memcpy (str, output, pruned_len); | 57 | memcpy (str, output, pruned_len); |
58 | str[pruned_len] = '\0'; | 58 | str[pruned_len] = '\0'; |
59 | } | 59 | } |
60 | 60 | ||
61 | free (output); | 61 | free (output); |
62 | } | 62 | } |
diff --git a/gl/w32sock.h b/gl/w32sock.h new file mode 100644 index 00000000..b472bd05 --- /dev/null +++ b/gl/w32sock.h | |||
@@ -0,0 +1,61 @@ | |||
1 | /* w32sock.h --- internal auxilliary functions for Windows socket functions | ||
2 | |||
3 | Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. | ||
4 | |||
5 | This program is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | /* Written by Paolo Bonzini */ | ||
19 | |||
20 | #include <errno.h> | ||
21 | |||
22 | /* Get O_RDWR and O_BINARY. */ | ||
23 | #include <fcntl.h> | ||
24 | |||
25 | /* Get _get_osfhandle() and _open_osfhandle(). */ | ||
26 | #include <io.h> | ||
27 | |||
28 | #define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd))) | ||
29 | #define SOCKET_TO_FD(fh) (_open_osfhandle ((long) (fh), O_RDWR | O_BINARY)) | ||
30 | |||
31 | static inline void | ||
32 | set_winsock_errno (void) | ||
33 | { | ||
34 | int err = WSAGetLastError (); | ||
35 | |||
36 | /* Map some WSAE* errors to the runtime library's error codes. */ | ||
37 | switch (err) | ||
38 | { | ||
39 | case WSA_INVALID_HANDLE: | ||
40 | errno = EBADF; | ||
41 | break; | ||
42 | case WSA_NOT_ENOUGH_MEMORY: | ||
43 | errno = ENOMEM; | ||
44 | break; | ||
45 | case WSA_INVALID_PARAMETER: | ||
46 | errno = EINVAL; | ||
47 | break; | ||
48 | case WSAEWOULDBLOCK: | ||
49 | errno = EWOULDBLOCK; | ||
50 | break; | ||
51 | case WSAENAMETOOLONG: | ||
52 | errno = ENAMETOOLONG; | ||
53 | break; | ||
54 | case WSAENOTEMPTY: | ||
55 | errno = ENOTEMPTY; | ||
56 | break; | ||
57 | default: | ||
58 | errno = (err > 10000 && err < 10025) ? err - 10000 : err; | ||
59 | break; | ||
60 | } | ||
61 | } | ||
diff --git a/gl/wchar.in.h b/gl/wchar.in.h index cc5baad3..dd41d353 100644 --- a/gl/wchar.in.h +++ b/gl/wchar.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A substitute for ISO C99 <wchar.h>, for platforms that have issues. | 1 | /* A substitute for ISO C99 <wchar.h>, for platforms that have issues. |
2 | 2 | ||
3 | Copyright (C) 2007-2009 Free Software Foundation, Inc. | 3 | Copyright (C) 2007-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -30,9 +30,9 @@ | |||
30 | @PRAGMA_SYSTEM_HEADER@ | 30 | @PRAGMA_SYSTEM_HEADER@ |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | #if defined __need_mbstate_t || (defined __hpux && ((defined _INTTYPES_INCLUDED && !defined strtoimax) || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) || defined _GL_ALREADY_INCLUDING_WCHAR_H | 33 | #if defined __need_mbstate_t || defined __need_wint_t || (defined __hpux && ((defined _INTTYPES_INCLUDED && !defined strtoimax) || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) || defined _GL_ALREADY_INCLUDING_WCHAR_H |
34 | /* Special invocation convention: | 34 | /* Special invocation convention: |
35 | - Inside uClibc header files. | 35 | - Inside glibc and uClibc header files. |
36 | - On HP-UX 11.00 we have a sequence of nested includes | 36 | - On HP-UX 11.00 we have a sequence of nested includes |
37 | <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>, | 37 | <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>, |
38 | once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h> | 38 | once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h> |
@@ -55,10 +55,13 @@ | |||
55 | /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before | 55 | /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before |
56 | <wchar.h>. | 56 | <wchar.h>. |
57 | BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be | 57 | BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be |
58 | included before <wchar.h>. */ | 58 | included before <wchar.h>. |
59 | #include <stddef.h> | 59 | But avoid namespace pollution on glibc systems. */ |
60 | #include <stdio.h> | 60 | #ifndef __GLIBC__ |
61 | #include <time.h> | 61 | # include <stddef.h> |
62 | # include <stdio.h> | ||
63 | # include <time.h> | ||
64 | #endif | ||
62 | 65 | ||
63 | /* Include the original <wchar.h> if it exists. | 66 | /* Include the original <wchar.h> if it exists. |
64 | Some builds of uClibc lack it. */ | 67 | Some builds of uClibc lack it. */ |
@@ -72,19 +75,23 @@ | |||
72 | #ifndef _GL_WCHAR_H | 75 | #ifndef _GL_WCHAR_H |
73 | #define _GL_WCHAR_H | 76 | #define _GL_WCHAR_H |
74 | 77 | ||
75 | /* The definition of GL_LINK_WARNING is copied here. */ | 78 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
76 | 79 | ||
77 | #ifdef __cplusplus | 80 | /* The definition of _GL_ARG_NONNULL is copied here. */ |
78 | extern "C" { | ||
79 | #endif | ||
80 | 81 | ||
82 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
81 | 83 | ||
82 | /* Define wint_t. (Also done in wctype.in.h.) */ | 84 | |
85 | /* Define wint_t and WEOF. (Also done in wctype.in.h.) */ | ||
83 | #if !@HAVE_WINT_T@ && !defined wint_t | 86 | #if !@HAVE_WINT_T@ && !defined wint_t |
84 | # define wint_t int | 87 | # define wint_t int |
85 | # ifndef WEOF | 88 | # ifndef WEOF |
86 | # define WEOF -1 | 89 | # define WEOF -1 |
87 | # endif | 90 | # endif |
91 | #else | ||
92 | # ifndef WEOF | ||
93 | # define WEOF ((wint_t) -1) | ||
94 | # endif | ||
88 | #endif | 95 | #endif |
89 | 96 | ||
90 | 97 | ||
@@ -102,209 +109,320 @@ typedef int rpl_mbstate_t; | |||
102 | /* Convert a single-byte character to a wide character. */ | 109 | /* Convert a single-byte character to a wide character. */ |
103 | #if @GNULIB_BTOWC@ | 110 | #if @GNULIB_BTOWC@ |
104 | # if @REPLACE_BTOWC@ | 111 | # if @REPLACE_BTOWC@ |
105 | # undef btowc | 112 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
106 | # define btowc rpl_btowc | 113 | # undef btowc |
107 | # endif | 114 | # define btowc rpl_btowc |
108 | # if !@HAVE_BTOWC@ || @REPLACE_BTOWC@ | 115 | # endif |
109 | extern wint_t btowc (int c); | 116 | _GL_FUNCDECL_RPL (btowc, wint_t, (int c)); |
117 | _GL_CXXALIAS_RPL (btowc, wint_t, (int c)); | ||
118 | # else | ||
119 | # if !@HAVE_BTOWC@ | ||
120 | _GL_FUNCDECL_SYS (btowc, wint_t, (int c)); | ||
121 | # endif | ||
122 | _GL_CXXALIAS_SYS (btowc, wint_t, (int c)); | ||
110 | # endif | 123 | # endif |
124 | _GL_CXXALIASWARN (btowc); | ||
111 | #elif defined GNULIB_POSIXCHECK | 125 | #elif defined GNULIB_POSIXCHECK |
112 | # undef btowc | 126 | # undef btowc |
113 | # define btowc(c) \ | 127 | # if HAVE_RAW_DECL_BTOWC |
114 | (GL_LINK_WARNING ("btowc is unportable - " \ | 128 | _GL_WARN_ON_USE (btowc, "btowc is unportable - " |
115 | "use gnulib module btowc for portability"), \ | 129 | "use gnulib module btowc for portability"); |
116 | btowc (c)) | 130 | # endif |
117 | #endif | 131 | #endif |
118 | 132 | ||
119 | 133 | ||
120 | /* Convert a wide character to a single-byte character. */ | 134 | /* Convert a wide character to a single-byte character. */ |
121 | #if @GNULIB_WCTOB@ | 135 | #if @GNULIB_WCTOB@ |
122 | # if @REPLACE_WCTOB@ | 136 | # if @REPLACE_WCTOB@ |
123 | # undef wctob | 137 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
124 | # define wctob rpl_wctob | 138 | # undef wctob |
125 | # endif | 139 | # define wctob rpl_wctob |
126 | # if (!defined wctob && !@HAVE_DECL_WCTOB@) || @REPLACE_WCTOB@ | 140 | # endif |
141 | _GL_FUNCDECL_RPL (wctob, int, (wint_t wc)); | ||
142 | _GL_CXXALIAS_RPL (wctob, int, (wint_t wc)); | ||
143 | # else | ||
144 | # if !defined wctob && !@HAVE_DECL_WCTOB@ | ||
127 | /* wctob is provided by gnulib, or wctob exists but is not declared. */ | 145 | /* wctob is provided by gnulib, or wctob exists but is not declared. */ |
128 | extern int wctob (wint_t wc); | 146 | _GL_FUNCDECL_SYS (wctob, int, (wint_t wc)); |
147 | # endif | ||
148 | _GL_CXXALIAS_SYS (wctob, int, (wint_t wc)); | ||
129 | # endif | 149 | # endif |
150 | _GL_CXXALIASWARN (wctob); | ||
130 | #elif defined GNULIB_POSIXCHECK | 151 | #elif defined GNULIB_POSIXCHECK |
131 | # undef wctob | 152 | # undef wctob |
132 | # define wctob(w) \ | 153 | # if HAVE_RAW_DECL_WCTOB |
133 | (GL_LINK_WARNING ("wctob is unportable - " \ | 154 | _GL_WARN_ON_USE (wctob, "wctob is unportable - " |
134 | "use gnulib module wctob for portability"), \ | 155 | "use gnulib module wctob for portability"); |
135 | wctob (w)) | 156 | # endif |
136 | #endif | 157 | #endif |
137 | 158 | ||
138 | 159 | ||
139 | /* Test whether *PS is in the initial state. */ | 160 | /* Test whether *PS is in the initial state. */ |
140 | #if @GNULIB_MBSINIT@ | 161 | #if @GNULIB_MBSINIT@ |
141 | # if @REPLACE_MBSINIT@ | 162 | # if @REPLACE_MBSINIT@ |
142 | # undef mbsinit | 163 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
143 | # define mbsinit rpl_mbsinit | 164 | # undef mbsinit |
144 | # endif | 165 | # define mbsinit rpl_mbsinit |
145 | # if !@HAVE_MBSINIT@ || @REPLACE_MBSINIT@ | 166 | # endif |
146 | extern int mbsinit (const mbstate_t *ps); | 167 | _GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps)); |
168 | _GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps)); | ||
169 | # else | ||
170 | # if !@HAVE_MBSINIT@ | ||
171 | _GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps)); | ||
172 | # endif | ||
173 | _GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps)); | ||
147 | # endif | 174 | # endif |
175 | _GL_CXXALIASWARN (mbsinit); | ||
148 | #elif defined GNULIB_POSIXCHECK | 176 | #elif defined GNULIB_POSIXCHECK |
149 | # undef mbsinit | 177 | # undef mbsinit |
150 | # define mbsinit(p) \ | 178 | # if HAVE_RAW_DECL_MBSINIT |
151 | (GL_LINK_WARNING ("mbsinit is unportable - " \ | 179 | _GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - " |
152 | "use gnulib module mbsinit for portability"), \ | 180 | "use gnulib module mbsinit for portability"); |
153 | mbsinit (p)) | 181 | # endif |
154 | #endif | 182 | #endif |
155 | 183 | ||
156 | 184 | ||
157 | /* Convert a multibyte character to a wide character. */ | 185 | /* Convert a multibyte character to a wide character. */ |
158 | #if @GNULIB_MBRTOWC@ | 186 | #if @GNULIB_MBRTOWC@ |
159 | # if @REPLACE_MBRTOWC@ | 187 | # if @REPLACE_MBRTOWC@ |
160 | # undef mbrtowc | 188 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
161 | # define mbrtowc rpl_mbrtowc | 189 | # undef mbrtowc |
162 | # endif | 190 | # define mbrtowc rpl_mbrtowc |
163 | # if !@HAVE_MBRTOWC@ || @REPLACE_MBRTOWC@ | 191 | # endif |
164 | extern size_t mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps); | 192 | _GL_FUNCDECL_RPL (mbrtowc, size_t, |
193 | (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); | ||
194 | _GL_CXXALIAS_RPL (mbrtowc, size_t, | ||
195 | (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); | ||
196 | # else | ||
197 | # if !@HAVE_MBRTOWC@ | ||
198 | _GL_FUNCDECL_SYS (mbrtowc, size_t, | ||
199 | (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); | ||
200 | # endif | ||
201 | _GL_CXXALIAS_SYS (mbrtowc, size_t, | ||
202 | (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)); | ||
165 | # endif | 203 | # endif |
204 | _GL_CXXALIASWARN (mbrtowc); | ||
166 | #elif defined GNULIB_POSIXCHECK | 205 | #elif defined GNULIB_POSIXCHECK |
167 | # undef mbrtowc | 206 | # undef mbrtowc |
168 | # define mbrtowc(w,s,n,p) \ | 207 | # if HAVE_RAW_DECL_MBRTOWC |
169 | (GL_LINK_WARNING ("mbrtowc is unportable - " \ | 208 | _GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - " |
170 | "use gnulib module mbrtowc for portability"), \ | 209 | "use gnulib module mbrtowc for portability"); |
171 | mbrtowc (w, s, n, p)) | 210 | # endif |
172 | #endif | 211 | #endif |
173 | 212 | ||
174 | 213 | ||
175 | /* Recognize a multibyte character. */ | 214 | /* Recognize a multibyte character. */ |
176 | #if @GNULIB_MBRLEN@ | 215 | #if @GNULIB_MBRLEN@ |
177 | # if @REPLACE_MBRLEN@ | 216 | # if @REPLACE_MBRLEN@ |
178 | # undef mbrlen | 217 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
179 | # define mbrlen rpl_mbrlen | 218 | # undef mbrlen |
180 | # endif | 219 | # define mbrlen rpl_mbrlen |
181 | # if !@HAVE_MBRLEN@ || @REPLACE_MBRLEN@ | 220 | # endif |
182 | extern size_t mbrlen (const char *s, size_t n, mbstate_t *ps); | 221 | _GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); |
222 | _GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); | ||
223 | # else | ||
224 | # if !@HAVE_MBRLEN@ | ||
225 | _GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); | ||
226 | # endif | ||
227 | _GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps)); | ||
183 | # endif | 228 | # endif |
229 | _GL_CXXALIASWARN (mbrlen); | ||
184 | #elif defined GNULIB_POSIXCHECK | 230 | #elif defined GNULIB_POSIXCHECK |
185 | # undef mbrlen | 231 | # undef mbrlen |
186 | # define mbrlen(s,n,p) \ | 232 | # if HAVE_RAW_DECL_MBRLEN |
187 | (GL_LINK_WARNING ("mbrlen is unportable - " \ | 233 | _GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - " |
188 | "use gnulib module mbrlen for portability"), \ | 234 | "use gnulib module mbrlen for portability"); |
189 | mbrlen (s, n, p)) | 235 | # endif |
190 | #endif | 236 | #endif |
191 | 237 | ||
192 | 238 | ||
193 | /* Convert a string to a wide string. */ | 239 | /* Convert a string to a wide string. */ |
194 | #if @GNULIB_MBSRTOWCS@ | 240 | #if @GNULIB_MBSRTOWCS@ |
195 | # if @REPLACE_MBSRTOWCS@ | 241 | # if @REPLACE_MBSRTOWCS@ |
196 | # undef mbsrtowcs | 242 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
197 | # define mbsrtowcs rpl_mbsrtowcs | 243 | # undef mbsrtowcs |
198 | # endif | 244 | # define mbsrtowcs rpl_mbsrtowcs |
199 | # if !@HAVE_MBSRTOWCS@ || @REPLACE_MBSRTOWCS@ | 245 | # endif |
200 | extern size_t mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps); | 246 | _GL_FUNCDECL_RPL (mbsrtowcs, size_t, |
247 | (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps) | ||
248 | _GL_ARG_NONNULL ((2))); | ||
249 | _GL_CXXALIAS_RPL (mbsrtowcs, size_t, | ||
250 | (wchar_t *dest, const char **srcp, size_t len, | ||
251 | mbstate_t *ps)); | ||
252 | # else | ||
253 | # if !@HAVE_MBSRTOWCS@ | ||
254 | _GL_FUNCDECL_SYS (mbsrtowcs, size_t, | ||
255 | (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps) | ||
256 | _GL_ARG_NONNULL ((2))); | ||
257 | # endif | ||
258 | _GL_CXXALIAS_SYS (mbsrtowcs, size_t, | ||
259 | (wchar_t *dest, const char **srcp, size_t len, | ||
260 | mbstate_t *ps)); | ||
201 | # endif | 261 | # endif |
262 | _GL_CXXALIASWARN (mbsrtowcs); | ||
202 | #elif defined GNULIB_POSIXCHECK | 263 | #elif defined GNULIB_POSIXCHECK |
203 | # undef mbsrtowcs | 264 | # undef mbsrtowcs |
204 | # define mbsrtowcs(d,s,l,p) \ | 265 | # if HAVE_RAW_DECL_MBSRTOWCS |
205 | (GL_LINK_WARNING ("mbsrtowcs is unportable - " \ | 266 | _GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - " |
206 | "use gnulib module mbsrtowcs for portability"), \ | 267 | "use gnulib module mbsrtowcs for portability"); |
207 | mbsrtowcs (d, s, l, p)) | 268 | # endif |
208 | #endif | 269 | #endif |
209 | 270 | ||
210 | 271 | ||
211 | /* Convert a string to a wide string. */ | 272 | /* Convert a string to a wide string. */ |
212 | #if @GNULIB_MBSNRTOWCS@ | 273 | #if @GNULIB_MBSNRTOWCS@ |
213 | # if @REPLACE_MBSNRTOWCS@ | 274 | # if @REPLACE_MBSNRTOWCS@ |
214 | # undef mbsnrtowcs | 275 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
215 | # define mbsnrtowcs rpl_mbsnrtowcs | 276 | # undef mbsnrtowcs |
216 | # endif | 277 | # define mbsnrtowcs rpl_mbsnrtowcs |
217 | # if !@HAVE_MBSNRTOWCS@ || @REPLACE_MBSNRTOWCS@ | 278 | # endif |
218 | extern size_t mbsnrtowcs (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps); | 279 | _GL_FUNCDECL_RPL (mbsnrtowcs, size_t, |
280 | (wchar_t *dest, const char **srcp, size_t srclen, size_t len, | ||
281 | mbstate_t *ps) | ||
282 | _GL_ARG_NONNULL ((2))); | ||
283 | _GL_CXXALIAS_RPL (mbsnrtowcs, size_t, | ||
284 | (wchar_t *dest, const char **srcp, size_t srclen, size_t len, | ||
285 | mbstate_t *ps)); | ||
286 | # else | ||
287 | # if !@HAVE_MBSNRTOWCS@ | ||
288 | _GL_FUNCDECL_SYS (mbsnrtowcs, size_t, | ||
289 | (wchar_t *dest, const char **srcp, size_t srclen, size_t len, | ||
290 | mbstate_t *ps) | ||
291 | _GL_ARG_NONNULL ((2))); | ||
292 | # endif | ||
293 | _GL_CXXALIAS_SYS (mbsnrtowcs, size_t, | ||
294 | (wchar_t *dest, const char **srcp, size_t srclen, size_t len, | ||
295 | mbstate_t *ps)); | ||
219 | # endif | 296 | # endif |
297 | _GL_CXXALIASWARN (mbsnrtowcs); | ||
220 | #elif defined GNULIB_POSIXCHECK | 298 | #elif defined GNULIB_POSIXCHECK |
221 | # undef mbsnrtowcs | 299 | # undef mbsnrtowcs |
222 | # define mbsnrtowcs(d,s,n,l,p) \ | 300 | # if HAVE_RAW_DECL_MBSNRTOWCS |
223 | (GL_LINK_WARNING ("mbsnrtowcs is unportable - " \ | 301 | _GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - " |
224 | "use gnulib module mbsnrtowcs for portability"), \ | 302 | "use gnulib module mbsnrtowcs for portability"); |
225 | mbsnrtowcs (d, s, n, l, p)) | 303 | # endif |
226 | #endif | 304 | #endif |
227 | 305 | ||
228 | 306 | ||
229 | /* Convert a wide character to a multibyte character. */ | 307 | /* Convert a wide character to a multibyte character. */ |
230 | #if @GNULIB_WCRTOMB@ | 308 | #if @GNULIB_WCRTOMB@ |
231 | # if @REPLACE_WCRTOMB@ | 309 | # if @REPLACE_WCRTOMB@ |
232 | # undef wcrtomb | 310 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
233 | # define wcrtomb rpl_wcrtomb | 311 | # undef wcrtomb |
234 | # endif | 312 | # define wcrtomb rpl_wcrtomb |
235 | # if !@HAVE_WCRTOMB@ || @REPLACE_WCRTOMB@ | 313 | # endif |
236 | extern size_t wcrtomb (char *s, wchar_t wc, mbstate_t *ps); | 314 | _GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); |
315 | _GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); | ||
316 | # else | ||
317 | # if !@HAVE_WCRTOMB@ | ||
318 | _GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); | ||
319 | # endif | ||
320 | _GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps)); | ||
237 | # endif | 321 | # endif |
322 | _GL_CXXALIASWARN (wcrtomb); | ||
238 | #elif defined GNULIB_POSIXCHECK | 323 | #elif defined GNULIB_POSIXCHECK |
239 | # undef wcrtomb | 324 | # undef wcrtomb |
240 | # define wcrtomb(s,w,p) \ | 325 | # if HAVE_RAW_DECL_WCRTOMB |
241 | (GL_LINK_WARNING ("wcrtomb is unportable - " \ | 326 | _GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - " |
242 | "use gnulib module wcrtomb for portability"), \ | 327 | "use gnulib module wcrtomb for portability"); |
243 | wcrtomb (s, w, p)) | 328 | # endif |
244 | #endif | 329 | #endif |
245 | 330 | ||
246 | 331 | ||
247 | /* Convert a wide string to a string. */ | 332 | /* Convert a wide string to a string. */ |
248 | #if @GNULIB_WCSRTOMBS@ | 333 | #if @GNULIB_WCSRTOMBS@ |
249 | # if @REPLACE_WCSRTOMBS@ | 334 | # if @REPLACE_WCSRTOMBS@ |
250 | # undef wcsrtombs | 335 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
251 | # define wcsrtombs rpl_wcsrtombs | 336 | # undef wcsrtombs |
252 | # endif | 337 | # define wcsrtombs rpl_wcsrtombs |
253 | # if !@HAVE_WCSRTOMBS@ || @REPLACE_WCSRTOMBS@ | 338 | # endif |
254 | extern size_t wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps); | 339 | _GL_FUNCDECL_RPL (wcsrtombs, size_t, |
340 | (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) | ||
341 | _GL_ARG_NONNULL ((2))); | ||
342 | _GL_CXXALIAS_RPL (wcsrtombs, size_t, | ||
343 | (char *dest, const wchar_t **srcp, size_t len, | ||
344 | mbstate_t *ps)); | ||
345 | # else | ||
346 | # if !@HAVE_WCSRTOMBS@ | ||
347 | _GL_FUNCDECL_SYS (wcsrtombs, size_t, | ||
348 | (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) | ||
349 | _GL_ARG_NONNULL ((2))); | ||
350 | # endif | ||
351 | _GL_CXXALIAS_SYS (wcsrtombs, size_t, | ||
352 | (char *dest, const wchar_t **srcp, size_t len, | ||
353 | mbstate_t *ps)); | ||
255 | # endif | 354 | # endif |
355 | _GL_CXXALIASWARN (wcsrtombs); | ||
256 | #elif defined GNULIB_POSIXCHECK | 356 | #elif defined GNULIB_POSIXCHECK |
257 | # undef wcsrtombs | 357 | # undef wcsrtombs |
258 | # define wcsrtombs(d,s,l,p) \ | 358 | # if HAVE_RAW_DECL_WCSRTOMBS |
259 | (GL_LINK_WARNING ("wcsrtombs is unportable - " \ | 359 | _GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - " |
260 | "use gnulib module wcsrtombs for portability"), \ | 360 | "use gnulib module wcsrtombs for portability"); |
261 | wcsrtombs (d, s, l, p)) | 361 | # endif |
262 | #endif | 362 | #endif |
263 | 363 | ||
264 | 364 | ||
265 | /* Convert a wide string to a string. */ | 365 | /* Convert a wide string to a string. */ |
266 | #if @GNULIB_WCSNRTOMBS@ | 366 | #if @GNULIB_WCSNRTOMBS@ |
267 | # if @REPLACE_WCSNRTOMBS@ | 367 | # if @REPLACE_WCSNRTOMBS@ |
268 | # undef wcsnrtombs | 368 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
269 | # define wcsnrtombs rpl_wcsnrtombs | 369 | # undef wcsnrtombs |
270 | # endif | 370 | # define wcsnrtombs rpl_wcsnrtombs |
271 | # if !@HAVE_WCSNRTOMBS@ || @REPLACE_WCSNRTOMBS@ | 371 | # endif |
272 | extern size_t wcsnrtombs (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps); | 372 | _GL_FUNCDECL_RPL (wcsnrtombs, size_t, |
373 | (char *dest, const wchar_t **srcp, size_t srclen, size_t len, | ||
374 | mbstate_t *ps) | ||
375 | _GL_ARG_NONNULL ((2))); | ||
376 | _GL_CXXALIAS_RPL (wcsnrtombs, size_t, | ||
377 | (char *dest, const wchar_t **srcp, size_t srclen, size_t len, | ||
378 | mbstate_t *ps)); | ||
379 | # else | ||
380 | # if !@HAVE_WCSNRTOMBS@ | ||
381 | _GL_FUNCDECL_SYS (wcsnrtombs, size_t, | ||
382 | (char *dest, const wchar_t **srcp, size_t srclen, size_t len, | ||
383 | mbstate_t *ps) | ||
384 | _GL_ARG_NONNULL ((2))); | ||
385 | # endif | ||
386 | _GL_CXXALIAS_SYS (wcsnrtombs, size_t, | ||
387 | (char *dest, const wchar_t **srcp, size_t srclen, size_t len, | ||
388 | mbstate_t *ps)); | ||
273 | # endif | 389 | # endif |
390 | _GL_CXXALIASWARN (wcsnrtombs); | ||
274 | #elif defined GNULIB_POSIXCHECK | 391 | #elif defined GNULIB_POSIXCHECK |
275 | # undef wcsnrtombs | 392 | # undef wcsnrtombs |
276 | # define wcsnrtombs(d,s,n,l,p) \ | 393 | # if HAVE_RAW_DECL_WCSNRTOMBS |
277 | (GL_LINK_WARNING ("wcsnrtombs is unportable - " \ | 394 | _GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - " |
278 | "use gnulib module wcsnrtombs for portability"), \ | 395 | "use gnulib module wcsnrtombs for portability"); |
279 | wcsnrtombs (d, s, n, l, p)) | 396 | # endif |
280 | #endif | 397 | #endif |
281 | 398 | ||
282 | 399 | ||
283 | /* Return the number of screen columns needed for WC. */ | 400 | /* Return the number of screen columns needed for WC. */ |
284 | #if @GNULIB_WCWIDTH@ | 401 | #if @GNULIB_WCWIDTH@ |
285 | # if @REPLACE_WCWIDTH@ | 402 | # if @REPLACE_WCWIDTH@ |
286 | # undef wcwidth | 403 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
287 | # define wcwidth rpl_wcwidth | 404 | # undef wcwidth |
288 | extern int wcwidth (wchar_t); | 405 | # define wcwidth rpl_wcwidth |
406 | # endif | ||
407 | _GL_FUNCDECL_RPL (wcwidth, int, (wchar_t)); | ||
408 | _GL_CXXALIAS_RPL (wcwidth, int, (wchar_t)); | ||
289 | # else | 409 | # else |
290 | # if !defined wcwidth && !@HAVE_DECL_WCWIDTH@ | 410 | # if !defined wcwidth && !@HAVE_DECL_WCWIDTH@ |
291 | /* wcwidth exists but is not declared. */ | 411 | /* wcwidth exists but is not declared. */ |
292 | extern int wcwidth (int /* actually wchar_t */); | 412 | _GL_FUNCDECL_SYS (wcwidth, int, (wchar_t)); |
293 | # endif | 413 | # endif |
414 | _GL_CXXALIAS_SYS (wcwidth, int, (wchar_t)); | ||
294 | # endif | 415 | # endif |
416 | _GL_CXXALIASWARN (wcwidth); | ||
295 | #elif defined GNULIB_POSIXCHECK | 417 | #elif defined GNULIB_POSIXCHECK |
296 | # undef wcwidth | 418 | # undef wcwidth |
297 | # define wcwidth(w) \ | 419 | # if HAVE_RAW_DECL_WCWIDTH |
298 | (GL_LINK_WARNING ("wcwidth is unportable - " \ | 420 | _GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - " |
299 | "use gnulib module wcwidth for portability"), \ | 421 | "use gnulib module wcwidth for portability"); |
300 | wcwidth (w)) | 422 | # endif |
301 | #endif | 423 | #endif |
302 | 424 | ||
303 | 425 | ||
304 | #ifdef __cplusplus | ||
305 | } | ||
306 | #endif | ||
307 | |||
308 | #endif /* _GL_WCHAR_H */ | 426 | #endif /* _GL_WCHAR_H */ |
309 | #endif /* _GL_WCHAR_H */ | 427 | #endif /* _GL_WCHAR_H */ |
310 | #endif | 428 | #endif |
diff --git a/gl/wcrtomb.c b/gl/wcrtomb.c index 79df99f2..e7345f69 100644 --- a/gl/wcrtomb.c +++ b/gl/wcrtomb.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Convert wide character to multibyte character. | 1 | /* Convert wide character to multibyte character. |
2 | Copyright (C) 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2008. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
@@ -43,11 +43,11 @@ wcrtomb (char *s, wchar_t wc, mbstate_t *ps) | |||
43 | int ret = wctomb (s, wc); | 43 | int ret = wctomb (s, wc); |
44 | 44 | ||
45 | if (ret >= 0) | 45 | if (ret >= 0) |
46 | return ret; | 46 | return ret; |
47 | else | 47 | else |
48 | { | 48 | { |
49 | errno = EILSEQ; | 49 | errno = EILSEQ; |
50 | return (size_t)(-1); | 50 | return (size_t)(-1); |
51 | } | 51 | } |
52 | } | 52 | } |
53 | } | 53 | } |
diff --git a/gl/wctype.in.h b/gl/wctype.in.h index f008d8ff..0f0859c3 100644 --- a/gl/wctype.in.h +++ b/gl/wctype.in.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* A substitute for ISO C99 <wctype.h>, for platforms that lack it. | 1 | /* A substitute for ISO C99 <wctype.h>, for platforms that lack it. |
2 | 2 | ||
3 | Copyright (C) 2006-2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2006-2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
@@ -54,17 +54,27 @@ | |||
54 | #ifndef _GL_WCTYPE_H | 54 | #ifndef _GL_WCTYPE_H |
55 | #define _GL_WCTYPE_H | 55 | #define _GL_WCTYPE_H |
56 | 56 | ||
57 | /* Define wint_t. (Also done in wchar.in.h.) */ | 57 | /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
58 | |||
59 | /* The definition of _GL_WARN_ON_USE is copied here. */ | ||
60 | |||
61 | /* Define wint_t and WEOF. (Also done in wchar.in.h.) */ | ||
58 | #if !@HAVE_WINT_T@ && !defined wint_t | 62 | #if !@HAVE_WINT_T@ && !defined wint_t |
59 | # define wint_t int | 63 | # define wint_t int |
60 | # ifndef WEOF | 64 | # ifndef WEOF |
61 | # define WEOF -1 | 65 | # define WEOF -1 |
62 | # endif | 66 | # endif |
67 | #else | ||
68 | # ifndef WEOF | ||
69 | # define WEOF ((wint_t) -1) | ||
70 | # endif | ||
63 | #endif | 71 | #endif |
64 | 72 | ||
73 | |||
65 | /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions. | 74 | /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions. |
66 | Linux libc5 has <wctype.h> and the functions but they are broken. | 75 | Linux libc5 has <wctype.h> and the functions but they are broken. |
67 | Assume all 12 functions are implemented the same way, or not at all. */ | 76 | Assume all 11 functions (all isw* except iswblank) are implemented the |
77 | same way, or not at all. */ | ||
68 | #if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@ | 78 | #if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@ |
69 | 79 | ||
70 | /* IRIX 5.3 has macros but no functions, its isw* macros refer to an | 80 | /* IRIX 5.3 has macros but no functions, its isw* macros refer to an |
@@ -72,21 +82,24 @@ | |||
72 | refer to system functions like _iswctype that are not in the | 82 | refer to system functions like _iswctype that are not in the |
73 | standard C library. Rather than try to get ancient buggy | 83 | standard C library. Rather than try to get ancient buggy |
74 | implementations like this to work, just disable them. */ | 84 | implementations like this to work, just disable them. */ |
75 | # undef iswalnum | 85 | # undef iswalnum |
76 | # undef iswalpha | 86 | # undef iswalpha |
77 | # undef iswblank | 87 | # undef iswblank |
78 | # undef iswcntrl | 88 | # undef iswcntrl |
79 | # undef iswdigit | 89 | # undef iswdigit |
80 | # undef iswgraph | 90 | # undef iswgraph |
81 | # undef iswlower | 91 | # undef iswlower |
82 | # undef iswprint | 92 | # undef iswprint |
83 | # undef iswpunct | 93 | # undef iswpunct |
84 | # undef iswspace | 94 | # undef iswspace |
85 | # undef iswupper | 95 | # undef iswupper |
86 | # undef iswxdigit | 96 | # undef iswxdigit |
97 | # undef towlower | ||
98 | # undef towupper | ||
87 | 99 | ||
88 | /* Linux libc5 has <wctype.h> and the functions but they are broken. */ | 100 | /* Linux libc5 has <wctype.h> and the functions but they are broken. */ |
89 | # if @REPLACE_ISWCNTRL@ | 101 | # if @REPLACE_ISWCNTRL@ |
102 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
90 | # define iswalnum rpl_iswalnum | 103 | # define iswalnum rpl_iswalnum |
91 | # define iswalpha rpl_iswalpha | 104 | # define iswalpha rpl_iswalpha |
92 | # define iswblank rpl_iswblank | 105 | # define iswblank rpl_iswblank |
@@ -99,86 +112,266 @@ | |||
99 | # define iswspace rpl_iswspace | 112 | # define iswspace rpl_iswspace |
100 | # define iswupper rpl_iswupper | 113 | # define iswupper rpl_iswupper |
101 | # define iswxdigit rpl_iswxdigit | 114 | # define iswxdigit rpl_iswxdigit |
115 | # define towlower rpl_towlower | ||
116 | # define towupper rpl_towupper | ||
102 | # endif | 117 | # endif |
118 | # endif | ||
103 | 119 | ||
104 | static inline int | 120 | static inline int |
105 | iswalnum (wint_t wc) | 121 | # if @REPLACE_ISWCNTRL@ |
122 | rpl_iswalnum | ||
123 | # else | ||
124 | iswalnum | ||
125 | # endif | ||
126 | (wint_t wc) | ||
106 | { | 127 | { |
107 | return ((wc >= '0' && wc <= '9') | 128 | return ((wc >= '0' && wc <= '9') |
108 | || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')); | 129 | || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')); |
109 | } | 130 | } |
110 | 131 | ||
111 | static inline int | 132 | static inline int |
112 | iswalpha (wint_t wc) | 133 | # if @REPLACE_ISWCNTRL@ |
134 | rpl_iswalpha | ||
135 | # else | ||
136 | iswalpha | ||
137 | # endif | ||
138 | (wint_t wc) | ||
113 | { | 139 | { |
114 | return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'; | 140 | return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'; |
115 | } | 141 | } |
116 | 142 | ||
117 | static inline int | 143 | static inline int |
118 | iswblank (wint_t wc) | 144 | # if @REPLACE_ISWCNTRL@ |
145 | rpl_iswblank | ||
146 | # else | ||
147 | iswblank | ||
148 | # endif | ||
149 | (wint_t wc) | ||
119 | { | 150 | { |
120 | return wc == ' ' || wc == '\t'; | 151 | return wc == ' ' || wc == '\t'; |
121 | } | 152 | } |
122 | 153 | ||
123 | static inline int | 154 | static inline int |
124 | iswcntrl (wint_t wc) | 155 | # if @REPLACE_ISWCNTRL@ |
156 | rpl_iswcntrl | ||
157 | # else | ||
158 | iswcntrl | ||
159 | # endif | ||
160 | (wint_t wc) | ||
125 | { | 161 | { |
126 | return (wc & ~0x1f) == 0 || wc == 0x7f; | 162 | return (wc & ~0x1f) == 0 || wc == 0x7f; |
127 | } | 163 | } |
128 | 164 | ||
129 | static inline int | 165 | static inline int |
130 | iswdigit (wint_t wc) | 166 | # if @REPLACE_ISWCNTRL@ |
167 | rpl_iswdigit | ||
168 | # else | ||
169 | iswdigit | ||
170 | # endif | ||
171 | (wint_t wc) | ||
131 | { | 172 | { |
132 | return wc >= '0' && wc <= '9'; | 173 | return wc >= '0' && wc <= '9'; |
133 | } | 174 | } |
134 | 175 | ||
135 | static inline int | 176 | static inline int |
136 | iswgraph (wint_t wc) | 177 | # if @REPLACE_ISWCNTRL@ |
178 | rpl_iswgraph | ||
179 | # else | ||
180 | iswgraph | ||
181 | # endif | ||
182 | (wint_t wc) | ||
137 | { | 183 | { |
138 | return wc >= '!' && wc <= '~'; | 184 | return wc >= '!' && wc <= '~'; |
139 | } | 185 | } |
140 | 186 | ||
141 | static inline int | 187 | static inline int |
142 | iswlower (wint_t wc) | 188 | # if @REPLACE_ISWCNTRL@ |
189 | rpl_iswlower | ||
190 | # else | ||
191 | iswlower | ||
192 | # endif | ||
193 | (wint_t wc) | ||
143 | { | 194 | { |
144 | return wc >= 'a' && wc <= 'z'; | 195 | return wc >= 'a' && wc <= 'z'; |
145 | } | 196 | } |
146 | 197 | ||
147 | static inline int | 198 | static inline int |
148 | iswprint (wint_t wc) | 199 | # if @REPLACE_ISWCNTRL@ |
200 | rpl_iswprint | ||
201 | # else | ||
202 | iswprint | ||
203 | # endif | ||
204 | (wint_t wc) | ||
149 | { | 205 | { |
150 | return wc >= ' ' && wc <= '~'; | 206 | return wc >= ' ' && wc <= '~'; |
151 | } | 207 | } |
152 | 208 | ||
153 | static inline int | 209 | static inline int |
154 | iswpunct (wint_t wc) | 210 | # if @REPLACE_ISWCNTRL@ |
211 | rpl_iswpunct | ||
212 | # else | ||
213 | iswpunct | ||
214 | # endif | ||
215 | (wint_t wc) | ||
155 | { | 216 | { |
156 | return (wc >= '!' && wc <= '~' | 217 | return (wc >= '!' && wc <= '~' |
157 | && !((wc >= '0' && wc <= '9') | 218 | && !((wc >= '0' && wc <= '9') |
158 | || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'))); | 219 | || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'))); |
159 | } | 220 | } |
160 | 221 | ||
161 | static inline int | 222 | static inline int |
162 | iswspace (wint_t wc) | 223 | # if @REPLACE_ISWCNTRL@ |
224 | rpl_iswspace | ||
225 | # else | ||
226 | iswspace | ||
227 | # endif | ||
228 | (wint_t wc) | ||
163 | { | 229 | { |
164 | return (wc == ' ' || wc == '\t' | 230 | return (wc == ' ' || wc == '\t' |
165 | || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r'); | 231 | || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r'); |
166 | } | 232 | } |
167 | 233 | ||
168 | static inline int | 234 | static inline int |
169 | iswupper (wint_t wc) | 235 | # if @REPLACE_ISWCNTRL@ |
236 | rpl_iswupper | ||
237 | # else | ||
238 | iswupper | ||
239 | # endif | ||
240 | (wint_t wc) | ||
170 | { | 241 | { |
171 | return wc >= 'A' && wc <= 'Z'; | 242 | return wc >= 'A' && wc <= 'Z'; |
172 | } | 243 | } |
173 | 244 | ||
174 | static inline int | 245 | static inline int |
175 | iswxdigit (wint_t wc) | 246 | # if @REPLACE_ISWCNTRL@ |
247 | rpl_iswxdigit | ||
248 | # else | ||
249 | iswxdigit | ||
250 | # endif | ||
251 | (wint_t wc) | ||
176 | { | 252 | { |
177 | return ((wc >= '0' && wc <= '9') | 253 | return ((wc >= '0' && wc <= '9') |
178 | || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')); | 254 | || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')); |
179 | } | 255 | } |
180 | 256 | ||
181 | # endif /* ! HAVE_ISWCNTRL */ | 257 | static inline wint_t |
258 | # if @REPLACE_ISWCNTRL@ | ||
259 | rpl_towlower | ||
260 | # else | ||
261 | towlower | ||
262 | # endif | ||
263 | (wint_t wc) | ||
264 | { | ||
265 | return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc); | ||
266 | } | ||
267 | |||
268 | static inline wint_t | ||
269 | # if @REPLACE_ISWCNTRL@ | ||
270 | rpl_towupper | ||
271 | # else | ||
272 | towupper | ||
273 | # endif | ||
274 | (wint_t wc) | ||
275 | { | ||
276 | return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc); | ||
277 | } | ||
278 | |||
279 | #elif ! @HAVE_ISWBLANK@ | ||
280 | /* Only the iswblank function is missing. */ | ||
281 | |||
282 | static inline int | ||
283 | iswblank (wint_t wc) | ||
284 | { | ||
285 | return wc == ' ' || wc == '\t'; | ||
286 | } | ||
287 | |||
288 | #endif | ||
289 | |||
290 | #if defined __MINGW32__ | ||
291 | |||
292 | /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t. | ||
293 | The functions towlower and towupper are implemented in the MSVCRT library | ||
294 | to take a wchar_t argument and return a wchar_t result. mingw declares | ||
295 | these functions to take a wint_t argument and return a wint_t result. | ||
296 | This means that: | ||
297 | 1. When the user passes an argument outside the range 0x0000..0xFFFF, the | ||
298 | function will look only at the lower 16 bits. This is allowed according | ||
299 | to POSIX. | ||
300 | 2. The return value is returned in the lower 16 bits of the result register. | ||
301 | The upper 16 bits are random: whatever happened to be in that part of the | ||
302 | result register. We need to fix this by adding a zero-extend from | ||
303 | wchar_t to wint_t after the call. */ | ||
304 | |||
305 | static inline wint_t | ||
306 | rpl_towlower (wint_t wc) | ||
307 | { | ||
308 | return (wint_t) (wchar_t) towlower (wc); | ||
309 | } | ||
310 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
311 | # define towlower rpl_towlower | ||
312 | # endif | ||
313 | |||
314 | static inline wint_t | ||
315 | rpl_towupper (wint_t wc) | ||
316 | { | ||
317 | return (wint_t) (wchar_t) towupper (wc); | ||
318 | } | ||
319 | # if !(defined __cplusplus && defined GNULIB_NAMESPACE) | ||
320 | # define towupper rpl_towupper | ||
321 | # endif | ||
322 | |||
323 | #endif /* __MINGW32__ */ | ||
324 | |||
325 | #if @REPLACE_ISWCNTRL@ | ||
326 | _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc)); | ||
327 | _GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc)); | ||
328 | _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc)); | ||
329 | _GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc)); | ||
330 | _GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc)); | ||
331 | _GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc)); | ||
332 | _GL_CXXALIAS_RPL (iswlower, int, (wint_t wc)); | ||
333 | _GL_CXXALIAS_RPL (iswprint, int, (wint_t wc)); | ||
334 | _GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc)); | ||
335 | _GL_CXXALIAS_RPL (iswspace, int, (wint_t wc)); | ||
336 | _GL_CXXALIAS_RPL (iswupper, int, (wint_t wc)); | ||
337 | _GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc)); | ||
338 | #else | ||
339 | _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc)); | ||
340 | _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc)); | ||
341 | _GL_CXXALIAS_SYS (iswblank, int, (wint_t wc)); | ||
342 | _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc)); | ||
343 | _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc)); | ||
344 | _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc)); | ||
345 | _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc)); | ||
346 | _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc)); | ||
347 | _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc)); | ||
348 | _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc)); | ||
349 | _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc)); | ||
350 | _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc)); | ||
351 | #endif | ||
352 | _GL_CXXALIASWARN (iswalnum); | ||
353 | _GL_CXXALIASWARN (iswalpha); | ||
354 | _GL_CXXALIASWARN (iswblank); | ||
355 | _GL_CXXALIASWARN (iswcntrl); | ||
356 | _GL_CXXALIASWARN (iswdigit); | ||
357 | _GL_CXXALIASWARN (iswgraph); | ||
358 | _GL_CXXALIASWARN (iswlower); | ||
359 | _GL_CXXALIASWARN (iswprint); | ||
360 | _GL_CXXALIASWARN (iswpunct); | ||
361 | _GL_CXXALIASWARN (iswspace); | ||
362 | _GL_CXXALIASWARN (iswupper); | ||
363 | _GL_CXXALIASWARN (iswxdigit); | ||
364 | |||
365 | #if @REPLACE_ISWCNTRL@ || defined __MINGW32__ | ||
366 | _GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc)); | ||
367 | _GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc)); | ||
368 | #else | ||
369 | _GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc)); | ||
370 | _GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc)); | ||
371 | #endif | ||
372 | _GL_CXXALIASWARN (towlower); | ||
373 | _GL_CXXALIASWARN (towupper); | ||
374 | |||
182 | 375 | ||
183 | #endif /* _GL_WCTYPE_H */ | 376 | #endif /* _GL_WCTYPE_H */ |
184 | #endif /* _GL_WCTYPE_H */ | 377 | #endif /* _GL_WCTYPE_H */ |
@@ -1,5 +1,5 @@ | |||
1 | /* POSIX compatible write() function. | 1 | /* POSIX compatible write() function. |
2 | Copyright (C) 2008 Free Software Foundation, Inc. | 2 | Copyright (C) 2008-2010 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2008. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2008. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
@@ -46,14 +46,14 @@ rpl_write (int fd, const void *buf, size_t count) | |||
46 | if (ret < 0) | 46 | if (ret < 0) |
47 | { | 47 | { |
48 | if (GetLastError () == ERROR_NO_DATA | 48 | if (GetLastError () == ERROR_NO_DATA |
49 | && GetFileType (_get_osfhandle (fd)) == FILE_TYPE_PIPE) | 49 | && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE) |
50 | { | 50 | { |
51 | /* Try to raise signal SIGPIPE. */ | 51 | /* Try to raise signal SIGPIPE. */ |
52 | raise (SIGPIPE); | 52 | raise (SIGPIPE); |
53 | /* If it is currently blocked or ignored, change errno from EINVAL | 53 | /* If it is currently blocked or ignored, change errno from EINVAL |
54 | to EPIPE. */ | 54 | to EPIPE. */ |
55 | errno = EPIPE; | 55 | errno = EPIPE; |
56 | } | 56 | } |
57 | } | 57 | } |
58 | return ret; | 58 | return ret; |
59 | } | 59 | } |
diff --git a/gl/xalloc-die.c b/gl/xalloc-die.c index 0a0694fc..4b220403 100644 --- a/gl/xalloc-die.c +++ b/gl/xalloc-die.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* Report a memory allocation failure and exit. | 1 | /* Report a memory allocation failure and exit. |
2 | 2 | ||
3 | Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 Free | 3 | Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006, 2009, 2010 |
4 | Software Foundation, Inc. | 4 | Free Software Foundation, Inc. |
5 | 5 | ||
6 | This program is free software: you can redistribute it and/or modify | 6 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/xalloc.h b/gl/xalloc.h index 57a13e0a..6122cc58 100644 --- a/gl/xalloc.h +++ b/gl/xalloc.h | |||
@@ -1,7 +1,8 @@ | |||
1 | /* xalloc.h -- malloc with out-of-memory checking | 1 | /* xalloc.h -- malloc with out-of-memory checking |
2 | 2 | ||
3 | Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | 3 | Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
4 | 1999, 2000, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. | 4 | 2000, 2003, 2004, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, |
5 | Inc. | ||
5 | 6 | ||
6 | This program is free software: you can redistribute it and/or modify | 7 | This program is free software: you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -105,10 +106,10 @@ char *xstrdup (char const *str) ATTRIBUTE_MALLOC; | |||
105 | # if HAVE_INLINE | 106 | # if HAVE_INLINE |
106 | # define static_inline static inline | 107 | # define static_inline static inline |
107 | # else | 108 | # else |
108 | void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC; | 109 | void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC; |
109 | void *xnrealloc (void *p, size_t n, size_t s); | 110 | void *xnrealloc (void *p, size_t n, size_t s); |
110 | void *x2nrealloc (void *p, size_t *pn, size_t s); | 111 | void *x2nrealloc (void *p, size_t *pn, size_t s); |
111 | char *xcharalloc (size_t n) ATTRIBUTE_MALLOC; | 112 | char *xcharalloc (size_t n) ATTRIBUTE_MALLOC; |
112 | # endif | 113 | # endif |
113 | 114 | ||
114 | # ifdef static_inline | 115 | # ifdef static_inline |
@@ -161,9 +162,9 @@ xnrealloc (void *p, size_t n, size_t s) | |||
161 | void | 162 | void |
162 | append_int (int value) | 163 | append_int (int value) |
163 | { | 164 | { |
164 | if (used == allocated) | 165 | if (used == allocated) |
165 | p = x2nrealloc (p, &allocated, sizeof *p); | 166 | p = x2nrealloc (p, &allocated, sizeof *p); |
166 | p[used++] = value; | 167 | p[used++] = value; |
167 | } | 168 | } |
168 | 169 | ||
169 | This causes x2nrealloc to allocate a block of some nonzero size the | 170 | This causes x2nrealloc to allocate a block of some nonzero size the |
@@ -181,12 +182,12 @@ xnrealloc (void *p, size_t n, size_t s) | |||
181 | void | 182 | void |
182 | append_int (int value) | 183 | append_int (int value) |
183 | { | 184 | { |
184 | if (used == allocated) | 185 | if (used == allocated) |
185 | { | 186 | { |
186 | p = x2nrealloc (p, &allocated1, sizeof *p); | 187 | p = x2nrealloc (p, &allocated1, sizeof *p); |
187 | allocated = allocated1; | 188 | allocated = allocated1; |
188 | } | 189 | } |
189 | p[used++] = value; | 190 | p[used++] = value; |
190 | } | 191 | } |
191 | 192 | ||
192 | */ | 193 | */ |
@@ -199,25 +200,25 @@ x2nrealloc (void *p, size_t *pn, size_t s) | |||
199 | if (! p) | 200 | if (! p) |
200 | { | 201 | { |
201 | if (! n) | 202 | if (! n) |
202 | { | 203 | { |
203 | /* The approximate size to use for initial small allocation | 204 | /* The approximate size to use for initial small allocation |
204 | requests, when the invoking code specifies an old size of | 205 | requests, when the invoking code specifies an old size of |
205 | zero. 64 bytes is the largest "small" request for the | 206 | zero. 64 bytes is the largest "small" request for the |
206 | GNU C library malloc. */ | 207 | GNU C library malloc. */ |
207 | enum { DEFAULT_MXFAST = 64 }; | 208 | enum { DEFAULT_MXFAST = 64 }; |
208 | 209 | ||
209 | n = DEFAULT_MXFAST / s; | 210 | n = DEFAULT_MXFAST / s; |
210 | n += !n; | 211 | n += !n; |
211 | } | 212 | } |
212 | } | 213 | } |
213 | else | 214 | else |
214 | { | 215 | { |
215 | /* Set N = ceil (1.5 * N) so that progress is made if N == 1. | 216 | /* Set N = ceil (1.5 * N) so that progress is made if N == 1. |
216 | Check for overflow, so that N * S stays in size_t range. | 217 | Check for overflow, so that N * S stays in size_t range. |
217 | The check is slightly conservative, but an exact check isn't | 218 | The check is slightly conservative, but an exact check isn't |
218 | worth the trouble. */ | 219 | worth the trouble. */ |
219 | if ((size_t) -1 / 3 * 2 / s <= n) | 220 | if ((size_t) -1 / 3 * 2 / s <= n) |
220 | xalloc_die (); | 221 | xalloc_die (); |
221 | n += (n + 1) / 2; | 222 | n += (n + 1) / 2; |
222 | } | 223 | } |
223 | 224 | ||
diff --git a/gl/xmalloc.c b/gl/xmalloc.c index 585fb4b1..ecce5296 100644 --- a/gl/xmalloc.c +++ b/gl/xmalloc.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* xmalloc.c -- malloc with out of memory checking | 1 | /* xmalloc.c -- malloc with out of memory checking |
2 | 2 | ||
3 | Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | 3 | Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
4 | 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2008-2009 Free Software Foundation, | 4 | 2000, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 Free Software |
5 | Inc. | 5 | Foundation, Inc. |
6 | 6 | ||
7 | This program is free software: you can redistribute it and/or modify | 7 | This program is free software: you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -1,6 +1,6 @@ | |||
1 | /* xsize.h -- Checked size_t computations. | 1 | /* xsize.h -- Checked size_t computations. |
2 | 2 | ||
3 | Copyright (C) 2003, 2008 Free Software Foundation, Inc. | 3 | Copyright (C) 2003, 2008, 2009, 2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/xstrndup.c b/gl/xstrndup.c index 37488cd9..414f9f4f 100644 --- a/gl/xstrndup.c +++ b/gl/xstrndup.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Duplicate a bounded initial segment of a string, with out-of-memory | 1 | /* Duplicate a bounded initial segment of a string, with out-of-memory |
2 | checking. | 2 | checking. |
3 | Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc. | 3 | Copyright (C) 2003, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/gl/xstrndup.h b/gl/xstrndup.h index 4882e394..009fdb08 100644 --- a/gl/xstrndup.h +++ b/gl/xstrndup.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* Duplicate a bounded initial segment of a string, with out-of-memory | 1 | /* Duplicate a bounded initial segment of a string, with out-of-memory |
2 | checking. | 2 | checking. |
3 | Copyright (C) 2003 Free Software Foundation, Inc. | 3 | Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc. |
4 | 4 | ||
5 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
diff --git a/tools/setup b/tools/setup index 1afe4f15..6da3f674 100755 --- a/tools/setup +++ b/tools/setup | |||
@@ -23,6 +23,10 @@ if test -d $HOME/share/aclocal ; then | |||
23 | extra="-I $HOME/share/aclocal" | 23 | extra="-I $HOME/share/aclocal" |
24 | fi | 24 | fi |
25 | 25 | ||
26 | # This file will be automagically re-generated of present - still looks | ||
27 | # better than having a versioned file change based on automake version | ||
28 | touch build-aux/mkinstalldirs | ||
29 | |||
26 | aclocal -I gl/m4 -I m4 $extra | 30 | aclocal -I gl/m4 -I m4 $extra |
27 | #libtoolize --force --copy | 31 | #libtoolize --force --copy |
28 | autoheader | 32 | autoheader |