changeset 1530:94eb6a8a7d56

Add helper function dmGrowBufRealloc() to handle the common case of reallocating the grow buffer in various enlargement functions.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 12 May 2018 03:10:47 +0300
parents 4068d87ca884
children 260bf529a8f2
files src/dmgrowbuf.c
diffstat 1 files changed, 20 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/dmgrowbuf.c	Sat May 12 02:29:05 2018 +0300
+++ b/src/dmgrowbuf.c	Sat May 12 03:10:47 2018 +0300
@@ -73,6 +73,20 @@
 }
 
 
+static BOOL dmGrowBufRealloc(DMGrowBuf *buf, const size_t nsize, const BOOL clear)
+{
+    if ((buf->data = dmRealloc(buf->data, nsize)) == NULL)
+        return FALSE;
+
+    if (clear)
+        memset(buf->adata + buf->size, 0, nsize - buf->size);
+
+    buf->size = nsize;
+
+    return TRUE;
+}
+
+
 //
 // Grow the buffer by "amount" bytes, but at least by buf->mingrow,
 // if there is not enough space for at least that amount compared to
@@ -80,15 +94,11 @@
 //
 BOOL dmGrowBufGrow(DMGrowBuf *buf, const size_t amount)
 {
-    size_t grow = (amount > buf->mingrow) ? amount : buf->mingrow;
-    if (buf->data == NULL || buf->len + grow > buf->size)
+    if (buf->data == NULL || buf->offs + buf->len + amount >= buf->size)
     {
-        size_t prev = buf->size;
-        buf->size += grow;
-        if ((buf->data = dmRealloc(buf->data, buf->size)) == NULL)
+        size_t grow = (amount > buf->mingrow) ? amount : buf->mingrow;
+        if (!dmGrowBufRealloc(buf, buf->offs + buf->len + grow, TRUE))
             return FALSE;
-
-        memset(buf->data + prev, 0, buf->size - prev);
     }
 
     return TRUE;
@@ -101,14 +111,10 @@
 //
 BOOL dmGrowBufCheckGrow(DMGrowBuf *buf, const size_t nsize)
 {
-    if (buf->data == NULL || nsize > buf->size)
+    if (buf->data == NULL || buf->offs + nsize > buf->size)
     {
-        size_t prev = buf->size;
-        buf->size = nsize + buf->mingrow;
-        if ((buf->data = dmRealloc(buf->data, buf->size)) == NULL)
+        if (!dmGrowBufRealloc(buf, buf->offs + nsize + buf->mingrow, TRUE))
             return FALSE;
-
-        memset(buf->data + prev, 0, buf->size - prev);
     }
 
     return TRUE;
@@ -124,7 +130,7 @@
     if (buf->len == 0)
         return DMERR_OK;
 
-    if ((buf->data = dmRealloc(buf->data, buf->len)) == NULL)
+    if (!dmGrowBufRealloc(buf, buf->size, FALSE))
         return DMERR_MALLOC;
 
     return DMERR_OK;