wchar2.h 20 KB

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