47 lines
813 B
C
47 lines
813 B
C
/**
|
|
* @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);
|
|
}
|