summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/strlib.c25
-rw-r--r--src/common/strlib.h5
2 files changed, 30 insertions, 0 deletions
diff --git a/src/common/strlib.c b/src/common/strlib.c
index d0b312f0a..db47c969b 100644
--- a/src/common/strlib.c
+++ b/src/common/strlib.c
@@ -316,6 +316,31 @@ size_t safestrnlen(const char* string, size_t maxlen)
return ( string != NULL ) ? strnlen(string, maxlen) : 0;
}
+/// Works like snprintf, but always nul-terminates the buffer.
+/// Returns the size of the string (without nul-terminator)
+/// or -1 if the buffer is too small.
+///
+/// @param buf Target buffer
+/// @param sz Size of the buffer (including nul-terminator)
+/// @param fmt Format string
+/// @param ... Format arguments
+/// @return The size of the string or -1 if the buffer is too small
+int safesnprintf(char* buf, size_t sz, const char* fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap,fmt);
+ ret = vsnprintf(buf, sz, fmt, ap);
+ va_end(ap);
+ if( ret < 0 || (size_t)ret >= sz )
+ {// overflow
+ buf[sz-1] = '\0';// always nul-terminate
+ return -1;
+ }
+ return ret;
+}
+
/// Returns the line of the target position in the string.
/// Lines start at 1.
int strline(const char* str, size_t pos)
diff --git a/src/common/strlib.h b/src/common/strlib.h
index 4df5a51d2..31e364e2a 100644
--- a/src/common/strlib.h
+++ b/src/common/strlib.h
@@ -37,6 +37,11 @@ char* safestrncpy(char* dst, const char* src, size_t n);
/// doesn't crash on null pointer
size_t safestrnlen(const char* string, size_t maxlen);
+/// Works like snprintf, but always nul-terminates the buffer.
+/// Returns the size of the string (without nul-terminator)
+/// or -1 if the buffer is too small.
+int safesnprintf(char* buf, size_t sz, const char* fmt, ...);
+
/// Returns the line of the target position in the string.
/// Lines start at 1.
int strline(const char* str, size_t pos);