stdlib.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* Checking macros for stdlib functions.
  2. Copyright (C) 2005, 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 _STDLIB_H
  17. # error "Never include <bits/stdlib.h> directly; use <stdlib.h> instead."
  18. #endif
  19. extern char *__realpath_chk (__const char *__restrict __name,
  20. char *__restrict __resolved,
  21. size_t __resolvedlen) __THROW __wur;
  22. extern char *__REDIRECT_NTH (__realpath_alias,
  23. (__const char *__restrict __name,
  24. char *__restrict __resolved), realpath) __wur;
  25. extern char *__REDIRECT_NTH (__realpath_chk_warn,
  26. (__const char *__restrict __name,
  27. char *__restrict __resolved,
  28. size_t __resolvedlen), __realpath_chk) __wur
  29. __warnattr ("second argument of realpath must be either NULL or at "
  30. "least PATH_MAX bytes long buffer");
  31. __extern_always_inline __wur char *
  32. __NTH (realpath (__const char *__restrict __name, char *__restrict __resolved))
  33. {
  34. if (__bos (__resolved) != (size_t) -1)
  35. {
  36. #if defined _LIBC_LIMITS_H_ && defined PATH_MAX
  37. if (__bos (__resolved) < PATH_MAX)
  38. return __realpath_chk_warn (__name, __resolved, __bos (__resolved));
  39. #endif
  40. return __realpath_chk (__name, __resolved, __bos (__resolved));
  41. }
  42. return __realpath_alias (__name, __resolved);
  43. }
  44. extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen,
  45. size_t __nreal) __THROW __nonnull ((2));
  46. extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf,
  47. size_t __buflen), ptsname_r)
  48. __nonnull ((2));
  49. extern int __REDIRECT_NTH (__ptsname_r_chk_warn,
  50. (int __fd, char *__buf, size_t __buflen,
  51. size_t __nreal), __ptsname_r_chk)
  52. __nonnull ((2)) __warnattr ("ptsname_r called with buflen bigger than "
  53. "size of buf");
  54. __extern_always_inline int
  55. __NTH (ptsname_r (int __fd, char *__buf, size_t __buflen))
  56. {
  57. if (__bos (__buf) != (size_t) -1)
  58. {
  59. if (!__builtin_constant_p (__buflen))
  60. return __ptsname_r_chk (__fd, __buf, __buflen, __bos (__buf));
  61. if (__buflen > __bos (__buf))
  62. return __ptsname_r_chk_warn (__fd, __buf, __buflen, __bos (__buf));
  63. }
  64. return __ptsname_r_alias (__fd, __buf, __buflen);
  65. }
  66. extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen)
  67. __THROW __wur;
  68. extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar),
  69. wctomb) __wur;
  70. __extern_always_inline __wur int
  71. __NTH (wctomb (char *__s, wchar_t __wchar))
  72. {
  73. /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
  74. But this would only disturb the namespace. So we define our own
  75. version here. */
  76. #define __STDLIB_MB_LEN_MAX 16
  77. #if defined MB_LEN_MAX && MB_LEN_MAX != __STDLIB_MB_LEN_MAX
  78. # error "Assumed value of MB_LEN_MAX wrong"
  79. #endif
  80. if (__bos (__s) != (size_t) -1 && __STDLIB_MB_LEN_MAX > __bos (__s))
  81. return __wctomb_chk (__s, __wchar, __bos (__s));
  82. return __wctomb_alias (__s, __wchar);
  83. }
  84. extern size_t __mbstowcs_chk (wchar_t *__restrict __dst,
  85. __const char *__restrict __src,
  86. size_t __len, size_t __dstlen) __THROW;
  87. extern size_t __REDIRECT_NTH (__mbstowcs_alias,
  88. (wchar_t *__restrict __dst,
  89. __const char *__restrict __src,
  90. size_t __len), mbstowcs);
  91. extern size_t __REDIRECT_NTH (__mbstowcs_chk_warn,
  92. (wchar_t *__restrict __dst,
  93. __const char *__restrict __src,
  94. size_t __len, size_t __dstlen), __mbstowcs_chk)
  95. __warnattr ("mbstowcs called with dst buffer smaller than len "
  96. "* sizeof (wchar_t)");
  97. __extern_always_inline size_t
  98. __NTH (mbstowcs (wchar_t *__restrict __dst, __const char *__restrict __src,
  99. size_t __len))
  100. {
  101. if (__bos (__dst) != (size_t) -1)
  102. {
  103. if (!__builtin_constant_p (__len))
  104. return __mbstowcs_chk (__dst, __src, __len,
  105. __bos (__dst) / sizeof (wchar_t));
  106. if (__len > __bos (__dst) / sizeof (wchar_t))
  107. return __mbstowcs_chk_warn (__dst, __src, __len,
  108. __bos (__dst) / sizeof (wchar_t));
  109. }
  110. return __mbstowcs_alias (__dst, __src, __len);
  111. }
  112. extern size_t __wcstombs_chk (char *__restrict __dst,
  113. __const wchar_t *__restrict __src,
  114. size_t __len, size_t __dstlen) __THROW;
  115. extern size_t __REDIRECT_NTH (__wcstombs_alias,
  116. (char *__restrict __dst,
  117. __const wchar_t *__restrict __src,
  118. size_t __len), wcstombs);
  119. extern size_t __REDIRECT_NTH (__wcstombs_chk_warn,
  120. (char *__restrict __dst,
  121. __const wchar_t *__restrict __src,
  122. size_t __len, size_t __dstlen), __wcstombs_chk)
  123. __warnattr ("wcstombs called with dst buffer smaller than len");
  124. __extern_always_inline size_t
  125. __NTH (wcstombs (char *__restrict __dst, __const wchar_t *__restrict __src,
  126. size_t __len))
  127. {
  128. if (__bos (__dst) != (size_t) -1)
  129. {
  130. if (!__builtin_constant_p (__len))
  131. return __wcstombs_chk (__dst, __src, __len, __bos (__dst));
  132. if (__len > __bos (__dst))
  133. return __wcstombs_chk_warn (__dst, __src, __len, __bos (__dst));
  134. }
  135. return __wcstombs_alias (__dst, __src, __len);
  136. }