Mercurial > hg > th-libs
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 */