source: trunk/libtransmission/list.c @ 6795

Last change on this file since 6795 was 6795, checked in by charles, 13 years ago

run libT, cli, daemon, gtk through the source-code formatter "uncrustify" as promised/threatened

  • Property svn:keywords set to Date Rev Author Id
File size: 3.8 KB
Line 
1/*
2 * This file Copyright (C) 2007-2008 Charles Kerr <charles@rebelbase.com>
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: list.c 6795 2008-09-23 19:11:04Z charles $
11 */
12
13#include "transmission.h"
14#include "list.h"
15#include "utils.h"
16
17static tr_list*
18node_alloc( void )
19{
20    return tr_new0( tr_list, 1 );
21}
22
23static void
24node_free( tr_list* node )
25{
26    tr_free( node );
27}
28
29/***
30****
31***/
32
33void
34tr_list_free( tr_list**         list,
35              TrListForeachFunc data_free_func )
36{
37    while( *list )
38    {
39        tr_list *node = *list;
40        *list = ( *list )->next;
41        if( data_free_func )
42            data_free_func( node->data );
43        node_free( node );
44    }
45}
46
47void
48tr_list_prepend( tr_list ** list,
49                 void *     data )
50{
51    tr_list * node = node_alloc ( );
52
53    node->data = data;
54    node->next = *list;
55    if( *list )
56        ( *list )->prev = node;
57    *list = node;
58}
59
60void
61tr_list_append( tr_list ** list,
62                void *     data )
63{
64    tr_list * node = node_alloc( );
65
66    node->data = data;
67    if( !*list )
68        *list = node;
69    else
70    {
71        tr_list * l = *list;
72        while( l->next )
73            l = l->next;
74
75        l->next = node;
76        node->prev = l;
77    }
78}
79
80void
81tr_list_insert_sorted( tr_list ** list,
82                       void *     data,
83                        int          compare(const void*, const void*) )
84{
85    /* find l, the node that we'll insert this data before */
86    tr_list * l;
87
88    for( l = *list; l != NULL; l = l->next )
89    {
90        const int c = (compare)( data, l->data );
91        if( c <= 0 )
92            break;
93    }
94
95    if( l == NULL )
96        tr_list_append( list, data );
97    else if( l == *list )
98        tr_list_prepend( list, data );
99    else
100    {
101        tr_list * node = node_alloc( );
102        node->data = data;
103        if( l->prev ){ node->prev = l->prev; node->prev->next = node; }
104        node->next = l;
105        l->prev = node;
106    }
107}
108
109tr_list*
110tr_list_find_data( tr_list *    list,
111                   const void * data )
112{
113    for( ; list; list = list->next )
114        if( list->data == data )
115            return list;
116
117    return NULL;
118}
119
120static void*
121tr_list_remove_node( tr_list ** list,
122                     tr_list *  node )
123{
124    void *    data;
125    tr_list * prev = node ? node->prev : NULL;
126    tr_list * next = node ? node->next : NULL;
127
128    if( prev ) prev->next = next;
129    if( next ) next->prev = prev;
130    if( *list == node ) *list = next;
131    data = node ? node->data : NULL;
132    node_free( node );
133    return data;
134}
135
136void*
137tr_list_pop_front( tr_list ** list )
138{
139    void * ret = NULL;
140
141    if( *list )
142    {
143        ret = ( *list )->data;
144        tr_list_remove_node( list, *list );
145    }
146    return ret;
147}
148
149void*
150tr_list_remove_data( tr_list **   list,
151                     const void * data )
152{
153    return tr_list_remove_node( list, tr_list_find_data( *list, data ) );
154}
155
156void*
157tr_list_remove( tr_list **        list,
158                const void *      b,
159                TrListCompareFunc compare_func )
160{
161    return tr_list_remove_node( list, tr_list_find( *list, b, compare_func ) );
162}
163
164tr_list*
165tr_list_find( tr_list *         list,
166              const void *      b,
167              TrListCompareFunc func )
168{
169    for( ; list; list = list->next )
170        if( !func( list->data, b ) )
171            return list;
172
173    return NULL;
174}
175
176void
177tr_list_foreach( tr_list *         list,
178                 TrListForeachFunc func )
179{
180    while( list )
181    {
182        func( list->data );
183        list = list->next;
184    }
185}
186
187int
188tr_list_size( const tr_list * list )
189{
190    int size = 0;
191
192    while( list )
193    {
194        ++size;
195        list = list->next;
196    }
197
198    return size;
199}
200
Note: See TracBrowser for help on using the repository browser.