/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef __JAR_DS_h_ #define __JAR_DS_h_ /* Typedefs */ typedef struct ZZLinkStr ZZLink; typedef struct ZZListStr ZZList; /* ** Circular linked list. Each link contains a pointer to the object that ** is actually in the list. */ struct ZZLinkStr { ZZLink *next; ZZLink *prev; JAR_Item *thing; }; struct ZZListStr { ZZLink link; }; #define ZZ_InitList(lst) \ { \ (lst)->link.next = &(lst)->link; \ (lst)->link.prev = &(lst)->link; \ (lst)->link.thing = 0; \ } #define ZZ_ListEmpty(lst) ((lst)->link.next == &(lst)->link) #define ZZ_ListHead(lst) ((lst)->link.next) #define ZZ_ListTail(lst) ((lst)->link.prev) #define ZZ_ListIterDone(lst, lnk) ((lnk) == &(lst)->link) #define ZZ_AppendLink(lst, lnk) \ { \ (lnk)->next = &(lst)->link; \ (lnk)->prev = (lst)->link.prev; \ (lst)->link.prev->next = (lnk); \ (lst)->link.prev = (lnk); \ } #define ZZ_InsertLink(lst, lnk) \ { \ (lnk)->next = (lst)->link.next; \ (lnk)->prev = &(lst)->link; \ (lst)->link.next->prev = (lnk); \ (lst)->link.next = (lnk); \ } #define ZZ_RemoveLink(lnk) \ { \ (lnk)->next->prev = (lnk)->prev; \ (lnk)->prev->next = (lnk)->next; \ (lnk)->next = 0; \ (lnk)->prev = 0; \ } extern ZZLink * ZZ_NewLink(JAR_Item *thing); extern void ZZ_DestroyLink(ZZLink *link); extern ZZList * ZZ_NewList(void); extern void ZZ_DestroyList(ZZList *list); #endif /* __JAR_DS_h_ */