]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/picomodel/lwo/list.c
eol style
[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 {
23    lwNode *node, *next;
24
25    node = ( lwNode * ) list;
26    while ( node ) {
27       next = node->next;
28       freeNode( node );
29       node = next;
30    }
31 }
32
33
34 /*
35 ======================================================================
36 lwListAdd()
37
38 Append a node to a list.
39 ====================================================================== */
40
41 void lwListAdd( void **list, void *node )
42 {
43    lwNode *head, *tail;
44
45    head = *(( lwNode ** ) list );
46    if ( !head ) {
47       *list = node;
48       return;
49    }
50    while ( head ) {
51       tail = head;
52       head = head->next;
53    }
54    tail->next = ( lwNode * ) node;
55    (( lwNode * ) node )->prev = tail;
56 }
57
58
59 /*
60 ======================================================================
61 lwListInsert()
62
63 Insert a node into a list in sorted order.
64 ====================================================================== */
65
66 void lwListInsert( void **vlist, void *vitem, int ( *compare )( void *, void * ))
67 {
68    lwNode **list, *item, *node, *prev;
69
70    if ( !*vlist ) {
71       *vlist = vitem;
72       return;
73    }
74
75    list = ( lwNode ** ) vlist;
76    item = ( lwNode * ) vitem;
77    node = *list;
78    prev = NULL;
79
80    while ( node ) {
81       if ( 0 < compare( node, item )) break;
82       prev = node;
83       node = node->next;
84    }
85
86    if ( !prev ) {
87       *list = item;
88       node->prev = item;
89       item->next = node;
90    }
91    else if ( !node ) {
92       prev->next = item;
93       item->prev = prev;
94    }
95    else {
96       item->next = node;
97       item->prev = prev;
98       prev->next = item;
99       node->prev = item;
100    }
101 }