diff --git a/lib/roken/Makefile.am b/lib/roken/Makefile.am index d97ed9503..d50ee3116 100644 --- a/lib/roken/Makefile.am +++ b/lib/roken/Makefile.am @@ -20,7 +20,7 @@ if HAVE_DBHEADER AM_CPPFLAGS += -I$(DBHEADER) endif -noinst_PROGRAMS = snprintf-test resolve-test rkpty test-detach test-auxval rkvis rkbase32 rkbase64 +noinst_PROGRAMS = snprintf-test resolve-test rkpty test-detach test-auxval rkvis rkbase32 rkbase64 rtbl CHECK_LOCAL = snprintf-test resolve-test rkpty make-roken @@ -67,6 +67,9 @@ rkbase32_CPPFLAGS = -DTEST rkbase64_SOURCES = base64.c rkbase64_CPPFLAGS = -DTEST +rtbl_SOURCES = rtbl.c +rtbl_CPPFLAGS = -DTEST + test_detach_SOURCES = test-detach.c rkpty_LDADD = $(LIB_openpty) $(LDADD) diff --git a/lib/roken/strpool.c b/lib/roken/strpool.c index 14e579f6b..032bae1dd 100644 --- a/lib/roken/strpool.c +++ b/lib/roken/strpool.c @@ -39,7 +39,8 @@ struct rk_strpool { char *str; - size_t len; + size_t len; /* strlen() of str */ + size_t sz; /* Allocated size */ }; /* @@ -64,29 +65,32 @@ ROKEN_LIB_FUNCTION struct rk_strpool * ROKEN_LIB_CALL rk_strpoolprintf(struct rk_strpool *p, const char *fmt, ...) { va_list ap; - char *str, *str2; + char *str; int len; - if (p == NULL) { - p = malloc(sizeof(*p)); - if (p == NULL) - return NULL; - p->str = NULL; - p->len = 0; - } va_start(ap, fmt); len = vasprintf(&str, fmt, ap); va_end(ap); - if (str == NULL) { - rk_strpoolfree(p); - return NULL; + if (str == NULL) + return rk_strpoolfree(p), NULL; + + if (p == NULL) { + if ((p = malloc(sizeof(*p))) == NULL) + return free(str), NULL; + p->str = str; + p->len = p->sz = len; + return p; + } /* else grow the buffer and append `str', but don't grow too fast */ + + if (len + p->len + 1 > p->sz) { + size_t sz = p->len + len + 9 + (p->sz >> 2); + char *str2; + + if ((str2 = realloc(p->str, sz)) == NULL) + return rk_strpoolfree(p), NULL; + p->str = str2; + p->sz = sz; } - str2 = realloc(p->str, len + p->len + 1); - if (str2 == NULL) { - rk_strpoolfree(p); - return NULL; - } - p->str = str2; memcpy(p->str + p->len, str, len + 1); p->len += len; free(str);