void vdl_list_sort (struct VdlList *list, bool (*is_strictly_lower) (void *a, void *b, void *context), void *context) { // insertion sort. struct VdlList sorted; vdl_list_construct (&sorted); void **i; for (i = vdl_list_begin (list); i != vdl_list_end (list); i = vdl_list_next (i)) { void **j; void **insertion = vdl_list_end (&sorted); for (j = vdl_list_begin (&sorted); j != vdl_list_end (&sorted); j = vdl_list_next (j)) { if (!is_strictly_lower (*j, *i, context)) { insertion = j; break; } } vdl_list_insert (&sorted, insertion, *i); } vdl_list_clear (list); vdl_list_insert_range (list, vdl_list_begin (list), vdl_list_begin (&sorted), vdl_list_end (&sorted)); vdl_list_destruct (&sorted); }
void vdl_list_insert_range (struct VdlList *list, void **at, void **start, void **end) { void **i; for (i = start; i != end; i = vdl_list_next (i)) { vdl_list_insert (list, at, *i); } }
struct VdlList * vdl_utils_splitpath (const char *value) { struct VdlList *list = vdl_utils_strsplit (value, ':'); void **i; for (i = vdl_list_begin (list); i != vdl_list_end (list); i = vdl_list_next (list, i)) { if (vdl_utils_strisequal (*i, "")) { // the empty string is interpreted as '.' vdl_alloc_free (*i); i = vdl_list_erase (list, i); i = vdl_list_insert (list, i, vdl_utils_strdup (".")); } } return list; }
void vdl_list_push_front (struct VdlList *list, void *data) { vdl_list_insert (list, vdl_list_begin (list), data); }
void vdl_list_push_back (struct VdlList *list, void *data) { vdl_list_insert (list, vdl_list_end (list), data); }