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