⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue.h

📁 excellent event-driven http framework which can be used as a light-http library
💻 H
📖 第 1 页 / 共 2 页
字号:
	(head)->sqh_last = &(head)->sqh_first;				\} while (0)#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\	if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\		(head)->sqh_last = &(elm)->field.sqe_next;		\	(head)->sqh_first = (elm);					\} while (0)#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.sqe_next = NULL;					\	*(head)->sqh_last = (elm);					\	(head)->sqh_last = &(elm)->field.sqe_next;			\} while (0)#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\	if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\		(head)->sqh_last = &(elm)->field.sqe_next;		\	(listelm)->field.sqe_next = (elm);				\} while (0)#define SIMPLEQ_REMOVE_HEAD(head, elm, field) do {			\	if (((head)->sqh_first = (elm)->field.sqe_next) == NULL)	\		(head)->sqh_last = &(head)->sqh_first;			\} while (0)/* * Tail queue definitions. */#define TAILQ_HEAD(name, type)						\struct name {								\	struct type *tqh_first;	/* first element */			\	struct type **tqh_last;	/* addr of last next element */		\}#define TAILQ_HEAD_INITIALIZER(head)					\	{ NULL, &(head).tqh_first }#define TAILQ_ENTRY(type)						\struct {								\	struct type *tqe_next;	/* next element */			\	struct type **tqe_prev;	/* address of previous next element */	\}/*  * tail queue access methods  */#define	TAILQ_FIRST(head)		((head)->tqh_first)#define	TAILQ_END(head)			NULL#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)#define TAILQ_LAST(head, headname)					\	(*(((struct headname *)((head)->tqh_last))->tqh_last))/* XXX */#define TAILQ_PREV(elm, headname, field)				\	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))#define	TAILQ_EMPTY(head)						\	(TAILQ_FIRST(head) == TAILQ_END(head))#define TAILQ_FOREACH(var, head, field)					\	for((var) = TAILQ_FIRST(head);					\	    (var) != TAILQ_END(head);					\	    (var) = TAILQ_NEXT(var, field))#define TAILQ_FOREACH_REVERSE(var, head, field, headname)		\	for((var) = TAILQ_LAST(head, headname);				\	    (var) != TAILQ_END(head);					\	    (var) = TAILQ_PREV(var, headname, field))/* * Tail queue functions. */#define	TAILQ_INIT(head) do {						\	(head)->tqh_first = NULL;					\	(head)->tqh_last = &(head)->tqh_first;				\} while (0)#define TAILQ_INSERT_HEAD(head, elm, field) do {			\	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\		(head)->tqh_first->field.tqe_prev =			\		    &(elm)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm)->field.tqe_next;		\	(head)->tqh_first = (elm);					\	(elm)->field.tqe_prev = &(head)->tqh_first;			\} while (0)#define TAILQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.tqe_next = NULL;					\	(elm)->field.tqe_prev = (head)->tqh_last;			\	*(head)->tqh_last = (elm);					\	(head)->tqh_last = &(elm)->field.tqe_next;			\} while (0)#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\	if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\		(elm)->field.tqe_next->field.tqe_prev =			\		    &(elm)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm)->field.tqe_next;		\	(listelm)->field.tqe_next = (elm);				\	(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\} while (0)#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\	(elm)->field.tqe_next = (listelm);				\	*(listelm)->field.tqe_prev = (elm);				\	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\} while (0)#define TAILQ_REMOVE(head, elm, field) do {				\	if (((elm)->field.tqe_next) != NULL)				\		(elm)->field.tqe_next->field.tqe_prev =			\		    (elm)->field.tqe_prev;				\	else								\		(head)->tqh_last = (elm)->field.tqe_prev;		\	*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\} while (0)#define TAILQ_REPLACE(head, elm, elm2, field) do {			\	if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)	\		(elm2)->field.tqe_next->field.tqe_prev =		\		    &(elm2)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm2)->field.tqe_next;		\	(elm2)->field.tqe_prev = (elm)->field.tqe_prev;			\	*(elm2)->field.tqe_prev = (elm2);				\} while (0)/* * Circular queue definitions. */#define CIRCLEQ_HEAD(name, type)					\struct name {								\	struct type *cqh_first;		/* first element */		\	struct type *cqh_last;		/* last element */		\}#define CIRCLEQ_HEAD_INITIALIZER(head)					\	{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) }#define CIRCLEQ_ENTRY(type)						\struct {								\	struct type *cqe_next;		/* next element */		\	struct type *cqe_prev;		/* previous element */		\}/* * Circular queue access methods  */#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)#define	CIRCLEQ_LAST(head)		((head)->cqh_last)#define	CIRCLEQ_END(head)		((void *)(head))#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)#define	CIRCLEQ_EMPTY(head)						\	(CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))#define CIRCLEQ_FOREACH(var, head, field)				\	for((var) = CIRCLEQ_FIRST(head);				\	    (var) != CIRCLEQ_END(head);					\	    (var) = CIRCLEQ_NEXT(var, field))#define CIRCLEQ_FOREACH_REVERSE(var, head, field)			\	for((var) = CIRCLEQ_LAST(head);					\	    (var) != CIRCLEQ_END(head);					\	    (var) = CIRCLEQ_PREV(var, field))/* * Circular queue functions. */#define	CIRCLEQ_INIT(head) do {						\	(head)->cqh_first = CIRCLEQ_END(head);				\	(head)->cqh_last = CIRCLEQ_END(head);				\} while (0)#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\	(elm)->field.cqe_next = (listelm)->field.cqe_next;		\	(elm)->field.cqe_prev = (listelm);				\	if ((listelm)->field.cqe_next == CIRCLEQ_END(head))		\		(head)->cqh_last = (elm);				\	else								\		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\	(listelm)->field.cqe_next = (elm);				\} while (0)#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\	(elm)->field.cqe_next = (listelm);				\	(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\	if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))		\		(head)->cqh_first = (elm);				\	else								\		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\	(listelm)->field.cqe_prev = (elm);				\} while (0)#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\	(elm)->field.cqe_next = (head)->cqh_first;			\	(elm)->field.cqe_prev = CIRCLEQ_END(head);			\	if ((head)->cqh_last == CIRCLEQ_END(head))			\		(head)->cqh_last = (elm);				\	else								\		(head)->cqh_first->field.cqe_prev = (elm);		\	(head)->cqh_first = (elm);					\} while (0)#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.cqe_next = CIRCLEQ_END(head);			\	(elm)->field.cqe_prev = (head)->cqh_last;			\	if ((head)->cqh_first == CIRCLEQ_END(head))			\		(head)->cqh_first = (elm);				\	else								\		(head)->cqh_last->field.cqe_next = (elm);		\	(head)->cqh_last = (elm);					\} while (0)#define	CIRCLEQ_REMOVE(head, elm, field) do {				\	if ((elm)->field.cqe_next == CIRCLEQ_END(head))			\		(head)->cqh_last = (elm)->field.cqe_prev;		\	else								\		(elm)->field.cqe_next->field.cqe_prev =			\		    (elm)->field.cqe_prev;				\	if ((elm)->field.cqe_prev == CIRCLEQ_END(head))			\		(head)->cqh_first = (elm)->field.cqe_next;		\	else								\		(elm)->field.cqe_prev->field.cqe_next =			\		    (elm)->field.cqe_next;				\} while (0)#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {			\	if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==		\	    CIRCLEQ_END(head))						\		(head).cqh_last = (elm2);				\	else								\		(elm2)->field.cqe_next->field.cqe_prev = (elm2);	\	if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==		\	    CIRCLEQ_END(head))						\		(head).cqh_first = (elm2);				\	else								\		(elm2)->field.cqe_prev->field.cqe_next = (elm2);	\} while (0)#endif	/* !_SYS_QUEUE_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -