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