2018-06-03 09:01:17 +02:00
|
|
|
/****************************************************************************
|
|
|
|
*
|
|
|
|
* ftutil.c
|
|
|
|
*
|
|
|
|
* FreeType utility file for memory and list management (body).
|
|
|
|
*
|
2022-01-11 10:54:10 +01:00
|
|
|
* Copyright (C) 2002-2022 by
|
2018-06-03 09:01:17 +02:00
|
|
|
* David Turner, Robert Wilhelm, and Werner Lemberg.
|
|
|
|
*
|
|
|
|
* This file is part of the FreeType project, and may only be used,
|
|
|
|
* modified, and distributed under the terms of the FreeType project
|
|
|
|
* license, LICENSE.TXT. By continuing to use, modify, or distribute
|
|
|
|
* this file you indicate that you have read the license and
|
|
|
|
* understand and accept it fully.
|
|
|
|
*
|
|
|
|
*/
|
2002-03-30 14:16:35 +01:00
|
|
|
|
|
|
|
|
2020-06-08 13:31:55 +02:00
|
|
|
#include <freetype/internal/ftdebug.h>
|
|
|
|
#include <freetype/internal/ftmemory.h>
|
|
|
|
#include <freetype/internal/ftobjs.h>
|
|
|
|
#include <freetype/ftlist.h>
|
2002-02-22 15:40:12 +01:00
|
|
|
|
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* The macro FT_COMPONENT is used in trace mode. It is an implicit
|
|
|
|
* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
|
|
|
|
* messages during execution.
|
|
|
|
*/
|
2002-02-22 15:40:12 +01:00
|
|
|
#undef FT_COMPONENT
|
2018-08-15 18:13:17 +02:00
|
|
|
#define FT_COMPONENT memory
|
2002-02-22 15:40:12 +01:00
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** M E M O R Y M A N A G E M E N T *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
FT_BASE_DEF( FT_Pointer )
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
ft_mem_alloc( FT_Memory memory,
|
2006-02-17 09:07:09 +01:00
|
|
|
FT_Long size,
|
|
|
|
FT_Error *p_error )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
FT_Error error;
|
|
|
|
FT_Pointer block = ft_mem_qalloc( memory, size, &error );
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2018-07-25 07:03:07 +02:00
|
|
|
if ( !error && block && size > 0 )
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
FT_MEM_ZERO( block, size );
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
*p_error = error;
|
|
|
|
return block;
|
|
|
|
}
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
|
|
|
|
FT_BASE_DEF( FT_Pointer )
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
ft_mem_qalloc( FT_Memory memory,
|
2006-02-17 09:07:09 +01:00
|
|
|
FT_Long size,
|
|
|
|
FT_Error *p_error )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
2006-01-27 15:16:16 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
2006-01-27 13:11:22 +01:00
|
|
|
FT_Pointer block = NULL;
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
if ( size > 0 )
|
|
|
|
{
|
|
|
|
block = memory->alloc( memory, size );
|
2016-12-26 17:08:17 +01:00
|
|
|
if ( !block )
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Out_Of_Memory );
|
2006-01-27 13:11:22 +01:00
|
|
|
}
|
2006-02-28 14:21:50 +01:00
|
|
|
else if ( size < 0 )
|
2006-02-27 14:14:42 +01:00
|
|
|
{
|
|
|
|
/* may help catch/prevent security issues */
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Invalid_Argument );
|
2006-02-27 14:14:42 +01:00
|
|
|
}
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
*p_error = error;
|
|
|
|
return block;
|
|
|
|
}
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
|
|
|
|
FT_BASE_DEF( FT_Pointer )
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
ft_mem_realloc( FT_Memory memory,
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
FT_Long item_size,
|
|
|
|
FT_Long cur_count,
|
|
|
|
FT_Long new_count,
|
2006-02-17 09:07:09 +01:00
|
|
|
void* block,
|
|
|
|
FT_Error *p_error )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
2006-01-27 15:16:16 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2013-03-14 10:27:35 +01:00
|
|
|
|
2006-05-03 00:22:16 +02:00
|
|
|
block = ft_mem_qrealloc( memory, item_size,
|
|
|
|
cur_count, new_count, block, &error );
|
2018-07-25 07:03:07 +02:00
|
|
|
if ( !error && block && new_count > cur_count )
|
2006-05-03 00:22:16 +02:00
|
|
|
FT_MEM_ZERO( (char*)block + cur_count * item_size,
|
|
|
|
( new_count - cur_count ) * item_size );
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
*p_error = error;
|
|
|
|
return block;
|
|
|
|
}
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
|
|
|
|
FT_BASE_DEF( FT_Pointer )
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
ft_mem_qrealloc( FT_Memory memory,
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
FT_Long item_size,
|
|
|
|
FT_Long cur_count,
|
|
|
|
FT_Long new_count,
|
2006-02-17 09:07:09 +01:00
|
|
|
void* block,
|
|
|
|
FT_Error *p_error )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
2006-01-27 15:16:16 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-06-04 17:17:41 +02:00
|
|
|
/* 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.
|
|
|
|
*/
|
2006-06-04 16:50:57 +02:00
|
|
|
if ( cur_count < 0 || new_count < 0 || item_size < 0 )
|
2006-02-27 14:14:42 +01:00
|
|
|
{
|
2006-02-27 19:25:22 +01:00
|
|
|
/* may help catch/prevent nasty security issues */
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Invalid_Argument );
|
2006-02-27 14:14:42 +01:00
|
|
|
}
|
2006-06-04 16:50:57 +02:00
|
|
|
else if ( new_count == 0 || item_size == 0 )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
ft_mem_free( memory, block );
|
2006-01-27 13:11:22 +01:00
|
|
|
block = NULL;
|
|
|
|
}
|
2017-08-22 08:41:03 +02:00
|
|
|
else if ( new_count > FT_INT_MAX / item_size )
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
{
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Array_Too_Large );
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
}
|
|
|
|
else if ( cur_count == 0 )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
2016-12-26 17:08:17 +01:00
|
|
|
FT_ASSERT( !block );
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
|
2017-08-22 08:41:03 +02:00
|
|
|
block = memory->alloc( memory, new_count * item_size );
|
|
|
|
if ( block == NULL )
|
|
|
|
error = FT_THROW( Out_Of_Memory );
|
2006-01-27 13:11:22 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FT_Pointer block2;
|
2017-08-22 08:41:03 +02:00
|
|
|
FT_Long cur_size = cur_count * item_size;
|
|
|
|
FT_Long new_size = new_count * item_size;
|
2006-01-27 13:11:22 +01:00
|
|
|
|
2006-01-27 15:16:16 +01:00
|
|
|
|
* include/freetype/fterrdef.h, include/freetype/config/ftconfig.h,
include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c,
src/base/ftutil.c: udpating the memory management functions and
macros to safely deal with array size buffer overflows, this
corresponds to attemps to allocate arrays that are too large. For
an example, consider the following code:
count = read_uint32_from_file();
array = malloc( sizeof(Item) * count );
for ( nn = 0; nn < count; nn++ )
array[nn] = read_item_from_file();
if 'count' is larger than FT_UINT_MAX/sizeof(Item), the multiplication
will overflow and the array allocated will be smaller than the data
read from the file. In this case, the heap will be trashed, and this
can be used as a denial-of-service, or make the engine crash later.
the FT_ARRAY_NEW and FT_ARRAY_RENEW macro now check that the new
count is no more than FT_INT_MAX/item_size, otherwise, a new error,
named 'FT_Err_Array_Too_Large' will be returned.
note that the memory debugger now works again when FT_DEBUG_MEMORY
is defined, and FT_STRICT_ALIASING has disappeared, the corresponding
code being now the default.
2006-05-02 08:34:27 +02:00
|
|
|
block2 = memory->realloc( memory, cur_size, new_size, block );
|
2016-12-26 17:08:17 +01:00
|
|
|
if ( !block2 )
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Out_Of_Memory );
|
2006-01-27 13:11:22 +01:00
|
|
|
else
|
|
|
|
block = block2;
|
|
|
|
}
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
*p_error = error;
|
|
|
|
return block;
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
}
|
2006-01-27 13:11:22 +01:00
|
|
|
|
2006-02-27 19:25:22 +01:00
|
|
|
|
2006-01-27 13:11:22 +01:00
|
|
|
FT_BASE_DEF( void )
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
ft_mem_free( FT_Memory memory,
|
2006-02-17 09:07:09 +01:00
|
|
|
const void *P )
|
2006-01-27 13:11:22 +01:00
|
|
|
{
|
|
|
|
if ( P )
|
|
|
|
memory->free( memory, (void*)P );
|
* builds/amiga/src/base/ftsystem.c, devel/ftoption.h
include/freetype/ftcache.h, include/freetype/ftoutln.h,
include/freetype/cache/ftccache.h, include/freetype/cache/ftccmap.h,
include/freetype/config/ftoption.h, include/freetype/internal/ftcalc.h,
include/freetype/internal/ftdriver.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h, include/freetype/internal/ftrfork.h,
include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
include/freetype/internal/t1types.h, include/freetype/internal/tttypes.h,
src/base/ftcalc.c, src/base/ftdbgmem.c, src/base/ftobjs.c,
src/base/ftsystem.c, src/base/ftutil.c, src/bdf/bdfdrivr.c,
src/cache/ftccache.c, src/cache/ftccback.h, src/cache/ftccmap.c,
src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
massive changes to the internals to respect the internal object layouts
and exported functions of FreeType 2.1.7. Note that the cache sub-system
cannot be fully retrofitted, unfortunately.
2006-02-16 23:45:31 +01:00
|
|
|
}
|
2006-01-27 13:11:22 +01:00
|
|
|
|
2006-01-27 15:16:16 +01:00
|
|
|
|
2007-02-12 15:55:03 +01:00
|
|
|
FT_BASE_DEF( FT_Pointer )
|
|
|
|
ft_mem_dup( FT_Memory memory,
|
|
|
|
const void* address,
|
|
|
|
FT_ULong size,
|
|
|
|
FT_Error *p_error )
|
|
|
|
{
|
|
|
|
FT_Error error;
|
2015-02-16 20:05:08 +01:00
|
|
|
FT_Pointer p = ft_mem_qalloc( memory, (FT_Long)size, &error );
|
2007-02-12 15:55:03 +01:00
|
|
|
|
2007-02-12 22:44:10 +01:00
|
|
|
|
2018-07-25 07:03:07 +02:00
|
|
|
if ( !error && address && size > 0 )
|
2007-02-12 15:55:03 +01:00
|
|
|
ft_memcpy( p, address, size );
|
|
|
|
|
|
|
|
*p_error = error;
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_BASE_DEF( FT_Pointer )
|
|
|
|
ft_mem_strdup( FT_Memory memory,
|
|
|
|
const char* str,
|
|
|
|
FT_Error *p_error )
|
|
|
|
{
|
2007-02-12 22:44:10 +01:00
|
|
|
FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1
|
|
|
|
: 0;
|
|
|
|
|
2007-02-12 15:55:03 +01:00
|
|
|
|
|
|
|
return ft_mem_dup( memory, str, len, p_error );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_BASE_DEF( FT_Int )
|
|
|
|
ft_mem_strcpyn( char* dst,
|
|
|
|
const char* src,
|
|
|
|
FT_ULong size )
|
|
|
|
{
|
|
|
|
while ( size > 1 && *src != 0 )
|
2007-03-08 11:50:38 +01:00
|
|
|
{
|
2007-02-12 15:55:03 +01:00
|
|
|
*dst++ = *src++;
|
2007-03-08 11:50:38 +01:00
|
|
|
size--;
|
|
|
|
}
|
2007-02-12 15:55:03 +01:00
|
|
|
|
|
|
|
*dst = 0; /* always zero-terminate */
|
|
|
|
|
2007-02-12 22:44:10 +01:00
|
|
|
return *src != 0;
|
2007-02-12 15:55:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** D O U B L Y L I N K E D L I S T S *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
#undef FT_COMPONENT
|
2018-08-15 18:13:17 +02:00
|
|
|
#define FT_COMPONENT list
|
2002-02-22 15:40:12 +01:00
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( FT_ListNode )
|
|
|
|
FT_List_Find( FT_List list,
|
|
|
|
void* data )
|
|
|
|
{
|
|
|
|
FT_ListNode cur;
|
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list )
|
|
|
|
return NULL;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
cur = list->head;
|
|
|
|
while ( cur )
|
|
|
|
{
|
|
|
|
if ( cur->data == data )
|
|
|
|
return cur;
|
|
|
|
|
|
|
|
cur = cur->next;
|
|
|
|
}
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
return NULL;
|
2002-02-22 15:40:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( void )
|
|
|
|
FT_List_Add( FT_List list,
|
|
|
|
FT_ListNode node )
|
|
|
|
{
|
2014-11-26 21:59:21 +01:00
|
|
|
FT_ListNode before;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list || !node )
|
|
|
|
return;
|
|
|
|
|
|
|
|
before = list->tail;
|
2002-02-22 15:40:12 +01:00
|
|
|
|
2015-04-11 05:45:11 +02:00
|
|
|
node->next = NULL;
|
2002-02-22 15:40:12 +01:00
|
|
|
node->prev = before;
|
|
|
|
|
|
|
|
if ( before )
|
|
|
|
before->next = node;
|
|
|
|
else
|
|
|
|
list->head = node;
|
|
|
|
|
|
|
|
list->tail = node;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( void )
|
|
|
|
FT_List_Insert( FT_List list,
|
|
|
|
FT_ListNode node )
|
|
|
|
{
|
2014-11-26 21:59:21 +01:00
|
|
|
FT_ListNode after;
|
2002-02-22 15:40:12 +01:00
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list || !node )
|
|
|
|
return;
|
|
|
|
|
|
|
|
after = list->head;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
node->next = after;
|
2015-04-11 05:45:11 +02:00
|
|
|
node->prev = NULL;
|
2002-02-22 15:40:12 +01:00
|
|
|
|
|
|
|
if ( !after )
|
|
|
|
list->tail = node;
|
|
|
|
else
|
|
|
|
after->prev = node;
|
|
|
|
|
|
|
|
list->head = node;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( void )
|
|
|
|
FT_List_Remove( FT_List list,
|
|
|
|
FT_ListNode node )
|
|
|
|
{
|
|
|
|
FT_ListNode before, after;
|
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list || !node )
|
|
|
|
return;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
before = node->prev;
|
|
|
|
after = node->next;
|
|
|
|
|
|
|
|
if ( before )
|
|
|
|
before->next = after;
|
|
|
|
else
|
|
|
|
list->head = after;
|
|
|
|
|
|
|
|
if ( after )
|
|
|
|
after->prev = before;
|
|
|
|
else
|
|
|
|
list->tail = before;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( void )
|
|
|
|
FT_List_Up( FT_List list,
|
|
|
|
FT_ListNode node )
|
|
|
|
{
|
|
|
|
FT_ListNode before, after;
|
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list || !node )
|
|
|
|
return;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
before = node->prev;
|
|
|
|
after = node->next;
|
|
|
|
|
|
|
|
/* check whether we are already on top of the list */
|
|
|
|
if ( !before )
|
|
|
|
return;
|
|
|
|
|
|
|
|
before->next = after;
|
|
|
|
|
|
|
|
if ( after )
|
|
|
|
after->prev = before;
|
|
|
|
else
|
|
|
|
list->tail = before;
|
|
|
|
|
2015-04-11 05:45:11 +02:00
|
|
|
node->prev = NULL;
|
2002-02-22 15:40:12 +01:00
|
|
|
node->next = list->head;
|
|
|
|
list->head->prev = node;
|
|
|
|
list->head = node;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( FT_Error )
|
2014-11-26 21:59:21 +01:00
|
|
|
FT_List_Iterate( FT_List list,
|
|
|
|
FT_List_Iterator iterator,
|
|
|
|
void* user )
|
2002-02-22 15:40:12 +01:00
|
|
|
{
|
2014-11-26 21:59:21 +01:00
|
|
|
FT_ListNode cur;
|
2002-02-22 15:40:12 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list || !iterator )
|
|
|
|
return FT_THROW( Invalid_Argument );
|
|
|
|
|
|
|
|
cur = list->head;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
while ( cur )
|
|
|
|
{
|
|
|
|
FT_ListNode next = cur->next;
|
|
|
|
|
|
|
|
|
|
|
|
error = iterator( cur, user );
|
|
|
|
if ( error )
|
|
|
|
break;
|
|
|
|
|
|
|
|
cur = next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftlist.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( void )
|
|
|
|
FT_List_Finalize( FT_List list,
|
|
|
|
FT_List_Destructor destroy,
|
|
|
|
FT_Memory memory,
|
|
|
|
void* user )
|
|
|
|
{
|
|
|
|
FT_ListNode cur;
|
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !list || !memory )
|
|
|
|
return;
|
|
|
|
|
2002-02-22 15:40:12 +01:00
|
|
|
cur = list->head;
|
|
|
|
while ( cur )
|
|
|
|
{
|
|
|
|
FT_ListNode next = cur->next;
|
|
|
|
void* data = cur->data;
|
|
|
|
|
|
|
|
|
|
|
|
if ( destroy )
|
|
|
|
destroy( memory, data, user );
|
|
|
|
|
2002-03-22 14:52:37 +01:00
|
|
|
FT_FREE( cur );
|
2002-02-22 15:40:12 +01:00
|
|
|
cur = next;
|
|
|
|
}
|
|
|
|
|
2015-04-11 05:45:11 +02:00
|
|
|
list->head = NULL;
|
|
|
|
list->tail = NULL;
|
2002-02-22 15:40:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-30 14:16:35 +01:00
|
|
|
/* END */
|