FT_Alloc( FT_Memory memory, FT_Long size, void* *P ) { FT_ASSERT( P != 0 ); if ( size > 0 ) { *P = memory->alloc( memory, size ); if ( !*P ) { FT_ERROR(( "FT_Alloc:" )); FT_ERROR(( " Out of memory? (%ld requested)\n", size )); return FT_Err_Out_Of_Memory; } FT_MEM_ZERO( *P, size ); } else *P = NULL; FT_TRACE7(( "FT_Alloc:" )); FT_TRACE7(( " size = %ld, block = 0x%08p, ref = 0x%08p\n", size, *P, P )); return FT_Err_Ok; }
ft_mem_qrealloc( FT_Memory memory, FT_Long item_size, FT_Long cur_count, FT_Long new_count, void* block, FT_Error *p_error ) { FT_Error error = FT_Err_Ok; /* Note that we now accept `item_size == 0' as a valid parameter, in * order to cover very weird cases where an ALLOC_MULT macro would be * called. */ if ( cur_count < 0 || new_count < 0 || item_size < 0 ) { /* may help catch/prevent nasty security issues */ error = FT_THROW( Invalid_Argument ); } else if ( new_count == 0 || item_size == 0 ) { ft_mem_free( memory, block ); block = NULL; } else if ( new_count > FT_INT_MAX / item_size ) { error = FT_THROW( Array_Too_Large ); } else if ( cur_count == 0 ) { FT_ASSERT( !block ); block = memory->alloc( memory, new_count * item_size ); if ( block == NULL ) error = FT_THROW( Out_Of_Memory ); } else { FT_Pointer block2; FT_Long cur_size = cur_count * item_size; FT_Long new_size = new_count * item_size; block2 = memory->realloc( memory, cur_size, new_size, block ); if ( !block2 ) error = FT_THROW( Out_Of_Memory ); else block = block2; } *p_error = error; return block; }
static FT_MemTable ft_mem_table_new( FT_Memory memory ) { FT_MemTable table; table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); if ( !table ) goto Exit; FT_ZERO( table ); table->size = FT_MEM_SIZE_MIN; table->nodes = 0; table->memory = memory; table->memory_user = memory->user; table->alloc = memory->alloc; table->realloc = memory->realloc; table->free = memory->free; table->buckets = (FT_MemNode *) memory->alloc( memory, table->size * (FT_Long)sizeof ( FT_MemNode ) ); if ( table->buckets ) FT_ARRAY_ZERO( table->buckets, table->size ); else { memory->free( memory, table ); table = NULL; } Exit: return table; }
ft_mem_qalloc( FT_Memory memory, FT_Long size, FT_Error *p_error ) { FT_Error error = FT_Err_Ok; FT_Pointer block = NULL; if ( size > 0 ) { block = memory->alloc( memory, size ); if ( block == NULL ) error = FT_Err_Out_Of_Memory; } else if ( size < 0 ) { /* may help catch/prevent security issues */ error = FT_Err_Invalid_Argument; } *p_error = error; return block; }