From: Yorhel Date: Tue, 7 May 2013 09:56:49 +0000 (+0200) Subject: kstring: Add kvsprintf() X-Git-Tag: spawn-final~24^2~1 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=e44075f866b5f8f7c002904271ccfc8b3bc27484;p=klib.git kstring: Add kvsprintf() --- diff --git a/kstring.c b/kstring.c index b8ff45c..8ecda50 100644 --- a/kstring.c +++ b/kstring.c @@ -5,25 +5,35 @@ #include #include "kstring.h" -int ksprintf(kstring_t *s, const char *fmt, ...) +int kvsprintf(kstring_t *s, const char *fmt, va_list ap) { - va_list ap; + va_list args; int l; - va_start(ap, fmt); - l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); // This line does not work with glibc 2.0. See `man snprintf'. - va_end(ap); + va_copy(args, ap); + l = vsnprintf(s->s + s->l, s->m - s->l, fmt, args); // This line does not work with glibc 2.0. See `man snprintf'. + va_end(args); if (l + 1 > s->m - s->l) { s->m = s->l + l + 2; kroundup32(s->m); s->s = (char*)realloc(s->s, s->m); - va_start(ap, fmt); - l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); + va_copy(args, ap); + l = vsnprintf(s->s + s->l, s->m - s->l, fmt, args); + va_end(args); } - va_end(ap); s->l += l; return l; } +int ksprintf(kstring_t *s, const char *fmt, ...) +{ + va_list ap; + int l; + va_start(ap, fmt); + l = kvsprintf(s, fmt, ap); + va_end(ap); + return l; +} + char *kstrtok(const char *str, const char *sep, ks_tokaux_t *aux) { const char *p, *start; diff --git a/kstring.h b/kstring.h index 89a7920..ef69a6b 100644 --- a/kstring.h +++ b/kstring.h @@ -28,6 +28,7 @@ #include #include +#include #include #ifndef kroundup32 @@ -52,6 +53,7 @@ typedef struct { extern "C" { #endif + int kvsprintf(kstring_t *s, const char *fmt, va_list ap); int ksprintf(kstring_t *s, const char *fmt, ...); int ksplit_core(char *s, int delimiter, int *_max, int **_offsets); char *kstrstr(const char *str, const char *pat, int **_prep);