/******************************************************************************* * The information contained in this file is confidential and proprietary to * ZNK Corporation. No part of this file may be reproduced or distributed, * in any form or by any means for any purpose, without the express written * permission of ZNK Corporation. * * (c) COPYRIGHT 1998 ZNK Corporation, ALL RIGHTS RESERVED. * * Single link list routines: * void s_list_init (s_list_t *, *head, *tail, cnt) * void s_list_clear (s_list_t *) * void s_list_push_head (s_list_t *, s_list_entry_t *) * s_list_entry_t * s_list_pop_head (s_list_t *) * void s_list_push_tail (s_list_t *, s_list_entry_t *) * s_list_entry_t * s_list_peek_head (s_list_t *) * s_list_entry_t * s_list_peek_tail (s_list_t *) * s_list_entry_t * s_list_next_entry (s_list_entry_t *) * unsigned long s_list_entry_cnt (s_list_t *) * char s_list_is_empty (s_list_t *) * void s_list_add_head (s_list_t *, s_list_t *) * void s_list_add_tail (s_list_t *, s_list_t *) * void s_list_split (d_list_t *, d_list_t *, d_list_entry_t *, ulong) * * Double link list routines: * void d_list_init (d_list_t *, *head, *tail, cnt) * void d_list_clear (d_list_t *) * void d_list_push_head (d_list_t *, d_list_entry_t *) * d_list_entry_t * d_list_pop_head (d_list_t *) * void d_list_push_tail (d_list_t *, d_list_entry_t *) * d_list_entry_t * d_list_pop_tail (d_list_t *) * d_list_entry_t * d_list_peek_head (d_list_t *) * d_list_entry_t * d_list_peek_tail (d_list_t *) * d_list_entry_t * d_list_next_entry (d_list_entry_t *) * void d_list_remove_entry(d_list_t *, d_list_entry_t *) * void d_list_insert_entry(d_list_t *, *prev, *next, *new) * d_list_entry_t * d_list_prev_entry (d_list_entry_t *) * unsigned long d_list_entry_cnt (d_list_t *) * char d_list_is_empty (d_list_t *) * void d_list_add_head (d_list_t *, d_list_t *) * void d_list_add_tail (d_list_t *, d_list_t *) * * Array list routines: * void q_list_init (q_list_t *, q_list_entry *, ulong) * void q_list_clear (q_list_t *) * void q_list_push_head (q_list_t *, q_list_entry_t) * q_list_entry_t q_list_pop_head (q_list_t *) * void q_list_push_tail (q_list_t *, q_list_entry_t) * q_list_entry_t q_list_pop_tail (q_list_t *) * q_list_entry_t q_list_peek_head (q_list_t *) * q_list_entry_t q_list_peek_tail (q_list_t *) * unsigned long q_list_entry_cnt (q_list_t *) * char q_list_is_empty (q_list_t *) * char q_list_is_full (q_list_t *) * * History: * 03/30/98 Hav Khauv Initial version. ******************************************************************************/ #ifndef _listq_h_ #define _listq_h_ /******************************************************************************* * Single link list. ******************************************************************************/ typedef struct _s_list_entry_t { struct _s_list_entry_t *next; } s_list_entry_t; #define S_LINK_CAST(_p) ((s_list_entry_t *) (_p)) typedef struct _s_list_t { s_list_entry_t *head; s_list_entry_t *tail; unsigned long cnt; } s_list_t; #ifdef _INLINE_LISTQ_CALLS __inline void s_list_init( s_list_t *s_list, s_list_entry_t *head_entry, s_list_entry_t *tail_entry, unsigned long entry_cnt) { s_list->head = head_entry; s_list->tail = tail_entry; s_list->cnt = entry_cnt; } __inline void s_list_clear( s_list_t *s_list) { s_list->head = (s_list_entry_t *) 0; s_list->tail = (s_list_entry_t *) 0; s_list->cnt = 0; } __inline void s_list_push_head( s_list_t *s_list, s_list_entry_t *s_entry) { s_entry->next = s_list->head; if(s_list->tail == (s_list_entry_t *) 0) { s_list->tail = s_entry; } s_list->head = s_entry; s_list->cnt++; } __inline s_list_entry_t * s_list_pop_head( s_list_t *s_list) { s_list_entry_t *s_entry; s_entry = s_list->head; if(s_list->head) { s_list->head = s_list->head->next; if(s_list->head == (s_list_entry_t *) 0) { s_list->tail = (s_list_entry_t *) 0; } s_list->cnt--; } return s_entry; } __inline void s_list_push_tail( s_list_t *s_list, s_list_entry_t *s_entry) { s_entry->next = (s_list_entry_t *) 0; if(s_list->tail) { s_list->tail->next = s_entry; } else { s_list->head = s_entry; } s_list->tail = s_entry; s_list->cnt++; } __inline s_list_entry_t * s_list_peek_head( s_list_t *s_list) { return s_list->head; } __inline s_list_entry_t * s_list_peek_tail( s_list_t *s_list) { return s_list->tail; } __inline s_list_entry_t * s_list_next_entry( s_list_entry_t *s_entry) { return s_entry->next; } __inline unsigned long s_list_entry_cnt( s_list_t *s_list) { return s_list->cnt; } __inline char s_list_is_empty( s_list_t *s_list) { return s_list->cnt == 0; } __inline void s_list_add_head( s_list_t *s_list, s_list_t *s_list_head) { if(s_list->cnt == 0) { *s_list = *s_list_head; } else if(s_list_head->cnt) { s_list_head->tail->next = s_list->head; s_list->head = s_list_head->head; s_list->cnt += s_list_head->cnt; } } __inline void s_list_add_tail( s_list_t *s_list, s_list_t *s_list_tail) { if(s_list->cnt == 0) { *s_list = *s_list_tail; } else if(s_list_tail->cnt) { s_list->tail->next = s_list_tail->head; s_list->tail = s_list_tail->tail; s_list->cnt += s_list_tail->cnt; } } __inline void s_list_split( s_list_t * s_list, s_list_t * s_list_head, s_list_entry_t * split_entry, unsigned long entry_cnt) { if (split_entry->next == NULL) { s_list_head->head = s_list->head; s_list_head->tail = split_entry; s_list_head->cnt = entry_cnt; s_list->head = NULL; s_list->tail = NULL; s_list->cnt = 0; } else { s_list_head->head = s_list->head; s_list_head->tail = split_entry; s_list_head->cnt = entry_cnt; s_list->head = split_entry->next; s_list->cnt = s_list->cnt - entry_cnt; split_entry->next = NULL; } } #else #define s_list_init(_s_list, _head_entry, _tail_entry, _entry_cnt) \ (_s_list)->head = (_head_entry); \ (_s_list)->tail = (_tail_entry); \ (_s_list)->cnt = (_entry_cnt) #define s_list_clear(_s_list) \ (_s_list)->head = (s_list_entry_t *) 0; \ (_s_list)->tail = (s_list_entry_t *) 0; \ (_s_list)->cnt = 0 #define s_list_push_head(_s_list, _s_entry) \ (_s_entry)->next = (_s_list)->head; \ if((_s_list)->tail == (s_list_entry_t *) 0) \ { \ (_s_list)->tail = (_s_entry); \ } \ (_s_list)->head = (_s_entry); \ (_s_list)->cnt++ #define s_list_pop_head(_s_list) \ (_s_list)->head; \ if((_s_list)->head) \ { \ (_s_list)->head = (_s_list)->head->next; \ if((_s_list)->head == (s_list_entry_t *) 0) \ { \ (_s_list)->tail = (s_list_entry_t *) 0; \ } \ (_s_list)->cnt--; \ } #define s_list_push_tail(_s_list, _s_entry) \ (_s_entry)->next = (s_list_entry_t *) 0; \ if((_s_list)->tail) \ { \ (_s_list)->tail->next = (_s_entry); \ } \ else \ { \ (_s_list)->head = (_s_entry); \ } \ (_s_list)->tail = (_s_entry); \ (_s_list)->cnt++ #define s_list_peek_head(_s_list) ((_s_list)->head) #define s_list_peek_tail(_s_list) ((_s_list)->tail) #define s_list_next_entry(_s_entry) ((_s_entry)->next) #define s_list_entry_cnt(_s_list) ((_s_list)->cnt) #define s_list_is_empty(_s_list) ((_s_list)->cnt == 0) #define s_list_add_head(_s_list, _s_list_head) \ if((_s_list)->cnt == 0) \ { \ *(_s_list) = *(_s_list_head); \ } \ else if((_s_list_head)->cnt) \ { \ (_s_list_head)->tail->next = (_s_list)->head; \ (_s_list)->head = (_s_list_head)->head; \ (_s_list)->cnt += (_s_list_head)->cnt; \ } #define s_list_add_tail(_s_list, _s_list_tail) \ if((_s_list)->cnt == 0) \ { \ *(_s_list) = *(_s_list_tail); \ } \ else if((_s_list_tail)->cnt) \ { \ (_s_list)->tail->next = (_s_list_tail)->head; \ (_s_list)->tail = (_s_list_tail)->tail; \ (_s_list)->cnt += (_s_list_tail)->cnt; \ } #define s_list_split(_s_list, _s_list_head, _split_entry, _entry_cnt) \ if ((_split_entry)->next == NULL) { \ (_s_list_head)->head = (_s_list)->head; \ (_s_list_head)->tail = _split_entry; \ (_s_list_head)->cnt = _entry_cnt; \ (_s_list)->head = NULL; \ (_s_list)->tail = NULL; \ (_s_list)->cnt = 0; \ } else { \ (_s_list_head)->head = (_s_list)->head; \ (_s_list_head)->tail = _split_entry; \ (_s_list_head)->cnt = (_entry_cnt); \ (_s_list)->head = (_split_entry)->next; \ (_s_list)->cnt = (_s_list)->cnt - (_entry_cnt); \ (_split_entry)->next = NULL; \ } #endif /******************************************************************************* * Double link list entry. ******************************************************************************/ typedef struct _d_list_entry_t { struct _d_list_entry_t *next; struct _d_list_entry_t *prev; } d_list_entry_t; #define D_LINK_CAST(_p) ((d_list_entry_t *) (_p)) typedef struct _d_list_t { d_list_entry_t *head; d_list_entry_t *tail; unsigned long cnt; } d_list_t; #ifdef _INLINE_LISTQ_CALLS __inline void d_list_init( d_list_t *d_list, d_list_entry_t *head_entry, d_list_entry_t *tail_entry, unsigned long entry_cnt) { d_list->head = head_entry; d_list->tail = tail_entry; d_list->cnt = entry_cnt; } __inline void d_list_clear( d_list_t *d_list) { d_list->head = (d_list_entry_t *) 0; d_list->tail = (d_list_entry_t *) 0; d_list->cnt = 0; } __inline void d_list_push_head( d_list_t *d_list, d_list_entry_t *d_entry) { d_entry->prev = (d_list_entry_t *) 0; d_entry->next = d_list->head; if(d_list->tail == (d_list_entry_t *) 0) { d_list->tail = d_entry; } else { d_list->head->prev = d_entry; } d_list->head = d_entry; d_list->cnt++; } __inline d_list_entry_t * d_list_pop_head( d_list_t *d_list) { d_list_entry_t *d_entry; d_entry = d_list->head; if(d_list->head) { d_list->head = d_list->head->next; if(d_list->head) { d_list->head->prev = (d_list_entry_t *) 0; } else { d_list->tail = (d_list_entry_t *) 0; } d_list->cnt--; } return d_entry; } __inline void d_list_push_tail( d_list_t *d_list, d_list_entry_t *d_entry) { d_entry->next = (d_list_entry_t *) 0; d_entry->prev = d_list->tail; if(d_list->tail) { d_list->tail->next = d_entry; } else { d_list->head = d_entry; } d_list->tail = d_entry; d_list->cnt++; } __inline d_list_entry_t * d_list_pop_tail( d_list_t *d_list) { d_list_entry_t *d_entry; d_entry = d_list->tail; if(d_list->tail) { d_list->tail = d_list->tail->prev; if(d_list->tail) { d_list->tail->next = (d_list_entry_t *) 0; } else { d_list->head = (d_list_entry_t *) 0; } d_list->cnt--; } return d_entry; } __inline d_list_entry_t * d_list_peek_head( d_list_t *d_list) { return d_list->head; } __inline d_list_entry_t * d_list_peek_tail( d_list_t *d_list) { return d_list->tail; } __inline d_list_entry_t * d_list_next_entry( d_list_entry_t *d_entry) { return d_entry->next; } __inline void d_list_remove_entry( d_list_t *d_list, d_list_entry_t *d_entry) { if(d_list->head == d_entry) { d_list_pop_head(d_list); } else if(d_list->tail == d_entry) { d_list_pop_tail(d_list); } else { d_entry->prev->next = d_entry->next; d_entry->next->prev = d_entry->prev; d_list->cnt--; } } __inline void d_list_insert_entry( d_list_t *d_list, d_list_entry_t *d_entry_prev, d_list_entry_t *d_entry_next, d_list_entry_t *d_entry) { if (d_entry_prev == NULL) { d_list_push_head(d_list, d_entry); } else if (d_entry_next == NULL) { d_list_push_tail(d_list, d_entry); } else { d_entry->next = d_entry_next; d_entry->prev = d_entry_prev; d_entry_prev->next = d_entry; d_entry_next->prev = d_entry; d_list->cnt++; } } __inline d_list_entry_t * d_list_prev_entry( d_list_entry_t *d_entry) { return d_entry->prev; } __inline unsigned long d_list_entry_cnt( d_list_t *d_list) { return d_list->cnt; } __inline char d_list_is_empty( d_list_t *d_list) { return d_list->cnt == 0; } __inline void d_list_add_head( d_list_t *d_list, d_list_t *d_list_head) { d_list_head->tail->next = d_list->head; if(d_list->head) { d_list->head->prev = d_list_head->tail; } else { d_list->tail = d_list_head->tail; } d_list->head = d_list_head->head; d_list->cnt += d_list_head->cnt; } __inline void d_list_add_tail( d_list_t *d_list, d_list_t *d_list_tail) { d_list_tail->head->prev = d_list->tail; if(d_list->tail) { d_list->tail->next = d_list_tail->head; } else { d_list->head = d_list_tail->head; } d_list->tail = d_list_tail->tail; d_list->cnt += d_list_tail->cnt; } #else #define d_list_init(_d_list, _head_entry, _tail_entry, _entry_cnt) \ (_d_list)->head = (_head_entry); \ (_d_list)->tail = (_tail_entry); \ (_d_list)->cnt = (_entry_cnt) #define d_list_clear(_d_list) \ (_d_list)->head = (d_list_entry_t *) 0; \ (_d_list)->tail = (d_list_entry_t *) 0; \ (_d_list)->cnt = 0 #define d_list_push_head(_d_list, _d_entry) \ (_d_entry)->prev = (d_list_entry_t *) 0; \ (_d_entry)->next = (_d_list)->head; \ if((_d_list)->tail == (d_list_entry_t *) 0) \ { \ (_d_list)->tail = (_d_entry); \ } \ else \ { \ (_d_list)->head->prev = (_d_entry); \ } \ (_d_list)->head = (_d_entry); \ (_d_list)->cnt++ #define d_list_pop_head(_d_list) \ (_d_list)->head; \ if((_d_list)->head) \ { \ (_d_list)->head = (_d_list)->head->next; \ if((_d_list)->head) \ { \ (_d_list)->head->prev = (d_list_entry_t *) 0; \ } \ else \ { \ (_d_list)->tail = (d_list_entry_t *) 0; \ } \ (_d_list)->cnt--; \ } #define d_list_push_tail(_d_list, _d_entry) \ (_d_entry)->next = (d_list_entry_t *) 0; \ (_d_entry)->prev = (_d_list)->tail; \ if((_d_list)->tail) \ { \ (_d_list)->tail->next = (_d_entry); \ } \ else \ { \ (_d_list)->head = (_d_entry); \ } \ (_d_list)->tail = (_d_entry); \ (_d_list)->cnt++ #define d_list_pop_tail(_d_list) \ (_d_list)->tail; \ if((_d_list)->tail) \ { \ (_d_list)->tail = (_d_list)->tail->prev; \ if((_d_list)->tail) \ { \ (_d_list)->tail->next = (d_list_entry_t *) 0; \ } \ else \ { \ (_d_list)->head = (d_list_entry_t *) 0; \ } \ (_d_list)->cnt--; \ } #define d_list_peek_head(_d_list) ((_d_list)->head) #define d_list_peek_tail(_d_list) ((_d_list)->tail) #define d_list_next_entry(_d_entry) ((_d_entry)->next) #define d_list_insert_entry(_d_list, _d_entry_prev, _d_entry_next, _d_entry) \ if (_d_entry_prev == NULL ) \ { \ (_d_entry)->prev = (d_list_entry_t *) 0; \ (_d_entry)->next = (_d_list)->head; \ if((_d_list)->tail == (d_list_entry_t *) 0) \ { \ (_d_list)->tail = (_d_entry); \ } \ (_d_list)->head = (_d_entry); \ (_d_list)->cnt++; \ } \ else if (_d_entry_next == NULL ) \ { \ (_d_entry)->next = (d_list_entry_t *) 0; \ (_d_entry)->prev = (_d_list)->tail; \ if((_d_list)->tail) \ { \ (_d_list)->tail->next = (_d_entry); \ } \ else \ { \ (_d_list)->head = (_d_entry); \ } \ (_d_list)->tail = (_d_entry); \ (_d_list)->cnt++; \ } \ else \ { \ (_d_entry)->next = (_d_entry_next); \ (_d_entry)->prev = (_d_entry_prev); \ (_d_entry_prev)->next = (_d_entry); \ (_d_entry_next)->prev = (_d_entry); \ (_d_list)->cnt++; \ } #define d_list_remove_entry(_d_list, _d_entry) \ if((_d_list)->head == (_d_entry)) \ { \ if((_d_list)->head) \ { \ (_d_list)->head = (_d_list)->head->next; \ if((_d_list)->head) \ { \ (_d_list)->head->prev = (d_list_entry_t *) 0; \ } \ else \ { \ (_d_list)->tail = (d_list_entry_t *) 0; \ } \ (_d_list)->cnt--; \ } \ } \ else if((_d_list)->tail == (_d_entry)) \ { \ if((_d_list)->tail) \ { \ (_d_list)->tail = (_d_list)->tail->prev; \ if((_d_list)->tail) \ { \ (_d_list)->tail->next = (d_list_entry_t *) 0; \ } \ else \ { \ (_d_list)->head = (d_list_entry_t *) 0; \ } \ (_d_list)->cnt--; \ } \ } \ else \ { \ (_d_entry)->prev->next = (_d_entry)->next; \ (_d_entry)->next->prev = (_d_entry)->prev; \ (_d_list)->cnt--; \ } #define d_list_prev_entry(_d_entry) ((_d_entry)->prev) #define d_list_entry_cnt(_d_list) ((_d_list)->cnt) #define d_list_is_empty(_d_list) ((_d_list)->cnt == 0) #define d_list_add_head(_d_list, _d_list_head) \ (_d_list_head)->tail->next = (_d_list)->head; \ if((_d_list)->head) \ { \ (_d_list)->head->prev = (_d_list_head)->tail; \ } \ else \ { \ (_d_list)->tail = (_d_list_head)->tail; \ } \ (_d_list)->head = (_d_list_head)->head; \ (_d_list)->cnt += (_d_list_head)->cnt #define d_list_add_tail(_d_list, _d_list_tail) \ (_d_list_tail)->head->prev = (_d_list)->tail; \ if((_d_list)->tail) \ { \ (_d_list)->tail->next = (_d_list_tail)->head; \ } \ else \ { \ (_d_list)->head = (_d_list_tail)->head; \ } \ (_d_list)->tail = (_d_list_tail)->tail; \ (_d_list)->cnt += (_d_list_tail)->cnt #endif /******************************************************************************* * Array list. ******************************************************************************/ typedef void *q_list_entry_t; typedef struct _q_list_t { q_list_entry_t *head; q_list_entry_t *tail; unsigned long cnt; unsigned long max_cnt; q_list_entry_t *first_entry_addr; q_list_entry_t *last_entry_addr; } q_list_t; #ifdef _INLINE_LISTQ_CALLS __inline void q_list_init( q_list_t *q_list, q_list_entry_t q_list_arr[], unsigned long max_cnt) { q_list->max_cnt = max_cnt; q_list->first_entry_addr = q_list_arr; q_list->last_entry_addr = q_list_arr + (max_cnt-1); q_list->head = q_list->first_entry_addr; q_list->tail = q_list->first_entry_addr; q_list->cnt = 0; } __inline void q_list_clear( q_list_t *q_list) { q_list->head = q_list->first_entry_addr; q_list->tail = q_list->first_entry_addr; q_list->cnt = 0; } __inline void q_list_push_head( q_list_t *q_list, q_list_entry_t q_entry) { if(q_list->cnt < q_list->max_cnt) { if(q_list->head == q_list->first_entry_addr) { q_list->head = q_list->last_entry_addr; } else { q_list->head--; } *(q_list->head) = q_entry; q_list->cnt++; } } __inline q_list_entry_t q_list_pop_head( q_list_t *q_list) { q_list_entry_t q_entry; q_entry = q_list->cnt ? *q_list->head : (q_list_entry_t *) 0; if(q_list->cnt) { if(q_list->head == q_list->last_entry_addr) { q_list->head = q_list->first_entry_addr; } else { q_list->head++; } q_list->cnt--; } return q_entry; } __inline void q_list_push_tail( q_list_t *q_list, q_list_entry_t q_entry) { if(q_list->cnt < q_list->max_cnt) { *q_list->tail = q_entry; if(q_list->tail == q_list->last_entry_addr) { q_list->tail = q_list->first_entry_addr; } else { q_list->tail++; } q_list->cnt++; } } __inline q_list_entry_t q_list_pop_tail( q_list_t *q_list) { q_list_entry_t q_entry; q_entry = q_list->cnt ? (q_list->tail == q_list->first_entry_addr ? *q_list->last_entry_addr : *(q_list->tail-1)) : (q_list_entry_t *) 0; if(q_list->cnt) { if(q_list->tail == q_list->first_entry_addr) { q_list->tail = q_list->last_entry_addr; } else { q_list->tail--; } q_list->cnt--; } return q_entry; } __inline q_list_entry_t q_list_peek_head( q_list_t *q_list) { q_list_entry_t q_entry; q_entry = q_list->cnt ? *q_list->head : (q_list_entry_t *) 0; return q_entry; } __inline q_list_entry_t q_list_peek_tail( q_list_t *q_list) { q_list_entry_t q_entry; q_entry = q_list->cnt ? (q_list->tail == q_list->first_entry_addr ? *q_list->last_entry_addr : *(q_list->tail - 1)) : (q_list_entry_t *) 0; return q_entry; } __inline unsigned long q_list_entry_cnt( q_list_t *q_list) { return q_list->cnt; } __inline char q_list_is_empty( q_list_t *q_list) { return q_list->cnt == 0; } __inline char q_list_is_full( q_list_t *q_list) { return q_list->cnt == q_list->max_cnt; } #else #define q_list_init(_q_list, _q_list_arr, _max_cnt) \ (_q_list)->max_cnt = (_max_cnt); \ (_q_list)->first_entry_addr = (_q_list_arr); \ (_q_list)->last_entry_addr = (_q_list_arr) + ((_max_cnt) - 1); \ (_q_list)->head = (_q_list)->first_entry_addr; \ (_q_list)->tail = (_q_list)->first_entry_addr; \ (_q_list)->cnt = 0 #define q_list_clear(_q_list) \ (_q_list)->head = (_q_list)->first_entry_addr; \ (_q_list)->tail = (_q_list)->first_entry_addr; \ (_q_list)->cnt = 0 #define q_list_push_head(_q_list, _q_entry) \ if((_q_list)->cnt < (_q_list)->max_cnt) \ { \ if((_q_list)->head == (_q_list)->first_entry_addr) \ { \ (_q_list)->head = (_q_list)->last_entry_addr; \ } \ else \ { \ (_q_list)->head--; \ } \ *((_q_list)->head) = (_q_entry); \ (_q_list)->cnt++; \ } #define q_list_pop_head(_q_list) \ (_q_list)->cnt ? *(_q_list)->head : (q_list_entry_t *) 0; \ if((_q_list)->cnt) \ { \ if((_q_list)->head == (_q_list)->last_entry_addr) \ { \ (_q_list)->head = (_q_list)->first_entry_addr; \ } \ else \ { \ (_q_list)->head++; \ } \ (_q_list)->cnt--; \ } #define q_list_push_tail(_q_list, _q_entry) \ if((_q_list)->cnt < (_q_list)->max_cnt) \ { \ *(_q_list)->tail = (_q_entry); \ if((_q_list)->tail == (_q_list)->last_entry_addr) \ { \ (_q_list)->tail = (_q_list)->first_entry_addr; \ } \ else \ { \ (_q_list)->tail++; \ } \ (_q_list)->cnt++; \ } #define q_list_pop_tail(_q_list) \ (_q_list)->cnt ? ((_q_list)->tail == (_q_list)->first_entry_addr ? \ *(_q_list)->last_entry_addr : *((_q_list)->tail-1)) : \ (q_list_entry_t *) 0; \ if((_q_list)->cnt) \ { \ if((_q_list)->tail == (_q_list)->first_entry_addr) \ { \ (_q_list)->tail = (_q_list)->last_entry_addr; \ } \ else \ { \ (_q_list)->tail--; \ } \ (_q_list)->cnt--; \ } \ #define q_list_peek_head(_q_list) \ ((_q_list)->cnt ? *(_q_list)->head : (q_list_entry_t *) 0) #define q_list_peek_tail(_q_list) \ ((_q_list)->cnt ? ((_q_list)->tail == (_q_list)->first_entry_addr ? \ *(_q_list)->last_entry_addr : *((_q_list)->tail - 1)) : \ (q_list_entry_t *) 0) #define q_list_entry_cnt(_q_list) ((_q_list)->cnt) #define q_list_is_empty(_q_list) ((_q_list)->cnt == 0) #define q_list_is_full(_q_list) ((_q_list)->cnt == (_q_list)->max_cnt) #endif #endif /* _listq_h_ */