Mercurial > hg > nnchat
annotate th_util.c @ 308:e2da8c812f56
Free homeDir variable.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 11 Jun 2011 05:46:45 +0300 |
parents | a6304a3719ee |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * Generic utility-functions, macros and defaults | |
3 * Programmed and designed by Matti 'ccr' Hamalainen | |
136
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
4 * (C) Copyright 2002-2010 Tecnic Software productions (TNSP) |
0 | 5 * |
6 * Please read file 'COPYING' for information on license and distribution. | |
7 */ | |
8 #ifdef HAVE_CONFIG_H | |
2 | 9 #include "config.h" |
0 | 10 #endif |
11 #include "th_util.h" | |
12 #include <stdio.h> | |
13 | |
20 | 14 /* Default settings |
0 | 15 */ |
81 | 16 static BOOL th_initialized = FALSE; |
17 int th_verbosityLevel = 2; | |
18 char *th_prog_name = NULL, | |
19 *th_prog_fullname = NULL, | |
20 *th_prog_version = NULL, | |
21 *th_prog_author = NULL, | |
22 *th_prog_license = NULL; | |
0 | 23 |
24 | |
25 /* Initialize th_util-library and global variables | |
26 */ | |
27 void th_init(char *progName, char *progFullName, char *progVersion, | |
81 | 28 char *progAuthor, char *progLicense) |
0 | 29 { |
81 | 30 th_prog_name = progName; |
31 th_prog_fullname = progFullName; | |
32 th_prog_version = progVersion; | |
0 | 33 |
81 | 34 if (progAuthor) |
35 th_prog_author = progAuthor; | |
36 else | |
37 th_prog_author = TH_PROG_AUTHOR; | |
0 | 38 |
81 | 39 if (progLicense) |
40 th_prog_license = progLicense; | |
41 else | |
42 th_prog_license = TH_PROG_LICENSE; | |
0 | 43 |
81 | 44 th_initialized = TRUE; |
0 | 45 } |
46 | |
47 | |
48 /* Print formatted error, warning and information messages | |
49 * TODO: Implement th_vfprintf() and friends? | |
50 */ | |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
51 void THERR_V(const char *fmt, va_list ap) |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
52 { |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
53 assert(th_initialized == TRUE); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
54 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
55 fprintf(stderr, "%s: ", th_prog_name); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
56 vfprintf(stderr, fmt, ap); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
57 } |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
58 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
59 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
60 void THMSG_V(int level, const char *fmt, va_list ap) |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
61 { |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
62 assert(th_initialized == TRUE); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
63 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
64 if (th_verbosityLevel >= level) { |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
65 fprintf(stderr, "%s: ", th_prog_name); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
66 vfprintf(stderr, fmt, ap); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
67 } |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
68 } |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
69 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
70 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
71 void THPRINT_V(int level, const char *fmt, va_list ap) |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
72 { |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
73 assert(th_initialized == TRUE); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
74 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
75 if (th_verbosityLevel >= level) { |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
76 vfprintf(stderr, fmt, ap); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
77 } |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
78 } |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
79 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
80 |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
81 void THERR(const char *fmt, ...) |
0 | 82 { |
81 | 83 va_list ap; |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
84 assert(th_initialized == TRUE); |
0 | 85 |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
86 va_start(ap, fmt); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
87 THERR_V(fmt, ap); |
81 | 88 va_end(ap); |
0 | 89 } |
90 | |
91 | |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
92 void THMSG(int level, const char *fmt, ...) |
0 | 93 { |
81 | 94 va_list ap; |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
95 assert(th_initialized == TRUE); |
0 | 96 |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
97 va_start(ap, fmt); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
98 THMSG_V(level, fmt, ap); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
99 va_end(ap); |
0 | 100 } |
101 | |
102 | |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
103 void THPRINT(int level, const char *fmt, ...) |
0 | 104 { |
81 | 105 va_list ap; |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
106 assert(th_initialized == TRUE); |
0 | 107 |
99
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
108 va_start(ap, fmt); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
109 THPRINT_V(level, fmt, ap); |
0313fabd8049
Added varargs versions of some functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
81
diff
changeset
|
110 va_end(ap); |
0 | 111 } |
112 | |
113 | |
2 | 114 /* Memory handling routines |
0 | 115 */ |
116 void *th_malloc(size_t l) | |
117 { | |
81 | 118 return malloc(l); |
0 | 119 } |
120 | |
121 | |
122 void *th_calloc(size_t n, size_t l) | |
123 { | |
81 | 124 return calloc(n, l); |
0 | 125 } |
126 | |
127 | |
128 void *th_realloc(void *p, size_t l) | |
129 { | |
81 | 130 return realloc(p, l); |
0 | 131 } |
132 | |
133 | |
134 void th_free(void *p) | |
135 { | |
81 | 136 /* Check for NULL pointers for portability due to some libc |
137 * implementations not handling free(NULL) too well. | |
138 */ | |
139 if (p) free(p); | |
0 | 140 } |
141 | |
142 | |
143 #ifndef HAVE_MEMSET | |
144 void *th_memset(void *p, int c, size_t n) | |
145 { | |
81 | 146 unsigned char *dp = (unsigned char *) p; |
147 | |
148 while (n--) | |
149 *(dp++) = c; | |
0 | 150 |
81 | 151 return p; |
0 | 152 } |
153 #endif | |
136
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
154 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
155 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
156 /* Doubly linked list handling |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
157 * |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
158 * In this implementation first node's prev points to last node of the list, |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
159 * and last node's next is NULL. This way we can semi-efficiently traverse to |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
160 * beginning and end of the list, assuming user does not do weird things. |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
161 */ |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
162 qlist_t * th_llist_new(void *data) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
163 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
164 qlist_t *res = th_calloc(sizeof(qlist_t), 1); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
165 res->data = data; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
166 return res; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
167 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
168 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
169 void th_llist_free_func(qlist_t *list, void (*freefunc)(void *data)) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
170 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
171 qlist_t *curr = list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
172 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
173 while (curr != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
174 qlist_t *next = curr->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
175 if (freefunc != NULL && curr->data != NULL) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
176 freefunc(curr->data); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
177 th_free(curr); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
178 curr = next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
179 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
180 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
181 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
182 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
183 void th_llist_free(qlist_t *list) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
184 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
185 th_llist_free_func(list, NULL); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
186 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
187 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
188 void th_llist_append_node(qlist_t **list, qlist_t *node) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
189 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
190 if (*list != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
191 node->prev = (*list)->prev; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
192 (*list)->prev->next = node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
193 (*list)->prev = node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
194 (*list)->num++; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
195 } else { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
196 *list = node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
197 node->prev = *list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
198 (*list)->num = 1; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
199 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
200 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
201 node->next = NULL; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
202 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
203 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
204 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
205 qlist_t *th_llist_append(qlist_t **list, void *data) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
206 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
207 qlist_t *node = th_llist_new(data); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
208 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
209 th_llist_append_node(list, node); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
210 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
211 return node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
212 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
213 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
214 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
215 void th_llist_prepend_node(qlist_t **list, qlist_t *node) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
216 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
217 if (*list != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
218 node->prev = (*list)->prev; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
219 node->next = *list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
220 (*list)->prev = node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
221 node->num = (*list)->num + 1; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
222 *list = node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
223 } else { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
224 *list = node->prev = node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
225 node->next = NULL; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
226 (*list)->num = 1; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
227 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
228 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
229 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
230 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
231 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
232 qlist_t *th_llist_prepend(qlist_t **list, void *data) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
233 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
234 qlist_t *node = th_llist_new(data); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
235 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
236 th_llist_prepend_node(list, node); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
237 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
238 return node; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
239 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
240 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
241 /* |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
242 1) Remove a middle node |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
243 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
244 node0->prev->next = node->next (node1) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
245 node0->next->prev = node->prev (list) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
246 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
247 node2 <- list <=> node0 <=> node1 <=> node2 -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
248 node2 <- list <=> node1 <=> node2 -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
249 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
250 2) Remove first node when many items |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
251 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
252 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
253 node2 <- list <=> node0 <=> node1 <=> node2 -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
254 node2 <- node0 <=> node1 <=> node2 -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
255 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
256 *list = node0 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
257 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
258 3) Remove last node in list |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
259 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
260 if (node->next == NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
261 list->prev = node->prev; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
262 node->prev->next = NULL; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
263 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
264 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
265 node2 <- list <=> node0 <=> node1 <=> node2 -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
266 node1 <- list <=> node0 <=> node1 -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
267 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
268 4) Remove last |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
269 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
270 list <- list -> NULL |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
271 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
272 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
273 */ |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
274 static void th_llist_delete_node_fast(qlist_t **list, qlist_t *node) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
275 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
276 if (node == *list) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
277 /* First node in list */ |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
278 qlist_t *tmp = (*list)->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
279 if (tmp != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
280 tmp->num = (*list)->num - 1; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
281 tmp->prev = (*list)->prev; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
282 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
283 *list = tmp; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
284 } else { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
285 /* Somewhere in middle or end */ |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
286 if (node->prev != NULL) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
287 node->prev->next = node->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
288 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
289 if (node->next != NULL) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
290 node->next->prev = node->prev; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
291 else |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
292 (*list)->prev = node; /* Last node */ |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
293 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
294 (*list)->num--; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
295 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
296 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
297 node->next = node->prev = NULL; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
298 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
299 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
300 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
301 void th_llist_delete_node(qlist_t **list, qlist_t *node) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
302 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
303 qlist_t *curr = *list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
304 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
305 while (curr != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
306 qlist_t *next = curr->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
307 if (curr == node) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
308 th_llist_delete_node_fast(list, curr); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
309 th_free(node); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
310 break; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
311 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
312 curr = next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
313 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
314 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
315 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
316 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
317 void th_llist_delete(qlist_t **list, const void *data) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
318 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
319 qlist_t *curr = *list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
320 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
321 while (curr != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
322 qlist_t *next = curr->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
323 if (curr->data == data) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
324 th_llist_delete_node_fast(list, curr); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
325 th_free(curr); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
326 break; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
327 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
328 curr = next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
329 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
330 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
331 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
332 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
333 qlist_t * th_llist_get_nth(qlist_t *list, const size_t n) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
334 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
335 qlist_t *curr = list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
336 size_t i; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
337 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
338 for (i = 0; curr != NULL && i < n; curr = curr->next, i++); |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
339 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
340 return curr; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
341 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
342 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
343 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
344 size_t th_llist_length(const qlist_t *list) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
345 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
346 if (list == NULL) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
347 return 0; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
348 else |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
349 return list->num; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
350 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
351 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
352 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
353 ssize_t th_llist_position(const qlist_t *list, const qlist_t *node) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
354 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
355 const qlist_t *curr = list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
356 ssize_t i = 0; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
357 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
358 while (curr != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
359 if (curr == node) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
360 return i; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
361 else |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
362 i++; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
363 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
364 curr = curr->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
365 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
366 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
367 return -1; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
368 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
369 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
370 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
371 qlist_t * th_llist_find(qlist_t *list, const void *data) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
372 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
373 qlist_t *curr = list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
374 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
375 while (curr != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
376 if (curr->data == data) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
377 return curr; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
378 curr = curr->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
379 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
380 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
381 return NULL; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
382 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
383 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
384 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
385 qlist_t * th_llist_find_func(qlist_t *list, const void *userdata, int (compare)(const void *, const void *)) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
386 { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
387 qlist_t *curr = list; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
388 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
389 while (curr != NULL) { |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
390 if (compare(curr->data, userdata) == 0) |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
391 return curr; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
392 curr = curr->next; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
393 } |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
394 |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
395 return NULL; |
4ec36204d34e
Add doubly linked list handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
99
diff
changeset
|
396 } |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
397 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
398 |
281 | 399 /* |
400 * Ringbuffers | |
401 */ | |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
402 qringbuf_t * th_ringbuf_new(const size_t size, void (*mdeallocator)(void *data)) |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
403 { |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
404 qringbuf_t *res = th_calloc(1, sizeof(qringbuf_t)); |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
405 |
306
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
406 res->data = (char **) th_calloc(size, sizeof(char *)); |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
407 res->size = size; |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
408 res->n = 0; |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
409 res->deallocator = mdeallocator; |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
410 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
411 return res; |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
412 } |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
413 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
414 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
415 BOOL th_ringbuf_grow(qringbuf_t *buf, const size_t n) |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
416 { |
306
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
417 buf->data = (char **) th_realloc(buf->data, (buf->size + n) * sizeof(char *)); |
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
418 if (buf->data != NULL) { |
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
419 memset(buf->data + buf->size, 0, sizeof(char *) * n); |
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
420 buf->size += n; |
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
421 return TRUE; |
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
422 } else |
21528fe535fb
Don't use void pointers in the ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
284
diff
changeset
|
423 return FALSE; |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
424 } |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
425 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
426 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
427 void th_ringbuf_free(qringbuf_t *buf) |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
428 { |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
429 int i; |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
430 |
307
a6304a3719ee
Free every item in the ringbuffer instead of just up to N.
Matti Hamalainen <ccr@tnsp.org>
parents:
306
diff
changeset
|
431 for (i = 0; i < buf->size; i++) |
283
18e292701db4
Change ringbuffer functionality.
Matti Hamalainen <ccr@tnsp.org>
parents:
281
diff
changeset
|
432 if (buf->data[i] != NULL) |
18e292701db4
Change ringbuffer functionality.
Matti Hamalainen <ccr@tnsp.org>
parents:
281
diff
changeset
|
433 buf->deallocator(buf->data[i]); |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
434 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
435 th_free(buf->data); |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
436 th_free(buf); |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
437 } |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
438 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
439 |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
440 void th_ringbuf_add(qringbuf_t *buf, void *ptr) |
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
441 { |
283
18e292701db4
Change ringbuffer functionality.
Matti Hamalainen <ccr@tnsp.org>
parents:
281
diff
changeset
|
442 if (buf->n < buf->size) |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
443 buf->n++; |
283
18e292701db4
Change ringbuffer functionality.
Matti Hamalainen <ccr@tnsp.org>
parents:
281
diff
changeset
|
444 |
18e292701db4
Change ringbuffer functionality.
Matti Hamalainen <ccr@tnsp.org>
parents:
281
diff
changeset
|
445 th_free(buf->data[0]); |
284
dbf07a4eadd7
Grave bugfix in ringbuffer implementation!
Matti Hamalainen <ccr@tnsp.org>
parents:
283
diff
changeset
|
446 memmove(&(buf->data[0]), &(buf->data[1]), (buf->size - 1) * sizeof(void *)); |
283
18e292701db4
Change ringbuffer functionality.
Matti Hamalainen <ccr@tnsp.org>
parents:
281
diff
changeset
|
447 buf->data[buf->size - 1] = ptr; |
276
1807059fb8f2
Move ringbuffer implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
136
diff
changeset
|
448 } |