wchar2.h 20 KB

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