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/* */ 7ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki/* Copyright 2002-2015 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; 183ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Pointer p = ft_mem_qalloc( memory, (FT_Long)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 248ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list ) 249ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return NULL; 250ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = list->head; 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( cur ) 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cur->data == data ) 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cur; 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = cur->next; 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 260ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return NULL; 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Add( FT_List list, 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 270ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_ListNode before; 271ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 273ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list || !node ) 274ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return; 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 276ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki before = list->tail; 277ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 278ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki node->next = NULL; 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->prev = before; 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( before ) 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before->next = node; 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = node; 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = node; 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Insert( FT_List list, 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 296ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_ListNode after; 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 299ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list || !node ) 300ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return; 301ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 302ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki after = list->head; 303ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->next = after; 305ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki node->prev = NULL; 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !after ) 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = node; 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after->prev = node; 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = node; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Remove( FT_List list, 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode before, after; 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 325ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list || !node ) 326ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return; 327ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before = node->prev; 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after = node->next; 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( before ) 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before->next = after; 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = after; 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( after ) 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after->prev = before; 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = before; 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Up( FT_List list, 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode node ) 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode before, after; 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list || !node ) 353ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return; 354ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before = node->prev; 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after = node->next; 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check whether we are already on top of the list */ 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !before ) 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project before->next = after; 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( after ) 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project after->prev = before; 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->tail = before; 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 369ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki node->prev = NULL; 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project node->next = list->head; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head->prev = node; 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project list->head = node; 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 379ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_List_Iterate( FT_List list, 380ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_List_Iterator iterator, 381ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki void* user ) 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 383ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_ListNode cur; 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list || !iterator ) 388ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return FT_THROW( Invalid_Argument ); 389ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 390ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki cur = list->head; 391ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( cur ) 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode next = cur->next; 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = iterator( cur, user ); 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = next; 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftlist.h */ 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Finalize( FT_List list, 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_List_Destructor destroy, 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory, 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* user ) 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode cur; 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 419ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !list || !memory ) 420ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return; 421ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = list->head; 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( cur ) 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ListNode next = cur->next; 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* data = cur->data; 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( destroy ) 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project destroy( memory, data, user ); 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( cur ); 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = next; 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 436ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki list->head = NULL; 437ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki list->tail = NULL; 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 442