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