e1b7c13023f0cb67fa5a3c95c1df06759ac23834
[kopensolaris-gnu/glibc.git] / wcsmbs / bits / wchar2.h
1 /* Checking macros for wchar functions.
2    Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library 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 Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #ifndef _WCHAR_H
21 # error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
22 #endif
23
24
25 extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1,
26                                __const wchar_t *__restrict __s2, size_t __n,
27                                size_t __ns1) __THROW;
28 extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
29                                 (wchar_t *__restrict __s1,
30                                  __const wchar_t *__restrict __s2, size_t __n),
31                                 wmemcpy);
32
33 __extern_always_inline wchar_t *
34 __NTH (wmemcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
35                 size_t __n))
36 {
37   if (__bos0 (__s1) != (size_t) -1)
38     return __wmemcpy_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t));
39   return __wmemcpy_alias (__s1, __s2, __n);
40 }
41
42
43 extern wchar_t *__wmemmove_chk (wchar_t *__s1, __const wchar_t *__s2,
44                                 size_t __n, size_t __ns1) __THROW;
45 extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
46                                                    __const wchar_t *__s2,
47                                                    size_t __n), wmemmove);
48
49 __extern_always_inline wchar_t *
50 __NTH (wmemmove (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
51                  size_t __n))
52 {
53   if (__bos0 (__s1) != (size_t) -1)
54     return __wmemmove_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t));
55   return __wmemmove_alias (__s1, __s2, __n);
56 }
57
58
59 #ifdef __USE_GNU
60 extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1,
61                                 __const wchar_t *__restrict __s2, size_t __n,
62                                 size_t __ns1) __THROW;
63 extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
64                                 (wchar_t *__restrict __s1,
65                                  __const wchar_t *__restrict __s2,
66                                  size_t __n), wmempcpy);
67
68 __extern_always_inline wchar_t *
69 __NTH (wmempcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
70                  size_t __n))
71 {
72   if (__bos0 (__s1) != (size_t) -1)
73     return __wmempcpy_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t));
74   return __wmempcpy_alias (__s1, __s2, __n);
75 }
76 #endif
77
78
79 extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
80                                size_t __ns) __THROW;
81 extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
82                                                   size_t __n), wmemset);
83
84 __extern_always_inline wchar_t *
85 __NTH (wmemset (wchar_t *__restrict __s, wchar_t __c, size_t __n))
86 {
87   if (__bos0 (__s) != (size_t) -1)
88     return __wmemset_chk (__s, __c, __n, __bos0 (__s) / sizeof (wchar_t));
89   return __wmemset_alias (__s, __c, __n);
90 }
91
92
93 extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest,
94                               __const wchar_t *__restrict __src,
95                               size_t __n) __THROW;
96 extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
97                                 (wchar_t *__restrict __dest,
98                                  __const wchar_t *__restrict __src), wcscpy);
99
100 __extern_always_inline wchar_t *
101 __NTH (wcscpy (wchar_t *__dest, __const wchar_t *__src))
102 {
103   if (__bos (__dest) != (size_t) -1)
104     return __wcscpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
105   return __wcscpy_alias (__dest, __src);
106 }
107
108
109 extern wchar_t *__wcpcpy_chk (wchar_t *__dest, __const wchar_t *__src,
110                               size_t __destlen) __THROW;
111 extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias, (wchar_t *__dest,
112                                                  __const wchar_t *__src),
113                                 wcpcpy);
114
115 __extern_always_inline wchar_t *
116 __NTH (wcpcpy (wchar_t *__dest, __const wchar_t *__src))
117 {
118   if (__bos (__dest) != (size_t) -1)
119     return __wcpcpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
120   return __wcpcpy_alias (__dest, __src);
121 }
122
123
124 extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest,
125                                __const wchar_t *__restrict __src, size_t __n,
126                                size_t __destlen) __THROW;
127 extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
128                                 (wchar_t *__restrict __dest,
129                                  __const wchar_t *__restrict __src,
130                                  size_t __n), wcsncpy);
131
132 __extern_always_inline wchar_t *
133 __NTH (wcsncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n))
134 {
135   if (__bos (__dest) != (size_t) -1
136       && (!__builtin_constant_p (__n) || __bos (__dest) >= __n))
137     return __wcsncpy_chk (__dest, __src, __n,
138                           __bos (__dest) / sizeof (wchar_t));
139   return __wcsncpy_alias (__dest, __src, __n);
140 }
141
142
143 extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest,
144                                __const wchar_t *__restrict __src, size_t __n,
145                                size_t __destlen) __THROW;
146 extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
147                                 (wchar_t *__restrict __dest,
148                                  __const wchar_t *__restrict __src,
149                                  size_t __n), wcpncpy);
150
151 __extern_always_inline wchar_t *
152 __NTH (wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n))
153 {
154   if (__bos (__dest) != (size_t) -1
155       && (!__builtin_constant_p (__n) || __bos (__dest) >= __n))
156     return __wcpncpy_chk (__dest, __src, __n,
157                           __bos (__dest) / sizeof (wchar_t));
158   return __wcpncpy_alias (__dest, __src, __n);
159 }
160
161
162 extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest,
163                               __const wchar_t *__restrict __src,
164                               size_t __destlen) __THROW;
165 extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
166                                 (wchar_t *__restrict __dest,
167                                  __const wchar_t *__restrict __src), wcscat);
168
169 __extern_always_inline wchar_t *
170 __NTH (wcscat (wchar_t *__dest, __const wchar_t *__src))
171 {
172   if (__bos (__dest) != (size_t) -1)
173     return __wcscat_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
174   return __wcscat_alias (__dest, __src);
175 }
176
177
178 extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest,
179                                __const wchar_t *__restrict __src,
180                                size_t __n, size_t __destlen) __THROW;
181 extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
182                                 (wchar_t *__restrict __dest,
183                                  __const wchar_t *__restrict __src,
184                                  size_t __n), wcsncat);
185
186 __extern_always_inline wchar_t *
187 __NTH (wcsncat (wchar_t *__dest, __const wchar_t *__src, size_t __n))
188 {
189   if (__bos (__dest) != (size_t) -1)
190     return __wcsncat_chk (__dest, __src, __n,
191                           __bos (__dest) / sizeof (wchar_t));
192   return __wcsncat_alias (__dest, __src, __n);
193 }
194
195
196 extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
197                            int __flag, size_t __s_len,
198                            __const wchar_t *__restrict __format, ...)
199      __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
200
201 extern int __REDIRECT_NTH (__swprintf_alias,
202                            (wchar_t *__restrict __s, size_t __n,
203                             __const wchar_t *__restrict __fmt, ...),
204                             swprintf);
205
206 #ifdef __va_arg_pack
207 __extern_always_inline int
208 __NTH (swprintf (wchar_t *__restrict __s, size_t __n,
209                  __const wchar_t *__restrict __fmt, ...))
210 {
211   if (__bos (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
212     return __swprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, __bos (__s),
213                            __fmt, __va_arg_pack ());
214   return __swprintf_alias (__s, __n, __fmt, __va_arg_pack ());
215 }
216 #elif !defined __cplusplus
217 /* XXX We might want to have support in gcc for swprintf.  */
218 # define swprintf(s, n, ...) \
219   (__bos (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1                        \
220    ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, __bos (s), __VA_ARGS__)   \
221    : swprintf (s, n, __VA_ARGS__))
222 #endif
223
224 extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
225                             int __flag, size_t __s_len,
226                             __const wchar_t *__restrict __format,
227                             __gnuc_va_list __arg)
228      __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
229
230 extern int __REDIRECT_NTH (__vswprintf_alias,
231                            (wchar_t *__restrict __s, size_t __n,
232                             __const wchar_t *__restrict __fmt,
233                             __gnuc_va_list __ap), vswprintf);
234
235 __extern_always_inline int
236 __NTH (vswprintf (wchar_t *__restrict __s, size_t __n,
237                   __const wchar_t *__restrict __fmt, __gnuc_va_list __ap))
238 {
239   if (__bos (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
240     return __vswprintf_chk (__s, __n,  __USE_FORTIFY_LEVEL - 1, __bos (__s),
241                             __fmt, __ap);
242   return __vswprintf_alias (__s, __n, __fmt, __ap);
243 }
244
245
246 #if __USE_FORTIFY_LEVEL > 1
247
248 extern int __fwprintf_chk (__FILE *__restrict __stream, int __flag,
249                            __const wchar_t *__restrict __format, ...);
250 extern int __wprintf_chk (int __flag, __const wchar_t *__restrict __format,
251                           ...);
252 extern int __vfwprintf_chk (__FILE *__restrict __stream, int __flag,
253                             __const wchar_t *__restrict __format,
254                             __gnuc_va_list __ap);
255 extern int __vwprintf_chk (int __flag, __const wchar_t *__restrict __format,
256                            __gnuc_va_list __ap);
257
258 # ifdef __va_arg_pack
259 __extern_always_inline int
260 wprintf (__const wchar_t *__restrict __fmt, ...)
261 {
262   return __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
263 }
264
265 __extern_always_inline int
266 fwprintf (__FILE *__restrict __stream, __const wchar_t *__restrict __fmt, ...)
267 {
268   return __fwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt,
269                          __va_arg_pack ());
270 }
271 # elif !defined __cplusplus
272 #  define wprintf(...) \
273   __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
274 #  define fwprintf(stream, ...) \
275   __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
276 # endif
277
278 __extern_always_inline int
279 vwprintf (__const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
280 {
281   return __vwprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
282 }
283
284 __extern_always_inline int
285 vfwprintf (__FILE *__restrict __stream,
286            __const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
287 {
288   return __vfwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
289 }
290
291 #endif
292
293 extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n,
294                               __FILE *__restrict __stream) __wur;
295 extern wchar_t *__REDIRECT (__fgetws_alias,
296                             (wchar_t *__restrict __s, int __n,
297                              __FILE *__restrict __stream), fgetws) __wur;
298
299 __extern_always_inline __wur wchar_t *
300 fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
301 {
302   if (__bos (__s) != (size_t) -1
303       && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s)))
304     return __fgetws_chk (__s, __bos (__s), __n, __stream);
305   return __fgetws_alias (__s, __n, __stream);
306 }
307
308 #ifdef __USE_GNU
309 extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size,
310                                        int __n, __FILE *__restrict __stream)
311   __wur;
312 extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
313                             (wchar_t *__restrict __s, int __n,
314                              __FILE *__restrict __stream), fgetws_unlocked)
315   __wur;
316
317 __extern_always_inline __wur wchar_t *
318 fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
319 {
320   if (__bos (__s) != (size_t) -1
321       && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s)))
322     return __fgetws_unlocked_chk (__s, __bos (__s), __n, __stream);
323   return __fgetws_unlocked_alias (__s, __n, __stream);
324 }
325 #endif
326
327
328 extern size_t __wcrtomb_chk (char *__s, wchar_t __wchar, mbstate_t *__p,
329                           size_t __buflen) __THROW __wur;
330 extern size_t __REDIRECT_NTH (__wcrtomb_alias,
331                               (char *__restrict __s, wchar_t __wchar,
332                                mbstate_t *__restrict __ps), wcrtomb) __wur;
333
334 __extern_always_inline __wur size_t
335 __NTH (wcrtomb (char *__s, wchar_t __wchar, mbstate_t *__ps))
336 {
337   /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
338      But this would only disturb the namespace.  So we define our own
339      version here.  */
340 #define __WCHAR_MB_LEN_MAX      16
341 #if defined MB_LEN_MAX && MB_LEN_MAX != __WCHAR_MB_LEN_MAX
342 # error "Assumed value of MB_LEN_MAX wrong"
343 #endif
344   if (__bos (__s) != (size_t) -1 && __WCHAR_MB_LEN_MAX > __bos (__s))
345     return __wcrtomb_chk (__s, __wchar, __ps, __bos (__s));
346   return __wcrtomb_alias (__s, __wchar, __ps);
347 }
348
349
350 extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst,
351                                __const char **__restrict __src,
352                                size_t __len, mbstate_t *__restrict __ps,
353                                size_t __dstlen) __THROW;
354 extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
355                               (wchar_t *__restrict __dst,
356                                __const char **__restrict __src,
357                                size_t __len, mbstate_t *__restrict __ps),
358                               mbsrtowcs);
359
360 __extern_always_inline size_t
361 __NTH (mbsrtowcs (wchar_t *__restrict __dst, __const char **__restrict __src,
362                   size_t __len, mbstate_t *__restrict __ps))
363 {
364   if (__bos (__dst) != (size_t) -1
365       && (!__builtin_constant_p (__len)
366           || __len > __bos (__dst) / sizeof (wchar_t)))
367     return __mbsrtowcs_chk (__dst, __src, __len, __ps,
368                             __bos (__dst) / sizeof (wchar_t));
369   return __mbsrtowcs_alias (__dst, __src, __len, __ps);
370 }
371
372
373 extern size_t __wcsrtombs_chk (char *__restrict __dst,
374                                __const wchar_t **__restrict __src,
375                                size_t __len, mbstate_t *__restrict __ps,
376                                size_t __dstlen) __THROW;
377 extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
378                               (char *__restrict __dst,
379                                __const wchar_t **__restrict __src,
380                                size_t __len, mbstate_t *__restrict __ps),
381                               wcsrtombs);
382
383 __extern_always_inline size_t
384 __NTH (wcsrtombs (char *__restrict __dst, __const wchar_t **__restrict __src,
385                   size_t __len, mbstate_t *__restrict __ps))
386 {
387   if (__bos (__dst) != (size_t) -1
388       && (!__builtin_constant_p (__len) || __len > __bos (__dst)))
389     return __wcsrtombs_chk (__dst, __src, __len, __ps, __bos (__dst));
390   return __wcsrtombs_alias (__dst, __src, __len, __ps);
391 }
392
393
394 #ifdef __USE_GNU
395 extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst,
396                                 __const char **__restrict __src, size_t __nmc,
397                                 size_t __len, mbstate_t *__restrict __ps,
398                                 size_t __dstlen) __THROW;
399 extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
400                               (wchar_t *__restrict __dst,
401                                __const char **__restrict __src, size_t __nmc,
402                                size_t __len, mbstate_t *__restrict __ps),
403                               mbsnrtowcs);
404
405 __extern_always_inline size_t
406 __NTH (mbsnrtowcs (wchar_t *__restrict __dst, __const char **__restrict __src,
407                    size_t __nmc, size_t __len, mbstate_t *__restrict __ps))
408 {
409   if (__bos (__dst) != (size_t) -1
410       && (!__builtin_constant_p (__len)
411           || __len > __bos (__dst) / sizeof (wchar_t)))
412     return __mbsnrtowcs_chk (__dst, __src, __nmc, __len, __ps,
413                              __bos (__dst) / sizeof (wchar_t));
414   return __mbsnrtowcs_alias (__dst, __src, __nmc, __len, __ps);
415 }
416
417
418 extern size_t __wcsnrtombs_chk (char *__restrict __dst,
419                                 __const wchar_t **__restrict __src,
420                                 size_t __nwc, size_t __len,
421                                 mbstate_t *__restrict __ps, size_t __dstlen)
422      __THROW;
423 extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
424                               (char *__restrict __dst,
425                                __const wchar_t **__restrict __src,
426                                size_t __nwc, size_t __len,
427                                mbstate_t *__restrict __ps), wcsnrtombs);
428
429 __extern_always_inline size_t
430 __NTH (wcsnrtombs (char *__restrict __dst, __const wchar_t **__restrict __src,
431                    size_t __nwc, size_t __len, mbstate_t *__restrict __ps))
432 {
433   if (__bos (__dst) != (size_t) -1
434       && (!__builtin_constant_p (__len) || __len > __bos (__dst)))
435     return __wcsnrtombs_chk (__dst, __src, __nwc, __len, __ps, __bos (__dst));
436   return __wcsnrtombs_alias (__dst, __src, __nwc, __len, __ps);
437 }
438 #endif