]> git.kaiwu.me - klib.git/commitdiff
kstring: Add kvsprintf()
authorYorhel <git@yorhel.nl>
Tue, 7 May 2013 09:56:49 +0000 (11:56 +0200)
committerYorhel <git@yorhel.nl>
Tue, 7 May 2013 09:56:49 +0000 (11:56 +0200)
kstring.c
kstring.h

index b8ff45c758128c6760c494b8c97d7e06d2a676bd..8ecda502b893669b68c2e587532e17b2325861c0 100644 (file)
--- a/kstring.c
+++ b/kstring.c
@@ -5,25 +5,35 @@
 #include <stdint.h>
 #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;
index 89a7920c646fd6df2dc773250b7a0f5f1195ccec..ef69a6b1ebbb623f131744e42f618d28bd644111 100644 (file)
--- a/kstring.h
+++ b/kstring.h
@@ -28,6 +28,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <stdarg.h>
 #include <stdint.h>
 
 #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);