1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* ftlist.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* Generic list support for FreeType (body). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 1996-2001, 2002 by */ 8*37da2899SCharles.Forsyth /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9*37da2899SCharles.Forsyth /* */ 10*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 11*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 12*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 14*37da2899SCharles.Forsyth /* understand and accept it fully. */ 15*37da2899SCharles.Forsyth /* */ 16*37da2899SCharles.Forsyth /***************************************************************************/ 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsyth /*************************************************************************/ 19*37da2899SCharles.Forsyth /* */ 20*37da2899SCharles.Forsyth /* This file implements functions relative to list processing. Its */ 21*37da2899SCharles.Forsyth /* data structures are defined in `freetype/internal/ftlist.h'. */ 22*37da2899SCharles.Forsyth /* */ 23*37da2899SCharles.Forsyth /*************************************************************************/ 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth #include <ft2build.h> 27*37da2899SCharles.Forsyth #include FT_LIST_H 28*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 29*37da2899SCharles.Forsyth #include FT_INTERNAL_OBJECTS_H 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth /*************************************************************************/ 33*37da2899SCharles.Forsyth /* */ 34*37da2899SCharles.Forsyth /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 35*37da2899SCharles.Forsyth /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 36*37da2899SCharles.Forsyth /* messages during execution. */ 37*37da2899SCharles.Forsyth /* */ 38*37da2899SCharles.Forsyth #undef FT_COMPONENT 39*37da2899SCharles.Forsyth #define FT_COMPONENT trace_list 40*37da2899SCharles.Forsyth 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth FT_EXPORT_DEF( FT_ListNode ) FT_List_Find(FT_List list,void * data)45*37da2899SCharles.Forsyth FT_List_Find( FT_List list, 46*37da2899SCharles.Forsyth void* data ) 47*37da2899SCharles.Forsyth { 48*37da2899SCharles.Forsyth FT_ListNode cur; 49*37da2899SCharles.Forsyth 50*37da2899SCharles.Forsyth 51*37da2899SCharles.Forsyth cur = list->head; 52*37da2899SCharles.Forsyth while ( cur ) 53*37da2899SCharles.Forsyth { 54*37da2899SCharles.Forsyth if ( cur->data == data ) 55*37da2899SCharles.Forsyth return cur; 56*37da2899SCharles.Forsyth 57*37da2899SCharles.Forsyth cur = cur->next; 58*37da2899SCharles.Forsyth } 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth return (FT_ListNode)0; 61*37da2899SCharles.Forsyth } 62*37da2899SCharles.Forsyth 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 65*37da2899SCharles.Forsyth 66*37da2899SCharles.Forsyth FT_EXPORT_DEF( void ) FT_List_Add(FT_List list,FT_ListNode node)67*37da2899SCharles.Forsyth FT_List_Add( FT_List list, 68*37da2899SCharles.Forsyth FT_ListNode node ) 69*37da2899SCharles.Forsyth { 70*37da2899SCharles.Forsyth FT_ListNode before = list->tail; 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsyth 73*37da2899SCharles.Forsyth node->next = 0; 74*37da2899SCharles.Forsyth node->prev = before; 75*37da2899SCharles.Forsyth 76*37da2899SCharles.Forsyth if ( before ) 77*37da2899SCharles.Forsyth before->next = node; 78*37da2899SCharles.Forsyth else 79*37da2899SCharles.Forsyth list->head = node; 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth list->tail = node; 82*37da2899SCharles.Forsyth } 83*37da2899SCharles.Forsyth 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 86*37da2899SCharles.Forsyth 87*37da2899SCharles.Forsyth FT_EXPORT_DEF( void ) FT_List_Insert(FT_List list,FT_ListNode node)88*37da2899SCharles.Forsyth FT_List_Insert( FT_List list, 89*37da2899SCharles.Forsyth FT_ListNode node ) 90*37da2899SCharles.Forsyth { 91*37da2899SCharles.Forsyth FT_ListNode after = list->head; 92*37da2899SCharles.Forsyth 93*37da2899SCharles.Forsyth 94*37da2899SCharles.Forsyth node->next = after; 95*37da2899SCharles.Forsyth node->prev = 0; 96*37da2899SCharles.Forsyth 97*37da2899SCharles.Forsyth if ( !after ) 98*37da2899SCharles.Forsyth list->tail = node; 99*37da2899SCharles.Forsyth else 100*37da2899SCharles.Forsyth after->prev = node; 101*37da2899SCharles.Forsyth 102*37da2899SCharles.Forsyth list->head = node; 103*37da2899SCharles.Forsyth } 104*37da2899SCharles.Forsyth 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 107*37da2899SCharles.Forsyth 108*37da2899SCharles.Forsyth FT_EXPORT_DEF( void ) FT_List_Remove(FT_List list,FT_ListNode node)109*37da2899SCharles.Forsyth FT_List_Remove( FT_List list, 110*37da2899SCharles.Forsyth FT_ListNode node ) 111*37da2899SCharles.Forsyth { 112*37da2899SCharles.Forsyth FT_ListNode before, after; 113*37da2899SCharles.Forsyth 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth before = node->prev; 116*37da2899SCharles.Forsyth after = node->next; 117*37da2899SCharles.Forsyth 118*37da2899SCharles.Forsyth if ( before ) 119*37da2899SCharles.Forsyth before->next = after; 120*37da2899SCharles.Forsyth else 121*37da2899SCharles.Forsyth list->head = after; 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsyth if ( after ) 124*37da2899SCharles.Forsyth after->prev = before; 125*37da2899SCharles.Forsyth else 126*37da2899SCharles.Forsyth list->tail = before; 127*37da2899SCharles.Forsyth } 128*37da2899SCharles.Forsyth 129*37da2899SCharles.Forsyth 130*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 131*37da2899SCharles.Forsyth 132*37da2899SCharles.Forsyth FT_EXPORT_DEF( void ) FT_List_Up(FT_List list,FT_ListNode node)133*37da2899SCharles.Forsyth FT_List_Up( FT_List list, 134*37da2899SCharles.Forsyth FT_ListNode node ) 135*37da2899SCharles.Forsyth { 136*37da2899SCharles.Forsyth FT_ListNode before, after; 137*37da2899SCharles.Forsyth 138*37da2899SCharles.Forsyth 139*37da2899SCharles.Forsyth before = node->prev; 140*37da2899SCharles.Forsyth after = node->next; 141*37da2899SCharles.Forsyth 142*37da2899SCharles.Forsyth /* check whether we are already on top of the list */ 143*37da2899SCharles.Forsyth if ( !before ) 144*37da2899SCharles.Forsyth return; 145*37da2899SCharles.Forsyth 146*37da2899SCharles.Forsyth before->next = after; 147*37da2899SCharles.Forsyth 148*37da2899SCharles.Forsyth if ( after ) 149*37da2899SCharles.Forsyth after->prev = before; 150*37da2899SCharles.Forsyth else 151*37da2899SCharles.Forsyth list->tail = before; 152*37da2899SCharles.Forsyth 153*37da2899SCharles.Forsyth node->prev = 0; 154*37da2899SCharles.Forsyth node->next = list->head; 155*37da2899SCharles.Forsyth list->head->prev = node; 156*37da2899SCharles.Forsyth list->head = node; 157*37da2899SCharles.Forsyth } 158*37da2899SCharles.Forsyth 159*37da2899SCharles.Forsyth 160*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth FT_EXPORT_DEF( FT_Error ) FT_List_Iterate(FT_List list,FT_List_Iterator iterator,void * user)163*37da2899SCharles.Forsyth FT_List_Iterate( FT_List list, 164*37da2899SCharles.Forsyth FT_List_Iterator iterator, 165*37da2899SCharles.Forsyth void* user ) 166*37da2899SCharles.Forsyth { 167*37da2899SCharles.Forsyth FT_ListNode cur = list->head; 168*37da2899SCharles.Forsyth FT_Error error = FT_Err_Ok; 169*37da2899SCharles.Forsyth 170*37da2899SCharles.Forsyth 171*37da2899SCharles.Forsyth while ( cur ) 172*37da2899SCharles.Forsyth { 173*37da2899SCharles.Forsyth FT_ListNode next = cur->next; 174*37da2899SCharles.Forsyth 175*37da2899SCharles.Forsyth 176*37da2899SCharles.Forsyth error = iterator( cur, user ); 177*37da2899SCharles.Forsyth if ( error ) 178*37da2899SCharles.Forsyth break; 179*37da2899SCharles.Forsyth 180*37da2899SCharles.Forsyth cur = next; 181*37da2899SCharles.Forsyth } 182*37da2899SCharles.Forsyth 183*37da2899SCharles.Forsyth return error; 184*37da2899SCharles.Forsyth } 185*37da2899SCharles.Forsyth 186*37da2899SCharles.Forsyth 187*37da2899SCharles.Forsyth /* documentation is in ftlist.h */ 188*37da2899SCharles.Forsyth 189*37da2899SCharles.Forsyth FT_EXPORT_DEF( void ) FT_List_Finalize(FT_List list,FT_List_Destructor destroy,FT_Memory memory,void * user)190*37da2899SCharles.Forsyth FT_List_Finalize( FT_List list, 191*37da2899SCharles.Forsyth FT_List_Destructor destroy, 192*37da2899SCharles.Forsyth FT_Memory memory, 193*37da2899SCharles.Forsyth void* user ) 194*37da2899SCharles.Forsyth { 195*37da2899SCharles.Forsyth FT_ListNode cur; 196*37da2899SCharles.Forsyth 197*37da2899SCharles.Forsyth 198*37da2899SCharles.Forsyth cur = list->head; 199*37da2899SCharles.Forsyth while ( cur ) 200*37da2899SCharles.Forsyth { 201*37da2899SCharles.Forsyth FT_ListNode next = cur->next; 202*37da2899SCharles.Forsyth void* data = cur->data; 203*37da2899SCharles.Forsyth 204*37da2899SCharles.Forsyth 205*37da2899SCharles.Forsyth if ( destroy ) 206*37da2899SCharles.Forsyth destroy( memory, data, user ); 207*37da2899SCharles.Forsyth 208*37da2899SCharles.Forsyth FT_FREE( cur ); 209*37da2899SCharles.Forsyth cur = next; 210*37da2899SCharles.Forsyth } 211*37da2899SCharles.Forsyth 212*37da2899SCharles.Forsyth list->head = 0; 213*37da2899SCharles.Forsyth list->tail = 0; 214*37da2899SCharles.Forsyth } 215*37da2899SCharles.Forsyth 216*37da2899SCharles.Forsyth 217*37da2899SCharles.Forsyth /* END */ 218