110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_growable_buffer.c
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * a growable buffer implementation
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2007 OProfile authors
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_growable_buffer.h"
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_libiberty.h"
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h>
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h>
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid init_buffer(struct growable_buffer * b)
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	b->max_size = 0;
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	b->size = 0;
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	b->p = NULL;
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid free_buffer(struct growable_buffer * b)
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	free(b->p);
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void grow_buffer(struct growable_buffer * b)
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	size_t new_size = (b->max_size + b->size) * 2;
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	b->p = xrealloc(b->p, new_size);
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	b->max_size = new_size;
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid add_data(struct growable_buffer * b, void const * data, size_t len)
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	size_t old_size = b->size;
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	b->size += len;
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (b->size > b->max_size)
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		grow_buffer(b);
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	memcpy(b->p + old_size, data, len);
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
47