mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-21 04:46:29 +00:00
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r60603 | russell | 2007-04-06 15:58:43 -0500 (Fri, 06 Apr 2007) | 13 lines To be able to achieve the things that we would like to achieve with the Asterisk GUI project, we need a fully functional HTTP interface with access to the Asterisk manager interface. One of the things that was intended to be a part of this system, but was never actually implemented, was the ability for the GUI to be able to upload files to Asterisk. So, this commit adds this in the most minimally invasive way that we could come up with. A lot of work on minimime was done by Steve Murphy. He fixed a lot of bugs in the parser, and updated it to be thread-safe. The ability to check permissions of active manager sessions was added by Dwayne Hubbard. Then, hacking this all together and do doing the modifications necessary to the HTTP interface was done by me. ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@60604 65c4cc65-6c06-0410-ace0-fbb531ad65f3
533 lines
56 KiB
HTML
533 lines
56 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
|
|
<title>MiniMIME: mm_queue.h Source File</title>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
|
<link href="tabs.css" rel="stylesheet" type="text/css">
|
|
</head><body>
|
|
<!-- Generated by Doxygen 1.5.1 -->
|
|
<div class="tabs">
|
|
<ul>
|
|
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
<li><a href="modules.html"><span>Modules</span></a></li>
|
|
<li id="current"><a href="files.html"><span>Files</span></a></li>
|
|
<li><a href="pages.html"><span>Related Pages</span></a></li>
|
|
</ul></div>
|
|
<div class="tabs">
|
|
<ul>
|
|
<li><a href="files.html"><span>File List</span></a></li>
|
|
<li><a href="globals.html"><span>Globals</span></a></li>
|
|
</ul></div>
|
|
<h1>mm_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* $OpenBSD: queue.h,v 1.25 2004/04/08 16:08:21 henning Exp $ */</span>
|
|
<a name="l00002"></a>00002 <span class="comment">/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */</span>
|
|
<a name="l00003"></a>00003
|
|
<a name="l00004"></a>00004 <span class="comment">/*</span>
|
|
<a name="l00005"></a>00005 <span class="comment"> * Copyright (c) 1991, 1993</span>
|
|
<a name="l00006"></a>00006 <span class="comment"> * The Regents of the University of California. All rights reserved.</span>
|
|
<a name="l00007"></a>00007 <span class="comment"> *</span>
|
|
<a name="l00008"></a>00008 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
|
|
<a name="l00009"></a>00009 <span class="comment"> * modification, are permitted provided that the following conditions</span>
|
|
<a name="l00010"></a>00010 <span class="comment"> * are met:</span>
|
|
<a name="l00011"></a>00011 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
|
|
<a name="l00012"></a>00012 <span class="comment"> * notice, this list of conditions and the following disclaimer.</span>
|
|
<a name="l00013"></a>00013 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
|
|
<a name="l00014"></a>00014 <span class="comment"> * notice, this list of conditions and the following disclaimer in the</span>
|
|
<a name="l00015"></a>00015 <span class="comment"> * documentation and/or other materials provided with the distribution.</span>
|
|
<a name="l00016"></a>00016 <span class="comment"> * 3. Neither the name of the University nor the names of its contributors</span>
|
|
<a name="l00017"></a>00017 <span class="comment"> * may be used to endorse or promote products derived from this software</span>
|
|
<a name="l00018"></a>00018 <span class="comment"> * without specific prior written permission.</span>
|
|
<a name="l00019"></a>00019 <span class="comment"> *</span>
|
|
<a name="l00020"></a>00020 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND</span>
|
|
<a name="l00021"></a>00021 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
|
|
<a name="l00022"></a>00022 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
|
|
<a name="l00023"></a>00023 <span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE</span>
|
|
<a name="l00024"></a>00024 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
|
|
<a name="l00025"></a>00025 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
|
|
<a name="l00026"></a>00026 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
|
|
<a name="l00027"></a>00027 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
|
|
<a name="l00028"></a>00028 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
|
|
<a name="l00029"></a>00029 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
|
|
<a name="l00030"></a>00030 <span class="comment"> * SUCH DAMAGE.</span>
|
|
<a name="l00031"></a>00031 <span class="comment"> *</span>
|
|
<a name="l00032"></a>00032 <span class="comment"> * @(#)queue.h 8.5 (Berkeley) 8/20/94</span>
|
|
<a name="l00033"></a>00033 <span class="comment"> */</span>
|
|
<a name="l00034"></a>00034
|
|
<a name="l00035"></a>00035 <span class="preprocessor">#ifndef _SYS_QUEUE_H_</span>
|
|
<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define _SYS_QUEUE_H_</span>
|
|
<a name="l00037"></a>00037 <span class="preprocessor"></span>
|
|
<a name="l00038"></a>00038 <span class="comment">/*</span>
|
|
<a name="l00039"></a>00039 <span class="comment"> * This file defines five types of data structures: singly-linked lists, </span>
|
|
<a name="l00040"></a>00040 <span class="comment"> * lists, simple queues, tail queues, and circular queues.</span>
|
|
<a name="l00041"></a>00041 <span class="comment"> *</span>
|
|
<a name="l00042"></a>00042 <span class="comment"> *</span>
|
|
<a name="l00043"></a>00043 <span class="comment"> * A singly-linked list is headed by a single forward pointer. The elements</span>
|
|
<a name="l00044"></a>00044 <span class="comment"> * are singly linked for minimum space and pointer manipulation overhead at</span>
|
|
<a name="l00045"></a>00045 <span class="comment"> * the expense of O(n) removal for arbitrary elements. New elements can be</span>
|
|
<a name="l00046"></a>00046 <span class="comment"> * added to the list after an existing element or at the head of the list.</span>
|
|
<a name="l00047"></a>00047 <span class="comment"> * Elements being removed from the head of the list should use the explicit</span>
|
|
<a name="l00048"></a>00048 <span class="comment"> * macro for this purpose for optimum efficiency. A singly-linked list may</span>
|
|
<a name="l00049"></a>00049 <span class="comment"> * only be traversed in the forward direction. Singly-linked lists are ideal</span>
|
|
<a name="l00050"></a>00050 <span class="comment"> * for applications with large datasets and few or no removals or for</span>
|
|
<a name="l00051"></a>00051 <span class="comment"> * implementing a LIFO queue.</span>
|
|
<a name="l00052"></a>00052 <span class="comment"> *</span>
|
|
<a name="l00053"></a>00053 <span class="comment"> * A list is headed by a single forward pointer (or an array of forward</span>
|
|
<a name="l00054"></a>00054 <span class="comment"> * pointers for a hash table header). The elements are doubly linked</span>
|
|
<a name="l00055"></a>00055 <span class="comment"> * so that an arbitrary element can be removed without a need to</span>
|
|
<a name="l00056"></a>00056 <span class="comment"> * traverse the list. New elements can be added to the list before</span>
|
|
<a name="l00057"></a>00057 <span class="comment"> * or after an existing element or at the head of the list. A list</span>
|
|
<a name="l00058"></a>00058 <span class="comment"> * may only be traversed in the forward direction.</span>
|
|
<a name="l00059"></a>00059 <span class="comment"> *</span>
|
|
<a name="l00060"></a>00060 <span class="comment"> * A simple queue is headed by a pair of pointers, one the head of the</span>
|
|
<a name="l00061"></a>00061 <span class="comment"> * list and the other to the tail of the list. The elements are singly</span>
|
|
<a name="l00062"></a>00062 <span class="comment"> * linked to save space, so elements can only be removed from the</span>
|
|
<a name="l00063"></a>00063 <span class="comment"> * head of the list. New elements can be added to the list before or after</span>
|
|
<a name="l00064"></a>00064 <span class="comment"> * an existing element, at the head of the list, or at the end of the</span>
|
|
<a name="l00065"></a>00065 <span class="comment"> * list. A simple queue may only be traversed in the forward direction.</span>
|
|
<a name="l00066"></a>00066 <span class="comment"> *</span>
|
|
<a name="l00067"></a>00067 <span class="comment"> * A tail queue is headed by a pair of pointers, one to the head of the</span>
|
|
<a name="l00068"></a>00068 <span class="comment"> * list and the other to the tail of the list. The elements are doubly</span>
|
|
<a name="l00069"></a>00069 <span class="comment"> * linked so that an arbitrary element can be removed without a need to</span>
|
|
<a name="l00070"></a>00070 <span class="comment"> * traverse the list. New elements can be added to the list before or</span>
|
|
<a name="l00071"></a>00071 <span class="comment"> * after an existing element, at the head of the list, or at the end of</span>
|
|
<a name="l00072"></a>00072 <span class="comment"> * the list. A tail queue may be traversed in either direction.</span>
|
|
<a name="l00073"></a>00073 <span class="comment"> *</span>
|
|
<a name="l00074"></a>00074 <span class="comment"> * A circle queue is headed by a pair of pointers, one to the head of the</span>
|
|
<a name="l00075"></a>00075 <span class="comment"> * list and the other to the tail of the list. The elements are doubly</span>
|
|
<a name="l00076"></a>00076 <span class="comment"> * linked so that an arbitrary element can be removed without a need to</span>
|
|
<a name="l00077"></a>00077 <span class="comment"> * traverse the list. New elements can be added to the list before or after</span>
|
|
<a name="l00078"></a>00078 <span class="comment"> * an existing element, at the head of the list, or at the end of the list.</span>
|
|
<a name="l00079"></a>00079 <span class="comment"> * A circle queue may be traversed in either direction, but has a more</span>
|
|
<a name="l00080"></a>00080 <span class="comment"> * complex end of list detection.</span>
|
|
<a name="l00081"></a>00081 <span class="comment"> *</span>
|
|
<a name="l00082"></a>00082 <span class="comment"> * For details on the use of these macros, see the queue(3) manual page.</span>
|
|
<a name="l00083"></a>00083 <span class="comment"> */</span>
|
|
<a name="l00084"></a>00084
|
|
<a name="l00085"></a>00085 <span class="comment">/*</span>
|
|
<a name="l00086"></a>00086 <span class="comment"> * Singly-linked List definitions.</span>
|
|
<a name="l00087"></a>00087 <span class="comment"> */</span>
|
|
<a name="l00088"></a>00088 <span class="preprocessor">#define SLIST_HEAD(name, type) \</span>
|
|
<a name="l00089"></a>00089 <span class="preprocessor">struct name { \</span>
|
|
<a name="l00090"></a>00090 <span class="preprocessor"> struct type *slh_first; </span><span class="comment">/* first element */</span> \
|
|
<a name="l00091"></a>00091 }
|
|
<a name="l00092"></a>00092
|
|
<a name="l00093"></a>00093 <span class="preprocessor">#define SLIST_HEAD_INITIALIZER(head) \</span>
|
|
<a name="l00094"></a>00094 <span class="preprocessor"> { NULL }</span>
|
|
<a name="l00095"></a>00095 <span class="preprocessor"></span>
|
|
<a name="l00096"></a>00096 <span class="preprocessor">#define SLIST_ENTRY(type) \</span>
|
|
<a name="l00097"></a>00097 <span class="preprocessor">struct { \</span>
|
|
<a name="l00098"></a>00098 <span class="preprocessor"> struct type *sle_next; </span><span class="comment">/* next element */</span> \
|
|
<a name="l00099"></a>00099 }
|
|
<a name="l00100"></a>00100
|
|
<a name="l00101"></a>00101 <span class="comment">/*</span>
|
|
<a name="l00102"></a>00102 <span class="comment"> * Singly-linked List access methods.</span>
|
|
<a name="l00103"></a>00103 <span class="comment"> */</span>
|
|
<a name="l00104"></a>00104 <span class="preprocessor">#define SLIST_FIRST(head) ((head)->slh_first)</span>
|
|
<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#define SLIST_END(head) NULL</span>
|
|
<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor">#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))</span>
|
|
<a name="l00107"></a>00107 <span class="preprocessor"></span><span class="preprocessor">#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)</span>
|
|
<a name="l00108"></a>00108 <span class="preprocessor"></span>
|
|
<a name="l00109"></a>00109 <span class="preprocessor">#define SLIST_FOREACH(var, head, field) \</span>
|
|
<a name="l00110"></a>00110 <span class="preprocessor"> for((var) = SLIST_FIRST(head); \</span>
|
|
<a name="l00111"></a>00111 <span class="preprocessor"> (var) != SLIST_END(head); \</span>
|
|
<a name="l00112"></a>00112 <span class="preprocessor"> (var) = SLIST_NEXT(var, field))</span>
|
|
<a name="l00113"></a>00113 <span class="preprocessor"></span>
|
|
<a name="l00114"></a>00114 <span class="preprocessor">#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \</span>
|
|
<a name="l00115"></a>00115 <span class="preprocessor"> for ((varp) = &SLIST_FIRST((head)); \</span>
|
|
<a name="l00116"></a>00116 <span class="preprocessor"> ((var) = *(varp)) != SLIST_END(head); \</span>
|
|
<a name="l00117"></a>00117 <span class="preprocessor"> (varp) = &SLIST_NEXT((var), field))</span>
|
|
<a name="l00118"></a>00118 <span class="preprocessor"></span>
|
|
<a name="l00119"></a>00119 <span class="comment">/*</span>
|
|
<a name="l00120"></a>00120 <span class="comment"> * Singly-linked List functions.</span>
|
|
<a name="l00121"></a>00121 <span class="comment"> */</span>
|
|
<a name="l00122"></a>00122 <span class="preprocessor">#define SLIST_INIT(head) { \</span>
|
|
<a name="l00123"></a>00123 <span class="preprocessor"> SLIST_FIRST(head) = SLIST_END(head); \</span>
|
|
<a name="l00124"></a>00124 <span class="preprocessor">}</span>
|
|
<a name="l00125"></a>00125 <span class="preprocessor"></span>
|
|
<a name="l00126"></a>00126 <span class="preprocessor">#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \</span>
|
|
<a name="l00127"></a>00127 <span class="preprocessor"> (elm)->field.sle_next = (slistelm)->field.sle_next; \</span>
|
|
<a name="l00128"></a>00128 <span class="preprocessor"> (slistelm)->field.sle_next = (elm); \</span>
|
|
<a name="l00129"></a>00129 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00130"></a>00130 <span class="preprocessor"></span>
|
|
<a name="l00131"></a>00131 <span class="preprocessor">#define SLIST_INSERT_HEAD(head, elm, field) do { \</span>
|
|
<a name="l00132"></a>00132 <span class="preprocessor"> (elm)->field.sle_next = (head)->slh_first; \</span>
|
|
<a name="l00133"></a>00133 <span class="preprocessor"> (head)->slh_first = (elm); \</span>
|
|
<a name="l00134"></a>00134 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00135"></a>00135 <span class="preprocessor"></span>
|
|
<a name="l00136"></a>00136 <span class="preprocessor">#define SLIST_REMOVE_NEXT(head, elm, field) do { \</span>
|
|
<a name="l00137"></a>00137 <span class="preprocessor"> (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \</span>
|
|
<a name="l00138"></a>00138 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00139"></a>00139 <span class="preprocessor"></span>
|
|
<a name="l00140"></a>00140 <span class="preprocessor">#define SLIST_REMOVE_HEAD(head, field) do { \</span>
|
|
<a name="l00141"></a>00141 <span class="preprocessor"> (head)->slh_first = (head)->slh_first->field.sle_next; \</span>
|
|
<a name="l00142"></a>00142 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00143"></a>00143 <span class="preprocessor"></span>
|
|
<a name="l00144"></a>00144 <span class="preprocessor">#define SLIST_REMOVE(head, elm, type, field) do { \</span>
|
|
<a name="l00145"></a>00145 <span class="preprocessor"> if ((head)->slh_first == (elm)) { \</span>
|
|
<a name="l00146"></a>00146 <span class="preprocessor"> SLIST_REMOVE_HEAD((head), field); \</span>
|
|
<a name="l00147"></a>00147 <span class="preprocessor"> } \</span>
|
|
<a name="l00148"></a>00148 <span class="preprocessor"> else { \</span>
|
|
<a name="l00149"></a>00149 <span class="preprocessor"> struct type *curelm = (head)->slh_first; \</span>
|
|
<a name="l00150"></a>00150 <span class="preprocessor"> while( curelm->field.sle_next != (elm) ) \</span>
|
|
<a name="l00151"></a>00151 <span class="preprocessor"> curelm = curelm->field.sle_next; \</span>
|
|
<a name="l00152"></a>00152 <span class="preprocessor"> curelm->field.sle_next = \</span>
|
|
<a name="l00153"></a>00153 <span class="preprocessor"> curelm->field.sle_next->field.sle_next; \</span>
|
|
<a name="l00154"></a>00154 <span class="preprocessor"> } \</span>
|
|
<a name="l00155"></a>00155 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00156"></a>00156 <span class="preprocessor"></span>
|
|
<a name="l00157"></a>00157 <span class="comment">/*</span>
|
|
<a name="l00158"></a>00158 <span class="comment"> * List definitions.</span>
|
|
<a name="l00159"></a>00159 <span class="comment"> */</span>
|
|
<a name="l00160"></a>00160 <span class="preprocessor">#define LIST_HEAD(name, type) \</span>
|
|
<a name="l00161"></a>00161 <span class="preprocessor">struct name { \</span>
|
|
<a name="l00162"></a>00162 <span class="preprocessor"> struct type *lh_first; </span><span class="comment">/* first element */</span> \
|
|
<a name="l00163"></a>00163 }
|
|
<a name="l00164"></a>00164
|
|
<a name="l00165"></a>00165 <span class="preprocessor">#define LIST_HEAD_INITIALIZER(head) \</span>
|
|
<a name="l00166"></a>00166 <span class="preprocessor"> { NULL }</span>
|
|
<a name="l00167"></a>00167 <span class="preprocessor"></span>
|
|
<a name="l00168"></a>00168 <span class="preprocessor">#define LIST_ENTRY(type) \</span>
|
|
<a name="l00169"></a>00169 <span class="preprocessor">struct { \</span>
|
|
<a name="l00170"></a>00170 <span class="preprocessor"> struct type *le_next; </span><span class="comment">/* next element */</span> \
|
|
<a name="l00171"></a>00171 struct type **le_prev; <span class="comment">/* address of previous next element */</span> \
|
|
<a name="l00172"></a>00172 }
|
|
<a name="l00173"></a>00173
|
|
<a name="l00174"></a>00174 <span class="comment">/*</span>
|
|
<a name="l00175"></a>00175 <span class="comment"> * List access methods</span>
|
|
<a name="l00176"></a>00176 <span class="comment"> */</span>
|
|
<a name="l00177"></a>00177 <span class="preprocessor">#define LIST_FIRST(head) ((head)->lh_first)</span>
|
|
<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">#define LIST_END(head) NULL</span>
|
|
<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">#define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))</span>
|
|
<a name="l00180"></a>00180 <span class="preprocessor"></span><span class="preprocessor">#define LIST_NEXT(elm, field) ((elm)->field.le_next)</span>
|
|
<a name="l00181"></a>00181 <span class="preprocessor"></span>
|
|
<a name="l00182"></a>00182 <span class="preprocessor">#define LIST_FOREACH(var, head, field) \</span>
|
|
<a name="l00183"></a>00183 <span class="preprocessor"> for((var) = LIST_FIRST(head); \</span>
|
|
<a name="l00184"></a>00184 <span class="preprocessor"> (var)!= LIST_END(head); \</span>
|
|
<a name="l00185"></a>00185 <span class="preprocessor"> (var) = LIST_NEXT(var, field))</span>
|
|
<a name="l00186"></a>00186 <span class="preprocessor"></span>
|
|
<a name="l00187"></a>00187 <span class="comment">/*</span>
|
|
<a name="l00188"></a>00188 <span class="comment"> * List functions.</span>
|
|
<a name="l00189"></a>00189 <span class="comment"> */</span>
|
|
<a name="l00190"></a>00190 <span class="preprocessor">#define LIST_INIT(head) do { \</span>
|
|
<a name="l00191"></a>00191 <span class="preprocessor"> LIST_FIRST(head) = LIST_END(head); \</span>
|
|
<a name="l00192"></a>00192 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00193"></a>00193 <span class="preprocessor"></span>
|
|
<a name="l00194"></a>00194 <span class="preprocessor">#define LIST_INSERT_AFTER(listelm, elm, field) do { \</span>
|
|
<a name="l00195"></a>00195 <span class="preprocessor"> if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \</span>
|
|
<a name="l00196"></a>00196 <span class="preprocessor"> (listelm)->field.le_next->field.le_prev = \</span>
|
|
<a name="l00197"></a>00197 <span class="preprocessor"> &(elm)->field.le_next; \</span>
|
|
<a name="l00198"></a>00198 <span class="preprocessor"> (listelm)->field.le_next = (elm); \</span>
|
|
<a name="l00199"></a>00199 <span class="preprocessor"> (elm)->field.le_prev = &(listelm)->field.le_next; \</span>
|
|
<a name="l00200"></a>00200 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00201"></a>00201 <span class="preprocessor"></span>
|
|
<a name="l00202"></a>00202 <span class="preprocessor">#define LIST_INSERT_BEFORE(listelm, elm, field) do { \</span>
|
|
<a name="l00203"></a>00203 <span class="preprocessor"> (elm)->field.le_prev = (listelm)->field.le_prev; \</span>
|
|
<a name="l00204"></a>00204 <span class="preprocessor"> (elm)->field.le_next = (listelm); \</span>
|
|
<a name="l00205"></a>00205 <span class="preprocessor"> *(listelm)->field.le_prev = (elm); \</span>
|
|
<a name="l00206"></a>00206 <span class="preprocessor"> (listelm)->field.le_prev = &(elm)->field.le_next; \</span>
|
|
<a name="l00207"></a>00207 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00208"></a>00208 <span class="preprocessor"></span>
|
|
<a name="l00209"></a>00209 <span class="preprocessor">#define LIST_INSERT_HEAD(head, elm, field) do { \</span>
|
|
<a name="l00210"></a>00210 <span class="preprocessor"> if (((elm)->field.le_next = (head)->lh_first) != NULL) \</span>
|
|
<a name="l00211"></a>00211 <span class="preprocessor"> (head)->lh_first->field.le_prev = &(elm)->field.le_next;\</span>
|
|
<a name="l00212"></a>00212 <span class="preprocessor"> (head)->lh_first = (elm); \</span>
|
|
<a name="l00213"></a>00213 <span class="preprocessor"> (elm)->field.le_prev = &(head)->lh_first; \</span>
|
|
<a name="l00214"></a>00214 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00215"></a>00215 <span class="preprocessor"></span>
|
|
<a name="l00216"></a>00216 <span class="preprocessor">#define LIST_REMOVE(elm, field) do { \</span>
|
|
<a name="l00217"></a>00217 <span class="preprocessor"> if ((elm)->field.le_next != NULL) \</span>
|
|
<a name="l00218"></a>00218 <span class="preprocessor"> (elm)->field.le_next->field.le_prev = \</span>
|
|
<a name="l00219"></a>00219 <span class="preprocessor"> (elm)->field.le_prev; \</span>
|
|
<a name="l00220"></a>00220 <span class="preprocessor"> *(elm)->field.le_prev = (elm)->field.le_next; \</span>
|
|
<a name="l00221"></a>00221 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00222"></a>00222 <span class="preprocessor"></span>
|
|
<a name="l00223"></a>00223 <span class="preprocessor">#define LIST_REPLACE(elm, elm2, field) do { \</span>
|
|
<a name="l00224"></a>00224 <span class="preprocessor"> if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \</span>
|
|
<a name="l00225"></a>00225 <span class="preprocessor"> (elm2)->field.le_next->field.le_prev = \</span>
|
|
<a name="l00226"></a>00226 <span class="preprocessor"> &(elm2)->field.le_next; \</span>
|
|
<a name="l00227"></a>00227 <span class="preprocessor"> (elm2)->field.le_prev = (elm)->field.le_prev; \</span>
|
|
<a name="l00228"></a>00228 <span class="preprocessor"> *(elm2)->field.le_prev = (elm2); \</span>
|
|
<a name="l00229"></a>00229 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00230"></a>00230 <span class="preprocessor"></span>
|
|
<a name="l00231"></a>00231 <span class="comment">/*</span>
|
|
<a name="l00232"></a>00232 <span class="comment"> * Simple queue definitions.</span>
|
|
<a name="l00233"></a>00233 <span class="comment"> */</span>
|
|
<a name="l00234"></a>00234 <span class="preprocessor">#define SIMPLEQ_HEAD(name, type) \</span>
|
|
<a name="l00235"></a>00235 <span class="preprocessor">struct name { \</span>
|
|
<a name="l00236"></a>00236 <span class="preprocessor"> struct type *sqh_first; </span><span class="comment">/* first element */</span> \
|
|
<a name="l00237"></a>00237 struct type **sqh_last; <span class="comment">/* addr of last next element */</span> \
|
|
<a name="l00238"></a>00238 }
|
|
<a name="l00239"></a>00239
|
|
<a name="l00240"></a>00240 <span class="preprocessor">#define SIMPLEQ_HEAD_INITIALIZER(head) \</span>
|
|
<a name="l00241"></a>00241 <span class="preprocessor"> { NULL, &(head).sqh_first }</span>
|
|
<a name="l00242"></a>00242 <span class="preprocessor"></span>
|
|
<a name="l00243"></a>00243 <span class="preprocessor">#define SIMPLEQ_ENTRY(type) \</span>
|
|
<a name="l00244"></a>00244 <span class="preprocessor">struct { \</span>
|
|
<a name="l00245"></a>00245 <span class="preprocessor"> struct type *sqe_next; </span><span class="comment">/* next element */</span> \
|
|
<a name="l00246"></a>00246 }
|
|
<a name="l00247"></a>00247
|
|
<a name="l00248"></a>00248 <span class="comment">/*</span>
|
|
<a name="l00249"></a>00249 <span class="comment"> * Simple queue access methods.</span>
|
|
<a name="l00250"></a>00250 <span class="comment"> */</span>
|
|
<a name="l00251"></a>00251 <span class="preprocessor">#define SIMPLEQ_FIRST(head) ((head)->sqh_first)</span>
|
|
<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor">#define SIMPLEQ_END(head) NULL</span>
|
|
<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))</span>
|
|
<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor">#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)</span>
|
|
<a name="l00255"></a>00255 <span class="preprocessor"></span>
|
|
<a name="l00256"></a>00256 <span class="preprocessor">#define SIMPLEQ_FOREACH(var, head, field) \</span>
|
|
<a name="l00257"></a>00257 <span class="preprocessor"> for((var) = SIMPLEQ_FIRST(head); \</span>
|
|
<a name="l00258"></a>00258 <span class="preprocessor"> (var) != SIMPLEQ_END(head); \</span>
|
|
<a name="l00259"></a>00259 <span class="preprocessor"> (var) = SIMPLEQ_NEXT(var, field))</span>
|
|
<a name="l00260"></a>00260 <span class="preprocessor"></span>
|
|
<a name="l00261"></a>00261 <span class="comment">/*</span>
|
|
<a name="l00262"></a>00262 <span class="comment"> * Simple queue functions.</span>
|
|
<a name="l00263"></a>00263 <span class="comment"> */</span>
|
|
<a name="l00264"></a>00264 <span class="preprocessor">#define SIMPLEQ_INIT(head) do { \</span>
|
|
<a name="l00265"></a>00265 <span class="preprocessor"> (head)->sqh_first = NULL; \</span>
|
|
<a name="l00266"></a>00266 <span class="preprocessor"> (head)->sqh_last = &(head)->sqh_first; \</span>
|
|
<a name="l00267"></a>00267 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00268"></a>00268 <span class="preprocessor"></span>
|
|
<a name="l00269"></a>00269 <span class="preprocessor">#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \</span>
|
|
<a name="l00270"></a>00270 <span class="preprocessor"> if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \</span>
|
|
<a name="l00271"></a>00271 <span class="preprocessor"> (head)->sqh_last = &(elm)->field.sqe_next; \</span>
|
|
<a name="l00272"></a>00272 <span class="preprocessor"> (head)->sqh_first = (elm); \</span>
|
|
<a name="l00273"></a>00273 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00274"></a>00274 <span class="preprocessor"></span>
|
|
<a name="l00275"></a>00275 <span class="preprocessor">#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \</span>
|
|
<a name="l00276"></a>00276 <span class="preprocessor"> (elm)->field.sqe_next = NULL; \</span>
|
|
<a name="l00277"></a>00277 <span class="preprocessor"> *(head)->sqh_last = (elm); \</span>
|
|
<a name="l00278"></a>00278 <span class="preprocessor"> (head)->sqh_last = &(elm)->field.sqe_next; \</span>
|
|
<a name="l00279"></a>00279 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00280"></a>00280 <span class="preprocessor"></span>
|
|
<a name="l00281"></a>00281 <span class="preprocessor">#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \</span>
|
|
<a name="l00282"></a>00282 <span class="preprocessor"> if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\</span>
|
|
<a name="l00283"></a>00283 <span class="preprocessor"> (head)->sqh_last = &(elm)->field.sqe_next; \</span>
|
|
<a name="l00284"></a>00284 <span class="preprocessor"> (listelm)->field.sqe_next = (elm); \</span>
|
|
<a name="l00285"></a>00285 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00286"></a>00286 <span class="preprocessor"></span>
|
|
<a name="l00287"></a>00287 <span class="preprocessor">#define SIMPLEQ_REMOVE_HEAD(head, elm, field) do { \</span>
|
|
<a name="l00288"></a>00288 <span class="preprocessor"> if (((head)->sqh_first = (elm)->field.sqe_next) == NULL) \</span>
|
|
<a name="l00289"></a>00289 <span class="preprocessor"> (head)->sqh_last = &(head)->sqh_first; \</span>
|
|
<a name="l00290"></a>00290 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00291"></a>00291 <span class="preprocessor"></span>
|
|
<a name="l00292"></a>00292 <span class="comment">/*</span>
|
|
<a name="l00293"></a>00293 <span class="comment"> * Tail queue definitions.</span>
|
|
<a name="l00294"></a>00294 <span class="comment"> */</span>
|
|
<a name="l00295"></a>00295 <span class="preprocessor">#define TAILQ_HEAD(name, type) \</span>
|
|
<a name="l00296"></a>00296 <span class="preprocessor">struct name { \</span>
|
|
<a name="l00297"></a>00297 <span class="preprocessor"> struct type *tqh_first; </span><span class="comment">/* first element */</span> \
|
|
<a name="l00298"></a>00298 struct type **tqh_last; <span class="comment">/* addr of last next element */</span> \
|
|
<a name="l00299"></a>00299 }
|
|
<a name="l00300"></a>00300
|
|
<a name="l00301"></a>00301 <span class="preprocessor">#define TAILQ_HEAD_INITIALIZER(head) \</span>
|
|
<a name="l00302"></a>00302 <span class="preprocessor"> { NULL, &(head).tqh_first }</span>
|
|
<a name="l00303"></a>00303 <span class="preprocessor"></span>
|
|
<a name="l00304"></a>00304 <span class="preprocessor">#define TAILQ_ENTRY(type) \</span>
|
|
<a name="l00305"></a>00305 <span class="preprocessor">struct { \</span>
|
|
<a name="l00306"></a>00306 <span class="preprocessor"> struct type *tqe_next; </span><span class="comment">/* next element */</span> \
|
|
<a name="l00307"></a>00307 struct type **tqe_prev; <span class="comment">/* address of previous next element */</span> \
|
|
<a name="l00308"></a>00308 }
|
|
<a name="l00309"></a>00309
|
|
<a name="l00310"></a>00310 <span class="comment">/* </span>
|
|
<a name="l00311"></a>00311 <span class="comment"> * tail queue access methods </span>
|
|
<a name="l00312"></a>00312 <span class="comment"> */</span>
|
|
<a name="l00313"></a>00313 <span class="preprocessor">#define TAILQ_FIRST(head) ((head)->tqh_first)</span>
|
|
<a name="l00314"></a>00314 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_END(head) NULL</span>
|
|
<a name="l00315"></a>00315 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)</span>
|
|
<a name="l00316"></a>00316 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_LAST(head, headname) \</span>
|
|
<a name="l00317"></a>00317 <span class="preprocessor"> (*(((struct headname *)((head)->tqh_last))->tqh_last))</span>
|
|
<a name="l00318"></a>00318 <span class="preprocessor"></span><span class="comment">/* XXX */</span>
|
|
<a name="l00319"></a>00319 <span class="preprocessor">#define TAILQ_PREV(elm, headname, field) \</span>
|
|
<a name="l00320"></a>00320 <span class="preprocessor"> (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))</span>
|
|
<a name="l00321"></a>00321 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_EMPTY(head) \</span>
|
|
<a name="l00322"></a>00322 <span class="preprocessor"> (TAILQ_FIRST(head) == TAILQ_END(head))</span>
|
|
<a name="l00323"></a>00323 <span class="preprocessor"></span>
|
|
<a name="l00324"></a>00324 <span class="preprocessor">#define TAILQ_FOREACH(var, head, field) \</span>
|
|
<a name="l00325"></a>00325 <span class="preprocessor"> for((var) = TAILQ_FIRST(head); \</span>
|
|
<a name="l00326"></a>00326 <span class="preprocessor"> (var) != TAILQ_END(head); \</span>
|
|
<a name="l00327"></a>00327 <span class="preprocessor"> (var) = TAILQ_NEXT(var, field))</span>
|
|
<a name="l00328"></a>00328 <span class="preprocessor"></span>
|
|
<a name="l00329"></a>00329 <span class="preprocessor">#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \</span>
|
|
<a name="l00330"></a>00330 <span class="preprocessor"> for((var) = TAILQ_LAST(head, headname); \</span>
|
|
<a name="l00331"></a>00331 <span class="preprocessor"> (var) != TAILQ_END(head); \</span>
|
|
<a name="l00332"></a>00332 <span class="preprocessor"> (var) = TAILQ_PREV(var, headname, field))</span>
|
|
<a name="l00333"></a>00333 <span class="preprocessor"></span>
|
|
<a name="l00334"></a>00334 <span class="comment">/*</span>
|
|
<a name="l00335"></a>00335 <span class="comment"> * Tail queue functions.</span>
|
|
<a name="l00336"></a>00336 <span class="comment"> */</span>
|
|
<a name="l00337"></a>00337 <span class="preprocessor">#define TAILQ_INIT(head) do { \</span>
|
|
<a name="l00338"></a>00338 <span class="preprocessor"> (head)->tqh_first = NULL; \</span>
|
|
<a name="l00339"></a>00339 <span class="preprocessor"> (head)->tqh_last = &(head)->tqh_first; \</span>
|
|
<a name="l00340"></a>00340 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00341"></a>00341 <span class="preprocessor"></span>
|
|
<a name="l00342"></a>00342 <span class="preprocessor">#define TAILQ_INSERT_HEAD(head, elm, field) do { \</span>
|
|
<a name="l00343"></a>00343 <span class="preprocessor"> if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \</span>
|
|
<a name="l00344"></a>00344 <span class="preprocessor"> (head)->tqh_first->field.tqe_prev = \</span>
|
|
<a name="l00345"></a>00345 <span class="preprocessor"> &(elm)->field.tqe_next; \</span>
|
|
<a name="l00346"></a>00346 <span class="preprocessor"> else \</span>
|
|
<a name="l00347"></a>00347 <span class="preprocessor"> (head)->tqh_last = &(elm)->field.tqe_next; \</span>
|
|
<a name="l00348"></a>00348 <span class="preprocessor"> (head)->tqh_first = (elm); \</span>
|
|
<a name="l00349"></a>00349 <span class="preprocessor"> (elm)->field.tqe_prev = &(head)->tqh_first; \</span>
|
|
<a name="l00350"></a>00350 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00351"></a>00351 <span class="preprocessor"></span>
|
|
<a name="l00352"></a>00352 <span class="preprocessor">#define TAILQ_INSERT_TAIL(head, elm, field) do { \</span>
|
|
<a name="l00353"></a>00353 <span class="preprocessor"> (elm)->field.tqe_next = NULL; \</span>
|
|
<a name="l00354"></a>00354 <span class="preprocessor"> (elm)->field.tqe_prev = (head)->tqh_last; \</span>
|
|
<a name="l00355"></a>00355 <span class="preprocessor"> *(head)->tqh_last = (elm); \</span>
|
|
<a name="l00356"></a>00356 <span class="preprocessor"> (head)->tqh_last = &(elm)->field.tqe_next; \</span>
|
|
<a name="l00357"></a>00357 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00358"></a>00358 <span class="preprocessor"></span>
|
|
<a name="l00359"></a>00359 <span class="preprocessor">#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \</span>
|
|
<a name="l00360"></a>00360 <span class="preprocessor"> if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\</span>
|
|
<a name="l00361"></a>00361 <span class="preprocessor"> (elm)->field.tqe_next->field.tqe_prev = \</span>
|
|
<a name="l00362"></a>00362 <span class="preprocessor"> &(elm)->field.tqe_next; \</span>
|
|
<a name="l00363"></a>00363 <span class="preprocessor"> else \</span>
|
|
<a name="l00364"></a>00364 <span class="preprocessor"> (head)->tqh_last = &(elm)->field.tqe_next; \</span>
|
|
<a name="l00365"></a>00365 <span class="preprocessor"> (listelm)->field.tqe_next = (elm); \</span>
|
|
<a name="l00366"></a>00366 <span class="preprocessor"> (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \</span>
|
|
<a name="l00367"></a>00367 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00368"></a>00368 <span class="preprocessor"></span>
|
|
<a name="l00369"></a>00369 <span class="preprocessor">#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \</span>
|
|
<a name="l00370"></a>00370 <span class="preprocessor"> (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \</span>
|
|
<a name="l00371"></a>00371 <span class="preprocessor"> (elm)->field.tqe_next = (listelm); \</span>
|
|
<a name="l00372"></a>00372 <span class="preprocessor"> *(listelm)->field.tqe_prev = (elm); \</span>
|
|
<a name="l00373"></a>00373 <span class="preprocessor"> (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \</span>
|
|
<a name="l00374"></a>00374 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00375"></a>00375 <span class="preprocessor"></span>
|
|
<a name="l00376"></a>00376 <span class="preprocessor">#define TAILQ_REMOVE(head, elm, field) do { \</span>
|
|
<a name="l00377"></a>00377 <span class="preprocessor"> if (((elm)->field.tqe_next) != NULL) \</span>
|
|
<a name="l00378"></a>00378 <span class="preprocessor"> (elm)->field.tqe_next->field.tqe_prev = \</span>
|
|
<a name="l00379"></a>00379 <span class="preprocessor"> (elm)->field.tqe_prev; \</span>
|
|
<a name="l00380"></a>00380 <span class="preprocessor"> else \</span>
|
|
<a name="l00381"></a>00381 <span class="preprocessor"> (head)->tqh_last = (elm)->field.tqe_prev; \</span>
|
|
<a name="l00382"></a>00382 <span class="preprocessor"> *(elm)->field.tqe_prev = (elm)->field.tqe_next; \</span>
|
|
<a name="l00383"></a>00383 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00384"></a>00384 <span class="preprocessor"></span>
|
|
<a name="l00385"></a>00385 <span class="preprocessor">#define TAILQ_REPLACE(head, elm, elm2, field) do { \</span>
|
|
<a name="l00386"></a>00386 <span class="preprocessor"> if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \</span>
|
|
<a name="l00387"></a>00387 <span class="preprocessor"> (elm2)->field.tqe_next->field.tqe_prev = \</span>
|
|
<a name="l00388"></a>00388 <span class="preprocessor"> &(elm2)->field.tqe_next; \</span>
|
|
<a name="l00389"></a>00389 <span class="preprocessor"> else \</span>
|
|
<a name="l00390"></a>00390 <span class="preprocessor"> (head)->tqh_last = &(elm2)->field.tqe_next; \</span>
|
|
<a name="l00391"></a>00391 <span class="preprocessor"> (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \</span>
|
|
<a name="l00392"></a>00392 <span class="preprocessor"> *(elm2)->field.tqe_prev = (elm2); \</span>
|
|
<a name="l00393"></a>00393 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00394"></a>00394 <span class="preprocessor"></span>
|
|
<a name="l00395"></a>00395 <span class="comment">/*</span>
|
|
<a name="l00396"></a>00396 <span class="comment"> * Circular queue definitions.</span>
|
|
<a name="l00397"></a>00397 <span class="comment"> */</span>
|
|
<a name="l00398"></a>00398 <span class="preprocessor">#define CIRCLEQ_HEAD(name, type) \</span>
|
|
<a name="l00399"></a>00399 <span class="preprocessor">struct name { \</span>
|
|
<a name="l00400"></a>00400 <span class="preprocessor"> struct type *cqh_first; </span><span class="comment">/* first element */</span> \
|
|
<a name="l00401"></a>00401 struct type *cqh_last; <span class="comment">/* last element */</span> \
|
|
<a name="l00402"></a>00402 }
|
|
<a name="l00403"></a>00403
|
|
<a name="l00404"></a>00404 <span class="preprocessor">#define CIRCLEQ_HEAD_INITIALIZER(head) \</span>
|
|
<a name="l00405"></a>00405 <span class="preprocessor"> { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }</span>
|
|
<a name="l00406"></a>00406 <span class="preprocessor"></span>
|
|
<a name="l00407"></a>00407 <span class="preprocessor">#define CIRCLEQ_ENTRY(type) \</span>
|
|
<a name="l00408"></a>00408 <span class="preprocessor">struct { \</span>
|
|
<a name="l00409"></a>00409 <span class="preprocessor"> struct type *cqe_next; </span><span class="comment">/* next element */</span> \
|
|
<a name="l00410"></a>00410 struct type *cqe_prev; <span class="comment">/* previous element */</span> \
|
|
<a name="l00411"></a>00411 }
|
|
<a name="l00412"></a>00412
|
|
<a name="l00413"></a>00413 <span class="comment">/*</span>
|
|
<a name="l00414"></a>00414 <span class="comment"> * Circular queue access methods </span>
|
|
<a name="l00415"></a>00415 <span class="comment"> */</span>
|
|
<a name="l00416"></a>00416 <span class="preprocessor">#define CIRCLEQ_FIRST(head) ((head)->cqh_first)</span>
|
|
<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#define CIRCLEQ_LAST(head) ((head)->cqh_last)</span>
|
|
<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#define CIRCLEQ_END(head) ((void *)(head))</span>
|
|
<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)</span>
|
|
<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)</span>
|
|
<a name="l00421"></a>00421 <span class="preprocessor"></span><span class="preprocessor">#define CIRCLEQ_EMPTY(head) \</span>
|
|
<a name="l00422"></a>00422 <span class="preprocessor"> (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))</span>
|
|
<a name="l00423"></a>00423 <span class="preprocessor"></span>
|
|
<a name="l00424"></a>00424 <span class="preprocessor">#define CIRCLEQ_FOREACH(var, head, field) \</span>
|
|
<a name="l00425"></a>00425 <span class="preprocessor"> for((var) = CIRCLEQ_FIRST(head); \</span>
|
|
<a name="l00426"></a>00426 <span class="preprocessor"> (var) != CIRCLEQ_END(head); \</span>
|
|
<a name="l00427"></a>00427 <span class="preprocessor"> (var) = CIRCLEQ_NEXT(var, field))</span>
|
|
<a name="l00428"></a>00428 <span class="preprocessor"></span>
|
|
<a name="l00429"></a>00429 <span class="preprocessor">#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \</span>
|
|
<a name="l00430"></a>00430 <span class="preprocessor"> for((var) = CIRCLEQ_LAST(head); \</span>
|
|
<a name="l00431"></a>00431 <span class="preprocessor"> (var) != CIRCLEQ_END(head); \</span>
|
|
<a name="l00432"></a>00432 <span class="preprocessor"> (var) = CIRCLEQ_PREV(var, field))</span>
|
|
<a name="l00433"></a>00433 <span class="preprocessor"></span>
|
|
<a name="l00434"></a>00434 <span class="comment">/*</span>
|
|
<a name="l00435"></a>00435 <span class="comment"> * Circular queue functions.</span>
|
|
<a name="l00436"></a>00436 <span class="comment"> */</span>
|
|
<a name="l00437"></a>00437 <span class="preprocessor">#define CIRCLEQ_INIT(head) do { \</span>
|
|
<a name="l00438"></a>00438 <span class="preprocessor"> (head)->cqh_first = CIRCLEQ_END(head); \</span>
|
|
<a name="l00439"></a>00439 <span class="preprocessor"> (head)->cqh_last = CIRCLEQ_END(head); \</span>
|
|
<a name="l00440"></a>00440 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00441"></a>00441 <span class="preprocessor"></span>
|
|
<a name="l00442"></a>00442 <span class="preprocessor">#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \</span>
|
|
<a name="l00443"></a>00443 <span class="preprocessor"> (elm)->field.cqe_next = (listelm)->field.cqe_next; \</span>
|
|
<a name="l00444"></a>00444 <span class="preprocessor"> (elm)->field.cqe_prev = (listelm); \</span>
|
|
<a name="l00445"></a>00445 <span class="preprocessor"> if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \</span>
|
|
<a name="l00446"></a>00446 <span class="preprocessor"> (head)->cqh_last = (elm); \</span>
|
|
<a name="l00447"></a>00447 <span class="preprocessor"> else \</span>
|
|
<a name="l00448"></a>00448 <span class="preprocessor"> (listelm)->field.cqe_next->field.cqe_prev = (elm); \</span>
|
|
<a name="l00449"></a>00449 <span class="preprocessor"> (listelm)->field.cqe_next = (elm); \</span>
|
|
<a name="l00450"></a>00450 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00451"></a>00451 <span class="preprocessor"></span>
|
|
<a name="l00452"></a>00452 <span class="preprocessor">#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \</span>
|
|
<a name="l00453"></a>00453 <span class="preprocessor"> (elm)->field.cqe_next = (listelm); \</span>
|
|
<a name="l00454"></a>00454 <span class="preprocessor"> (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \</span>
|
|
<a name="l00455"></a>00455 <span class="preprocessor"> if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \</span>
|
|
<a name="l00456"></a>00456 <span class="preprocessor"> (head)->cqh_first = (elm); \</span>
|
|
<a name="l00457"></a>00457 <span class="preprocessor"> else \</span>
|
|
<a name="l00458"></a>00458 <span class="preprocessor"> (listelm)->field.cqe_prev->field.cqe_next = (elm); \</span>
|
|
<a name="l00459"></a>00459 <span class="preprocessor"> (listelm)->field.cqe_prev = (elm); \</span>
|
|
<a name="l00460"></a>00460 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00461"></a>00461 <span class="preprocessor"></span>
|
|
<a name="l00462"></a>00462 <span class="preprocessor">#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \</span>
|
|
<a name="l00463"></a>00463 <span class="preprocessor"> (elm)->field.cqe_next = (head)->cqh_first; \</span>
|
|
<a name="l00464"></a>00464 <span class="preprocessor"> (elm)->field.cqe_prev = CIRCLEQ_END(head); \</span>
|
|
<a name="l00465"></a>00465 <span class="preprocessor"> if ((head)->cqh_last == CIRCLEQ_END(head)) \</span>
|
|
<a name="l00466"></a>00466 <span class="preprocessor"> (head)->cqh_last = (elm); \</span>
|
|
<a name="l00467"></a>00467 <span class="preprocessor"> else \</span>
|
|
<a name="l00468"></a>00468 <span class="preprocessor"> (head)->cqh_first->field.cqe_prev = (elm); \</span>
|
|
<a name="l00469"></a>00469 <span class="preprocessor"> (head)->cqh_first = (elm); \</span>
|
|
<a name="l00470"></a>00470 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00471"></a>00471 <span class="preprocessor"></span>
|
|
<a name="l00472"></a>00472 <span class="preprocessor">#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \</span>
|
|
<a name="l00473"></a>00473 <span class="preprocessor"> (elm)->field.cqe_next = CIRCLEQ_END(head); \</span>
|
|
<a name="l00474"></a>00474 <span class="preprocessor"> (elm)->field.cqe_prev = (head)->cqh_last; \</span>
|
|
<a name="l00475"></a>00475 <span class="preprocessor"> if ((head)->cqh_first == CIRCLEQ_END(head)) \</span>
|
|
<a name="l00476"></a>00476 <span class="preprocessor"> (head)->cqh_first = (elm); \</span>
|
|
<a name="l00477"></a>00477 <span class="preprocessor"> else \</span>
|
|
<a name="l00478"></a>00478 <span class="preprocessor"> (head)->cqh_last->field.cqe_next = (elm); \</span>
|
|
<a name="l00479"></a>00479 <span class="preprocessor"> (head)->cqh_last = (elm); \</span>
|
|
<a name="l00480"></a>00480 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00481"></a>00481 <span class="preprocessor"></span>
|
|
<a name="l00482"></a>00482 <span class="preprocessor">#define CIRCLEQ_REMOVE(head, elm, field) do { \</span>
|
|
<a name="l00483"></a>00483 <span class="preprocessor"> if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \</span>
|
|
<a name="l00484"></a>00484 <span class="preprocessor"> (head)->cqh_last = (elm)->field.cqe_prev; \</span>
|
|
<a name="l00485"></a>00485 <span class="preprocessor"> else \</span>
|
|
<a name="l00486"></a>00486 <span class="preprocessor"> (elm)->field.cqe_next->field.cqe_prev = \</span>
|
|
<a name="l00487"></a>00487 <span class="preprocessor"> (elm)->field.cqe_prev; \</span>
|
|
<a name="l00488"></a>00488 <span class="preprocessor"> if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \</span>
|
|
<a name="l00489"></a>00489 <span class="preprocessor"> (head)->cqh_first = (elm)->field.cqe_next; \</span>
|
|
<a name="l00490"></a>00490 <span class="preprocessor"> else \</span>
|
|
<a name="l00491"></a>00491 <span class="preprocessor"> (elm)->field.cqe_prev->field.cqe_next = \</span>
|
|
<a name="l00492"></a>00492 <span class="preprocessor"> (elm)->field.cqe_next; \</span>
|
|
<a name="l00493"></a>00493 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00494"></a>00494 <span class="preprocessor"></span>
|
|
<a name="l00495"></a>00495 <span class="preprocessor">#define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \</span>
|
|
<a name="l00496"></a>00496 <span class="preprocessor"> if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \</span>
|
|
<a name="l00497"></a>00497 <span class="preprocessor"> CIRCLEQ_END(head)) \</span>
|
|
<a name="l00498"></a>00498 <span class="preprocessor"> (head).cqh_last = (elm2); \</span>
|
|
<a name="l00499"></a>00499 <span class="preprocessor"> else \</span>
|
|
<a name="l00500"></a>00500 <span class="preprocessor"> (elm2)->field.cqe_next->field.cqe_prev = (elm2); \</span>
|
|
<a name="l00501"></a>00501 <span class="preprocessor"> if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \</span>
|
|
<a name="l00502"></a>00502 <span class="preprocessor"> CIRCLEQ_END(head)) \</span>
|
|
<a name="l00503"></a>00503 <span class="preprocessor"> (head).cqh_first = (elm2); \</span>
|
|
<a name="l00504"></a>00504 <span class="preprocessor"> else \</span>
|
|
<a name="l00505"></a>00505 <span class="preprocessor"> (elm2)->field.cqe_prev->field.cqe_next = (elm2); \</span>
|
|
<a name="l00506"></a>00506 <span class="preprocessor">} while (0)</span>
|
|
<a name="l00507"></a>00507 <span class="preprocessor"></span>
|
|
<a name="l00508"></a>00508 <span class="preprocessor">#endif </span><span class="comment">/* !_SYS_QUEUE_H_ */</span>
|
|
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Mar 29 17:59:08 2007 for MiniMIME by
|
|
<a href="http://www.doxygen.org/index.html">
|
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
|
|
</body>
|
|
</html>
|