# HG changeset patch # User Matti Hamalainen # Date 1403371369 -10800 # Node ID 87f1caa659d497bed3d54725d97691a1100899b2 # Parent f6e0a32b59060624ce09435ce2c0c594a6d496a9 Improved API. diff -r f6e0a32b5906 -r 87f1caa659d4 th_growbuf.c --- 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; } diff -r f6e0a32b5906 -r 87f1caa659d4 th_growbuf.h --- 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