Mercurial > code
comparison array.c @ 25:e09000fc013a
Switch to void * thus the user do not need to cast
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 15 Sep 2011 17:53:43 +0200 |
parents | 216b6e6a539c |
children | 4fd9ecbbb143 |
comparison
equal
deleted
inserted
replaced
24:726b181b8956 | 25:e09000fc013a |
---|---|
63 array_push(struct array *arr, const void *data) | 63 array_push(struct array *arr, const void *data) |
64 { | 64 { |
65 if (array_grow(arr) < 0) | 65 if (array_grow(arr) < 0) |
66 return -1; | 66 return -1; |
67 | 67 |
68 memmove(arr->data + arr->unit, arr->data, SIZE(arr->length++)); | 68 memmove((char *) arr->data + arr->unit, arr->data, SIZE(arr->length++)); |
69 memcpy(arr->data, data, arr->unit); | 69 memcpy((char *) arr->data, data, arr->unit); |
70 | 70 |
71 return 0; | 71 return 0; |
72 } | 72 } |
73 | 73 |
74 /* | 74 /* |
81 array_insert(struct array *arr, const void *data, int index) | 81 array_insert(struct array *arr, const void *data, int index) |
82 { | 82 { |
83 if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0) | 83 if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0) |
84 return -1; | 84 return -1; |
85 | 85 |
86 memmove(arr->data + SIZE(index + 1), arr->data + SIZE(index), | 86 memmove((char *) arr->data + SIZE(index + 1), (char *) arr->data + SIZE(index), |
87 SIZE(arr->length++ - index)); | 87 SIZE(arr->length++ - index)); |
88 memcpy(arr->data + SIZE(index), data, arr->unit); | 88 memcpy((char *) arr->data + SIZE(index), data, arr->unit); |
89 | 89 |
90 return 0; | 90 return 0; |
91 } | 91 } |
92 | 92 |
93 /* | 93 /* |
98 array_append(struct array *arr, const void *data) | 98 array_append(struct array *arr, const void *data) |
99 { | 99 { |
100 if (array_grow(arr) < 0) | 100 if (array_grow(arr) < 0) |
101 return -1; | 101 return -1; |
102 | 102 |
103 memcpy(arr->data + SIZE(arr->length++), data, arr->unit); | 103 memcpy((char *) arr->data + SIZE(arr->length++), data, arr->unit); |
104 | 104 |
105 return 0; | 105 return 0; |
106 } | 106 } |
107 | 107 |
108 /* | 108 /* |
117 | 117 |
118 if (arr->length == 0) | 118 if (arr->length == 0) |
119 return NULL; | 119 return NULL; |
120 | 120 |
121 data = arr->data; | 121 data = arr->data; |
122 memmove(arr->data, arr->data + SIZE(1), SIZE(arr->length)); | 122 memmove((char *) arr->data, (char *) arr->data + SIZE(1), |
123 memset(arr->data + SIZE(--arr->length), 0, arr->unit); | 123 SIZE(arr->length)); |
124 memset((char *) arr->data + SIZE(--arr->length), 0, arr->unit); | |
124 | 125 |
125 return data; | 126 return data; |
126 } | 127 } |
127 | 128 |
128 /* | 129 /* |
136 void *data; | 137 void *data; |
137 | 138 |
138 if (arr->length == 0) | 139 if (arr->length == 0) |
139 return NULL; | 140 return NULL; |
140 | 141 |
141 data = arr->data + SIZE(--arr->length); | 142 data = (char *) arr->data + SIZE(--arr->length); |
142 memset(arr->data + SIZE(arr->length), 0, arr->unit); | 143 memset((char *) arr->data + SIZE(arr->length), 0, arr->unit); |
143 | 144 |
144 return data; | 145 return data; |
145 } | 146 } |
146 | 147 |
147 /* | 148 /* |
155 void *data; | 156 void *data; |
156 | 157 |
157 if (arr->length == 0 || index < 0 || index > arr->length - 1) | 158 if (arr->length == 0 || index < 0 || index > arr->length - 1) |
158 return NULL; | 159 return NULL; |
159 | 160 |
160 data = arr->data + SIZE(index); | 161 data = (char *) arr->data + SIZE(index); |
161 memmove(arr->data + SIZE(index), arr->data + SIZE(index + 1), | 162 memmove((char *) arr->data + SIZE(index), (char *) arr->data + SIZE(index + 1), |
162 SIZE(arr->length - index)); | 163 SIZE(arr->length - index)); |
163 memset(arr->data + SIZE(--arr->length), 0, arr->unit); | 164 memset((char *) arr->data + SIZE(--arr->length), 0, arr->unit); |
164 | 165 |
165 return data; | 166 return data; |
166 } | 167 } |
167 | 168 |
168 /* | 169 /* |
184 */ | 185 */ |
185 | 186 |
186 if (!arr->tmp && !(arr->tmp = malloc(arr->unit))) | 187 if (!arr->tmp && !(arr->tmp = malloc(arr->unit))) |
187 return -1; | 188 return -1; |
188 | 189 |
189 memcpy(arr->tmp, arr->data + SIZE(i1), arr->unit); | 190 memcpy((char *) arr->tmp, (char *) arr->data + SIZE(i1), arr->unit); |
190 memcpy(arr->data + SIZE(i1), arr->data + SIZE(i2), arr->unit); | 191 memcpy((char *) arr->data + SIZE(i1), (char *) arr->data + SIZE(i2), arr->unit); |
191 memcpy(arr->data + SIZE(i2), arr->tmp, arr->unit); | 192 memcpy((char *) arr->data + SIZE(i2), (char *) arr->tmp, arr->unit); |
192 | 193 |
193 return 0; | 194 return 0; |
194 } | 195 } |
195 | 196 |
196 /* | 197 /* |
202 array_map(struct array *arr, void (*fn)(void *, void *), void *udata) | 203 array_map(struct array *arr, void (*fn)(void *, void *), void *udata) |
203 { | 204 { |
204 int i; | 205 int i; |
205 | 206 |
206 for (i = 0; i < arr->length; ++i) | 207 for (i = 0; i < arr->length; ++i) |
207 fn(arr->data + i, udata); | 208 fn((char *) arr->data + SIZE(i), udata); |
208 } | 209 } |
209 | 210 |
210 /* | 211 /* |
211 * Compare each object with the user supplied function. If the `fn' function | 212 * Compare each object with the user supplied function. If the `fn' function |
212 * returns 1 then the data is returned. Optional idx argument can be set to | 213 * returns 1 then the data is returned. Optional idx argument can be set to |
213 * indicate the data position. If the data was not found the function returns | 214 * indicate the data position. If the data was not found the function returns |
214 * NULL. | 215 * NULL. |
215 */ | 216 */ |
216 | 217 |
217 void * | 218 void * |
218 array_find(struct array *arr, int (*fn)(void *, void *), void *udata, int *idx) | 219 array_find(struct array *arr, int (*fn)(void *, void *), int *idx, void *udata) |
219 { | 220 { |
220 int st, i; | 221 int st, i; |
221 void *data; | 222 void *data; |
222 | 223 |
223 for (i = st = 0; i < arr->length && !st; ++i) | 224 for (i = st = 0; i < arr->length && !st; ++i) |
224 st = fn(arr->data + i, udata); | 225 st = fn((char *) arr->data + SIZE(i), udata); |
225 | 226 |
226 if (st) { | 227 if (st) { |
227 data = arr->data + --i; | 228 data = (char *) arr->data + SIZE(--i); |
228 if (idx) | 229 if (idx) |
229 *idx = i; | 230 *idx = i; |
230 } else | 231 } else |
231 data = NULL; | 232 data = NULL; |
232 | 233 |