blob: d138f36ef4b656540b0b5c8ef25e2ea19651c94e [file] [log] [blame]
/**
* @file op_growable_buffer.c
* a growable buffer implementation
*
* @remark Copyright 2007 OProfile authors
* @remark Read the file COPYING
*
* @author Philippe Elie
*/
#include "op_growable_buffer.h"
#include "op_libiberty.h"
#include <string.h>
#include <stdlib.h>
void init_buffer(struct growable_buffer * b)
{
b->max_size = 0;
b->size = 0;
b->p = NULL;
}
void free_buffer(struct growable_buffer * b)
{
free(b->p);
}
static void grow_buffer(struct growable_buffer * b)
{
size_t new_size = (b->max_size + b->size) * 2;
b->p = xrealloc(b->p, new_size);
b->max_size = new_size;
}
void add_data(struct growable_buffer * b, void const * data, size_t len)
{
size_t old_size = b->size;
b->size += len;
if (b->size > b->max_size)
grow_buffer(b);
memcpy(b->p + old_size, data, len);
}