common: add mp_snprintf_append() utility function

This commit is contained in:
wm4 2014-04-29 13:14:48 +02:00
parent 8562f53cf9
commit 81171e37b2
2 changed files with 23 additions and 0 deletions

View File

@ -16,6 +16,9 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdarg.h>
#include <assert.h>
#include <libavutil/common.h>
#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.

View File

@ -19,6 +19,7 @@
#ifndef MPLAYER_MPCOMMON_H
#define MPLAYER_MPCOMMON_H
#include <stddef.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
@ -76,6 +77,9 @@ struct mp_rect {
void mp_rect_union(struct mp_rect *rc, const struct mp_rect *src);
bool mp_rect_intersection(struct mp_rect *rc, const struct mp_rect *rc2);
int mp_snprintf_append(char *str, size_t size, const char *format, ...)
PRINTF_ATTRIBUTE(3, 4);
struct bstr;
void mp_append_utf8_bstr(void *talloc_ctx, struct bstr *buf, uint32_t codepoint);