1/* 2 tre-mem.h - TRE memory allocator interface 3 4 This software is released under a BSD-style license. 5 See the file LICENSE for details and copyright. 6 7*/ 8 9#ifndef TRE_MEM_H 10#define TRE_MEM_H 1 11 12#include <stdlib.h> 13 14#define TRE_MEM_BLOCK_SIZE 1024 15 16typedef struct tre_list { 17 void *data; 18 struct tre_list *next; 19} tre_list_t; 20 21typedef struct tre_mem_struct { 22 tre_list_t *blocks; 23 tre_list_t *current; 24 char *ptr; 25 size_t n; 26 int failed; 27 void **provided; 28} *tre_mem_t; 29 30 31__private_extern__ tre_mem_t tre_mem_new_impl(int provided, 32 void *provided_block); 33__private_extern__ void *tre_mem_alloc_impl(tre_mem_t mem, int provided, 34 void *provided_block, 35 int zero, size_t size); 36 37/* Returns a new memory allocator or NULL if out of memory. */ 38#define tre_mem_new() tre_mem_new_impl(0, NULL) 39 40/* Allocates a block of `size' bytes from `mem'. Returns a pointer to the 41 allocated block or NULL if an underlying malloc() failed. */ 42#define tre_mem_alloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 0, size) 43 44/* Allocates a block of `size' bytes from `mem'. Returns a pointer to the 45 allocated block or NULL if an underlying malloc() failed. The memory 46 is set to zero. */ 47#define tre_mem_calloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 1, size) 48 49#ifdef TRE_USE_ALLOCA 50/* alloca() versions. Like above, but memory is allocated with alloca() 51 instead of malloc(). */ 52 53#define tre_mem_newa() \ 54 tre_mem_new_impl(1, alloca(sizeof(struct tre_mem_struct))) 55 56#define tre_mem_alloca(mem, size) \ 57 ((mem)->n >= (size) \ 58 ? tre_mem_alloc_impl((mem), 1, NULL, 0, (size)) \ 59 : tre_mem_alloc_impl((mem), 1, alloca(TRE_MEM_BLOCK_SIZE), 0, (size))) 60#endif /* TRE_USE_ALLOCA */ 61 62 63/* Frees the memory allocator and all memory allocated with it. */ 64__private_extern__ void tre_mem_destroy(tre_mem_t mem); 65 66#endif /* TRE_MEM_H */ 67 68/* EOF */ 69