38 #ifndef BLOCXX_SAFE_CSTRING_HPP_INCLUDE_GUARD_
39 #define BLOCXX_SAFE_CSTRING_HPP_INCLUDE_GUARD_
41 #include "blocxx/BLOCXX_config.h"
48 namespace BLOCXX_NAMESPACE
54 #define vsnprintf _vsnprintf
60 BLOCXX_COMMON_API
char *
str_dup(
char const * s);
74 inline char const *
nonull(
char const * s)
95 char *
strcpy_trunc(
char * dst, std::size_t dstsize,
char const * src);
113 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
119 template <std::
size_t N>
inline
128 template <std::
size_t N>
inline
129 char *
strcpy_trunc(
char (&dst)[N],
char const * src, std::size_t srclen)
138 template <std::
size_t N>
inline
140 char (&dst)[N], std::size_t pos,
char const * src
150 template <std::
size_t N>
inline
152 char (&dst)[N], std::size_t pos,
char const * src, std::size_t srclen
155 return strcpy_trunc(dst + pos, N - pos, src, srclen) - dst;
180 char *
strcpy_check(
char * dst, std::size_t dstsize,
char const * src);
200 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
206 template <std::
size_t N>
inline
215 template <std::
size_t N>
inline
216 char *
strcpy_check(
char (&dst)[N],
char const * src, std::size_t srclen)
225 template <std::
size_t N>
inline
227 char (&dst)[N], std::size_t pos,
char const * src
237 template <std::
size_t N>
inline
239 char (&dst)[N], std::size_t pos,
char const * src, std::size_t srclen
242 return strcpy_check(dst + pos, N - pos, src, srclen) - dst;
263 char *
strcat_trunc(
char * dst, std::size_t dstsize,
char const * src);
284 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
290 template <std::
size_t N>
inline
299 template <std::
size_t N>
inline
300 char *
strcat_trunc(
char (&dst)[N],
char const * src, std::size_t srclen)
326 char *
strcat_check(
char * dst, std::size_t dstsize,
char const * src);
351 char * dst, std::size_t dstsize,
char const * src, std::size_t srclen
357 template <std::
size_t N>
inline
366 template <std::
size_t N>
inline
367 char *
strcat_check(
char (&dst)[N],
char const * src, std::size_t srclen)
378 retval < 0 || retval >= static_cast<int>(dstsize) ? dstsize - 1
379 : static_cast<std::size_t>(retval)
383 std::size_t
nchars_check(
int retval, std::size_t dstsize);
392 template <
typename T1>
394 char * dst, std::size_t dstsize,
char const * fmt, T1
const & x1
406 template <
typename T1,
typename T2>
408 char * dst, std::size_t dstsize,
char const * fmt,
409 T1
const & x1, T2
const & x2
413 snprintf(dst, dstsize, fmt, x1, x2), dstsize);
422 template <
typename T1,
typename T2,
typename T3>
424 char * dst, std::size_t dstsize,
char const * fmt,
425 T1
const & x1, T2
const & x2, T3
const & x3
429 snprintf(dst, dstsize, fmt, x1, x2, x3), dstsize);
438 template <
typename T1,
typename T2,
typename T3,
typename T4>
440 char * dst, std::size_t dstsize,
char const * fmt,
441 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4
445 snprintf(dst, dstsize, fmt, x1, x2, x3, x4), dstsize);
454 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
456 char * dst, std::size_t dstsize,
char const * fmt,
457 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4, T5
const & x5
461 snprintf(dst, dstsize, fmt, x1, x2, x3, x4, x5), dstsize);
467 template <std::
size_t N,
typename T1>
476 template <std::
size_t N,
typename T1,
typename T2>
478 char (&dst)[N],
char const * fmt, T1
const & x1, T2
const & x2
487 template <std::
size_t N,
typename T1,
typename T2,
typename T3>
489 char (&dst)[N],
char const * fmt,
490 T1
const & x1, T2
const & x2, T3
const & x3
499 template <std::
size_t N,
typename T1,
typename T2,
typename T3,
typename T4>
501 char (&dst)[N],
char const * fmt,
502 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4
511 template <std::size_t N,
typename T1,
typename T2,
typename T3,
typename T4,
514 char (&dst)[N],
char const * fmt,
515 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4, T5
const & x5
519 snprintf(dst, N, fmt, x1, x2, x3, x4, x5), N);
531 template <
typename T1>
533 char * dst, std::size_t dstsize,
char const * fmt, T1
const & x1
547 template <
typename T1,
typename T2>
549 char * dst, std::size_t dstsize,
char const * fmt,
550 T1
const & x1, T2
const & x2
554 snprintf(dst, dstsize, fmt, x1, x2), dstsize);
565 template <
typename T1,
typename T2,
typename T3>
567 char * dst, std::size_t dstsize,
char const * fmt,
568 T1
const & x1, T2
const & x2, T3
const & x3
572 snprintf(dst, dstsize, fmt, x1, x2, x3), dstsize);
583 template <
typename T1,
typename T2,
typename T3,
typename T4>
585 char * dst, std::size_t dstsize,
char const * fmt,
586 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4
590 snprintf(dst, dstsize, fmt, x1, x2, x3, x4), dstsize);
601 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
603 char * dst, std::size_t dstsize,
char const * fmt,
604 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4, T5
const & x5
608 snprintf(dst, dstsize, fmt, x1, x2, x3, x4, x5), dstsize);
614 template <std::
size_t N,
typename T1>
623 template <std::
size_t N,
typename T1,
typename T2>
625 char (&dst)[N],
char const * fmt, T1
const & x1, T2
const & x2
634 template <std::
size_t N,
typename T1,
typename T2,
typename T3>
636 char (&dst)[N],
char const * fmt,
637 T1
const & x1, T2
const & x2, T3
const & x3
646 template <std::
size_t N,
typename T1,
typename T2,
typename T3,
typename T4>
648 char (&dst)[N],
char const * fmt,
649 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4
658 template <std::size_t N,
typename T1,
typename T2,
typename T3,
typename T4,
661 char (&dst)[N],
char const * fmt,
662 T1
const & x1, T2
const & x2, T3
const & x3, T4
const & x4, T5
const & x5
675 template <
typename T1>
677 char * dst, std::size_t dstsize,
char const * fmt, va_list ap
686 template <std::
size_t N>
inline
702 char * dst, std::size_t dstsize,
char const * fmt, va_list ap
711 template <std::
size_t N>
inline
720 #define BLOCXX_INTSTR_AUX(x) # x
730 #define BLOCXX_INTSTR(x) BLOCXX_INTSTR_AUX(x)