Mercurial > code
comparison array.c @ 12:cbfe95c9f7b7
Fix compiler warning (thanks gcc 4.2.2) and security
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 07 Sep 2011 21:54:15 +0200 |
parents | da47652b60c5 |
children | 2d112b8a3756 |
comparison
equal
deleted
inserted
replaced
11:7360d752183e | 12:cbfe95c9f7b7 |
---|---|
44 free(arr); | 44 free(arr); |
45 return NULL; | 45 return NULL; |
46 } | 46 } |
47 | 47 |
48 if (data) | 48 if (data) |
49 memcpy(&arr->data[0], data, arr->unit); | 49 memcpy(arr->data, data, arr->unit); |
50 | 50 |
51 return arr; | 51 return arr; |
52 } | 52 } |
53 | 53 |
54 /* | 54 /* |
62 array_push(struct array *arr, const void *data) | 62 array_push(struct array *arr, const void *data) |
63 { | 63 { |
64 if (array_grow(arr) < 0) | 64 if (array_grow(arr) < 0) |
65 return -1; | 65 return -1; |
66 | 66 |
67 memmove(&arr->data[arr->unit], &arr->data[0], SIZE(arr->length++)); | 67 memmove(arr->data + arr->unit, arr->data, SIZE(arr->length++)); |
68 memcpy(&arr->data[0], data, arr->unit); | 68 memcpy(arr->data, data, arr->unit); |
69 | 69 |
70 return 0; | 70 return 0; |
71 } | 71 } |
72 | 72 |
73 /* | 73 /* |
80 array_insert(struct array *arr, const void *data, int index) | 80 array_insert(struct array *arr, const void *data, int index) |
81 { | 81 { |
82 if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0) | 82 if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0) |
83 return -1; | 83 return -1; |
84 | 84 |
85 memmove(&arr->data[SIZE(index + 1)], &arr->data[SIZE(index)], | 85 memmove(arr->data + SIZE(index + 1), arr->data + SIZE(index), |
86 SIZE(arr->length++ - index)); | 86 SIZE(arr->length++ - index)); |
87 memcpy(&arr->data[SIZE(index)], data, arr->unit); | 87 memcpy(arr->data + SIZE(index), data, arr->unit); |
88 | 88 |
89 return 0; | 89 return 0; |
90 } | 90 } |
91 | 91 |
92 /* | 92 /* |
97 array_append(struct array *arr, const void *data) | 97 array_append(struct array *arr, const void *data) |
98 { | 98 { |
99 if (array_grow(arr) < 0) | 99 if (array_grow(arr) < 0) |
100 return -1; | 100 return -1; |
101 | 101 |
102 memcpy(&arr->data[SIZE(arr->length++)], data, arr->unit); | 102 memcpy(arr->data + SIZE(arr->length++), data, arr->unit); |
103 | 103 |
104 return 0; | 104 return 0; |
105 } | 105 } |
106 | 106 |
107 /* | 107 /* |
115 void *data; | 115 void *data; |
116 | 116 |
117 if (arr->length == 0) | 117 if (arr->length == 0) |
118 return NULL; | 118 return NULL; |
119 | 119 |
120 data = &arr->data[0]; | 120 data = arr->data; |
121 memmove(&arr->data[0], &arr->data[SIZE(1)], SIZE(arr->length)); | 121 memmove(arr->data, arr->data + SIZE(1), SIZE(arr->length)); |
122 memset(&arr->data[SIZE(--arr->length)], 0, arr->unit); | 122 memset(arr->data + SIZE(--arr->length), 0, arr->unit); |
123 | 123 |
124 return data; | 124 return data; |
125 } | 125 } |
126 | 126 |
127 /* | 127 /* |
135 void *data; | 135 void *data; |
136 | 136 |
137 if (arr->length == 0) | 137 if (arr->length == 0) |
138 return NULL; | 138 return NULL; |
139 | 139 |
140 data = &arr->data[SIZE(--arr->length)]; | 140 data = arr->data + SIZE(--arr->length); |
141 memset(&arr->data[SIZE(arr->length)], 0, arr->unit); | 141 memset(arr->data + SIZE(arr->length), 0, arr->unit); |
142 | 142 |
143 return data; | 143 return data; |
144 } | 144 } |
145 | 145 |
146 /* | 146 /* |
154 void *data; | 154 void *data; |
155 | 155 |
156 if (arr->length == 0 || index < 0 || index > arr->length - 1) | 156 if (arr->length == 0 || index < 0 || index > arr->length - 1) |
157 return NULL; | 157 return NULL; |
158 | 158 |
159 data = &arr->data[index]; | 159 data = arr->data + SIZE(index); |
160 memmove(&arr->data[index], &arr->data[index + 1], | 160 memmove(arr->data + SIZE(index), arr->data + SIZE(index + 1), |
161 SIZE(arr->length - index)); | 161 SIZE(arr->length - index)); |
162 memset(&arr->data[SIZE(--arr->length)], 0, arr->unit); | 162 memset(arr->data + SIZE(--arr->length), 0, arr->unit); |
163 | 163 |
164 return data; | 164 return data; |
165 } | 165 } |
166 | 166 |
167 /* | 167 /* |
173 array_map(struct array *arr, void (*fn)(void *, void *), void *udata) | 173 array_map(struct array *arr, void (*fn)(void *, void *), void *udata) |
174 { | 174 { |
175 int i; | 175 int i; |
176 | 176 |
177 for (i = 0; i < arr->length; ++i) | 177 for (i = 0; i < arr->length; ++i) |
178 fn(&arr->data[i], udata); | 178 fn(arr->data + i, udata); |
179 } | 179 } |
180 | 180 |
181 /* | 181 /* |
182 * Compare each object with the user supplied function. If the `fn' function | 182 * Compare each object with the user supplied function. If the `fn' function |
183 * returns 1 then the data is returned. Optional idx argument can be set to | 183 * returns 1 then the data is returned. Optional idx argument can be set to |
190 { | 190 { |
191 int st, i; | 191 int st, i; |
192 void *data; | 192 void *data; |
193 | 193 |
194 for (i = st = 0; i < arr->length && !st; ++i) | 194 for (i = st = 0; i < arr->length && !st; ++i) |
195 st = fn(&arr->data[i], udata); | 195 st = fn(arr->data + i, udata); |
196 | 196 |
197 if (st) { | 197 if (st) { |
198 data = &arr->data[--i]; | 198 data = arr->data + --i; |
199 if (idx) | 199 if (idx) |
200 *idx = i; | 200 *idx = i; |
201 } else | 201 } else |
202 data = NULL; | 202 data = NULL; |
203 | 203 |