summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/tools/clist.h
Unidiff
Diffstat (limited to 'kmicromail/libetpan/tools/clist.h') (more/less context) (show whitespace changes)
-rw-r--r--kmicromail/libetpan/tools/clist.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/kmicromail/libetpan/tools/clist.h b/kmicromail/libetpan/tools/clist.h
new file mode 100644
index 0000000..bd97f59
--- a/dev/null
+++ b/kmicromail/libetpan/tools/clist.h
@@ -0,0 +1,134 @@
1
2/*
3 * libEtPan! -- a mail stuff library
4 *
5 * clist - Implements simple generic double-linked pointer lists
6 *
7 * Copyright (c) 1999-2000, Gaël Roualland <gael.roualland@iname.com>
8 * interface changes - 2002 - DINH Viet Hoa
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the libEtPan! project nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36/*
37 * $Id$
38 */
39
40#ifndef CLIST_H
41#define CLIST_H
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47typedef struct clistcell_s {
48 void * data;
49 struct clistcell_s * previous;
50 struct clistcell_s * next;
51} clistcell;
52
53struct clist_s {
54 clistcell * first;
55 clistcell * last;
56 int count;
57};
58
59typedef struct clist_s clist;
60typedef clistcell clistiter;
61
62/* Allocate a new pointer list */
63clist * clist_new();
64
65/* Destroys a list. Data pointed by data pointers is NOT freed. */
66void clist_free(clist *);
67
68/* Some of the following routines can be implemented as macros to
69 be faster. If you don't want it, define NO_MACROS */
70#ifdef NO_MACROS
71
72/* Returns TRUE if list is empty */
73int clist_isempty(clist *);
74
75/* Returns the number of elements in the list */
76int clist_count(clist *);
77
78/* Returns an iterator to the first element of the list */
79clistiter * clist_begin(clist *);
80
81/* Returns an iterator to the last element of the list */
82clistiter * clist_end(clist *);
83
84/* Returns an iterator to the next element of the list */
85clistiter * clist_next(clistiter *);
86
87/* Returns an iterator to the previous element of the list */
88clistiter * clist_previous(clistiter *);
89
90/* Returns the data pointer of this element of the list */
91void* clist_content(clistiter *);
92
93/* Inserts this data pointer at the beginning of the list */
94int clist_prepend(clist *, void *);
95
96/* Inserts this data pointer at the end of the list */
97int clist_append(clist *, void *);
98#else
99#define clist_isempty(lst) ((lst->first==lst->last) && (lst->last==NULL))
100#define clist_count(lst) (lst->count)
101#define clist_begin(lst) (lst->first)
102#define clist_end(lst) (lst->last)
103#define clist_next(iter) (iter ? iter->next : NULL)
104#define clist_previous(iter) (iter ? iter->previous : NULL)
105#define clist_content(iter) (iter ? iter->data : NULL)
106#define clist_prepend(lst, data) (clist_insert_before(lst, lst->first, data))
107#define clist_append(lst, data) (clist_insert_after(lst, lst->last, data))
108#endif
109
110/* Inserts this data pointer before the element pointed by the iterator */
111int clist_insert_before(clist *, clistiter *, void *);
112
113/* Inserts this data pointer after the element pointed by the iterator */
114int clist_insert_after(clist *, clistiter *, void *);
115
116/* Deletes the element pointed by the iterator.
117 Returns an iterator to the next element. */
118clistiter * clist_delete(clist *, clistiter *);
119
120typedef void (* clist_func)(void *, void *);
121
122void clist_foreach(clist * lst, clist_func func, void * data);
123
124void clist_concat(clist * dest, clist * src);
125
126void * clist_nth_data(clist * lst, int index);
127
128clistiter * clist_nth(clist * lst, int index);
129
130#ifdef __cplusplus
131}
132#endif
133
134#endif