15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The contents of this file are subject to the Mozilla Public 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License Version 1.1 (the "License"); you may not use this file 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * except in compliance with the License. You may obtain a copy of 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the License at http://www.mozilla.org/MPL/ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Software distributed under the License is distributed on an "AS 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implied. See the License for the specific language governing 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rights and limitations under the License. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Original Code is the Netscape Portable Runtime (NSPR). 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Initial Developer of the Original Code is Netscape 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Communications Corporation. Portions created by Netscape are 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1998-2000 Netscape Communications Corporation. All 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Rights Reserved. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contributor(s): 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Alternatively, the contents of this file may be used under the 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * terms of the GNU General Public License Version 2 or later (the 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "GPL"), in which case the provisions of the GPL are applicable 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instead of those above. If you wish to allow use of your 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version of this file only under the terms of the GPL and not to 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allow others to use your version of this file under the MPL, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * indicate your decision by deleting the provisions above and 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * replace them with the notice and other provisions required by 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the GPL. If you do not delete the provisions above, a recipient 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * may use your version of this file under either the MPL or the 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GPL. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef prclist_h___ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define prclist_h___ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "prtypes.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct PRCListStr PRCList; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Circular linked list 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PRCListStr { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRCList *next; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRCList *prev; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Insert element "_e" into the list, before "_l". 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_INSERT_BEFORE(_e,_l) \ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_BEGIN_MACRO \ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->next = (_l); \ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->prev = (_l)->prev; \ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_l)->prev->next = (_e); \ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_l)->prev = (_e); \ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_END_MACRO 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Insert element "_e" into the list, after "_l". 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_INSERT_AFTER(_e,_l) \ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_BEGIN_MACRO \ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->next = (_l)->next; \ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->prev = (_l); \ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_l)->next->prev = (_e); \ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_l)->next = (_e); \ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_END_MACRO 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the element following element "_e" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_NEXT_LINK(_e) \ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((_e)->next) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the element preceding element "_e" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_PREV_LINK(_e) \ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((_e)->prev) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Append an element "_e" to the end of the list "_l" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_APPEND_LINK(_e,_l) PR_INSERT_BEFORE(_e,_l) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Insert an element "_e" at the head of the list "_l" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_INSERT_LINK(_e,_l) PR_INSERT_AFTER(_e,_l) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Return the head/tail of the list */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_LIST_HEAD(_l) (_l)->next 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_LIST_TAIL(_l) (_l)->prev 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove the element "_e" from it's circular list. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_REMOVE_LINK(_e) \ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_BEGIN_MACRO \ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->prev->next = (_e)->next; \ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->next->prev = (_e)->prev; \ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_END_MACRO 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove the element "_e" from it's circular list. Also initializes the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** linkage. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_REMOVE_AND_INIT_LINK(_e) \ 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_BEGIN_MACRO \ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->prev->next = (_e)->next; \ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->next->prev = (_e)->prev; \ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->next = (_e); \ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_e)->prev = (_e); \ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_END_MACRO 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return non-zero if the given circular list "_l" is empty, zero if the 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** circular list is not empty 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_CLIST_IS_EMPTY(_l) \ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((_l)->next == (_l)) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Initialize a circular list 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_INIT_CLIST(_l) \ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_BEGIN_MACRO \ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_l)->next = (_l); \ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_l)->prev = (_l); \ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PR_END_MACRO 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_INIT_STATIC_CLIST(_l) \ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {(_l), (_l)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* prclist_h___ */ 138