1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  ftmemory.h                                                             */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    The FreeType memory management macros (specification).               */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*  Copyright 1996-2015 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
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FT_MEM_SET( dest, byte, count )               \
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ft_memset( dest, byte, (FT_Offset)(count) )
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FT_MEM_COPY( dest, source, count )              \
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ft_memcpy( dest, source, (FT_Offset)(count) )
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FT_MEM_MOVE( dest, source, count )               \
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ft_memmove( dest, source, (FT_Offset)(count) )
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FT_ARRAY_ZERO( dest, count )                             \
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_MEM_ZERO( dest,                                     \
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       (FT_Offset)(count) * sizeof ( *(dest) ) )
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FT_ARRAY_COPY( dest, source, count )                     \
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_MEM_COPY( dest,                                     \
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       source,                                   \
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       (FT_Offset)(count) * sizeof ( *(dest) ) )
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FT_ARRAY_MOVE( dest, source, count )                     \
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_MEM_MOVE( dest,                                     \
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       source,                                   \
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       (FT_Offset)(count) * sizeof ( *(dest) ) )
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  Return the maximum number of addressable elements in an array.
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  any problems.
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The following functions macros expect that their pointer argument is  */
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* _typed_ in order to automatically compute array element sizes.        */
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_NEW_ARRAY( ptr, count )                              \
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 sizeof ( *(ptr) ), \
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 0,                 \
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 (FT_Long)(count),  \
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 NULL,              \
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 &error ) )
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                     \
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 sizeof ( *(ptr) ), \
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 (FT_Long)(cursz),  \
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 (FT_Long)(newsz),  \
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 (ptr),             \
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                 &error ) )
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_QNEW_ARRAY( ptr, count )                              \
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  sizeof ( *(ptr) ), \
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  0,                 \
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  (FT_Long)(count),  \
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  NULL,              \
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  &error ) )
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                     \
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  sizeof ( *(ptr) ), \
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  (FT_Long)(cursz),  \
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  (FT_Long)(newsz),  \
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  (ptr),             \
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                  &error ) )
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ALLOC( ptr, size )                           \
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_REALLOC( ptr, cursz, newsz )                           \
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_ALLOC_MULT( ptr, count, item_size )                           \
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                 newcnt, itmsz ) )
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QALLOC( ptr, size )                           \
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QREALLOC( ptr, cursz, newsz )                           \
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QALLOC_MULT( ptr, count, item_size )                           \
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                  newcnt, itmsz ) )
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_FREE( ptr )  FT_MEM_FREE( ptr )
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_NEW_ARRAY( ptr, count )                           \
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QNEW( ptr )                           \
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QNEW_ARRAY( ptr, count )                          \
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_BASE( FT_Pointer )
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_mem_strdup( FT_Memory    memory,
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 const char*  str,
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 FT_Error    *p_error );
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_BASE( FT_Pointer )
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_mem_dup( FT_Memory    memory,
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              const void*  address,
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              FT_ULong     size,
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              FT_Error    *p_error );
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_STRDUP( dst, str )                                            \
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_STRDUP( dst, str )                           \
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MEM_DUP( dst, address, size )                                    \
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_DUP( dst, address, size )                           \
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Return >= 1 if a truncation occurs.            */
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Return 0 if the source string fits the buffer. */
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* This is *not* the same as strlcpy().           */
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_BASE( FT_Int )
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_mem_strcpyn( char*        dst,
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  const char*  src,
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_ULong     size );
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_STRCPYN( dst, src, size )                                         \
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_END_HEADER
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __FTMEMORY_H__ */
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
387