1 /* 2 * Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /* 30 tre-mem.h - TRE memory allocator interface 31 */ 32 33 #ifndef _TRE_MEM_H 34 #define _TRE_MEM_H 35 36 #include <stdlib.h> 37 38 #define TRE_MEM_BLOCK_SIZE 1024 39 40 typedef struct tre_list { 41 void *data; 42 struct tre_list *next; 43 } tre_list_t; 44 45 typedef struct tre_mem_struct { 46 tre_list_t *blocks; 47 tre_list_t *current; 48 char *ptr; 49 size_t n; 50 int failed; 51 void **provided; 52 } *tre_mem_t; 53 54 tre_mem_t tre_mem_new_impl(int provided, void *provided_block); 55 void *tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block, 56 int zero, size_t size); 57 58 /* Returns a new memory allocator or NULL if out of memory. */ 59 #define tre_mem_new() tre_mem_new_impl(0, NULL) 60 61 /* Allocates a block of `size' bytes from `mem'. Returns a pointer to the 62 allocated block or NULL if an underlying malloc() failed. */ 63 #define tre_mem_alloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 0, size) 64 65 /* Allocates a block of `size' bytes from `mem'. Returns a pointer to the 66 allocated block or NULL if an underlying malloc() failed. The memory 67 is set to zero. */ 68 #define tre_mem_calloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 1, size) 69 70 /* Frees the memory allocator and all memory allocated with it. */ 71 void tre_mem_destroy(tre_mem_t mem); 72 73 #endif /* _TRE_MEM_H */