44 lines
1.5 KiB
C
44 lines
1.5 KiB
C
#if !defined(__XCELIST_H__)
|
|
#define __XCELIST_H__ 1
|
|
|
|
/*
|
|
* Intrusive doubly-linked list.
|
|
*
|
|
* A list entry must have its `forw` and `back` pointers as its first two
|
|
* members so that a user-defined node (e.g. `struct { void* forw; void* back;
|
|
* ...payload... }`) can be safely cast to `xcelist_entry_t*`.
|
|
*
|
|
* The list head (`xcelist_t`) is itself layout-compatible with an entry: its
|
|
* `forw` field points to the first entry (or back to itself when empty) and
|
|
* its `back` field points to the last entry. `numEnts` tracks the entry count.
|
|
*
|
|
* This replaces the previously external `basiclib/list.h` (extralib) with the
|
|
* minimal subset of functionality actually used in-tree.
|
|
*/
|
|
|
|
typedef struct _xcelist_entry {
|
|
struct _xcelist_entry* forw;
|
|
struct _xcelist_entry* back;
|
|
} xcelist_entry_t;
|
|
|
|
typedef struct _xcelist {
|
|
/* head sentinel: must mirror xcelist_entry_t layout (forw/back first) */
|
|
xcelist_entry_t* forw;
|
|
xcelist_entry_t* back;
|
|
int numEnts;
|
|
char* name;
|
|
} xcelist_t;
|
|
|
|
/* Create an empty list. `name` is copied and may be NULL. Returns NULL on OOM. */
|
|
extern xcelist_t* list_create(const char* name);
|
|
|
|
/* Destroy a list. Does not free the entries; caller owns them. */
|
|
extern void list_destroy(xcelist_t* list);
|
|
|
|
/* Append `entry` to the back (tail) of `list`. */
|
|
extern void list_insert_entry_back(xcelist_t* list, xcelist_entry_t* entry);
|
|
|
|
/* Unlink `entry` from `list`. Does not free `entry`. */
|
|
extern void list_entry_remove(xcelist_t* list, xcelist_entry_t* entry);
|
|
|
|
#endif
|