1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
|
<!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>LibU: queue.h Source File</title>
<link href="kl.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.9.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a></div>
<div class="nav">
<a class="el" href="dir_000001.html">u</a></div>
<h1>queue.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/* $Id: queue.h,v 1.2 2005/12/04 20:41:15 tho Exp $ */</span>
00002 <span class="comment">/* $OpenBSD: queue.h,v 1.22 2001/06/23 04:39:35 angelos Exp $ */</span>
00003 <span class="comment">/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */</span>
00004
00005 <span class="preprocessor">#ifndef _U_QUEUE_H_</span>
00006 <span class="preprocessor"></span><span class="preprocessor">#define _U_QUEUE_H_</span>
00007 <span class="preprocessor"></span>
00008
00009 <span class="comment">/* A list is headed by a single forward pointer (or an array of forward</span>
00010 <span class="comment"> * pointers for a hash table header). The elements are doubly linked so that</span>
00011 <span class="comment"> * an arbitrary element can be removed without a need to traverse the list. </span>
00012 <span class="comment"> * New elements can be added to the list before or after an existing element </span>
00013 <span class="comment"> * or at the head of the list. A list may only be traversed in the forward </span>
00014 <span class="comment"> * direction. */</span>
00015
00016 <span class="preprocessor">#define LIST_HEAD(name, type) \</span>
00017 <span class="preprocessor">struct name { \</span>
00018 <span class="preprocessor"> struct type *lh_first; </span><span class="comment">/* first element */</span> \
00019 }
00020
00021 <span class="preprocessor">#define LIST_HEAD_INITIALIZER(head) \</span>
00022 <span class="preprocessor"> { NULL }</span>
00023 <span class="preprocessor"></span>
00024 <span class="preprocessor">#define LIST_ENTRY(type) \</span>
00025 <span class="preprocessor">struct { \</span>
00026 <span class="preprocessor"> struct type *le_next; </span><span class="comment">/* next element */</span> \
00027 struct type **le_prev; <span class="comment">/* address of previous next element */</span> \
00028 }
00029
00030 <span class="preprocessor">#define LIST_FIRST(head) ((head)->lh_first)</span>
00031 <span class="preprocessor"></span><span class="preprocessor">#define LIST_END(head) NULL</span>
00032 <span class="preprocessor"></span><span class="preprocessor">#define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))</span>
00033 <span class="preprocessor"></span><span class="preprocessor">#define LIST_NEXT(elm, field) ((elm)->field.le_next)</span>
00034 <span class="preprocessor"></span>
00035 <span class="preprocessor">#define LIST_FOREACH(var, head, field) \</span>
00036 <span class="preprocessor"> for((var) = LIST_FIRST(head); \</span>
00037 <span class="preprocessor"> (var)!= LIST_END(head); \</span>
00038 <span class="preprocessor"> (var) = LIST_NEXT(var, field))</span>
00039 <span class="preprocessor"></span>
00040 <span class="preprocessor">#define LIST_INIT(head) do { \</span>
00041 <span class="preprocessor"> LIST_FIRST(head) = LIST_END(head); \</span>
00042 <span class="preprocessor">} while (0)</span>
00043 <span class="preprocessor"></span>
00044 <span class="preprocessor">#define LIST_INSERT_AFTER(listelm, elm, field) do { \</span>
00045 <span class="preprocessor"> if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \</span>
00046 <span class="preprocessor"> (listelm)->field.le_next->field.le_prev = \</span>
00047 <span class="preprocessor"> &(elm)->field.le_next; \</span>
00048 <span class="preprocessor"> (listelm)->field.le_next = (elm); \</span>
00049 <span class="preprocessor"> (elm)->field.le_prev = &(listelm)->field.le_next; \</span>
00050 <span class="preprocessor">} while (0)</span>
00051 <span class="preprocessor"></span>
00052 <span class="preprocessor">#define LIST_INSERT_BEFORE(listelm, elm, field) do { \</span>
00053 <span class="preprocessor"> (elm)->field.le_prev = (listelm)->field.le_prev; \</span>
00054 <span class="preprocessor"> (elm)->field.le_next = (listelm); \</span>
00055 <span class="preprocessor"> *(listelm)->field.le_prev = (elm); \</span>
00056 <span class="preprocessor"> (listelm)->field.le_prev = &(elm)->field.le_next; \</span>
00057 <span class="preprocessor">} while (0)</span>
00058 <span class="preprocessor"></span>
00059 <span class="preprocessor">#define LIST_INSERT_HEAD(head, elm, field) do { \</span>
00060 <span class="preprocessor"> if (((elm)->field.le_next = (head)->lh_first) != NULL) \</span>
00061 <span class="preprocessor"> (head)->lh_first->field.le_prev = &(elm)->field.le_next;\</span>
00062 <span class="preprocessor"> (head)->lh_first = (elm); \</span>
00063 <span class="preprocessor"> (elm)->field.le_prev = &(head)->lh_first; \</span>
00064 <span class="preprocessor">} while (0)</span>
00065 <span class="preprocessor"></span>
00066 <span class="preprocessor">#define LIST_REMOVE(elm, field) do { \</span>
00067 <span class="preprocessor"> if ((elm)->field.le_next != NULL) \</span>
00068 <span class="preprocessor"> (elm)->field.le_next->field.le_prev = \</span>
00069 <span class="preprocessor"> (elm)->field.le_prev; \</span>
00070 <span class="preprocessor"> *(elm)->field.le_prev = (elm)->field.le_next; \</span>
00071 <span class="preprocessor">} while (0)</span>
00072 <span class="preprocessor"></span>
00073 <span class="preprocessor">#define LIST_REPLACE(elm, elm2, field) do { \</span>
00074 <span class="preprocessor"> if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \</span>
00075 <span class="preprocessor"> (elm2)->field.le_next->field.le_prev = \</span>
00076 <span class="preprocessor"> &(elm2)->field.le_next; \</span>
00077 <span class="preprocessor"> (elm2)->field.le_prev = (elm)->field.le_prev; \</span>
00078 <span class="preprocessor"> *(elm2)->field.le_prev = (elm2); \</span>
00079 <span class="preprocessor">} while (0)</span>
00080 <span class="preprocessor"></span>
00081
00082 <span class="comment">/* A tail queue is headed by a pair of pointers, one to the head of the</span>
00083 <span class="comment"> * list and the other to the tail of the list. The elements are doubly</span>
00084 <span class="comment"> * linked so that an arbitrary element can be removed without a need to</span>
00085 <span class="comment"> * traverse the list. New elements can be added to the list after</span>
00086 <span class="comment"> * an existing element, at the head of the list, or at the end of the</span>
00087 <span class="comment"> * list. A tail queue may only be traversed in the forward direction. */</span>
00088
00089 <span class="comment">/* Tail queue definitions. */</span>
00090 <span class="preprocessor">#define TAILQ_HEAD(name, type) \</span>
00091 <span class="preprocessor">struct name { \</span>
00092 <span class="preprocessor"> struct type *tqh_first; </span><span class="comment">/* first element */</span> \
00093 struct type **tqh_last; <span class="comment">/* addr of last next element */</span> \
00094 }
00095
00096 <span class="preprocessor">#define TAILQ_ENTRY(type) \</span>
00097 <span class="preprocessor">struct { \</span>
00098 <span class="preprocessor"> struct type *tqe_next; </span><span class="comment">/* next element */</span> \
00099 struct type **tqe_prev; <span class="comment">/* address of previous next element */</span> \
00100 }
00101
00102 <span class="comment">/* Tail queue functions. */</span>
00103 <span class="preprocessor">#define TAILQ_INIT(head) { \</span>
00104 <span class="preprocessor"> (head)->tqh_first = NULL; \</span>
00105 <span class="preprocessor"> (head)->tqh_last = &(head)->tqh_first; \</span>
00106 <span class="preprocessor">}</span>
00107 <span class="preprocessor"></span>
00108 <span class="preprocessor">#define TAILQ_INSERT_HEAD(head, elm, field) { \</span>
00109 <span class="preprocessor"> if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \</span>
00110 <span class="preprocessor"> (elm)->field.tqe_next->field.tqe_prev = \</span>
00111 <span class="preprocessor"> &(elm)->field.tqe_next; \</span>
00112 <span class="preprocessor"> else \</span>
00113 <span class="preprocessor"> (head)->tqh_last = &(elm)->field.tqe_next; \</span>
00114 <span class="preprocessor"> (head)->tqh_first = (elm); \</span>
00115 <span class="preprocessor"> (elm)->field.tqe_prev = &(head)->tqh_first; \</span>
00116 <span class="preprocessor">}</span>
00117 <span class="preprocessor"></span>
00118 <span class="preprocessor">#define TAILQ_INSERT_TAIL(head, elm, field) { \</span>
00119 <span class="preprocessor"> (elm)->field.tqe_next = NULL; \</span>
00120 <span class="preprocessor"> (elm)->field.tqe_prev = (head)->tqh_last; \</span>
00121 <span class="preprocessor"> *(head)->tqh_last = (elm); \</span>
00122 <span class="preprocessor"> (head)->tqh_last = &(elm)->field.tqe_next; \</span>
00123 <span class="preprocessor">}</span>
00124 <span class="preprocessor"></span>
00125 <span class="preprocessor">#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \</span>
00126 <span class="preprocessor"> if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL) \</span>
00127 <span class="preprocessor"> (elm)->field.tqe_next->field.tqe_prev = \</span>
00128 <span class="preprocessor"> &(elm)->field.tqe_next; \</span>
00129 <span class="preprocessor"> else \</span>
00130 <span class="preprocessor"> (head)->tqh_last = &(elm)->field.tqe_next; \</span>
00131 <span class="preprocessor"> (listelm)->field.tqe_next = (elm); \</span>
00132 <span class="preprocessor"> (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \</span>
00133 <span class="preprocessor">}</span>
00134 <span class="preprocessor"></span>
00135 <span class="preprocessor">#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \</span>
00136 <span class="preprocessor"> (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \</span>
00137 <span class="preprocessor"> (elm)->field.tqe_next = (listelm); \</span>
00138 <span class="preprocessor"> *(listelm)->field.tqe_prev = (elm); \</span>
00139 <span class="preprocessor"> (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \</span>
00140 <span class="preprocessor">} while (0)</span>
00141 <span class="preprocessor"></span>
00142 <span class="preprocessor">#define TAILQ_REMOVE(head, elm, field) { \</span>
00143 <span class="preprocessor"> if (((elm)->field.tqe_next) != NULL) \</span>
00144 <span class="preprocessor"> (elm)->field.tqe_next->field.tqe_prev = \</span>
00145 <span class="preprocessor"> (elm)->field.tqe_prev; \</span>
00146 <span class="preprocessor"> else \</span>
00147 <span class="preprocessor"> (head)->tqh_last = (elm)->field.tqe_prev; \</span>
00148 <span class="preprocessor"> *(elm)->field.tqe_prev = (elm)->field.tqe_next; \</span>
00149 <span class="preprocessor">}</span>
00150 <span class="preprocessor"></span>
00151
00152 <span class="comment">/* A circle queue is headed by a pair of pointers, one to the head of the</span>
00153 <span class="comment"> * list and the other to the tail of the list. The elements are doubly</span>
00154 <span class="comment"> * linked so that an arbitrary element can be removed without a need to</span>
00155 <span class="comment"> * traverse the list. New elements can be added to the list before or after</span>
00156 <span class="comment"> * an existing element, at the head of the list, or at the end of the list.</span>
00157 <span class="comment"> * A circle queue may be traversed in either direction, but has a more</span>
00158 <span class="comment"> * complex end of list detection. */</span>
00159
00160 <span class="comment">/* Circular queue definitions. */</span>
00161 <span class="preprocessor">#define CIRCLEQ_HEAD(name, type) \</span>
00162 <span class="preprocessor">struct name { \</span>
00163 <span class="preprocessor"> struct type *cqh_first; </span><span class="comment">/* first element */</span> \
00164 struct type *cqh_last; <span class="comment">/* last element */</span> \
00165 }
00166
00167 <span class="preprocessor">#define CIRCLEQ_ENTRY(type) \</span>
00168 <span class="preprocessor">struct { \</span>
00169 <span class="preprocessor"> struct type *cqe_next; </span><span class="comment">/* next element */</span> \
00170 struct type *cqe_prev; <span class="comment">/* previous element */</span> \
00171 }
00172
00173 <span class="comment">/* Circular queue functions. */</span>
00174 <span class="preprocessor">#define CIRCLEQ_INIT(head) { \</span>
00175 <span class="preprocessor"> (head)->cqh_first = (void *)(head); \</span>
00176 <span class="preprocessor"> (head)->cqh_last = (void *)(head); \</span>
00177 <span class="preprocessor">}</span>
00178 <span class="preprocessor"></span>
00179 <span class="preprocessor">#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \</span>
00180 <span class="preprocessor"> (elm)->field.cqe_next = (listelm)->field.cqe_next; \</span>
00181 <span class="preprocessor"> (elm)->field.cqe_prev = (listelm); \</span>
00182 <span class="preprocessor"> if ((listelm)->field.cqe_next == (void *)(head)) \</span>
00183 <span class="preprocessor"> (head)->cqh_last = (elm); \</span>
00184 <span class="preprocessor"> else \</span>
00185 <span class="preprocessor"> (listelm)->field.cqe_next->field.cqe_prev = (elm); \</span>
00186 <span class="preprocessor"> (listelm)->field.cqe_next = (elm); \</span>
00187 <span class="preprocessor">}</span>
00188 <span class="preprocessor"></span>
00189 <span class="preprocessor">#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \</span>
00190 <span class="preprocessor"> (elm)->field.cqe_next = (listelm); \</span>
00191 <span class="preprocessor"> (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \</span>
00192 <span class="preprocessor"> if ((listelm)->field.cqe_prev == (void *)(head)) \</span>
00193 <span class="preprocessor"> (head)->cqh_first = (elm); \</span>
00194 <span class="preprocessor"> else \</span>
00195 <span class="preprocessor"> (listelm)->field.cqe_prev->field.cqe_next = (elm); \</span>
00196 <span class="preprocessor"> (listelm)->field.cqe_prev = (elm); \</span>
00197 <span class="preprocessor">}</span>
00198 <span class="preprocessor"></span>
00199 <span class="preprocessor">#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \</span>
00200 <span class="preprocessor"> (elm)->field.cqe_next = (head)->cqh_first; \</span>
00201 <span class="preprocessor"> (elm)->field.cqe_prev = (void *)(head); \</span>
00202 <span class="preprocessor"> if ((head)->cqh_last == (void *)(head)) \</span>
00203 <span class="preprocessor"> (head)->cqh_last = (elm); \</span>
00204 <span class="preprocessor"> else \</span>
00205 <span class="preprocessor"> (head)->cqh_first->field.cqe_prev = (elm); \</span>
00206 <span class="preprocessor"> (head)->cqh_first = (elm); \</span>
00207 <span class="preprocessor">}</span>
00208 <span class="preprocessor"></span>
00209 <span class="preprocessor">#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \</span>
00210 <span class="preprocessor"> (elm)->field.cqe_next = (void *)(head); \</span>
00211 <span class="preprocessor"> (elm)->field.cqe_prev = (head)->cqh_last; \</span>
00212 <span class="preprocessor"> if ((head)->cqh_first == (void *)(head)) \</span>
00213 <span class="preprocessor"> (head)->cqh_first = (elm); \</span>
00214 <span class="preprocessor"> else \</span>
00215 <span class="preprocessor"> (head)->cqh_last->field.cqe_next = (elm); \</span>
00216 <span class="preprocessor"> (head)->cqh_last = (elm); \</span>
00217 <span class="preprocessor">}</span>
00218 <span class="preprocessor"></span>
00219 <span class="preprocessor">#define CIRCLEQ_REMOVE(head, elm, field) { \</span>
00220 <span class="preprocessor"> if ((elm)->field.cqe_next == (void *)(head)) \</span>
00221 <span class="preprocessor"> (head)->cqh_last = (elm)->field.cqe_prev; \</span>
00222 <span class="preprocessor"> else \</span>
00223 <span class="preprocessor"> (elm)->field.cqe_next->field.cqe_prev = \</span>
00224 <span class="preprocessor"> (elm)->field.cqe_prev; \</span>
00225 <span class="preprocessor"> if ((elm)->field.cqe_prev == (void *)(head)) \</span>
00226 <span class="preprocessor"> (head)->cqh_first = (elm)->field.cqe_next; \</span>
00227 <span class="preprocessor"> else \</span>
00228 <span class="preprocessor"> (elm)->field.cqe_prev->field.cqe_next = \</span>
00229 <span class="preprocessor"> (elm)->field.cqe_next; \</span>
00230 <span class="preprocessor">}</span>
00231 <span class="preprocessor"></span>
00232 <span class="preprocessor">#ifndef LIST_ENTRY_NULL</span>
00233 <span class="preprocessor"></span><span class="preprocessor">#define LIST_ENTRY_NULL { NULL, NULL }</span>
00234 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00235 <span class="preprocessor"></span>
00236 <span class="preprocessor">#ifndef LIST_FOREACH</span>
00237 <span class="preprocessor"></span><span class="preprocessor">#define LIST_FOREACH(var, head, entries) \</span>
00238 <span class="preprocessor"> for (var = (head)->lh_first; var != NULL; var = var->entries.le_next)</span>
00239 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00240 <span class="preprocessor"></span>
00241 <span class="preprocessor">#ifndef LIST_FIRST</span>
00242 <span class="preprocessor"></span><span class="preprocessor">#define LIST_FIRST(head) ((head)->lh_first)</span>
00243 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
00244 <span class="preprocessor"></span>
00245 <span class="preprocessor">#ifndef TAILQ_ENTRY_NULL</span>
00246 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_ENTRY_NULL { NULL, NULL }</span>
00247 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00248 <span class="preprocessor"></span>
00249 <span class="preprocessor">#ifndef TAILQ_FIRST</span>
00250 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_FIRST(head) ((head)->tqh_first)</span>
00251 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
00252 <span class="preprocessor"></span>
00253 <span class="preprocessor">#ifndef TAILQ_END</span>
00254 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_END(head) NULL</span>
00255 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00256 <span class="preprocessor"></span>
00257 <span class="preprocessor">#ifndef TAILQ_NEXT</span>
00258 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)</span>
00259 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00260 <span class="preprocessor"></span>
00261 <span class="preprocessor">#ifndef TAILQ_LAST</span>
00262 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_LAST(head, headname) \</span>
00263 <span class="preprocessor"> (*(((struct headname *)((head)->tqh_last))->tqh_last))</span>
00264 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00265 <span class="preprocessor"></span>
00266 <span class="preprocessor">#ifndef TAILQ_PREV</span>
00267 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_PREV(elm, headname, field) \</span>
00268 <span class="preprocessor"> (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))</span>
00269 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00270 <span class="preprocessor"></span>
00271 <span class="preprocessor">#ifndef TAILQ_EMPTY</span>
00272 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_EMPTY(head) \</span>
00273 <span class="preprocessor"> (TAILQ_FIRST(head) == TAILQ_END(head))</span>
00274 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00275 <span class="preprocessor"></span>
00276 <span class="preprocessor">#ifndef TAILQ_FOREACH</span>
00277 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_FOREACH(var, head, field) \</span>
00278 <span class="preprocessor"> for((var) = TAILQ_FIRST(head); \</span>
00279 <span class="preprocessor"> (var) != TAILQ_END(head); \</span>
00280 <span class="preprocessor"> (var) = TAILQ_NEXT(var, field))</span>
00281 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00282 <span class="preprocessor"></span>
00283 <span class="preprocessor">#ifndef TAILQ_FOREACH_REVERSE</span>
00284 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_FOREACH_REVERSE(var, head, field, headname) \</span>
00285 <span class="preprocessor"> for((var) = TAILQ_LAST(head, headname); \</span>
00286 <span class="preprocessor"> (var) != TAILQ_END(head); \</span>
00287 <span class="preprocessor"> (var) = TAILQ_PREV(var, headname, field))</span>
00288 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00289 <span class="preprocessor"></span>
00290 <span class="preprocessor">#endif </span><span class="comment">/* !_U_QUEUE_H_ */</span>
</pre></div><hr>
<div>
<div style="text-align:left">
<a href="http://www.koanlogic.com/kl/cont/gb/html/products.html">←Products</a>
</div>
<div style="text-align:center;">
© 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
</div>
</div>
</body>
</html>
|