38 #include "blocxx/BLOCXX_config.h"
43 using namespace blocxx;
44 using namespace blocxx::SafeCString;
48 inline char const * strend(
char const * s, std::size_t n)
50 return static_cast<char const *
>(std::memchr(s,
'\0', n));
53 inline char * strend(
char * s, std::size_t n)
55 return const_cast<char *
>(strend(static_cast<char const *>(s), n));
58 char * strend_checked(
char * s, std::size_t n)
60 char * retval = strend(s, n);
69 "cstring catenation first operand unterminated",
78 inline char * safe_strcpy(
char * dst,
char const * src, std::size_t n)
80 #ifdef BLOCXX_HAS_MEMCCPY
81 char * rv =
static_cast<char *
>(std::memccpy(dst, src,
'\0', n));
82 return rv ? rv - 1 : 0;
84 char const * end = strend(src, n);
87 size_t len = end - src;
88 std::memcpy(dst, src, len + 1);
93 std::memcpy(dst, src, n);
100 namespace BLOCXX_NAMESPACE
102 namespace SafeCString
109 char * retval =
new char[std::strlen(s) + 1];
110 return std::strcpy(retval, s);
115 char * retval =
new (std::nothrow)
char[std::strlen(s)];
118 std::strcpy(retval, s);
125 std::size_t n = dstsize - 1;
126 char * retval = safe_strcpy(dst, src, n);
139 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
142 std::size_t n = (srclen < dstsize ? srclen : dstsize - 1);
143 char * retval = safe_strcpy(dst, src, n);
157 char * retval = safe_strcpy(dst, src, dstsize);
164 dst[dstsize - 1] =
'\0';
171 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
174 if (srclen >= dstsize)
186 char * dstend = strend_checked(dst, dstsize);
187 return strcpy_trunc(dstend, (dst + dstsize) - dstend, src);
191 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
194 char * dstend = strend_checked(dst, dstsize);
195 return strcpy_trunc(dstend, (dst + dstsize) - dstend, src, srclen);
200 char * dstend = strend_checked(dst, dstsize);
201 return strcpy_check(dstend, (dst + dstsize) - dstend, src);
205 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
208 char * dstend = strend_checked(dst, dstsize);
209 return strcpy_check(dstend, (dst + dstsize) - dstend, src, srclen);
216 if (retval < 0 || retval >= static_cast<int>(dstsize))
221 return static_cast<std::size_t
>(retval);