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;
}