changeset 106:4bba5be9d3bf

Add a new module for growing buffers.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 21 Jun 2014 19:59:54 +0300
parents ea5b1c4b3af5
children f6e0a32b5906
files th_growbuf.c th_growbuf.h
diffstat 2 files changed, 206 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/th_growbuf.c	Sat Jun 21 19:59:54 2014 +0300
@@ -0,0 +1,163 @@
+/*
+ * Growing buffer implementations
+ * Programmed and designed by Matti 'ccr' Hamalainen
+ * (C) Copyright 2002-2014 Tecnic Software productions (TNSP)
+ *
+ * Please read file 'COPYING' for information on license and distribution.
+ */
+#include "th_growbuf.h"
+
+
+
+BOOL th_strbuf_grow(char **buf, size_t *bufsize, size_t *len, size_t grow)
+{
+    if (*buf == NULL)
+        *bufsize = *len = 0;
+
+    if (*buf == NULL || *len + grow >= *bufsize)
+    {
+        *bufsize += grow + TH_BUFGROW;
+        *buf = th_realloc(*buf, *bufsize);
+        if (*buf == NULL)
+            return FALSE;
+    }
+    return TRUE;
+}
+
+
+BOOL th_strbuf_putch(char **buf, size_t *bufsize, size_t *len, const char ch)
+{
+    if (!th_strbuf_grow(buf, bufsize, len, 1))
+        return FALSE;
+
+    (*buf)[*len] = ch;
+    (*len)++;
+
+    return TRUE;
+}
+
+
+BOOL th_strbuf_puts(char **buf, size_t *bufsize, size_t *len, const char *str)
+{
+    size_t slen;
+    if (str == NULL)
+        return FALSE;
+
+    slen = strlen(str);
+    if (!th_strbuf_grow(buf, bufsize, len, slen + 1))
+        return FALSE;
+
+    memcpy(*buf + *len, str, slen + 1);
+    (*len) += slen;
+
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_grow(uint8_t **buf, size_t *bufsize, size_t *len, size_t grow)
+{
+    if (*buf == NULL)
+        *bufsize = *len = 0;
+
+    if (*buf == NULL || *len + grow >= *bufsize)
+    {
+        *bufsize += grow + TH_BUFGROW;
+        *buf = (uint8_t *) th_realloc(*buf, *bufsize);
+        if (*buf == NULL)
+            return FALSE;
+    }
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_str(uint8_t **buf, size_t *bufsize, size_t *len, 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))
+        return FALSE;
+
+    memcpy(*buf + *len, str, slen + 1);
+    (*len) += eos ? slen + 1 : slen;
+
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_u8(uint8_t **buf, size_t *bufsize, size_t *len, const uint8_t val)
+{
+    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint8_t)))
+        return FALSE;
+
+    (*buf)[*len] = val;
+    (*len)++;
+
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_u16_be(uint8_t **buf, size_t *bufsize, size_t *len, const uint16_t val)
+{
+    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint16_t)))
+        return FALSE;
+
+    (*buf)[*len] = (val >> 8) & 0xff;
+    (*len)++;
+    (*buf)[*len] = val & 0xff;
+    (*len)++;
+
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_u16_le(uint8_t **buf, size_t *bufsize, size_t *len, const uint16_t val)
+{
+    if (!th_vputbuf_grow(buf, bufsize, len, sizeof(uint16_t)))
+        return FALSE;
+
+    (*buf)[*len] = val & 0xff;
+    (*len)++;
+    (*buf)[*len] = (val >> 8) & 0xff;
+    (*len)++;
+
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_u32_be(uint8_t **buf, size_t *bufsize, size_t *len, const uint32_t val)
+{
+    if (!th_vputbuf_grow(buf, bufsize, len, 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)++;
+
+    return TRUE;
+}
+
+
+BOOL th_vputbuf_u32_le(uint8_t **buf, size_t *bufsize, size_t *len, const uint32_t val)
+{
+    if (!th_vputbuf_grow(buf, bufsize, len, 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)++;
+
+    return TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/th_growbuf.h	Sat Jun 21 19:59:54 2014 +0300
@@ -0,0 +1,43 @@
+/*
+ * Growing buffer implementations
+ * Programmed and designed by Matti 'ccr' Hamalainen
+ * (C) Copyright 2002-2014 Tecnic Software productions (TNSP)
+ *
+ * Please read file 'COPYING' for information on license and distribution.
+ */
+#ifndef TH_GROWBUF_H
+#define TH_GROWBUF_H
+
+#include "th_util.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define TH_BUFGROW       (32)
+
+
+/* Growing string buffer
+ */
+BOOL    th_strbuf_grow(char **buf, size_t *bufsize, size_t *len, 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);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* TH_GROWBUF_H */