38#ifndef BLOCXX_SAFE_CSTRING_HPP_INCLUDE_GUARD_
39#define BLOCXX_SAFE_CSTRING_HPP_INCLUDE_GUARD_
41#include "blocxx/BLOCXX_config.h"
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)
#define BLOCXX_DECLARE_EXCEPTION(NAME)
Declare a new exception class named <NAME>Exception that derives from Exception This macro is typical...
std::size_t nchars_output(int retval, std::size_t dstsize)
std::size_t nchars_check(int retval, std::size_t dstsize)
char * str_dup_nothrow(char const *s)
Like std::strdup, except that no-throw new is used to allocate memory and NULL is returned on allocat...
std::size_t strcpy_to_pos_check(char(&dst)[N], std::size_t pos, char const *src)
Like strcpy_check, but the destination is the subarray dst[pos..N-1] and the return value is an array...
char const * nonull(char const *s)
RETURNS: s if s is nonnull, otherwise returns empty string.
int const DEST_UNTERMINATED
std::size_t sprintf_check(char *dst, std::size_t dstsize, char const *fmt, T1 const &x1)
PROMISE: Behaves like sprintf(dst, fmt, ...) except that output stops at dstsize - 1 characters.
char * strcpy_trunc(char *dst, std::size_t dstsize, char const *src)
PROMISE: copies the first n = min(strlen(src), dstsize - 1) characters of C-string src to dst,...
std::size_t vprintf_trunc(char *dst, std::size_t dstsize, char const *fmt, va_list ap)
PROMISE: Behaves like vprintf(dst, fmt, ap) except that output stops at dstsize - 1 characters.
char * str_dup(char const *s)
Like std::strdup, except that new is used to allocate memory.
std::size_t strcpy_to_pos_trunc(char(&dst)[N], std::size_t pos, char const *src)
Like strcpy_trunc, but the destination is the subarray dst[pos..N-1] and the return value is an array...
char * strcpy_check(char *dst, std::size_t dstsize, char const *src)
PROMISE: copies the first n = min(strlen(src), dstsize - 1) chars of the C-string src to dst and appe...
char * strcat_check(char *dst, std::size_t dstsize, char const *src)
PROMISE: If dst[0..dstsize-1] contains a '\0', appends to C-string dst the first min(strlen(src),...
int const RESULT_TRUNCATED
Error codes for use with OverflowException class.
char * strcat_trunc(char *dst, std::size_t dstsize, char const *src)
PROMISE: If dst[0..dstsize-1] contains a '\0', appends to C-string dst the first min(strlen(src),...
std::size_t vprintf_check(char *dst, std::size_t dstsize, char const *fmt, va_list ap)
PROMISE: Behaves like vprintf(dst, fmt, ap) except that output stops at dstsize - 1 characters.
std::size_t sprintf_trunc(char *dst, std::size_t dstsize, char const *fmt, T1 const &x1)
PROMISE: Behaves like sprintf(dst, fmt, ...) except that output stops at dstsize - 1 characters.