1/* 2 * Copyright 2003-2006, Axel D��rfler, axeld@pinc-software.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _FSSH_LIST_H 6#define _FSSH_LIST_H 7 8 9#include "fssh_types.h" 10 11 12/* This header defines a doubly-linked list. It differentiates between a link 13 * and an item. 14 * A link is what is put into and removed from a list, an item is the whole 15 * object that contains the link. The item doesn't have to be begin with a 16 * link; the offset to the link structure is given to init_list_etc(), so that 17 * list_get_next/prev_item() will work correctly. 18 * Note, the offset value is only needed for the *_item() functions. If the 19 * offset is 0, list_link and item are identical - if you use init_list(), 20 * you don't have to care about the difference between a link and an item. 21 */ 22 23 24namespace FSShell { 25 26 27typedef struct list_link list_link; 28 29/* The object that is put into the list must begin with these 30 * fields, but it doesn't have to be this structure. 31 */ 32 33struct list_link { 34 list_link *next; 35 list_link *prev; 36}; 37 38struct list { 39 list_link link; 40 int32_t offset; 41}; 42 43 44extern void list_init(struct list *list); 45extern void list_init_etc(struct list *list, int32_t offset); 46extern void list_add_link_to_head(struct list *list, void *_link); 47extern void list_add_link_to_tail(struct list *list, void *_link); 48extern void list_remove_link(void *_link); 49extern void *list_get_next_item(struct list *list, void *item); 50extern void *list_get_prev_item(struct list *list, void *item); 51extern void *list_get_last_item(struct list *list); 52extern void list_add_item(struct list *list, void *item); 53extern void list_remove_item(struct list *list, void *item); 54extern void list_insert_item_before(struct list *list, void *before, void *item); 55extern void *list_remove_head_item(struct list *list); 56extern void *list_remove_tail_item(struct list *list); 57extern void list_move_to_list(struct list *sourceList, struct list *targetList); 58 59static inline bool 60list_is_empty(struct list *list) 61{ 62 return list->link.next == (list_link *)list; 63} 64 65static inline void * 66list_get_first_item(struct list *list) 67{ 68 return list_get_next_item(list, NULL); 69} 70 71 72} // namespace FSShell 73 74#endif /* _FSSH_LIST_H */ 75