|
|
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 Netscape 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/NPL/
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 Mozilla Communicator client code, released
14: * March 31, 1998.
15: *
16: * The Initial Developer of the Original Code is Netscape
17: * Communications Corporation. Portions created by Netscape are
18: * Copyright (C) 1998 Netscape Communications Corporation. All
19: * Rights Reserved.
20: *
21: * Contributor(s):
22: *
23: * Alternatively, the contents of this file may be used under the
24: * terms of the GNU Public License (the "GPL"), in which case the
25: * provisions of the GPL are applicable instead of those above.
26: * If you wish to allow use of your version of this file only
27: * under the terms of the GPL and not to allow others to use your
28: * version of this file under the NPL, indicate your decision by
29: * deleting the provisions above and replace them with the notice
30: * and other provisions required by the GPL. If you do not delete
31: * the provisions above, a recipient may use your version of this
32: * file under either the NPL or the GPL.
33: */
34:
35: #ifndef jsclist_h___
36: #define jsclist_h___
37:
38: #include "jstypes.h"
39:
40: /*
41: ** Circular linked list
42: */
43: typedef struct JSCListStr {
44: struct JSCListStr *next;
45: struct JSCListStr *prev;
46: } JSCList;
47:
48: /*
49: ** Insert element "_e" into the list, before "_l".
50: */
51: #define JS_INSERT_BEFORE(_e,_l) \
52: JS_BEGIN_MACRO \
53: (_e)->next = (_l); \
54: (_e)->prev = (_l)->prev; \
55: (_l)->prev->next = (_e); \
56: (_l)->prev = (_e); \
57: JS_END_MACRO
58:
59: /*
60: ** Insert element "_e" into the list, after "_l".
61: */
62: #define JS_INSERT_AFTER(_e,_l) \
63: JS_BEGIN_MACRO \
64: (_e)->next = (_l)->next; \
65: (_e)->prev = (_l); \
66: (_l)->next->prev = (_e); \
67: (_l)->next = (_e); \
68: JS_END_MACRO
69:
70: /*
71: ** Return the element following element "_e"
72: */
73: #define JS_NEXT_LINK(_e) \
74: ((_e)->next)
75: /*
76: ** Return the element preceding element "_e"
77: */
78: #define JS_PREV_LINK(_e) \
79: ((_e)->prev)
80:
81: /*
82: ** Append an element "_e" to the end of the list "_l"
83: */
84: #define JS_APPEND_LINK(_e,_l) JS_INSERT_BEFORE(_e,_l)
85:
86: /*
87: ** Insert an element "_e" at the head of the list "_l"
88: */
89: #define JS_INSERT_LINK(_e,_l) JS_INSERT_AFTER(_e,_l)
90:
91: /* Return the head/tail of the list */
92: #define JS_LIST_HEAD(_l) (_l)->next
93: #define JS_LIST_TAIL(_l) (_l)->prev
94:
95: /*
96: ** Remove the element "_e" from it's circular list.
97: */
98: #define JS_REMOVE_LINK(_e) \
99: JS_BEGIN_MACRO \
100: (_e)->prev->next = (_e)->next; \
101: (_e)->next->prev = (_e)->prev; \
102: JS_END_MACRO
103:
104: /*
105: ** Remove the element "_e" from it's circular list. Also initializes the
106: ** linkage.
107: */
108: #define JS_REMOVE_AND_INIT_LINK(_e) \
109: JS_BEGIN_MACRO \
110: (_e)->prev->next = (_e)->next; \
111: (_e)->next->prev = (_e)->prev; \
112: (_e)->next = (_e); \
113: (_e)->prev = (_e); \
114: JS_END_MACRO
115:
116: /*
117: ** Return non-zero if the given circular list "_l" is empty, zero if the
118: ** circular list is not empty
119: */
120: #define JS_CLIST_IS_EMPTY(_l) \
121: ((_l)->next == (_l))
122:
123: /*
124: ** Initialize a circular list
125: */
126: #define JS_INIT_CLIST(_l) \
127: JS_BEGIN_MACRO \
128: (_l)->next = (_l); \
129: (_l)->prev = (_l); \
130: JS_END_MACRO
131:
132: #define JS_INIT_STATIC_CLIST(_l) \
133: {(_l), (_l)}
134:
135: #endif /* jsclist_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.