changeset 108:87f1caa659d4

Improved API.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 21 Jun 2014 20:22:49 +0300
parents f6e0a32b5906
children fedad0ed894f
files th_growbuf.c th_growbuf.h
diffstat 2 files changed, 69 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/th_growbuf.c	Sat Jun 21 20:01:36 2014 +0300
+++ b/th_growbuf.c	Sat Jun 21 20:22:49 2014 +0300
@@ -54,110 +54,108 @@
 }
 
 
-BOOL th_vputbuf_grow(uint8_t **buf, size_t *bufsize, size_t *len, size_t grow)
+BOOL th_growbuf_grow(th_growbuf_t *buf, const size_t grow)
 {
-    if (*buf == NULL)
-        *bufsize = *len = 0;
+    if (buf == NULL)
+        return FALSE;
 
-    if (*buf == NULL || *len + grow >= *bufsize)
+    if (buf->data == NULL || buf->len + grow >= buf->size)
     {
-        *bufsize += grow + TH_BUFGROW;
-        *buf = (uint8_t *) th_realloc(*buf, *bufsize);
-        if (*buf == NULL)
+        buf->size += grow + (buf->mingrow > 0 ? buf->mingrow : TH_BUFGROW);
+        buf->data = (uint8_t *) th_realloc(buf->data, buf->size);
+        if (buf->data == NULL)
             return FALSE;
     }
     return TRUE;
 }
 
 
-BOOL th_vputbuf_str(uint8_t **buf, size_t *bufsize, size_t *len, const char *str, BOOL eos)
+BOOL th_growbuf_puts(th_growbuf_t *buf, const char *str, BOOL eos)
 {
     size_t slen;
     if (str == NULL)
         return FALSE;
 
     slen = strlen(str);
-    if (!th_vputbuf_grow(buf, bufsize, len, slen + 1))
+    if (!th_growbuf_grow(buf, slen + 1))
         return FALSE;
 
-    memcpy(*buf + *len, str, slen + 1);
-    (*len) += eos ? slen + 1 : slen;
+    memcpy(buf->data + buf->len, str, slen + 1);
+    buf->len += eos ? (slen + 1) : slen;
 
     return TRUE;
 }
 
 
-BOOL th_vputbuf_u8(uint8_t **buf, size_t *bufsize, size_t *len, const uint8_t val)
+BOOL th_growbuf_putch(th_growbuf_t *buf, const char ch)
 {
-    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint8_t)))
+    if (!th_growbuf_grow(buf, sizeof(char)))
         return FALSE;
 
-    (*buf)[*len] = val;
-    (*len)++;
+    buf->data[buf->len++] = (uint8_t) ch;
 
     return TRUE;
 }
 
 
-BOOL th_vputbuf_u16_be(uint8_t **buf, size_t *bufsize, size_t *len, const uint16_t val)
+BOOL th_growbuf_put_u8(th_growbuf_t *buf, const uint8_t val)
 {
-    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint16_t)))
+    if (!th_growbuf_grow(buf, sizeof(uint8_t)))
         return FALSE;
 
-    (*buf)[*len] = (val >> 8) & 0xff;
-    (*len)++;
-    (*buf)[*len] = val & 0xff;
-    (*len)++;
+    buf->data[buf->len++] = val;
 
     return TRUE;
 }
 
 
-BOOL th_vputbuf_u16_le(uint8_t **buf, size_t *bufsize, size_t *len, const uint16_t val)
+BOOL th_growbuf_put_u16_be(th_growbuf_t *buf, const uint16_t val)
 {
-    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint16_t)))
+    if (!th_growbuf_grow(buf, sizeof(uint16_t)))
         return FALSE;
 
-    (*buf)[*len] = val & 0xff;
-    (*len)++;
-    (*buf)[*len] = (val >> 8) & 0xff;
-    (*len)++;
+    buf->data[buf->len++] = (val >> 8) & 0xff;
+    buf->data[buf->len++] = val & 0xff;
+
+    return TRUE;
+}
+
+
+BOOL th_growbuf_put_u16_le(th_growbuf_t *buf, const uint16_t val)
+{
+    if (!th_growbuf_grow(buf, sizeof(uint16_t)))
+        return FALSE;
+
+    buf->data[buf->len++] = val & 0xff;
+    buf->data[buf->len++] = (val >> 8) & 0xff;
 
     return TRUE;
 }
 
 
-BOOL th_vputbuf_u32_be(uint8_t **buf, size_t *bufsize, size_t *len, const uint32_t val)
+BOOL th_growbuf_put_u32_be(th_growbuf_t *buf, const uint32_t val)
 {
-    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint32_t)))
+    if (!th_growbuf_grow(buf, sizeof(uint32_t)))
         return FALSE;
 
-    (*buf)[*len] = (val >> 24) & 0xff;
-    (*len)++;
-    (*buf)[*len] = (val >> 16) & 0xff;
-    (*len)++;
-    (*buf)[*len] = (val >> 8) & 0xff;
-    (*len)++;
-    (*buf)[*len] = val & 0xff;
-    (*len)++;
+    buf->data[buf->len++] = (val >> 24) & 0xff;
+    buf->data[buf->len++] = (val >> 16) & 0xff;
+    buf->data[buf->len++] = (val >> 8) & 0xff;
+    buf->data[buf->len++] = val & 0xff;
 
     return TRUE;
 }
 
 
-BOOL th_vputbuf_u32_le(uint8_t **buf, size_t *bufsize, size_t *len, const uint32_t val)
+BOOL th_growbuf_put_u32_le(th_growbuf_t *buf, const uint32_t val)
 {
-    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint32_t)))
+    if (!th_growbuf_grow(buf, sizeof(uint32_t)))
         return FALSE;
 
-    (*buf)[*len] = val & 0xff;
-    (*len)++;
-    (*buf)[*len] = (val >> 8) & 0xff;
-    (*len)++;
-    (*buf)[*len] = (val >> 16) & 0xff;
-    (*len)++;
-    (*buf)[*len] = (val >> 24) & 0xff;
-    (*len)++;
+    buf->data[buf->len++] = val & 0xff;
+    buf->data[buf->len++] = (val >> 8) & 0xff;
+    buf->data[buf->len++] = (val >> 16) & 0xff;
+    buf->data[buf->len++] = (val >> 24) & 0xff;
 
     return TRUE;
 }
--- a/th_growbuf.h	Sat Jun 21 20:01:36 2014 +0300
+++ b/th_growbuf.h	Sat Jun 21 20:22:49 2014 +0300
@@ -19,22 +19,37 @@
 #define TH_BUFGROW       (32)
 
 
-/* Growing string buffer
+typedef struct
+{
+    BOOL allocated;
+    uint8_t *data;
+    size_t size, len, mingrow;
+} th_growbuf_t;
+
+
+
+/* Simple growing string buffer
  */
-BOOL    th_strbuf_grow(char **buf, size_t *bufsize, size_t *len, size_t grow);
+BOOL    th_strbuf_grow(char **buf, size_t *bufsize, size_t *len, const size_t grow);
 BOOL    th_strbuf_putch(char **buf, size_t *bufsize, size_t *len, const char ch);
 BOOL    th_strbuf_puts(char **buf, size_t *bufsize, size_t *len, const char *str);
 
 
 /* Growing byte buffer
  */
-BOOL    th_vputbuf_grow(uint8_t **buf, size_t *bufsize, size_t *len, size_t grow);
-BOOL    th_vputbuf_str(uint8_t **buf, size_t *bufsize, size_t *len, const char *str, BOOL eos);
-BOOL    th_vputbuf_u8(uint8_t **buf, size_t *bufsize, size_t *len, const uint8_t val);
-BOOL    th_vputbuf_u16_be(uint8_t **buf, size_t *bufsize, size_t *len, const uint16_t val);
-BOOL    th_vputbuf_u16_le(uint8_t **buf, size_t *bufsize, size_t *len, const uint16_t val);
-BOOL    th_vputbuf_u32_be(uint8_t **buf, size_t *bufsize, size_t *len, const uint32_t val);
-BOOL    th_vputbuf_u32_le(uint8_t **buf, size_t *bufsize, size_t *len, const uint32_t val);
+void    th_growbuf_init(th_growbuf_t *buf, const size_t mingrow);
+th_growbuf_t *th_growbuf_new(const size_t mingrow);
+void    th_growbuf_free(th_growbuf_t *buf);
+
+
+BOOL    th_growbuf_grow(th_growbuf_t *buf, const size_t grow);
+BOOL    th_growbuf_puts(th_growbuf_t *buf, const char *str, BOOL eos);
+BOOL    th_growbuf_putch(th_growbuf_t *buf, const char ch);
+BOOL    th_growbuf_put_u8(th_growbuf_t *buf, const uint8_t val);
+BOOL    th_growbuf_put_u16_be(th_growbuf_t *buf, const uint16_t val);
+BOOL    th_growbuf_put_u16_le(th_growbuf_t *buf, const uint16_t val);
+BOOL    th_growbuf_put_u32_be(th_growbuf_t *buf, const uint32_t val);
+BOOL    th_growbuf_put_u32_le(th_growbuf_t *buf, const uint32_t val);
 
 
 #ifdef __cplusplus