summaryrefslogtreecommitdiff
path: root/firmware/general.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/general.c')
-rw-r--r--firmware/general.c37
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. */
209void ** 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. */
218int 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}