]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/picomodel/lwo/list.c
my own uncrustify run
[xonotic/netradiant.git] / libs / picomodel / lwo / list.c
1 /*
2    ======================================================================
3    list.c
4
5    Generic linked list operations.
6
7    Ernie Wright  17 Sep 00
8    ====================================================================== */
9
10 #include "../picointernal.h"
11 #include "lwo2.h"
12
13
14 /*
15    ======================================================================
16    lwListFree()
17
18    Free the items in a list.
19    ====================================================================== */
20
21 void lwListFree( void *list, void ( *freeNode )( void * ) ){
22         lwNode *node, *next;
23
24         node = ( lwNode * ) list;
25         while ( node ) {
26                 next = node->next;
27                 freeNode( node );
28                 node = next;
29         }
30 }
31
32
33 /*
34    ======================================================================
35    lwListAdd()
36
37    Append a node to a list.
38    ====================================================================== */
39
40 void lwListAdd( void **list, void *node ){
41         lwNode *head, *tail;
42
43         head = *( ( lwNode ** ) list );
44         if ( !head ) {
45                 *list = node;
46                 return;
47         }
48         while ( head ) {
49                 tail = head;
50                 head = head->next;
51         }
52         tail->next = ( lwNode * ) node;
53         ( ( lwNode * ) node )->prev = tail;
54 }
55
56
57 /*
58    ======================================================================
59    lwListInsert()
60
61    Insert a node into a list in sorted order.
62    ====================================================================== */
63
64 void lwListInsert( void **vlist, void *vitem, int ( *compare )( void *, void * ) ){
65         lwNode **list, *item, *node, *prev;
66
67         if ( !*vlist ) {
68                 *vlist = vitem;
69                 return;
70         }
71
72         list = ( lwNode ** ) vlist;
73         item = ( lwNode * ) vitem;
74         node = *list;
75         prev = NULL;
76
77         while ( node ) {
78                 if ( 0 < compare( node, item ) ) {
79                         break;
80                 }
81                 prev = node;
82                 node = node->next;
83         }
84
85         if ( !prev ) {
86                 *list = item;
87                 node->prev = item;
88                 item->next = node;
89         }
90         else if ( !node ) {
91                 prev->next = item;
92                 item->prev = prev;
93         }
94         else {
95                 item->next = node;
96                 item->prev = prev;
97                 prev->next = item;
98                 node->prev = item;
99         }
100 }