diff --git a/src/lib/safeclib.c b/src/lib/safeclib.c index 2a4bc50b4..71e347ab7 100644 --- a/src/lib/safeclib.c +++ b/src/lib/safeclib.c @@ -26,6 +26,7 @@ #include #include #include +#include /** * @file Portable and safe wrapers around some clib functions and some tools @@ -179,3 +180,35 @@ lumiera_tmpbuf_provide (size_t size) return buf->buffers[buf->idx]; } + +char* +lumiera_tmpbuf_strndup (const char* src, size_t size) +{ + size_t len = strlen (src); + len = len > size ? size : len; + + char* buf = lumiera_tmpbuf_provide (len + 1); + strncpy (buf, src, len); + buf[len] = '\0'; + + return buf; +} + + +char* +lumiera_tmpbuf_sprintf (size_t size, const char* fmt, ...) +{ + va_list args; + + va_start (args, fmt); + size_t len = vsnprintf (NULL, 0, fmt, args); + va_end (args); + + len = len > size ? size : len; + char* buf = lumiera_tmpbuf_provide (len); + va_start (args, fmt); + vsnprintf (buf, len, fmt, args); + va_end (args); + + return buf; +} diff --git a/src/lib/safeclib.h b/src/lib/safeclib.h index 90333abd0..02d931cb7 100644 --- a/src/lib/safeclib.h +++ b/src/lib/safeclib.h @@ -21,9 +21,7 @@ #include "error.h" -//#include -//#include -//#include +#include /** * @file Portable and safe wrapers around some clib functions and some tools @@ -95,3 +93,22 @@ lumiera_tmpbuf_freeall (void); void* lumiera_tmpbuf_provide (size_t size); +/** + * Duplicate string to a tmpbuf. + * @param src string to be duplicated + * @param size maximal length to be copied + * @return temporary buffer containing a copy of the string + */ +char* +lumiera_tmpbuf_strndup (const char* src, size_t size); + +/** + * Construct a string in a tmpbuf. + * @param size maximal length for the string + * @param fmt printf like formatstring + * @param ... parameters + * @return temporary buffer containing the constructed of the string + */ +char* +lumiera_tmpbuf_sprintf (size_t size, const char* fmt, ...); +