asn1_queue.h revision 233294
1168054Sflz/* $NetBSD: queue.h,v 1.38 2004/04/18 14:12:05 lukem Exp $ */ 2168054Sflz/* $Id$ */ 3168266Sgabor 4168266Sgabor/* 5168266Sgabor * Copyright (c) 1991, 1993 6168266Sgabor * The Regents of the University of California. All rights reserved. 7168266Sgabor * 8168266Sgabor * Redistribution and use in source and binary forms, with or without 9168266Sgabor * modification, are permitted provided that the following conditions 10168266Sgabor * are met: 11168054Sflz * 1. Redistributions of source code must retain the above copyright 12168054Sflz * notice, this list of conditions and the following disclaimer. 13168064Sflz * 2. Redistributions in binary form must reproduce the above copyright 14168064Sflz * notice, this list of conditions and the following disclaimer in the 15168064Sflz * documentation and/or other materials provided with the distribution. 16168064Sflz * 3. Neither the name of the University nor the names of its contributors 17168064Sflz * may be used to endorse or promote products derived from this software 18168064Sflz * without specific prior written permission. 19168064Sflz * 20168064Sflz * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21168064Sflz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22168064Sflz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23168064Sflz * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24168064Sflz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25168064Sflz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26168064Sflz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27168054Sflz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28168054Sflz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29168064Sflz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30168054Sflz * SUCH DAMAGE. 31168188Sgabor * 32168357Syar * @(#)queue.h 8.5 (Berkeley) 8/20/94 33168673Sjulian */ 34168188Sgabor 35168263Sru#ifndef _ASN1_QUEUE_H_ 36168194Simp#define _ASN1_QUEUE_H_ 37168357Syar 38168188Sgabor/* 39168188Sgabor * Tail queue definitions. 40168188Sgabor */ 41168188Sgabor#define ASN1_TAILQ_HEAD(name, type) \ 42168188Sgaborstruct name { \ 43168188Sgabor struct type *tqh_first; /* first element */ \ 44168188Sgabor struct type **tqh_last; /* addr of last next element */ \ 45168202Sume} 46168188Sgabor 47168188Sgabor#define ASN1_TAILQ_HEAD_INITIALIZER(head) \ 48168202Sume { NULL, &(head).tqh_first } 49168188Sgabor#define ASN1_TAILQ_ENTRY(type) \ 50168127Sdwmalonestruct { \ 51168054Sflz struct type *tqe_next; /* next element */ \ 52168054Sflz struct type **tqe_prev; /* address of previous next element */ \ 53168054Sflz} 54168054Sflz 55168215Sache/* 56208793Sae * Tail queue functions. 57168149Simp */ 58168149Simp#if defined(_KERNEL) && defined(QUEUEDEBUG) 59207017Sanchie#define QUEUEDEBUG_ASN1_TAILQ_INSERT_HEAD(head, elm, field) \ 60168179Sgabor if ((head)->tqh_first && \ 61210361Sandrew (head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \ 62168083Sjkim panic("ASN1_TAILQ_INSERT_HEAD %p %s:%d", (head), __FILE__, __LINE__); 63176001Santoine#define QUEUEDEBUG_ASN1_TAILQ_INSERT_TAIL(head, elm, field) \ 64168123Snetchild if (*(head)->tqh_last != NULL) \ 65188752Savg panic("ASN1_TAILQ_INSERT_TAIL %p %s:%d", (head), __FILE__, __LINE__); 66168080Smlaier#define QUEUEDEBUG_ASN1_TAILQ_OP(elm, field) \ 67168195Sbenno if ((elm)->field.tqe_next && \ 68168131Sbmah (elm)->field.tqe_next->field.tqe_prev != \ 69168183Sgabor &(elm)->field.tqe_next) \ 70168080Smlaier panic("ASN1_TAILQ_* forw %p %s:%d", (elm), __FILE__, __LINE__);\ 71168309Sbrian if (*(elm)->field.tqe_prev != (elm)) \ 72168308Sbrian panic("ASN1_TAILQ_* back %p %s:%d", (elm), __FILE__, __LINE__); 73203168Sbrucec#define QUEUEDEBUG_ASN1_TAILQ_PREREMOVE(head, elm, field) \ 74168150Srwatson if ((elm)->field.tqe_next == NULL && \ 75168149Simp (head)->tqh_last != &(elm)->field.tqe_next) \ 76203555Sbschmidt panic("ASN1_TAILQ_PREREMOVE head %p elm %p %s:%d", \ 77168150Srwatson (head), (elm), __FILE__, __LINE__); 78168263Sru#define QUEUEDEBUG_ASN1_TAILQ_POSTREMOVE(elm, field) \ 79180232Scokane (elm)->field.tqe_next = (void *)1L; \ 80168054Sflz (elm)->field.tqe_prev = (void *)1L; 81168183Sgabor#else 82168674Sjulian#define QUEUEDEBUG_ASN1_TAILQ_INSERT_HEAD(head, elm, field) 83168060Sdds#define QUEUEDEBUG_ASN1_TAILQ_INSERT_TAIL(head, elm, field) 84168108Srafan#define QUEUEDEBUG_ASN1_TAILQ_OP(elm, field) 85168083Sjkim#define QUEUEDEBUG_ASN1_TAILQ_PREREMOVE(head, elm, field) 86168153Simp#define QUEUEDEBUG_ASN1_TAILQ_POSTREMOVE(elm, field) 87168080Smlaier#endif 88212025Sdim 89168149Simp#define ASN1_TAILQ_INIT(head) do { \ 90168127Sdwmalone (head)->tqh_first = NULL; \ 91179207Sed (head)->tqh_last = &(head)->tqh_first; \ 92175201Sedwin} while (/*CONSTCOND*/0) 93168263Sru 94168180Srwatson#define ASN1_TAILQ_INSERT_HEAD(head, elm, field) do { \ 95168149Simp QUEUEDEBUG_ASN1_TAILQ_INSERT_HEAD((head), (elm), field) \ 96179830Seri if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ 97189932Sfabient (head)->tqh_first->field.tqe_prev = \ 98168127Sdwmalone &(elm)->field.tqe_next; \ 99169252Sfjoe else \ 100168054Sflz (head)->tqh_last = &(elm)->field.tqe_next; \ 101203370Sgabor (head)->tqh_first = (elm); \ 102168370Sgad (elm)->field.tqe_prev = &(head)->tqh_first; \ 103168631Sticso} while (/*CONSTCOND*/0) 104200313Sgavin 105168183Sgabor#define ASN1_TAILQ_INSERT_TAIL(head, elm, field) do { \ 106168672Smav QUEUEDEBUG_ASN1_TAILQ_INSERT_TAIL((head), (elm), field) \ 107168150Srwatson (elm)->field.tqe_next = NULL; \ 108168195Sbenno (elm)->field.tqe_prev = (head)->tqh_last; \ 109168081Sle *(head)->tqh_last = (elm); \ 110168154Sgshapiro (head)->tqh_last = &(elm)->field.tqe_next; \ 111168127Sdwmalone} while (/*CONSTCOND*/0) 112168144Simp 113179767Sivoras#define ASN1_TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ 114168308Sbrian QUEUEDEBUG_ASN1_TAILQ_OP((listelm), field) \ 115187937Sjamie if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ 116168183Sgabor (elm)->field.tqe_next->field.tqe_prev = \ 117208394Sjchandra &(elm)->field.tqe_next; \ 118208394Sjchandra else \ 119197776Sjh (head)->tqh_last = &(elm)->field.tqe_next; \ 120208394Sjchandra (listelm)->field.tqe_next = (elm); \ 121192607Sjilles (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ 122168150Srwatson} while (/*CONSTCOND*/0) 123168153Simp 124168083Sjkim#define ASN1_TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 125172389Skaiw QUEUEDEBUG_ASN1_TAILQ_OP((listelm), field) \ 126168111Smatteo (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 127168149Simp (elm)->field.tqe_next = (listelm); \ 128168151Sphk *(listelm)->field.tqe_prev = (elm); \ 129168149Simp (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ 130168673Sjulian} while (/*CONSTCOND*/0) 131172389Skaiw 132168180Srwatson#define ASN1_TAILQ_REMOVE(head, elm, field) do { \ 133168535Skevlo QUEUEDEBUG_ASN1_TAILQ_PREREMOVE((head), (elm), field) \ 134200356Skib QUEUEDEBUG_ASN1_TAILQ_OP((elm), field) \ 135168150Srwatson if (((elm)->field.tqe_next) != NULL) \ 136168081Sle (elm)->field.tqe_next->field.tqe_prev = \ 137168180Srwatson (elm)->field.tqe_prev; \ 138183643Slstewart else \ 139172984Slulf (head)->tqh_last = (elm)->field.tqe_prev; \ 140180222Smarcel *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ 141192775Smarkm QUEUEDEBUG_ASN1_TAILQ_POSTREMOVE((elm), field); \ 142168167Sphilip} while (/*CONSTCOND*/0) 143168918Sbrueffer 144168142Srwatson#define ASN1_TAILQ_FOREACH(var, head, field) \ 145168672Smav for ((var) = ((head)->tqh_first); \ 146168263Sru (var); \ 147208807Smdf (var) = ((var)->field.tqe_next)) 148168143Smjacob 149168080Smlaier#define ASN1_TAILQ_FOREACH_REVERSE(var, head, headname, field) \ 150168149Simp for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ 151168130Sdelphij (var); \ 152198183Sneel (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) 153168123Snetchild 154168171Sphilip/* 155194197Snork * Tail queue access methods. 156193775Snp */ 157180227Snwhitehorn#define ASN1_TAILQ_EMPTY(head) ((head)->tqh_first == NULL) 158168097Sle#define ASN1_TAILQ_FIRST(head) ((head)->tqh_first) 159176318Solli#define ASN1_TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 160168149Simp 161168127Sdwmalone#define ASN1_TAILQ_LAST(head, headname) \ 162168183Sgabor (*(((struct headname *)((head)->tqh_last))->tqh_last)) 163168111Smatteo#define ASN1_TAILQ_PREV(elm, headname, field) \ 164168151Sphk (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 165203610Sbrueffer 166168321Spjd 167168183Sgabor#endif /* !_ASN1_QUEUE_H_ */ 168168101Sandre