|
|
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.