1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftutil.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* FreeType utility file for memory and list management (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* Copyright 2002, 2004-2007, 2013 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_MEMORY_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_LIST_H 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_memory 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** M E M O R Y M A N A G E M E N T *****/ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Pointer ) 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_alloc( FT_Memory memory, 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long size, 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ) 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pointer block = ft_mem_qalloc( memory, size, &error ); 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error && size > 0 ) 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( block, size ); 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p_error = error; 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return block; 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Pointer ) 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_qalloc( FT_Memory memory, 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long size, 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ) 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pointer block = NULL; 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size > 0 ) 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project block = memory->alloc( memory, size ); 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( block == NULL ) 78727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Out_Of_Memory ); 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( size < 0 ) 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* may help catch/prevent security issues */ 83727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p_error = error; 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return block; 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Pointer ) 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_realloc( FT_Memory memory, 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long item_size, 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_count, 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_count, 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* block, 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ) 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project block = ft_mem_qrealloc( memory, item_size, 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_count, new_count, block, &error ); 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error && new_count > cur_count ) 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( (char*)block + cur_count * item_size, 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( new_count - cur_count ) * item_size ); 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p_error = error; 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return block; 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Pointer ) 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_qrealloc( FT_Memory memory, 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long item_size, 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_count, 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_count, 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* block, 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ) 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note that we now accept `item_size == 0' as a valid parameter, in 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * order to cover very weird cases where an ALLOC_MULT macro would be 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * called. 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cur_count < 0 || new_count < 0 || item_size < 0 ) 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* may help catch/prevent nasty security issues */ 131727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( new_count == 0 || item_size == 0 ) 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_free( memory, block ); 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project block = NULL; 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( new_count > FT_INT_MAX/item_size ) 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Array_Too_Large ); 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( cur_count == 0 ) 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( block == NULL ); 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project block = ft_mem_alloc( memory, new_count*item_size, &error ); 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pointer block2; 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long cur_size = cur_count*item_size; 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long new_size = new_count*item_size; 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project block2 = memory->realloc( memory, cur_size, new_size, block ); 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( block2 == NULL ) 157727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Out_Of_Memory ); 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project block = block2; 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p_error = error; 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return block; 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_free( FT_Memory memory, 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const void *P ) 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( P ) 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory->free( memory, (void*)P ); 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Pointer ) 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_dup( FT_Memory memory, 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const void* address, 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong size, 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ) 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pointer p = ft_mem_qalloc( memory, size, &error ); 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error && address ) 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_memcpy( p, address, size ); 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *p_error = error; 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return p; 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Pointer ) 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strdup( FT_Memory memory, 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* str, 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *p_error ) 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : 0; 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ft_mem_dup( memory, str, len, p_error ); 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Int ) 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_mem_strcpyn( char* dst, 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* src, 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong size ) 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( size > 1 && *src != 0 ) 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *dst++ = *src++; 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size--; 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *dst = 0; /* always zero-terminate */ 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return *src != 0; 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** D O U B L Y L I N K E D L I S T S *****/ 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_list 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_ListNode ) 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Find( FT_List list, 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* data ) 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode cur; 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = list->head; 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( cur ) 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cur->data == data ) 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cur; 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = cur->next; 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return (FT_ListNode)0; 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Add( FT_List list, 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode before = list->tail; 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->next = 0; 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->prev = before; 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( before ) 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before->next = node; 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = node; 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = node; 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Insert( FT_List list, 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode after = list->head; 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->next = after; 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->prev = 0; 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !after ) 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = node; 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after->prev = node; 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = node; 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Remove( FT_List list, 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode before, after; 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before = node->prev; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after = node->next; 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( before ) 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before->next = after; 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = after; 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( after ) 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after->prev = before; 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = before; 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Up( FT_List list, 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode before, after; 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before = node->prev; 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after = node->next; 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check whether we are already on top of the list */ 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !before ) 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before->next = after; 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( after ) 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after->prev = before; 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = before; 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->prev = 0; 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->next = list->head; 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head->prev = node; 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = node; 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Iterate( FT_List list, 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Iterator iterator, 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* user ) 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode cur = list->head; 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( cur ) 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode next = cur->next; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = iterator( cur, user ); 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = next; 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Finalize( FT_List list, 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Destructor destroy, 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory, 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* user ) 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode cur; 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = list->head; 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( cur ) 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode next = cur->next; 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* data = cur->data; 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( destroy ) 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project destroy( memory, data, user ); 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( cur ); 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = next; 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = 0; 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = 0; 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 415