Mercurial > hg > th-libs
view th_growbuf.c @ 108:87f1caa659d4
Improved API.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 21 Jun 2014 20:22:49 +0300 |
parents | 4bba5be9d3bf |
children |
line wrap: on
line source
/* * 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_growbuf_grow(th_growbuf_t *buf, const size_t grow) { if (buf == NULL) return FALSE; if (buf->data == NULL || buf->len + grow >= buf->size) { 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_growbuf_puts(th_growbuf_t *buf, const char *str, BOOL eos) { size_t slen; if (str == NULL) return FALSE; slen = strlen(str); if (!th_growbuf_grow(buf, slen + 1)) return FALSE; memcpy(buf->data + buf->len, str, slen + 1); buf->len += eos ? (slen + 1) : slen; return TRUE; } BOOL th_growbuf_putch(th_growbuf_t *buf, const char ch) { if (!th_growbuf_grow(buf, sizeof(char))) return FALSE; buf->data[buf->len++] = (uint8_t) ch; return TRUE; } BOOL th_growbuf_put_u8(th_growbuf_t *buf, const uint8_t val) { if (!th_growbuf_grow(buf, sizeof(uint8_t))) return FALSE; buf->data[buf->len++] = val; return TRUE; } BOOL th_growbuf_put_u16_be(th_growbuf_t *buf, const uint16_t val) { if (!th_growbuf_grow(buf, sizeof(uint16_t))) return FALSE; 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_growbuf_put_u32_be(th_growbuf_t *buf, const uint32_t val) { if (!th_growbuf_grow(buf, sizeof(uint32_t))) return FALSE; 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_growbuf_put_u32_le(th_growbuf_t *buf, const uint32_t val) { if (!th_growbuf_grow(buf, sizeof(uint32_t))) return FALSE; 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; }