1 /* Checking macros for wchar functions.
2 Copyright (C) 2005-2020 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
20 # error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
24 extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1
,
25 const wchar_t *__restrict __s2
, size_t __n
,
26 size_t __ns1
) __THROW
;
27 extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias
,
28 (wchar_t *__restrict __s1
,
29 const wchar_t *__restrict __s2
, size_t __n
),
31 extern wchar_t *__REDIRECT_NTH (__wmemcpy_chk_warn
,
32 (wchar_t *__restrict __s1
,
33 const wchar_t *__restrict __s2
, size_t __n
,
34 size_t __ns1
), __wmemcpy_chk
)
35 __warnattr ("wmemcpy called with length bigger than size of destination "
38 __fortify_function
wchar_t *
39 __NTH (wmemcpy (wchar_t *__restrict __s1
, const wchar_t *__restrict __s2
,
42 if (__glibc_objsize0 (__s1
) != (size_t) -1)
44 if (!__builtin_constant_p (__n
))
45 return __wmemcpy_chk (__s1
, __s2
, __n
,
46 __glibc_objsize0 (__s1
) / sizeof (wchar_t));
48 if (__n
> __glibc_objsize0 (__s1
) / sizeof (wchar_t))
49 return __wmemcpy_chk_warn (__s1
, __s2
, __n
,
50 __glibc_objsize0 (__s1
) / sizeof (wchar_t));
52 return __wmemcpy_alias (__s1
, __s2
, __n
);
56 extern wchar_t *__wmemmove_chk (wchar_t *__s1
, const wchar_t *__s2
,
57 size_t __n
, size_t __ns1
) __THROW
;
58 extern wchar_t *__REDIRECT_NTH (__wmemmove_alias
, (wchar_t *__s1
,
60 size_t __n
), wmemmove
);
61 extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn
,
62 (wchar_t *__s1
, const wchar_t *__s2
,
63 size_t __n
, size_t __ns1
), __wmemmove_chk
)
64 __warnattr ("wmemmove called with length bigger than size of destination "
67 __fortify_function
wchar_t *
68 __NTH (wmemmove (wchar_t *__s1
, const wchar_t *__s2
, size_t __n
))
70 if (__glibc_objsize0 (__s1
) != (size_t) -1)
72 if (!__builtin_constant_p (__n
))
73 return __wmemmove_chk (__s1
, __s2
, __n
,
74 __glibc_objsize0 (__s1
) / sizeof (wchar_t));
76 if (__n
> __glibc_objsize0 (__s1
) / sizeof (wchar_t))
77 return __wmemmove_chk_warn (__s1
, __s2
, __n
,
78 (__glibc_objsize0 (__s1
)
81 return __wmemmove_alias (__s1
, __s2
, __n
);
86 extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1
,
87 const wchar_t *__restrict __s2
, size_t __n
,
88 size_t __ns1
) __THROW
;
89 extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias
,
90 (wchar_t *__restrict __s1
,
91 const wchar_t *__restrict __s2
,
92 size_t __n
), wmempcpy
);
93 extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn
,
94 (wchar_t *__restrict __s1
,
95 const wchar_t *__restrict __s2
, size_t __n
,
96 size_t __ns1
), __wmempcpy_chk
)
97 __warnattr ("wmempcpy called with length bigger than size of destination "
100 __fortify_function
wchar_t *
101 __NTH (wmempcpy (wchar_t *__restrict __s1
, const wchar_t *__restrict __s2
,
104 if (__glibc_objsize0 (__s1
) != (size_t) -1)
106 if (!__builtin_constant_p (__n
))
107 return __wmempcpy_chk (__s1
, __s2
, __n
,
108 __glibc_objsize0 (__s1
) / sizeof (wchar_t));
110 if (__n
> __glibc_objsize0 (__s1
) / sizeof (wchar_t))
111 return __wmempcpy_chk_warn (__s1
, __s2
, __n
,
112 (__glibc_objsize0 (__s1
)
113 / sizeof (wchar_t)));
115 return __wmempcpy_alias (__s1
, __s2
, __n
);
120 extern wchar_t *__wmemset_chk (wchar_t *__s
, wchar_t __c
, size_t __n
,
121 size_t __ns
) __THROW
;
122 extern wchar_t *__REDIRECT_NTH (__wmemset_alias
, (wchar_t *__s
, wchar_t __c
,
123 size_t __n
), wmemset
);
124 extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn
,
125 (wchar_t *__s
, wchar_t __c
, size_t __n
,
126 size_t __ns
), __wmemset_chk
)
127 __warnattr ("wmemset called with length bigger than size of destination "
130 __fortify_function
wchar_t *
131 __NTH (wmemset (wchar_t *__s
, wchar_t __c
, size_t __n
))
133 if (__glibc_objsize0 (__s
) != (size_t) -1)
135 if (!__builtin_constant_p (__n
))
136 return __wmemset_chk (__s
, __c
, __n
,
137 __glibc_objsize0 (__s
) / sizeof (wchar_t));
139 if (__n
> __glibc_objsize0 (__s
) / sizeof (wchar_t))
140 return __wmemset_chk_warn (__s
, __c
, __n
,
141 __glibc_objsize0 (__s
) / sizeof (wchar_t));
143 return __wmemset_alias (__s
, __c
, __n
);
147 extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest
,
148 const wchar_t *__restrict __src
,
150 extern wchar_t *__REDIRECT_NTH (__wcscpy_alias
,
151 (wchar_t *__restrict __dest
,
152 const wchar_t *__restrict __src
), wcscpy
);
154 __fortify_function
wchar_t *
155 __NTH (wcscpy (wchar_t *__restrict __dest
, const wchar_t *__restrict __src
))
157 if (__glibc_objsize (__dest
) != (size_t) -1)
158 return __wcscpy_chk (__dest
, __src
,
159 __glibc_objsize (__dest
) / sizeof (wchar_t));
160 return __wcscpy_alias (__dest
, __src
);
164 extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest
,
165 const wchar_t *__restrict __src
,
166 size_t __destlen
) __THROW
;
167 extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias
,
168 (wchar_t *__restrict __dest
,
169 const wchar_t *__restrict __src
), wcpcpy
);
171 __fortify_function
wchar_t *
172 __NTH (wcpcpy (wchar_t *__restrict __dest
, const wchar_t *__restrict __src
))
174 if (__glibc_objsize (__dest
) != (size_t) -1)
175 return __wcpcpy_chk (__dest
, __src
,
176 __glibc_objsize (__dest
) / sizeof (wchar_t));
177 return __wcpcpy_alias (__dest
, __src
);
181 extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest
,
182 const wchar_t *__restrict __src
, size_t __n
,
183 size_t __destlen
) __THROW
;
184 extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias
,
185 (wchar_t *__restrict __dest
,
186 const wchar_t *__restrict __src
,
187 size_t __n
), wcsncpy
);
188 extern wchar_t *__REDIRECT_NTH (__wcsncpy_chk_warn
,
189 (wchar_t *__restrict __dest
,
190 const wchar_t *__restrict __src
,
191 size_t __n
, size_t __destlen
), __wcsncpy_chk
)
192 __warnattr ("wcsncpy called with length bigger than size of destination "
195 __fortify_function
wchar_t *
196 __NTH (wcsncpy (wchar_t *__restrict __dest
, const wchar_t *__restrict __src
,
199 if (__glibc_objsize (__dest
) != (size_t) -1)
201 if (!__builtin_constant_p (__n
))
202 return __wcsncpy_chk (__dest
, __src
, __n
,
203 __glibc_objsize (__dest
) / sizeof (wchar_t));
204 if (__n
> __glibc_objsize (__dest
) / sizeof (wchar_t))
205 return __wcsncpy_chk_warn (__dest
, __src
, __n
,
206 (__glibc_objsize (__dest
)
207 / sizeof (wchar_t)));
209 return __wcsncpy_alias (__dest
, __src
, __n
);
213 extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest
,
214 const wchar_t *__restrict __src
, size_t __n
,
215 size_t __destlen
) __THROW
;
216 extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias
,
217 (wchar_t *__restrict __dest
,
218 const wchar_t *__restrict __src
,
219 size_t __n
), wcpncpy
);
220 extern wchar_t *__REDIRECT_NTH (__wcpncpy_chk_warn
,
221 (wchar_t *__restrict __dest
,
222 const wchar_t *__restrict __src
,
223 size_t __n
, size_t __destlen
), __wcpncpy_chk
)
224 __warnattr ("wcpncpy called with length bigger than size of destination "
227 __fortify_function
wchar_t *
228 __NTH (wcpncpy (wchar_t *__restrict __dest
, const wchar_t *__restrict __src
,
231 if (__glibc_objsize (__dest
) != (size_t) -1)
233 if (!__builtin_constant_p (__n
))
234 return __wcpncpy_chk (__dest
, __src
, __n
,
235 __glibc_objsize (__dest
) / sizeof (wchar_t));
236 if (__n
> __glibc_objsize (__dest
) / sizeof (wchar_t))
237 return __wcpncpy_chk_warn (__dest
, __src
, __n
,
238 (__glibc_objsize (__dest
)
239 / sizeof (wchar_t)));
241 return __wcpncpy_alias (__dest
, __src
, __n
);
245 extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest
,
246 const wchar_t *__restrict __src
,
247 size_t __destlen
) __THROW
;
248 extern wchar_t *__REDIRECT_NTH (__wcscat_alias
,
249 (wchar_t *__restrict __dest
,
250 const wchar_t *__restrict __src
), wcscat
);
252 __fortify_function
wchar_t *
253 __NTH (wcscat (wchar_t *__restrict __dest
, const wchar_t *__restrict __src
))
255 if (__glibc_objsize (__dest
) != (size_t) -1)
256 return __wcscat_chk (__dest
, __src
,
257 __glibc_objsize (__dest
) / sizeof (wchar_t));
258 return __wcscat_alias (__dest
, __src
);
262 extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest
,
263 const wchar_t *__restrict __src
,
264 size_t __n
, size_t __destlen
) __THROW
;
265 extern wchar_t *__REDIRECT_NTH (__wcsncat_alias
,
266 (wchar_t *__restrict __dest
,
267 const wchar_t *__restrict __src
,
268 size_t __n
), wcsncat
);
270 __fortify_function
wchar_t *
271 __NTH (wcsncat (wchar_t *__restrict __dest
, const wchar_t *__restrict __src
,
274 if (__glibc_objsize (__dest
) != (size_t) -1)
275 return __wcsncat_chk (__dest
, __src
, __n
,
276 __glibc_objsize (__dest
) / sizeof (wchar_t));
277 return __wcsncat_alias (__dest
, __src
, __n
);
281 extern int __swprintf_chk (wchar_t *__restrict __s
, size_t __n
,
282 int __flag
, size_t __s_len
,
283 const wchar_t *__restrict __format
, ...)
284 __THROW
/* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
286 extern int __REDIRECT_NTH_LDBL (__swprintf_alias
,
287 (wchar_t *__restrict __s
, size_t __n
,
288 const wchar_t *__restrict __fmt
, ...),
292 __fortify_function
int
293 __NTH (swprintf (wchar_t *__restrict __s
, size_t __n
,
294 const wchar_t *__restrict __fmt
, ...))
296 if (__glibc_objsize (__s
) != (size_t) -1 || __USE_FORTIFY_LEVEL
> 1)
297 return __swprintf_chk (__s
, __n
, __USE_FORTIFY_LEVEL
- 1,
298 __glibc_objsize (__s
) / sizeof (wchar_t),
299 __fmt
, __va_arg_pack ());
300 return __swprintf_alias (__s
, __n
, __fmt
, __va_arg_pack ());
302 #elif !defined __cplusplus
303 /* XXX We might want to have support in gcc for swprintf. */
304 # define swprintf(s, n, ...) \
305 (__glibc_objsize (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1 \
306 ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, \
307 __glibc_objsize (s) / sizeof (wchar_t), __VA_ARGS__) \
308 : swprintf (s, n, __VA_ARGS__))
311 extern int __vswprintf_chk (wchar_t *__restrict __s
, size_t __n
,
312 int __flag
, size_t __s_len
,
313 const wchar_t *__restrict __format
,
314 __gnuc_va_list __arg
)
315 __THROW
/* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
317 extern int __REDIRECT_NTH_LDBL (__vswprintf_alias
,
318 (wchar_t *__restrict __s
, size_t __n
,
319 const wchar_t *__restrict __fmt
,
320 __gnuc_va_list __ap
), vswprintf
);
322 __fortify_function
int
323 __NTH (vswprintf (wchar_t *__restrict __s
, size_t __n
,
324 const wchar_t *__restrict __fmt
, __gnuc_va_list __ap
))
326 if (__glibc_objsize (__s
) != (size_t) -1 || __USE_FORTIFY_LEVEL
> 1)
327 return __vswprintf_chk (__s
, __n
, __USE_FORTIFY_LEVEL
- 1,
328 __glibc_objsize (__s
) / sizeof (wchar_t), __fmt
,
330 return __vswprintf_alias (__s
, __n
, __fmt
, __ap
);
334 #if __USE_FORTIFY_LEVEL > 1
336 extern int __fwprintf_chk (__FILE
*__restrict __stream
, int __flag
,
337 const wchar_t *__restrict __format
, ...);
338 extern int __wprintf_chk (int __flag
, const wchar_t *__restrict __format
,
340 extern int __vfwprintf_chk (__FILE
*__restrict __stream
, int __flag
,
341 const wchar_t *__restrict __format
,
342 __gnuc_va_list __ap
);
343 extern int __vwprintf_chk (int __flag
, const wchar_t *__restrict __format
,
344 __gnuc_va_list __ap
);
346 # ifdef __va_arg_pack
347 __fortify_function
int
348 wprintf (const wchar_t *__restrict __fmt
, ...)
350 return __wprintf_chk (__USE_FORTIFY_LEVEL
- 1, __fmt
, __va_arg_pack ());
353 __fortify_function
int
354 fwprintf (__FILE
*__restrict __stream
, const wchar_t *__restrict __fmt
, ...)
356 return __fwprintf_chk (__stream
, __USE_FORTIFY_LEVEL
- 1, __fmt
,
359 # elif !defined __cplusplus
360 # define wprintf(...) \
361 __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
362 # define fwprintf(stream, ...) \
363 __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
366 __fortify_function
int
367 vwprintf (const wchar_t *__restrict __fmt
, __gnuc_va_list __ap
)
369 return __vwprintf_chk (__USE_FORTIFY_LEVEL
- 1, __fmt
, __ap
);
372 __fortify_function
int
373 vfwprintf (__FILE
*__restrict __stream
,
374 const wchar_t *__restrict __fmt
, __gnuc_va_list __ap
)
376 return __vfwprintf_chk (__stream
, __USE_FORTIFY_LEVEL
- 1, __fmt
, __ap
);
381 extern wchar_t *__fgetws_chk (wchar_t *__restrict __s
, size_t __size
, int __n
,
382 __FILE
*__restrict __stream
) __wur
;
383 extern wchar_t *__REDIRECT (__fgetws_alias
,
384 (wchar_t *__restrict __s
, int __n
,
385 __FILE
*__restrict __stream
), fgetws
) __wur
;
386 extern wchar_t *__REDIRECT (__fgetws_chk_warn
,
387 (wchar_t *__restrict __s
, size_t __size
, int __n
,
388 __FILE
*__restrict __stream
), __fgetws_chk
)
389 __wur
__warnattr ("fgetws called with bigger size than length "
390 "of destination buffer");
392 __fortify_function __wur
wchar_t *
393 fgetws (wchar_t *__restrict __s
, int __n
, __FILE
*__restrict __stream
)
395 if (__glibc_objsize (__s
) != (size_t) -1)
397 if (!__builtin_constant_p (__n
) || __n
<= 0)
398 return __fgetws_chk (__s
, __glibc_objsize (__s
) / sizeof (wchar_t),
401 if ((size_t) __n
> __glibc_objsize (__s
) / sizeof (wchar_t))
402 return __fgetws_chk_warn (__s
,
403 __glibc_objsize (__s
) / sizeof (wchar_t),
406 return __fgetws_alias (__s
, __n
, __stream
);
410 extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s
, size_t __size
,
411 int __n
, __FILE
*__restrict __stream
)
413 extern wchar_t *__REDIRECT (__fgetws_unlocked_alias
,
414 (wchar_t *__restrict __s
, int __n
,
415 __FILE
*__restrict __stream
), fgetws_unlocked
)
417 extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn
,
418 (wchar_t *__restrict __s
, size_t __size
, int __n
,
419 __FILE
*__restrict __stream
),
420 __fgetws_unlocked_chk
)
421 __wur
__warnattr ("fgetws_unlocked called with bigger size than length "
422 "of destination buffer");
424 __fortify_function __wur
wchar_t *
425 fgetws_unlocked (wchar_t *__restrict __s
, int __n
, __FILE
*__restrict __stream
)
427 if (__glibc_objsize (__s
) != (size_t) -1)
429 if (!__builtin_constant_p (__n
) || __n
<= 0)
430 return __fgetws_unlocked_chk (__s
,
431 __glibc_objsize (__s
) / sizeof (wchar_t),
434 if ((size_t) __n
> __glibc_objsize (__s
) / sizeof (wchar_t))
435 return __fgetws_unlocked_chk_warn (__s
,
436 (__glibc_objsize (__s
)
440 return __fgetws_unlocked_alias (__s
, __n
, __stream
);
445 extern size_t __wcrtomb_chk (char *__restrict __s
, wchar_t __wchar
,
446 mbstate_t *__restrict __p
,
447 size_t __buflen
) __THROW __wur
;
448 extern size_t __REDIRECT_NTH (__wcrtomb_alias
,
449 (char *__restrict __s
, wchar_t __wchar
,
450 mbstate_t *__restrict __ps
), wcrtomb
) __wur
;
452 __fortify_function __wur
size_t
453 __NTH (wcrtomb (char *__restrict __s
, wchar_t __wchar
,
454 mbstate_t *__restrict __ps
))
456 /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
457 But this would only disturb the namespace. So we define our own
459 #define __WCHAR_MB_LEN_MAX 16
460 #if defined MB_LEN_MAX && MB_LEN_MAX != __WCHAR_MB_LEN_MAX
461 # error "Assumed value of MB_LEN_MAX wrong"
463 if (__glibc_objsize (__s
) != (size_t) -1
464 && __WCHAR_MB_LEN_MAX
> __glibc_objsize (__s
))
465 return __wcrtomb_chk (__s
, __wchar
, __ps
, __glibc_objsize (__s
));
466 return __wcrtomb_alias (__s
, __wchar
, __ps
);
470 extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst
,
471 const char **__restrict __src
,
472 size_t __len
, mbstate_t *__restrict __ps
,
473 size_t __dstlen
) __THROW
;
474 extern size_t __REDIRECT_NTH (__mbsrtowcs_alias
,
475 (wchar_t *__restrict __dst
,
476 const char **__restrict __src
,
477 size_t __len
, mbstate_t *__restrict __ps
),
479 extern size_t __REDIRECT_NTH (__mbsrtowcs_chk_warn
,
480 (wchar_t *__restrict __dst
,
481 const char **__restrict __src
,
482 size_t __len
, mbstate_t *__restrict __ps
,
483 size_t __dstlen
), __mbsrtowcs_chk
)
484 __warnattr ("mbsrtowcs called with dst buffer smaller than len "
485 "* sizeof (wchar_t)");
487 __fortify_function
size_t
488 __NTH (mbsrtowcs (wchar_t *__restrict __dst
, const char **__restrict __src
,
489 size_t __len
, mbstate_t *__restrict __ps
))
491 if (__glibc_objsize (__dst
) != (size_t) -1)
493 if (!__builtin_constant_p (__len
))
494 return __mbsrtowcs_chk (__dst
, __src
, __len
, __ps
,
495 __glibc_objsize (__dst
) / sizeof (wchar_t));
497 if (__len
> __glibc_objsize (__dst
) / sizeof (wchar_t))
498 return __mbsrtowcs_chk_warn (__dst
, __src
, __len
, __ps
,
499 (__glibc_objsize (__dst
)
500 / sizeof (wchar_t)));
502 return __mbsrtowcs_alias (__dst
, __src
, __len
, __ps
);
506 extern size_t __wcsrtombs_chk (char *__restrict __dst
,
507 const wchar_t **__restrict __src
,
508 size_t __len
, mbstate_t *__restrict __ps
,
509 size_t __dstlen
) __THROW
;
510 extern size_t __REDIRECT_NTH (__wcsrtombs_alias
,
511 (char *__restrict __dst
,
512 const wchar_t **__restrict __src
,
513 size_t __len
, mbstate_t *__restrict __ps
),
515 extern size_t __REDIRECT_NTH (__wcsrtombs_chk_warn
,
516 (char *__restrict __dst
,
517 const wchar_t **__restrict __src
,
518 size_t __len
, mbstate_t *__restrict __ps
,
519 size_t __dstlen
), __wcsrtombs_chk
)
520 __warnattr ("wcsrtombs called with dst buffer smaller than len");
522 __fortify_function
size_t
523 __NTH (wcsrtombs (char *__restrict __dst
, const wchar_t **__restrict __src
,
524 size_t __len
, mbstate_t *__restrict __ps
))
526 if (__glibc_objsize (__dst
) != (size_t) -1)
528 if (!__builtin_constant_p (__len
))
529 return __wcsrtombs_chk (__dst
, __src
, __len
, __ps
,
530 __glibc_objsize (__dst
));
532 if (__len
> __glibc_objsize (__dst
))
533 return __wcsrtombs_chk_warn (__dst
, __src
, __len
, __ps
,
534 __glibc_objsize (__dst
));
536 return __wcsrtombs_alias (__dst
, __src
, __len
, __ps
);
541 extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst
,
542 const char **__restrict __src
, size_t __nmc
,
543 size_t __len
, mbstate_t *__restrict __ps
,
544 size_t __dstlen
) __THROW
;
545 extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias
,
546 (wchar_t *__restrict __dst
,
547 const char **__restrict __src
, size_t __nmc
,
548 size_t __len
, mbstate_t *__restrict __ps
),
550 extern size_t __REDIRECT_NTH (__mbsnrtowcs_chk_warn
,
551 (wchar_t *__restrict __dst
,
552 const char **__restrict __src
, size_t __nmc
,
553 size_t __len
, mbstate_t *__restrict __ps
,
554 size_t __dstlen
), __mbsnrtowcs_chk
)
555 __warnattr ("mbsnrtowcs called with dst buffer smaller than len "
556 "* sizeof (wchar_t)");
558 __fortify_function
size_t
559 __NTH (mbsnrtowcs (wchar_t *__restrict __dst
, const char **__restrict __src
,
560 size_t __nmc
, size_t __len
, mbstate_t *__restrict __ps
))
562 if (__glibc_objsize (__dst
) != (size_t) -1)
564 if (!__builtin_constant_p (__len
))
565 return __mbsnrtowcs_chk (__dst
, __src
, __nmc
, __len
, __ps
,
566 __glibc_objsize (__dst
) / sizeof (wchar_t));
568 if (__len
> __glibc_objsize (__dst
) / sizeof (wchar_t))
569 return __mbsnrtowcs_chk_warn (__dst
, __src
, __nmc
, __len
, __ps
,
570 (__glibc_objsize (__dst
)
571 / sizeof (wchar_t)));
573 return __mbsnrtowcs_alias (__dst
, __src
, __nmc
, __len
, __ps
);
577 extern size_t __wcsnrtombs_chk (char *__restrict __dst
,
578 const wchar_t **__restrict __src
,
579 size_t __nwc
, size_t __len
,
580 mbstate_t *__restrict __ps
, size_t __dstlen
)
582 extern size_t __REDIRECT_NTH (__wcsnrtombs_alias
,
583 (char *__restrict __dst
,
584 const wchar_t **__restrict __src
,
585 size_t __nwc
, size_t __len
,
586 mbstate_t *__restrict __ps
), wcsnrtombs
);
587 extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn
,
588 (char *__restrict __dst
,
589 const wchar_t **__restrict __src
,
590 size_t __nwc
, size_t __len
,
591 mbstate_t *__restrict __ps
,
592 size_t __dstlen
), __wcsnrtombs_chk
)
593 __warnattr ("wcsnrtombs called with dst buffer smaller than len");
595 __fortify_function
size_t
596 __NTH (wcsnrtombs (char *__restrict __dst
, const wchar_t **__restrict __src
,
597 size_t __nwc
, size_t __len
, mbstate_t *__restrict __ps
))
599 if (__glibc_objsize (__dst
) != (size_t) -1)
601 if (!__builtin_constant_p (__len
))
602 return __wcsnrtombs_chk (__dst
, __src
, __nwc
, __len
, __ps
,
603 __glibc_objsize (__dst
));
605 if (__len
> __glibc_objsize (__dst
))
606 return __wcsnrtombs_chk_warn (__dst
, __src
, __nwc
, __len
, __ps
,
607 __glibc_objsize (__dst
));
609 return __wcsnrtombs_alias (__dst
, __src
, __nwc
, __len
, __ps
);