blob: 2a8bf5825dc948b2fd53ea058319edb72bb18be8 [file] [log] [blame]
Benny Prijono9033e312005-11-21 02:08:39 +00001/* $Id$ */
2/*
3 * Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20
21/* Internal */
22PJ_IDEF(void) pj_link_node(pj_list_type *prev, pj_list_type *next)
23{
24 ((pj_list*)prev)->next = next;
25 ((pj_list*)next)->prev = prev;
26}
27
28/*
29PJ_IDEF(void)
30pj_list_init(pj_list_type * node)
31{
32 ((pj_list*)node)->next = ((pj_list*)node)->prev = node;
33}
34
35PJ_IDEF(int) pj_list_empty(const pj_list_type * node)
36{
37 return ((pj_list*)node)->next == node;
38}
39*/
40
41PJ_IDEF(void)
42pj_list_insert_after(pj_list_type *pos, pj_list_type *node)
43{
44 ((pj_list*)node)->prev = pos;
45 ((pj_list*)node)->next = ((pj_list*)pos)->next;
46 ((pj_list*) ((pj_list*)pos)->next) ->prev = node;
47 ((pj_list*)pos)->next = node;
48}
49
50
51PJ_IDEF(void)
52pj_list_insert_before(pj_list_type *pos, pj_list_type *node)
53{
54 pj_list_insert_after(((pj_list*)pos)->prev, node);
55}
56
57
58PJ_IDEF(void)
59pj_list_insert_nodes_after(pj_list_type *pos, pj_list_type *lst)
60{
61 pj_list *lst_last = (pj_list *) ((pj_list*)lst)->prev;
62 pj_list *pos_next = (pj_list *) ((pj_list*)pos)->next;
63
64 pj_link_node(pos, lst);
65 pj_link_node(lst_last, pos_next);
66}
67
68PJ_IDEF(void)
69pj_list_insert_nodes_before(pj_list_type *pos, pj_list_type *lst)
70{
71 pj_list_insert_nodes_after(((pj_list*)pos)->prev, lst);
72}
73
74PJ_IDEF(void)
75pj_list_merge_last(pj_list_type *lst1, pj_list_type *lst2)
76{
77 pj_link_node(((pj_list*)lst1)->prev, ((pj_list*)lst2)->next);
78 pj_link_node(((pj_list*)lst2)->prev, lst1);
79 pj_list_init(lst2);
80}
81
82PJ_IDEF(void)
83pj_list_merge_first(pj_list_type *lst1, pj_list_type *lst2)
84{
85 pj_link_node(((pj_list*)lst2)->prev, ((pj_list*)lst1)->next);
86 pj_link_node(((pj_list*)lst1), ((pj_list*)lst2)->next);
87 pj_list_init(lst2);
88}
89
90PJ_IDEF(void)
91pj_list_erase(pj_list_type *node)
92{
93 pj_link_node( ((pj_list*)node)->prev, ((pj_list*)node)->next);
94}
95
96
97PJ_IDEF(pj_list_type*)
98pj_list_find_node(pj_list_type *list, pj_list_type *node)
99{
100 pj_list *p = (pj_list *) ((pj_list*)list)->next;
101 while (p != list && p != node)
102 p = (pj_list *) p->next;
103
104 return p==node ? p : NULL;
105}
106
107
108PJ_IDEF(pj_list_type*)
109pj_list_search(pj_list_type *list, void *value,
110 int (*comp)(void *value, const pj_list_type *node))
111{
112 pj_list *p = (pj_list *) ((pj_list*)list)->next;
113 while (p != list && (*comp)(value, p) != 0)
114 p = (pj_list *) p->next;
115
116 return p==list ? NULL : p;
117}
118
Benny Prijonoa5f4ff22006-02-19 01:28:21 +0000119
120PJ_IDEF(pj_size_t) pj_list_size(pj_list_type *list)
121{
122 pj_list *node = (pj_list*) ((pj_list*)list)->next;
123 pj_size_t count = 0;
124
125 while (node != list) {
126 ++count;
127 node = node->next;
128 }
129
130 return count;
131}
132