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