1 /**********************************************************************
2   linkedlist.h
3  **********************************************************************
4 
5   linkedlist - Linked list implementation.
6   Copyright ©2000-2003, Stewart Adcock <stewart@linux-domain.com>
7   All rights reserved.
8 
9   The latest version of this program should be available at:
10   http://www.stewart-adcock.co.uk/
11 
12   This program is free software; you can redistribute it and/or modify
13   it under the terms of the GNU General Public License as published by
14   the Free Software Foundation; either version 2 of the License, or
15   (at your option) any later version.  Alternatively, if your project
16   is incompatible with the GPL, I will probably agree to requests
17   for permission to use the terms of any other license.
18 
19   This program is distributed in the hope that it will be useful, but
20   WITHOUT ANY WARRANTY WHATSOEVER.
21 
22   A full copy of the GNU General Public License should be in the file
23   "COPYING" provided with this distribution; if not, see:
24   http://www.gnu.org/
25 
26  **********************************************************************
27 
28   Synopsis:	Header file for linked list implementation.
29 
30  **********************************************************************/
31 
32 #ifndef LINKEDLIST_H_INCLUDED
33 #define LINKEDLIST_H_INCLUDED
34 
35 #include "gaul/gaul_util.h"
36 
37 #include "gaul/memory_util.h"
38 
39 /*
40  * Type definitions.
41  */
42 
43 typedef int	(*LLCompareFunc)(constvpointer data1, constvpointer data2);
44 typedef boolean	(*LLForeachFunc)(vpointer data, vpointer userdata);
45 typedef void	(*LLDestructorFunc)(vpointer data);
46 
47 typedef struct DLList_t
48   {
49   struct DLList_t *next;	/* Next element. */
50   struct DLList_t *prev;	/* Prev element. */
51   vpointer data;		/* Data stored in this element. */
52   } DLList;
53 
54 typedef struct SLList_t
55   {
56   struct SLList_t *next;	/* Next element. */
57   vpointer data;		/* Data stored in this element. */
58   } SLList;
59 
60 
61 /*
62  * Function prototypes.
63  */
64 
65 FUNCPROTO void	linkedlist_init_openmp(void);
66 FUNCPROTO SLList	*slink_new(void);
67 FUNCPROTO void	slink_free_all(SLList *list);
68 FUNCPROTO void	slink_free(SLList *list);
69 FUNCPROTO SLList	*slink_append(SLList *list, vpointer data);
70 FUNCPROTO SLList	*slink_prepend(SLList *list, vpointer data);
71 FUNCPROTO SLList	*slink_insert_next(SLList *list, vpointer data);
72 FUNCPROTO SLList	*slink_insert_index(SLList *list, vpointer data, int index);
73 FUNCPROTO SLList	*slink_delete_data(SLList *list, vpointer data);
74 FUNCPROTO SLList	*slink_delete_all_data(SLList *list, vpointer data);
75 FUNCPROTO SLList	*slink_delete_link(SLList *list, SLList *link);
76 FUNCPROTO SLList	*slink_clone(SLList *list);
77 FUNCPROTO SLList	*slink_reverse(SLList *list);
78 FUNCPROTO SLList	*slink_nth(SLList *list, const int index);
79 FUNCPROTO vpointer	slink_nth_data(SLList *list, const int index);
80 FUNCPROTO SLList	*slink_find(SLList *list, vpointer data);
81 FUNCPROTO SLList	*slink_find_custom(SLList *list, vpointer data, LLCompareFunc func);
82 FUNCPROTO int	slink_index_link(SLList *list, SLList *link);
83 FUNCPROTO int	slink_index_data(SLList *list, vpointer data);
84 FUNCPROTO SLList	*slink_last(SLList *list);
85 FUNCPROTO int	slink_size(SLList *list);
86 FUNCPROTO boolean	slink_foreach(SLList *list, LLForeachFunc func, vpointer userdata);
87 FUNCPROTO SLList	*slink_sort_merge (SLList      *l1,
88 		     SLList      *l2,
89 		     LLCompareFunc compare_func);
90 FUNCPROTO SLList	*slink_sort(SLList       *list,
91 	      LLCompareFunc compare_func);
92 FUNCPROTO DLList	*dlink_new(void);
93 FUNCPROTO void	dlink_free_all(DLList *list);
94 FUNCPROTO void	dlink_free(DLList *list);
95 FUNCPROTO DLList	*dlink_append(DLList *list, vpointer data);
96 FUNCPROTO DLList	*dlink_prepend(DLList *list, vpointer data);
97 FUNCPROTO DLList	*dlink_insert_next(DLList *list, vpointer data);
98 FUNCPROTO DLList	*dlink_insert_prev(DLList *list, vpointer data);
99 FUNCPROTO DLList	*dlink_insert_index(DLList	*list,
100 	       vpointer	 data,
101 	       int	 index);
102 FUNCPROTO DLList	*dlink_delete_all_data(DLList *list, vpointer data);
103 FUNCPROTO DLList	*dlink_delete_data(DLList *list, vpointer data);
104 FUNCPROTO DLList	*dlink_delete_link(DLList *list, DLList *link);
105 FUNCPROTO DLList	*dlink_clone(DLList *list);
106 FUNCPROTO DLList	*dlink_reverse(DLList *list);
107 FUNCPROTO DLList	*dlink_nth(DLList *list, const int index);
108 FUNCPROTO DLList	*dlink_pth(DLList *list, const int index);
109 FUNCPROTO vpointer	dlink_nth_data(DLList *list, const int index);
110 FUNCPROTO vpointer	dlink_pth_data(DLList *list, const int index);
111 FUNCPROTO DLList	*dlink_find(DLList *list, vpointer data);
112 FUNCPROTO DLList	*dlink_find_custom(DLList *list, vpointer data, LLCompareFunc func);
113 FUNCPROTO int	dlink_index_link(DLList *list, DLList *link);
114 FUNCPROTO int	dlink_index_data(DLList *list, vpointer data);
115 FUNCPROTO DLList	*dlink_last(DLList *list);
116 FUNCPROTO DLList	*dlink_first(DLList *list);
117 FUNCPROTO int	dlink_size(DLList *list);
118 FUNCPROTO boolean	dlink_foreach(DLList *list, LLForeachFunc func, vpointer userdata);
119 FUNCPROTO boolean	dlink_foreach_reverse(DLList *list,
120                        LLForeachFunc func, vpointer userdata);
121 FUNCPROTO DLList	*dlink_sort_merge(DLList       *l1,
122 		   DLList       *l2,
123 		   LLCompareFunc compare_func);
124 FUNCPROTO DLList	*dlink_sort(DLList       *list,
125 	     LLCompareFunc compare_func);
126 FUNCPROTO void linkedlist_diagnostics(void);
127 #ifndef LINKEDLIST_COMPILE_MAIN
128 FUNCPROTO boolean linkedlist_test(void);
129 #endif
130 
131 #define slink_insert_prev(X,Y)	slink_prepend((X), (Y));
132 #define slink_next(X)		((X)?(((SLList *)(X))->next):NULL)
133 #define dlink_next(X)		((X)?(((DLList *)(X))->next):NULL)
134 #define dlink_prev(X)		((X)?(((DLList *)(X))->prev):NULL)
135 
136 #define slink_data(X)		((X)?(((SLList *)(X))->data):NULL)
137 #define dlink_data(X)		((X)?(((DLList *)(X))->data):NULL)
138 
139 /*
140  * glib list emulation stuff.
141  *
142  * These macro redirections will be used if LINKEDLIST_EMULATE_GLIST is defined.
143  */
144 #ifdef LINKEDLIST_EMULATE_GLIST
145 
146 #define GSList	SLList
147 #define GList	DLList
148 
149 #define g_list_append(X, Y)		dlink_append((X), (Y))
150 #define g_list_reverse(X)		dlink_reverse((X))
151 #define g_list_nth(X, Y)		dlink_nth((X), (Y))
152 #define g_list_nth_data(X, Y)		dlink_nth_data((X), (Y))
153 #define g_list_position(X, Y)		dlink_index_link((X), (Y))
154 #define g_list_free(X)			dlink_free_all((X))
155 #define g_list_insert_sorted(X, Y, Z)	dlink_insert_sorted((X), (Y), (Z))
156 #define g_list_foreach(X, Y, Z)		dlink_foreach((X), (Y), (Z))
157 #define g_list_prepend(X, Y)		dlink_prepend((X), (Y))
158 #define g_list_sort(X, Y)		dlink_sort((X), (Y))
159 #define g_list_length(X)		dlink_size((X))
160 #define g_list_next(X)			((X)?(((DLList *)(X))->next):NULL)
161 #define g_list_prev(X)			((X)?(((DLList *)(X))->prev):NULL)
162 
163 #define g_slist_append(X, Y)		slink_append((X), (Y))
164 #define g_slist_reverse(X)		slink_reverse((X))
165 #define g_slist_nth(X, Y)		slink_nth((X), (Y))
166 #define g_slist_nth_data(X, Y)		slink_nth_data((X), (Y))
167 #define g_slist_position(X, Y)		slink_index_link((X), (Y))
168 #define g_slist_free(X)			slink_free_all((X))
169 #define g_slist_insert_sorted(X, Y, Z)	slink_insert_sorted((X), (Y), (Z))
170 #define g_slist_foreach(X, Y, Z)	slink_foreach((X), (Y), (Z))
171 #define g_slist_prepend(X, Y)		slink_prepend((X), (Y))
172 #define g_slist_sort(X, Y)		slink_sort((X), (Y))
173 #define g_slist_length(X)		slink_size((X))
174 #define g_slist_next(X)			((X)?(((SLList *)(X))->next):NULL)
175 
176 #endif
177 
178 #endif /* LINKEDLIST_H_INCLUDED */
179 
180