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/* */ 7a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin/* Copyright 1996-2017 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 19055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifndef FTMEMORY_H_ 20055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#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 68055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shinextern "C++" 69055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin{ 70aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich template <typename T> inline T* 71aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cplusplus_typeof( T*, 72aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich void *v ) 73aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 74aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return static_cast <T*> ( v ); 75aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 76055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin} 77aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 78aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) 79aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 81aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ASSIGNP( p, val ) (p) = (val) 83aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_DEBUG_MEMORY 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( const char* ) _ft_debug_file; 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( long ) _ft_debug_lineno; 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _ft_debug_lineno = __LINE__, \ 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (exp) ) 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _ft_debug_lineno = __LINE__, \ 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSIGNP( p, exp ) ) 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_DEBUG_MEMORY */ 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_DEBUG_INNER( exp ) (exp) 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_DEBUG_MEMORY */ 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * The allocation functions return a pointer, and the error code 111055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin * is written to through the `p_error' parameter. 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 114055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* The `q' variants of the functions below (`q' for `quick') don't fill */ 115055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* the allocated or reallocated memory with zero bytes. */ 116055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_alloc( FT_Memory memory, 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long size, 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_qalloc( FT_Memory memory, 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long size, 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_realloc( FT_Memory memory, 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long item_size, 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_count, 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_count, 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* block, 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_qrealloc( FT_Memory memory, 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long item_size, 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_count, 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_count, 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* block, 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( void ) 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_free( FT_Memory memory, 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const void* P ); 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 148055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* The `Q' variants of the macros below (`Q' for `quick') don't fill */ 149055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* the allocated or reallocated memory with zero bytes. */ 150055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 151727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_ALLOC( ptr, size ) \ 152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ 153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(size), \ 154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_FREE( ptr ) \ 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BEGIN_STMNT \ 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_free( memory, (ptr) ); \ 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (ptr) = NULL; \ 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_END_STMNT 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_NEW( ptr ) \ 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ 166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 1, \ 168727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(cursz), \ 169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(newsz), \ 170727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (ptr), \ 171727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 172727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 173727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_QALLOC( ptr, size ) \ 174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \ 175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(size), \ 176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_QNEW( ptr ) \ 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ 182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 1, \ 184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(cursz), \ 185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(newsz), \ 186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (ptr), \ 187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ 190727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 191727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(item_size), \ 192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0, \ 193727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(count), \ 194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease NULL, \ 195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 196727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 197727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 198727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 199727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(itmsz), \ 200727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(oldcnt), \ 201727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(newcnt), \ 202727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (ptr), \ 203727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 204727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 205727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ 206727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 207727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(item_size), \ 208727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0, \ 209727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(count), \ 210727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease NULL, \ 211727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 212727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 213727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ 214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(itmsz), \ 216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(oldcnt), \ 217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(newcnt), \ 218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (ptr), \ 219727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define FT_MEM_SET( dest, byte, count ) \ 226fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki ft_memset( dest, byte, (FT_Offset)(count) ) 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 228fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define FT_MEM_COPY( dest, source, count ) \ 229fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki ft_memcpy( dest, source, (FT_Offset)(count) ) 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 231fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define FT_MEM_MOVE( dest, source, count ) \ 232fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki ft_memmove( dest, source, (FT_Offset)(count) ) 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define FT_ARRAY_ZERO( dest, count ) \ 241fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_MEM_ZERO( dest, \ 242fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_Offset)(count) * sizeof ( *(dest) ) ) 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 244fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define FT_ARRAY_COPY( dest, source, count ) \ 245fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_MEM_COPY( dest, \ 246fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki source, \ 247fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_Offset)(count) * sizeof ( *(dest) ) ) 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 249fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define FT_ARRAY_MOVE( dest, source, count ) \ 250fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_MEM_MOVE( dest, \ 251fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki source, \ 252fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_Offset)(count) * sizeof ( *(dest) ) ) 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Return the maximum number of addressable elements in an array. 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * any problems. 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following functions macros expect that their pointer argument is */ 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* _typed_ in order to automatically compute array element sizes. */ 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_NEW_ARRAY( ptr, count ) \ 272727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 273727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease sizeof ( *(ptr) ), \ 274727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0, \ 275727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(count), \ 276727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease NULL, \ 277727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 278727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 279727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ 280727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ 281727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease sizeof ( *(ptr) ), \ 282727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(cursz), \ 283727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(newsz), \ 284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (ptr), \ 285727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 286727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 287727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_QNEW_ARRAY( ptr, count ) \ 288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease sizeof ( *(ptr) ), \ 290727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0, \ 291727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(count), \ 292727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease NULL, \ 293727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 294727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 295727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ 296727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ 297727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease sizeof ( *(ptr) ), \ 298727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(cursz), \ 299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)(newsz), \ 300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (ptr), \ 301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &error ) ) 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ALLOC( ptr, size ) \ 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_REALLOC( ptr, cursz, newsz ) \ 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_ALLOC_MULT( ptr, count, item_size ) \ 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newcnt, itmsz ) ) 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QALLOC( ptr, size ) \ 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QREALLOC( ptr, cursz, newsz ) \ 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QALLOC_MULT( ptr, count, item_size ) \ 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newcnt, itmsz ) ) 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_NEW_ARRAY( ptr, count ) \ 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QNEW( ptr ) \ 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QNEW_ARRAY( ptr, count ) \ 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strdup( FT_Memory memory, 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* str, 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Pointer ) 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_dup( FT_Memory memory, 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const void* address, 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong size, 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ); 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 360727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_STRDUP( dst, str ) \ 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_STRDUP( dst, str ) \ 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_DUP( dst, address, size ) \ 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_DUP( dst, address, size ) \ 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Return >= 1 if a truncation occurs. */ 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Return 0 if the source string fits the buffer. */ 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This is *not* the same as strlcpy(). */ 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE( FT_Int ) 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strcpyn( char* dst, 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* src, 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong size ); 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_STRCPYN( dst, src, size ) \ 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 390055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* FTMEMORY_H_ */ 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 394