include: add list_append()
The existing list_add() prepends to the list, but in some cases we need the list ordered in the way we append the elements. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
		
							parent
							
								
									fb22a408c6
								
							
						
					
					
						commit
						6acebf9e12
					
				|  | @ -159,6 +159,28 @@ list_add(struct list *entry, struct list *head) | ||||||
|     __list_add(entry, head, head->next); |     __list_add(entry, head, head->next); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Append a new element to the end of the list given with this list head. | ||||||
|  |  * | ||||||
|  |  * The list changes from: | ||||||
|  |  *      head → some element → ... → lastelement | ||||||
|  |  * to | ||||||
|  |  *      head → some element → ... → lastelement → new element | ||||||
|  |  * | ||||||
|  |  * Example: | ||||||
|  |  * struct foo *newfoo = malloc(...); | ||||||
|  |  * list_append(&newfoo->mylist, &foo->mylist); | ||||||
|  |  * | ||||||
|  |  * @param entry The new element to prepend to the list. | ||||||
|  |  * @param head The existing list. | ||||||
|  |  */ | ||||||
|  | static inline void | ||||||
|  | list_append(struct list *entry, struct list *head) | ||||||
|  | { | ||||||
|  |     __list_add(entry, head->prev, head); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| static inline void | static inline void | ||||||
| __list_del(struct list *prev, struct list *next) | __list_del(struct list *prev, struct list *next) | ||||||
| { | { | ||||||
|  |  | ||||||
							
								
								
									
										31
									
								
								test/list.c
								
								
								
								
							
							
						
						
									
										31
									
								
								test/list.c
								
								
								
								
							|  | @ -88,6 +88,36 @@ test_list_add(void) | ||||||
|     assert(memcmp(c, &child[2], sizeof(struct child)) == 0); |     assert(memcmp(c, &child[2], sizeof(struct child)) == 0); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static void | ||||||
|  | test_list_append(void) | ||||||
|  | { | ||||||
|  |     struct parent parent = {0}; | ||||||
|  |     struct child child[3]; | ||||||
|  |     struct child *c; | ||||||
|  |     int i; | ||||||
|  | 
 | ||||||
|  |     list_init(&parent.children); | ||||||
|  | 
 | ||||||
|  |     list_append(&child[0].node, &parent.children); | ||||||
|  |     assert(!list_is_empty(&parent.children)); | ||||||
|  | 
 | ||||||
|  |     c = list_first_entry(&parent.children, struct child, node); | ||||||
|  |     assert(memcmp(c, &child[0], sizeof(struct child)) == 0); | ||||||
|  | 
 | ||||||
|  |     list_append(&child[1].node, &parent.children); | ||||||
|  |     c = list_first_entry(&parent.children, struct child, node); | ||||||
|  |     assert(memcmp(c, &child[0], sizeof(struct child)) == 0); | ||||||
|  | 
 | ||||||
|  |     list_append(&child[2].node, &parent.children); | ||||||
|  |     c = list_first_entry(&parent.children, struct child, node); | ||||||
|  |     assert(memcmp(c, &child[0], sizeof(struct child)) == 0); | ||||||
|  | 
 | ||||||
|  |     i = 0; | ||||||
|  |     list_for_each_entry(c, &parent.children, node) { | ||||||
|  |         assert(memcmp(c, &child[i++], sizeof(struct child)) == 0); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| test_list_del(void) | test_list_del(void) | ||||||
| { | { | ||||||
|  | @ -325,6 +355,7 @@ int main(int argc, char** argv) | ||||||
| { | { | ||||||
|     test_list_init(); |     test_list_init(); | ||||||
|     test_list_add(); |     test_list_add(); | ||||||
|  |     test_list_append(); | ||||||
|     test_list_del(); |     test_list_del(); | ||||||
|     test_list_for_each(); |     test_list_for_each(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue