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