diff options
Diffstat (limited to 'firmware/general.c')
-rw-r--r-- | firmware/general.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/firmware/general.c b/firmware/general.c index fa1025492b..20b0277c09 100644 --- a/firmware/general.c +++ b/firmware/general.c | |||
@@ -196,3 +196,40 @@ char *create_datetime_filename(char *buffer, const char *path, | |||
196 | return buffer; | 196 | return buffer; |
197 | } | 197 | } |
198 | #endif /* CONFIG_RTC */ | 198 | #endif /* CONFIG_RTC */ |
199 | |||
200 | /*** | ||
201 | ** Compacted pointer lists | ||
202 | ** | ||
203 | ** N-length list requires N+1 elements to ensure NULL-termination. | ||
204 | **/ | ||
205 | |||
206 | /* Find a pointer in a pointer array. Returns the addess of the element if | ||
207 | * found or the address of the terminating NULL otherwise. This can be used | ||
208 | * to bounds check and add items. */ | ||
209 | void ** find_array_ptr(void **arr, void *ptr) | ||
210 | { | ||
211 | void *curr; | ||
212 | for (curr = *arr; curr != NULL && curr != ptr; curr = *(++arr)); | ||
213 | return arr; | ||
214 | } | ||
215 | |||
216 | /* Remove a pointer from a pointer array if it exists. Compacts it so that | ||
217 | * no gaps exist. Returns 0 on success and -1 if the element wasn't found. */ | ||
218 | int remove_array_ptr(void **arr, void *ptr) | ||
219 | { | ||
220 | void *curr; | ||
221 | arr = find_array_ptr(arr, ptr); | ||
222 | |||
223 | if (*arr == NULL) | ||
224 | return -1; | ||
225 | |||
226 | /* Found. Slide up following items. */ | ||
227 | do | ||
228 | { | ||
229 | void **arr1 = arr + 1; | ||
230 | *arr++ = curr = *arr1; | ||
231 | } | ||
232 | while (curr != NULL); | ||
233 | |||
234 | return 0; | ||
235 | } | ||