From 81171e37b2c90bdb9b3b9c79d9cab1774760326e Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 29 Apr 2014 13:14:48 +0200 Subject: common: add mp_snprintf_append() utility function --- common/common.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'common/common.c') diff --git a/common/common.c b/common/common.c index e9cd70cf41..6084176610 100644 --- a/common/common.c +++ b/common/common.c @@ -16,6 +16,9 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include +#include + #include #include "talloc.h" @@ -104,6 +107,22 @@ bool mp_rect_intersection(struct mp_rect *rc, const struct mp_rect *rc2) return rc->x1 > rc->x0 && rc->y1 > rc->y0; } +// This works like snprintf(), except that it starts writing the first output +// character to str[strlen(str)]. This returns the number of characters the +// string would have assuming a large enough buffer, will make sure str is +// null-terminated, and will never write to str[size] or past. +int mp_snprintf_append(char *str, size_t size, const char *format, ...) +{ + size_t len = strnlen(str, size); + assert(!size || len < size); // str with no 0-termination is not allowed + int r; + va_list ap; + va_start(ap, format); + r = len + vsnprintf(str + len, size - len, format, ap); + va_end(ap); + return r; +} + // Encode the unicode codepoint as UTF-8, and append to the end of the // talloc'ed buffer. All guarantees bstr_xappend() give applies, such as // implicit \0-termination for convenience. -- cgit v1.2.3