Mercurial > hg > nnchat
annotate th_util.c @ 322:b9c15c57dc8f
Clean up message functions, add new printMsgQ() helper function for messages that should not
go into the log file. Add skeleton help function, accessible via F1 key. And other cleanups.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 11 Jun 2011 09:48:26 +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 } |