|
|
1.1 root 1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2: /*
3: * The contents of this file are subject to the Mozilla Public
4: * License Version 1.1 (the "License"); you may not use this file
5: * except in compliance with the License. You may obtain a copy of
6: * the License at http://www.mozilla.org/MPL/
7: *
8: * Software distributed under the License is distributed on an "AS
9: * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
10: * implied. See the License for the specific language governing
11: * rights and limitations under the License.
12: *
13: * The Original Code is the Netscape Portable Runtime (NSPR).
14: *
15: * The Initial Developer of the Original Code is Netscape
16: * Communications Corporation. Portions created by Netscape are
17: * Copyright (C) 1998-2000 Netscape Communications Corporation. All
18: * Rights Reserved.
19: *
20: * Contributor(s):
21: *
22: * Alternatively, the contents of this file may be used under the
23: * terms of the GNU General Public License Version 2 or later (the
24: * "GPL"), in which case the provisions of the GPL are applicable
25: * instead of those above. If you wish to allow use of your
26: * version of this file only under the terms of the GPL and not to
27: * allow others to use your version of this file under the MPL,
28: * indicate your decision by deleting the provisions above and
29: * replace them with the notice and other provisions required by
30: * the GPL. If you do not delete the provisions above, a recipient
31: * may use your version of this file under either the MPL or the
32: * GPL.
33: */
34:
35: #ifndef prclist_h___
36: #define prclist_h___
37:
38: #include "prtypes.h"
39:
40: typedef struct PRCListStr PRCList;
41:
42: /*
43: ** Circular linked list
44: */
45: struct PRCListStr {
46: PRCList *next;
47: PRCList *prev;
48: };
49:
50: /*
51: ** Insert element "_e" into the list, before "_l".
52: */
53: #define PR_INSERT_BEFORE(_e,_l) \
54: PR_BEGIN_MACRO \
55: (_e)->next = (_l); \
56: (_e)->prev = (_l)->prev; \
57: (_l)->prev->next = (_e); \
58: (_l)->prev = (_e); \
59: PR_END_MACRO
60:
61: /*
62: ** Insert element "_e" into the list, after "_l".
63: */
64: #define PR_INSERT_AFTER(_e,_l) \
65: PR_BEGIN_MACRO \
66: (_e)->next = (_l)->next; \
67: (_e)->prev = (_l); \
68: (_l)->next->prev = (_e); \
69: (_l)->next = (_e); \
70: PR_END_MACRO
71:
72: /*
73: ** Return the element following element "_e"
74: */
75: #define PR_NEXT_LINK(_e) \
76: ((_e)->next)
77: /*
78: ** Return the element preceding element "_e"
79: */
80: #define PR_PREV_LINK(_e) \
81: ((_e)->prev)
82:
83: /*
84: ** Append an element "_e" to the end of the list "_l"
85: */
86: #define PR_APPEND_LINK(_e,_l) PR_INSERT_BEFORE(_e,_l)
87:
88: /*
89: ** Insert an element "_e" at the head of the list "_l"
90: */
91: #define PR_INSERT_LINK(_e,_l) PR_INSERT_AFTER(_e,_l)
92:
93: /* Return the head/tail of the list */
94: #define PR_LIST_HEAD(_l) (_l)->next
95: #define PR_LIST_TAIL(_l) (_l)->prev
96:
97: /*
98: ** Remove the element "_e" from it's circular list.
99: */
100: #define PR_REMOVE_LINK(_e) \
101: PR_BEGIN_MACRO \
102: (_e)->prev->next = (_e)->next; \
103: (_e)->next->prev = (_e)->prev; \
104: PR_END_MACRO
105:
106: /*
107: ** Remove the element "_e" from it's circular list. Also initializes the
108: ** linkage.
109: */
110: #define PR_REMOVE_AND_INIT_LINK(_e) \
111: PR_BEGIN_MACRO \
112: (_e)->prev->next = (_e)->next; \
113: (_e)->next->prev = (_e)->prev; \
114: (_e)->next = (_e); \
115: (_e)->prev = (_e); \
116: PR_END_MACRO
117:
118: /*
119: ** Return non-zero if the given circular list "_l" is empty, zero if the
120: ** circular list is not empty
121: */
122: #define PR_CLIST_IS_EMPTY(_l) \
123: ((_l)->next == (_l))
124:
125: /*
126: ** Initialize a circular list
127: */
128: #define PR_INIT_CLIST(_l) \
129: PR_BEGIN_MACRO \
130: (_l)->next = (_l); \
131: (_l)->prev = (_l); \
132: PR_END_MACRO
133:
134: #define PR_INIT_STATIC_CLIST(_l) \
135: {(_l), (_l)}
136:
137: #endif /* prclist_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.