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

📄 bsdqueue.h

📁 一个C语言写的快速贝叶斯垃圾邮件过滤工具
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Simple queue definitions. */#define	SIMPLEQ_HEAD(name, type)					\struct name {								\	struct type *sqh_first;	/* first element */			\	struct type **sqh_last;	/* addr of last next element */		\}#define	SIMPLEQ_HEAD_INITIALIZER(head)					\	{ NULL, &(head).sqh_first }#define	SIMPLEQ_ENTRY(type)						\struct {								\	struct type *sqe_next;	/* next element */			\}/* * Simple queue functions. */#define	SIMPLEQ_INIT(head) do {						\	(head)->sqh_first = NULL;					\	(head)->sqh_last = &(head)->sqh_first;				\} while (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/0)#define	SIMPLEQ_REMOVE_HEAD(head, field) do {				\	if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \		(head)->sqh_last = &(head)->sqh_first;			\} while (/*CONSTCOND*/0)#define	SIMPLEQ_REMOVE(head, elm, type, field) do {			\	if ((head)->sqh_first == (elm)) {				\		SIMPLEQ_REMOVE_HEAD((head), field);			\	} else {							\		struct type *curelm = (head)->sqh_first;		\		while (curelm->field.sqe_next != (elm))			\			curelm = curelm->field.sqe_next;		\		if ((curelm->field.sqe_next =				\			curelm->field.sqe_next->field.sqe_next) == NULL) \			    (head)->sqh_last = &(curelm)->field.sqe_next; \	}								\} while (/*CONSTCOND*/0)#define	SIMPLEQ_FOREACH(var, head, field)				\	for ((var) = ((head)->sqh_first);				\		(var);							\		(var) = ((var)->field.sqe_next))/* * Simple queue access methods. */#define	SIMPLEQ_EMPTY(head)		((head)->sqh_first == NULL)#define	SIMPLEQ_FIRST(head)		((head)->sqh_first)#define	SIMPLEQ_NEXT(elm, field)	((elm)->field.sqe_next)/* * 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 functions. */#if defined(_KERNEL) && defined(QUEUEDEBUG)#define	QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)			\	if ((head)->tqh_first &&					\	    (head)->tqh_first->field.tqe_prev != &(head)->tqh_first)	\		panic("TAILQ_INSERT_HEAD %p %s:%d", (head), __FILE__, __LINE__);#define	QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)			\	if (*(head)->tqh_last != NULL)					\		panic("TAILQ_INSERT_TAIL %p %s:%d", (head), __FILE__, __LINE__);#define	QUEUEDEBUG_TAILQ_OP(elm, field)					\	if ((elm)->field.tqe_next &&					\	    (elm)->field.tqe_next->field.tqe_prev !=			\	    &(elm)->field.tqe_next)					\		panic("TAILQ_* forw %p %s:%d", (elm), __FILE__, __LINE__);\	if (*(elm)->field.tqe_prev != (elm))				\		panic("TAILQ_* back %p %s:%d", (elm), __FILE__, __LINE__);#define	QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field)			\	if ((elm)->field.tqe_next == NULL &&				\	    (head)->tqh_last != &(elm)->field.tqe_next)			\		panic("TAILQ_PREREMOVE head %p elm %p %s:%d",		\		      (head), (elm), __FILE__, __LINE__);#define	QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)				\	(elm)->field.tqe_next = (void *)1L;				\	(elm)->field.tqe_prev = (void *)1L;#else#define	QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)#define	QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)#define	QUEUEDEBUG_TAILQ_OP(elm, field)#define	QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field)#define	QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)#endif#define	TAILQ_INIT(head) do {						\	(head)->tqh_first = NULL;					\	(head)->tqh_last = &(head)->tqh_first;				\} while (/*CONSTCOND*/0)#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\	QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field)		\	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 (/*CONSTCOND*/0)#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\	QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field)		\	(elm)->field.tqe_next = NULL;					\	(elm)->field.tqe_prev = (head)->tqh_last;			\	*(head)->tqh_last = (elm);					\	(head)->tqh_last = &(elm)->field.tqe_next;			\} while (/*CONSTCOND*/0)#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\	QUEUEDEBUG_TAILQ_OP((listelm), field)				\	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 (/*CONSTCOND*/0)#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\	QUEUEDEBUG_TAILQ_OP((listelm), field)				\	(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 (/*CONSTCOND*/0)#define	TAILQ_REMOVE(head, elm, field) do {				\	QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field)		\	QUEUEDEBUG_TAILQ_OP((elm), field)				\	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;			\	QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field);			\} while (/*CONSTCOND*/0)#define	TAILQ_FOREACH(var, head, field)					\	for ((var) = ((head)->tqh_first);				\		(var);							\		(var) = ((var)->field.tqe_next))#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\	for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));	\		(var);							\		(var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))/* * Tail queue access methods. */#define	TAILQ_EMPTY(head)		((head)->tqh_first == NULL)#define	TAILQ_FIRST(head)		((head)->tqh_first)#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)#define	TAILQ_LAST(head, headname) \	(*(((struct headname *)((head)->tqh_last))->tqh_last))#define	TAILQ_PREV(elm, headname, field) \	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))/* * 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)					\	{ (void *)&head, (void *)&head }#define	CIRCLEQ_ENTRY(type)						\struct {								\	struct type *cqe_next;		/* next element */		\	struct type *cqe_prev;		/* previous element */		\}/* * Circular queue functions. */#define	CIRCLEQ_INIT(head) do {						\	(head)->cqh_first = (void *)(head);				\	(head)->cqh_last = (void *)(head);				\} while (/*CONSTCOND*/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 == (void *)(head))		\		(head)->cqh_last = (elm);				\	else								\		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\	(listelm)->field.cqe_next = (elm);				\} while (/*CONSTCOND*/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 == (void *)(head))		\		(head)->cqh_first = (elm);				\	else								\		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\	(listelm)->field.cqe_prev = (elm);				\} while (/*CONSTCOND*/0)#define	CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\	(elm)->field.cqe_next = (head)->cqh_first;			\	(elm)->field.cqe_prev = (void *)(head);				\	if ((head)->cqh_last == (void *)(head))				\		(head)->cqh_last = (elm);				\	else								\		(head)->cqh_first->field.cqe_prev = (elm);		\	(head)->cqh_first = (elm);					\} while (/*CONSTCOND*/0)#define	CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.cqe_next = (void *)(head);				\	(elm)->field.cqe_prev = (head)->cqh_last;			\	if ((head)->cqh_first == (void *)(head))			\		(head)->cqh_first = (elm);				\	else								\		(head)->cqh_last->field.cqe_next = (elm);		\	(head)->cqh_last = (elm);					\} while (/*CONSTCOND*/0)#define	CIRCLEQ_REMOVE(head, elm, field) do {				\	if ((elm)->field.cqe_next == (void *)(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 == (void *)(head))			\		(head)->cqh_first = (elm)->field.cqe_next;		\	else								\		(elm)->field.cqe_prev->field.cqe_next =			\		    (elm)->field.cqe_next;				\} while (/*CONSTCOND*/0)#define	CIRCLEQ_FOREACH(var, head, field)				\	for ((var) = ((head)->cqh_first);				\		(var) != (void *)(head);				\		(var) = ((var)->field.cqe_next))#define	CIRCLEQ_FOREACH_REVERSE(var, head, field)			\	for ((var) = ((head)->cqh_last);				\		(var) != (void *)(head);				\		(var) = ((var)->field.cqe_prev))/* * Circular queue access methods. */#define	CIRCLEQ_EMPTY(head)		((head)->cqh_first == (void *)(head))#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)#define	CIRCLEQ_LAST(head)		((head)->cqh_last)#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)#endif	/* !_SYS_QUEUE_H_ */

⌨️ 快捷键说明

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