jar-ds.h (1964B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef __JAR_DS_h_ 6 #define __JAR_DS_h_ 7 8 /* Typedefs */ 9 typedef struct ZZLinkStr ZZLink; 10 typedef struct ZZListStr ZZList; 11 12 /* 13 ** Circular linked list. Each link contains a pointer to the object that 14 ** is actually in the list. 15 */ 16 struct ZZLinkStr { 17 ZZLink *next; 18 ZZLink *prev; 19 JAR_Item *thing; 20 }; 21 22 struct ZZListStr { 23 ZZLink link; 24 }; 25 26 #define ZZ_InitList(lst) \ 27 { \ 28 (lst)->link.next = &(lst)->link; \ 29 (lst)->link.prev = &(lst)->link; \ 30 (lst)->link.thing = 0; \ 31 } 32 33 #define ZZ_ListEmpty(lst) ((lst)->link.next == &(lst)->link) 34 35 #define ZZ_ListHead(lst) ((lst)->link.next) 36 37 #define ZZ_ListTail(lst) ((lst)->link.prev) 38 39 #define ZZ_ListIterDone(lst, lnk) ((lnk) == &(lst)->link) 40 41 #define ZZ_AppendLink(lst, lnk) \ 42 { \ 43 (lnk)->next = &(lst)->link; \ 44 (lnk)->prev = (lst)->link.prev; \ 45 (lst)->link.prev->next = (lnk); \ 46 (lst)->link.prev = (lnk); \ 47 } 48 49 #define ZZ_InsertLink(lst, lnk) \ 50 { \ 51 (lnk)->next = (lst)->link.next; \ 52 (lnk)->prev = &(lst)->link; \ 53 (lst)->link.next->prev = (lnk); \ 54 (lst)->link.next = (lnk); \ 55 } 56 57 #define ZZ_RemoveLink(lnk) \ 58 { \ 59 (lnk)->next->prev = (lnk)->prev; \ 60 (lnk)->prev->next = (lnk)->next; \ 61 (lnk)->next = 0; \ 62 (lnk)->prev = 0; \ 63 } 64 65 extern ZZLink * 66 ZZ_NewLink(JAR_Item *thing); 67 68 extern void 69 ZZ_DestroyLink(ZZLink *link); 70 71 extern ZZList * 72 ZZ_NewList(void); 73 74 extern void 75 ZZ_DestroyList(ZZList *list); 76 77 #endif /* __JAR_DS_h_ */