Home
tmem.h - iomenu - interactive terminal-based selection menu HTML git clone git://bitreich.org/iomenu git://hg6vgqziawt5s4dj.onion/iomenu DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- tmem.h (2610B) --- 1 #ifndef MEM_H 2 #define MEM_H 3 4 /* 5 * Lightweight wrapper over malloc, that permit to define a memory pool of 6 * multiple buffers, and free them all at once. 7 * 8 * *──────────┐ 9 * │ mem_pool │ 10 * ├──────────┤ 11 * │*head │ 12 * └┬─────────┘ 13 * v 14 * NULL< *───────────┐< >*───────────┐< >*───────────┐< >*───────────┐ >NULL 15 * \ │ mem_block │ \/ │ mem_block │ \/ │ mem_block │ \/ │ mem_block │ / 16 * \ ├───────────┤ /\ ├───────────┤ /\ ├───────────┤ /\ ├───────────┤ / 17 * `┤*prev *next├' `┤*prev *next├' `┤*prev *next├' `┤*prev *next├' 18 * │len │ │len │ │len │ │len │ 19 * ├─┴─magic───┤ ├─┴─magic───┤ ├─┴─magic───┤ ├─┴─magic───┤ 20 * │///////////│ │///////////│ │///////////│ │///////////│ 21 * │///////////│ │///////////│ │///////////│ │///////////│ 22 * │///////////│ │///////////│ │///////////│ └───────────┘ 23 * └───────────┘ │///////////│ │///////////│ 24 * │///////////│ └───────────┘ 25 * └───────────┘ 26 * 27 * This permits the type checker to still work on all operations while 28 * providing generic memory management functions for all types of data 29 * structures and keep track of each object's length. 30 */ 31 32 #include <stddef.h> 33 34 #define MEM_BLOCK_MAGIC "\xcc\x68\x23\xd7\x9b\x7d\x39\xb9" 35 36 struct mem_pool { 37 struct mem_block *head; 38 }; 39 40 struct mem_block { 41 struct mem_pool *pool; 42 struct mem_block *prev, *next; 43 size_t len; 44 char magic[8]; /* at the end to detect buffer underflow */ 45 char buf[]; 46 }; 47 48 /** src/mem.c **/ 49 void * mem_alloc(struct mem_pool *pool, size_t len); 50 int mem_resize(void **memp, size_t len); 51 int mem_grow(void **memp, size_t len); 52 int mem_shrink(void **memp, size_t len); 53 size_t mem_length(void *mem); 54 int mem_append(void **memp, void const *buf, size_t len); 55 int mem_read(void **memp, struct mem_pool *pool); 56 void mem_delete(void *mem); 57 void mem_free(struct mem_pool *pool); 58 59 #endif