138 lines
4.1 KiB
C
138 lines
4.1 KiB
C
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef _SLL_LITE_H
|
|
#define _SLL_LITE_H
|
|
|
|
#include "cpr_types.h"
|
|
/*
|
|
* List node structure
|
|
*/
|
|
typedef struct sll_lite_node_t_ {
|
|
struct sll_lite_node_t_ *next_p; /* pointer to the next node */
|
|
} sll_lite_node_t;
|
|
|
|
/*
|
|
* List control structure
|
|
*/
|
|
typedef struct sll_lite_list_t_ {
|
|
uint16_t count; /* number of elements on the list */
|
|
sll_lite_node_t *head_p; /* pointer to the head or first node */
|
|
sll_lite_node_t *tail_p; /* pointer to the tail or last node */
|
|
} sll_lite_list_t;
|
|
|
|
typedef enum {
|
|
SLL_LITE_RET_SUCCESS,
|
|
SLL_LITE_RET_INVALID_ARGS,
|
|
SLL_LITE_RET_NODE_NOT_FOUND,
|
|
SLL_LITE_RET_OTHER_FAILURE
|
|
} sll_lite_return_e;
|
|
|
|
/*
|
|
* Convenient macros
|
|
*/
|
|
#define SLL_LITE_LINK_HEAD(link) \
|
|
(((sll_lite_list_t *)link)->head_p)
|
|
|
|
#define SLL_LITE_LINK_TAIL(link) \
|
|
(((sll_lite_list_t *)link)->tail_p)
|
|
|
|
#define SLL_LITE_LINK_NEXT_NODE(node) \
|
|
(((sll_lite_node_t *)node)->next_p)
|
|
|
|
#define SLL_LITE_NODE_COUNT(link) \
|
|
(((sll_lite_list_t *)link)->count)
|
|
|
|
/**
|
|
* sll_lite_init initializes list control structure given by the
|
|
* caller.
|
|
*
|
|
* @param[in] list - pointer to the list control structure
|
|
* sll_lite_list_t
|
|
*
|
|
* @return - SLL_LITE_RET_SUCCESS for success
|
|
* - SLL_LITE_RET_INVALID_ARGS when arguments are
|
|
* invalid.
|
|
*/
|
|
extern sll_lite_return_e
|
|
sll_lite_init(sll_lite_list_t *list);
|
|
|
|
/**
|
|
* sll_lite_link_head puts node to the head of the list.
|
|
*
|
|
* @param[in] list - pointer to the list control structure
|
|
* sll_lite_list_t. The list must be
|
|
* initialized prior.
|
|
* @param[in] node - pointer to the list node structure.
|
|
*
|
|
* @return - SLL_LITE_RET_SUCCESS for success
|
|
* - SLL_LITE_RET_INVALID_ARGS when arguments are
|
|
* invalid.
|
|
*/
|
|
extern sll_lite_return_e
|
|
sll_lite_link_head(sll_lite_list_t *list, sll_lite_node_t *node);
|
|
|
|
/**
|
|
* sll_lite_link_tail puts node to the tail of the list.
|
|
*
|
|
* @param[in] list - pointer to the list control structure
|
|
* sll_lite_list_t. The list must be
|
|
* initialized prior.
|
|
* @param[in] node - pointer to the list node structure.
|
|
*
|
|
* @return - SLL_LITE_RET_SUCCESS for success
|
|
* - SLL_LITE_RET_INVALID_ARGS when arguments are
|
|
* invalid.
|
|
*/
|
|
sll_lite_return_e
|
|
sll_lite_link_tail(sll_lite_list_t *list, sll_lite_node_t *node);
|
|
|
|
/**
|
|
* sll_lite_unlink_head removes head node from the head of the list and
|
|
* returns it to the caller.
|
|
*
|
|
* @param[in] list - pointer to the list control structure
|
|
* sll_lite_list_t. The list must be
|
|
* initialized prior.
|
|
*
|
|
* @return Pointer to the head node if one exists otherwise
|
|
* return NULL.
|
|
*/
|
|
extern sll_lite_node_t *
|
|
sll_lite_unlink_head(sll_lite_list_t *list);
|
|
|
|
/**
|
|
* sll_lite_unlink_tail removes tail node from the list and
|
|
* returns it to the caller.
|
|
*
|
|
* @param[in] list - pointer to the list control structure
|
|
* sll_lite_list_t. The list must be
|
|
* initialized prior.
|
|
*
|
|
* @return Pointer to the tail node if one exists otherwise
|
|
* return NULL.
|
|
*/
|
|
sll_lite_node_t *
|
|
sll_lite_unlink_tail(sll_lite_list_t *list);
|
|
|
|
/**
|
|
* sll_lite_remove removes the given node from the list.
|
|
*
|
|
* @param[in] list - pointer to the list control structure
|
|
* sll_lite_list_t. The list must be
|
|
* initialized prior.
|
|
* @param[in] node - pointer to the list node structure to be
|
|
* removed.
|
|
*
|
|
* @return - SLL_LITE_RET_SUCCESS for success
|
|
* - SLL_LITE_RET_INVALID_ARGS when arguments are
|
|
* invalid.
|
|
* - SLL_LITE_RET_NODE_NOT_FOUND when the node
|
|
* to remove is not found.
|
|
*/
|
|
extern sll_lite_return_e
|
|
sll_lite_remove(sll_lite_list_t *list, sll_lite_node_t *node);
|
|
|
|
#endif
|