From: Lucas De Marchi Date: Thu, 1 Dec 2011 17:27:42 +0000 (-0200) Subject: Add kmod_list_remove_n_latest() X-Git-Tag: v1~158 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=62be799554c468b483afdda36f6e9903662aab23;p=thirdparty%2Fkmod.git Add kmod_list_remove_n_latest() --- diff --git a/libkmod/libkmod-list.c b/libkmod/libkmod-list.c index d74d66df..d9caba0e 100644 --- a/libkmod/libkmod-list.c +++ b/libkmod/libkmod-list.c @@ -138,6 +138,34 @@ struct kmod_list *kmod_list_remove_data(struct kmod_list *list, return container_of(node, struct kmod_list, node); } +/* + * n must be greater to or equal the number of elements (we don't check the + * condition + */ +struct kmod_list *kmod_list_remove_n_latest(struct kmod_list *list, + unsigned int n) +{ + struct kmod_list *l; + unsigned int i; + + /* + * Get last element, remove all appended elments and if list became + * empty, set return pointer to NULL + */ + l = kmod_list_prev(list, list); + if (l == NULL) + l = list; + + for (i = 0; i < n; i++) + l = kmod_list_remove(l); + + /* If list became empty, save it*/ + if (l == NULL) + list = NULL; + + return list; +} + KMOD_EXPORT struct kmod_list *kmod_list_prev(struct kmod_list *list, struct kmod_list *curr) { diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h index 55626f2f..af1c93eb 100644 --- a/libkmod/libkmod-private.h +++ b/libkmod/libkmod-private.h @@ -51,7 +51,8 @@ struct kmod_list *kmod_list_prepend(struct kmod_list *list, void *data) __must_c struct kmod_list *kmod_list_remove(struct kmod_list *list); struct kmod_list *kmod_list_remove_data(struct kmod_list *list, const void *data) __must_check; - +struct kmod_list *kmod_list_remove_n_latest(struct kmod_list *list, + unsigned int n) __must_check; /* libkmod.c */ const char *kmod_get_dirname(struct kmod_ctx *ctx) __attribute__((nonnull(1)));