From 5e43bd658e578ced54f6065e95f6efb4892e114c Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Sun, 31 Jan 2016 15:40:16 +0100 Subject: sfeed: realloc, faster near pow 2 bufsiz --- sfeed.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'sfeed.c') diff --git a/sfeed.c b/sfeed.c index a75d832..b06bff6 100644 --- a/sfeed.c +++ b/sfeed.c @@ -207,15 +207,22 @@ string_clear(String *s) static void string_buffer_realloc(String *s, size_t newlen) { - char *p; - size_t alloclen; + uint32_t v; + /* check if allocation is necessary, don't shrink buffer, + * should be more than bufsiz ofcourse. */ + if (newlen <= s->bufsiz) + return; - for (alloclen = 64; alloclen <= newlen; alloclen *= 2) - ; - if (!(p = realloc(s->data, alloclen))) + v = (uint32_t)newlen; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + if (!(s->data = realloc(s->data, (size_t)v))) err(1, "realloc"); - s->bufsiz = alloclen; - s->data = p; + s->bufsiz = (size_t)v; } static void @@ -223,10 +230,8 @@ string_append(String *s, const char *data, size_t len) { if (!len || *data == '\0') return; - /* check if allocation is necesary, don't shrink buffer, - * should be more than bufsiz ofcourse. */ - if (s->len + len >= s->bufsiz) - string_buffer_realloc(s, s->len + len + 1); + + string_buffer_realloc(s, s->len + len + 1); memcpy(s->data + s->len, data, len); s->len += len; s->data[s->len] = '\0'; -- cgit v1.2.3