1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftmemory.h */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* The FreeType memory management macros (specification). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 1996-2002, 2004-2007, 2010, 2013 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef __FTMEMORY_H__ 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define __FTMEMORY_H__ 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h> 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_CONFIG_CONFIG_H 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_TYPES_H 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_BEGIN_HEADER 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Macro> */ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_SET_ERROR */ 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This macro is used to set an implicit `error' variable to a given */ 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* expression's value (usually a function call), and convert it to a */ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* boolean which is set whenever the value is != 0. */ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_SET_ERROR 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SET_ERROR( expression ) \ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( ( error = (expression) ) != 0 ) 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** M E M O R Y ****/ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * C++ refuses to handle statements like p = (void*)anything, with `p' a 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * typed pointer. Since we don't have a `typeof' operator in standard 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * C++, we have to use a template to emulate it. 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov extern "C++" 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov template <typename T> inline T* 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cplusplus_typeof( T*, 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *v ) 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return static_cast <T*> ( v ); 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ASSIGNP( p, val ) (p) = (val) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_DEBUG_MEMORY 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( const char* ) _ft_debug_file; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( long ) _ft_debug_lineno; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _ft_debug_lineno = __LINE__, \ 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (exp) ) 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov _ft_debug_lineno = __LINE__, \ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP( p, exp ) ) 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else /* !FT_DEBUG_MEMORY */ 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_DEBUG_INNER( exp ) (exp) 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_DEBUG_MEMORY */ 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The allocation functions return a pointer, and the error code 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * is written to through the `p_error' parameter. See below for 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * for documentation. 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Pointer ) 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_alloc( FT_Memory memory, 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long size, 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *p_error ); 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Pointer ) 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_qalloc( FT_Memory memory, 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long size, 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *p_error ); 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Pointer ) 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_realloc( FT_Memory memory, 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long item_size, 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long cur_count, 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long new_count, 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* block, 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *p_error ); 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Pointer ) 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_qrealloc( FT_Memory memory, 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long item_size, 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long cur_count, 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long new_count, 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* block, 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *p_error ); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( void ) 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_free( FT_Memory memory, 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const void* P ); 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_ALLOC( ptr, size ) \ 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(size), \ 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &error ) ) 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_FREE( ptr ) \ 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BEGIN_STMNT \ 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_free( memory, (ptr) ); \ 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (ptr) = NULL; \ 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_END_STMNT 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_NEW( ptr ) \ 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1, \ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(cursz), \ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(newsz), \ 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (ptr), \ 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_QALLOC( ptr, size ) \ 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \ 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(size), \ 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_QNEW( ptr ) \ 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1, \ 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(cursz), \ 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(newsz), \ 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (ptr), \ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(item_size), \ 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, \ 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(count), \ 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, \ 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(itmsz), \ 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(oldcnt), \ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(newcnt), \ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (ptr), \ 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(item_size), \ 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, \ 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(count), \ 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, \ 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(itmsz), \ 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(oldcnt), \ 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Long)(newcnt), \ 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (ptr), \ 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &error ) ) 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_ZERO( dest, count ) \ 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_COPY( dest, source, count ) \ 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_MOVE( dest, source, count ) \ 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Return the maximum number of addressable elements in an array. 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * any problems. 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The following functions macros expect that their pointer argument is */ 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* _typed_ in order to automatically compute array element sizes. */ 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_NEW_ARRAY( ptr, count ) \ 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sizeof ( *(ptr) ), \ 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0, \ 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(count), \ 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov NULL, \ 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &error ) ) 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sizeof ( *(ptr) ), \ 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(cursz), \ 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(newsz), \ 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (ptr), \ 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &error ) ) 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_QNEW_ARRAY( ptr, count ) \ 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sizeof ( *(ptr) ), \ 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0, \ 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(count), \ 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov NULL, \ 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &error ) ) 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sizeof ( *(ptr) ), \ 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(cursz), \ 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FT_Long)(newsz), \ 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (ptr), \ 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &error ) ) 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ALLOC( ptr, size ) \ 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_REALLOC( ptr, cursz, newsz ) \ 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ALLOC_MULT( ptr, count, item_size ) \ 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newcnt, itmsz ) ) 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QALLOC( ptr, size ) \ 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QREALLOC( ptr, cursz, newsz ) \ 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QALLOC_MULT( ptr, count, item_size ) \ 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newcnt, itmsz ) ) 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_NEW_ARRAY( ptr, count ) \ 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QNEW( ptr ) \ 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QNEW_ARRAY( ptr, count ) \ 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Pointer ) 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_strdup( FT_Memory memory, 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* str, 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *p_error ); 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Pointer ) 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_dup( FT_Memory memory, 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const void* address, 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong size, 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *p_error ); 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_STRDUP( dst, str ) \ 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_STRDUP( dst, str ) \ 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_DUP( dst, address, size ) \ 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_DUP( dst, address, size ) \ 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Return >= 1 if a truncation occurs. */ 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Return 0 if the source string fits the buffer. */ 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This is *not* the same as strlcpy(). */ 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE( FT_Int ) 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_strcpyn( char* dst, 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* src, 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong size ); 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_STRCPYN( dst, src, size ) \ 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_END_HEADER 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __FTMEMORY_H__ */ 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 379