32#define FT_COMPONENT memory
48 FT_BASE_DEF( FT_Pointer )
49 ft_mem_alloc( FT_Memory memory,
54 FT_Pointer block = ft_mem_qalloc( memory, size, &error );
56 if ( !error && block && size > 0 )
57 FT_MEM_ZERO( block, size );
64 FT_BASE_DEF( FT_Pointer )
65 ft_mem_qalloc( FT_Memory memory,
69 FT_Error error = FT_Err_Ok;
70 FT_Pointer block = NULL;
75 block = memory->alloc( memory, size );
77 error = FT_THROW( Out_Of_Memory );
82 error = FT_THROW( Invalid_Argument );
90 FT_BASE_DEF( FT_Pointer )
91 ft_mem_realloc( FT_Memory memory,
98 FT_Error error = FT_Err_Ok;
101 block = ft_mem_qrealloc( memory, item_size,
102 cur_count, new_count, block, &error );
103 if ( !error && block && new_count > cur_count )
104 FT_MEM_ZERO( (
char*)block + cur_count * item_size,
105 ( new_count - cur_count ) * item_size );
112 FT_BASE_DEF( FT_Pointer )
113 ft_mem_qrealloc( FT_Memory memory,
120 FT_Error error = FT_Err_Ok;
127 if ( cur_count < 0 || new_count < 0 || item_size < 0 )
130 error = FT_THROW( Invalid_Argument );
132 else if ( new_count == 0 || item_size == 0 )
134 ft_mem_free( memory, block );
137 else if ( new_count > FT_INT_MAX / item_size )
139 error = FT_THROW( Array_Too_Large );
141 else if ( cur_count == 0 )
145 block = memory->alloc( memory, new_count * item_size );
147 error = FT_THROW( Out_Of_Memory );
152 FT_Long cur_size = cur_count * item_size;
153 FT_Long new_size = new_count * item_size;
156 block2 = memory->realloc( memory, cur_size, new_size, block );
158 error = FT_THROW( Out_Of_Memory );
169 ft_mem_free( FT_Memory memory,
173 memory->free( memory, (
void*)P );
177 FT_BASE_DEF( FT_Pointer )
178 ft_mem_dup( FT_Memory memory,
184 FT_Pointer p = ft_mem_qalloc( memory, (FT_Long)size, &error );
187 if ( !error && address && size > 0 )
188 ft_memcpy( p, address, size );
195 FT_BASE_DEF( FT_Pointer )
196 ft_mem_strdup( FT_Memory memory,
200 FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1
204 return ft_mem_dup( memory, str, len, p_error );
208 FT_BASE_DEF( FT_Int )
209 ft_mem_strcpyn(
char* dst,
213 while ( size > 1 && *src != 0 )
238#define FT_COMPONENT list
242 FT_EXPORT_DEF( FT_ListNode )
243 FT_List_Find( FT_List list,
255 if ( cur->data == data )
267 FT_EXPORT_DEF(
void )
268 FT_List_Add( FT_List list,
274 if ( !list || !node )
293 FT_EXPORT_DEF(
void )
294 FT_List_Insert( FT_List list,
300 if ( !list || !node )
319 FT_EXPORT_DEF(
void )
320 FT_List_Remove( FT_List list,
323 FT_ListNode before, after;
326 if ( !list || !node )
333 before->next = after;
338 after->prev = before;
346 FT_EXPORT_DEF(
void )
347 FT_List_Up( FT_List list,
350 FT_ListNode before, after;
353 if ( !list || !node )
363 before->next = after;
366 after->prev = before;
371 node->next = list->head;
372 list->head->prev = node;
379 FT_EXPORT_DEF( FT_Error )
380 FT_List_Iterate( FT_List list,
381 FT_List_Iterator iterator,
385 FT_Error error = FT_Err_Ok;
388 if ( !list || !iterator )
389 return FT_THROW( Invalid_Argument );
395 FT_ListNode next = cur->next;
398 error = iterator( cur, user );
411 FT_EXPORT_DEF(
void )
412 FT_List_Finalize( FT_List list,
413 FT_List_Destructor destroy,
420 if ( !list || !memory )
426 FT_ListNode next = cur->next;
427 void* data = cur->data;
431 destroy( memory, data, user );