# HG changeset patch # User Matti Hamalainen # Date 1526083847 -10800 # Node ID 94eb6a8a7d56c29c52d29e61be73deab41dad90d # Parent 4068d87ca884b23c47436ea66668a8a98180698c Add helper function dmGrowBufRealloc() to handle the common case of reallocating the grow buffer in various enlargement functions. diff -r 4068d87ca884 -r 94eb6a8a7d56 src/dmgrowbuf.c --- 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;