1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftmemory.h */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* The FreeType memory management macros (specification). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/* Copyright 1996-2002, 2004-2007, 2010, 2013 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef __FTMEMORY_H__ 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define __FTMEMORY_H__ 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_CONFIG_CONFIG_H 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TYPES_H 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_BEGIN_HEADER 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Macro> */ 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FT_SET_ERROR */ 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This macro is used to set an implicit `error' variable to a given */ 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* expression's value (usually a function call), and convert it to a */ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* boolean which is set whenever the value is != 0. */ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_SET_ERROR 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_SET_ERROR( expression ) \ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( ( error = (expression) ) != 0 ) 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** M E M O R Y ****/ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 61aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich * C++ refuses to handle statements like p = (void*)anything, with `p' a 62aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich * typed pointer. Since we don't have a `typeof' operator in standard 63aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich * C++, we have to use a template to emulate it. 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef __cplusplus 67aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 68aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich extern "C++" 69aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich template <typename T> inline T* 70aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cplusplus_typeof( T*, 71aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich void *v ) 72aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 73aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return static_cast <T*> ( v ); 74aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 75aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 76aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) 77aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 79aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ASSIGNP( p, val ) (p) = (val) 81aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_DEBUG_MEMORY 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( const char* ) _ft_debug_file; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( long ) _ft_debug_lineno; 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _ft_debug_lineno = __LINE__, \ 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (exp) ) 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _ft_debug_lineno = __LINE__, \ 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSIGNP( p, exp ) ) 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_DEBUG_MEMORY */ 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_DEBUG_INNER( exp ) (exp) 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_DEBUG_MEMORY */ 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * The allocation functions return a pointer, and the error code 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * is written to through the `p_error' parameter. See below for 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * for documentation. 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_alloc( FT_Memory memory, 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long size, 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_qalloc( FT_Memory memory, 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long size, 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_realloc( FT_Memory memory, 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long item_size, 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_count, 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_count, 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* block, 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_qrealloc( FT_Memory memory, 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long item_size, 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_count, 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_count, 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* block, 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( void ) 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_free( FT_Memory memory, 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const void* P ); 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 144a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_ALLOC( ptr, size ) \ 145a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ 146a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(size), \ 147a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_FREE( ptr ) \ 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BEGIN_STMNT \ 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_free( memory, (ptr) ); \ 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (ptr) = NULL; \ 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_END_STMNT 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_NEW( ptr ) \ 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ 159a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 160a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 1, \ 161a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(cursz), \ 162a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(newsz), \ 163a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (ptr), \ 164a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 165a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 166a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_QALLOC( ptr, size ) \ 167a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \ 168a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(size), \ 169a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_QNEW( ptr ) \ 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 174a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ 175a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 176a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 1, \ 177a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(cursz), \ 178a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(newsz), \ 179a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (ptr), \ 180a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 181a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 182a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ 183a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 184a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(item_size), \ 185a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 0, \ 186a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(count), \ 187a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang NULL, \ 188a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 189a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 190a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 191a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 192a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(itmsz), \ 193a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(oldcnt), \ 194a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(newcnt), \ 195a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (ptr), \ 196a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 197a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 198a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ 199a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 200a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(item_size), \ 201a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 0, \ 202a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(count), \ 203a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang NULL, \ 204a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 205a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 206a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ 207a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 208a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(itmsz), \ 209a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(oldcnt), \ 210a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(newcnt), \ 211a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (ptr), \ 212a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_ZERO( dest, count ) \ 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_COPY( dest, source, count ) \ 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_MOVE( dest, source, count ) \ 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Return the maximum number of addressable elements in an array. 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * any problems. 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following functions macros expect that their pointer argument is */ 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* _typed_ in order to automatically compute array element sizes. */ 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 256a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_NEW_ARRAY( ptr, count ) \ 257a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 258a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang sizeof ( *(ptr) ), \ 259a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 0, \ 260a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(count), \ 261a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang NULL, \ 262a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 263a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 264a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ 265a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 266a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang sizeof ( *(ptr) ), \ 267a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(cursz), \ 268a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(newsz), \ 269a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (ptr), \ 270a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 271a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 272a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_QNEW_ARRAY( ptr, count ) \ 273a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 274a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang sizeof ( *(ptr) ), \ 275a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 0, \ 276a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(count), \ 277a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang NULL, \ 278a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 279a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 280a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ 281a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 282a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang sizeof ( *(ptr) ), \ 283a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(cursz), \ 284a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (FT_Long)(newsz), \ 285a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (ptr), \ 286a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang &error ) ) 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ALLOC( ptr, size ) \ 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_REALLOC( ptr, cursz, newsz ) \ 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ALLOC_MULT( ptr, count, item_size ) \ 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newcnt, itmsz ) ) 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QALLOC( ptr, size ) \ 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QREALLOC( ptr, cursz, newsz ) \ 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QALLOC_MULT( ptr, count, item_size ) \ 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newcnt, itmsz ) ) 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_NEW_ARRAY( ptr, count ) \ 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QNEW( ptr ) \ 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QNEW_ARRAY( ptr, count ) \ 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strdup( FT_Memory memory, 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* str, 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_dup( FT_Memory memory, 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const void* address, 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong size, 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_STRDUP( dst, str ) \ 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_STRDUP( dst, str ) \ 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_DUP( dst, address, size ) \ 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_DUP( dst, address, size ) \ 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Return >= 1 if a truncation occurs. */ 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Return 0 if the source string fits the buffer. */ 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This is *not* the same as strlcpy(). */ 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Int ) 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strcpyn( char* dst, 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* src, 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong size ); 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_STRCPYN( dst, src, size ) \ 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __FTMEMORY_H__ */ 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 379