1 /* 2 * bltList.h -- 3 * 4 * Copyright 1993-1998 Lucent Technologies, Inc. 5 * 6 * Permission to use, copy, modify, and distribute this software and 7 * its documentation for any purpose and without fee is hereby 8 * granted, provided that the above copyright notice appear in all 9 * copies and that both that the copyright notice and warranty 10 * disclaimer appear in supporting documentation, and that the names 11 * of Lucent Technologies any of their entities not be used in 12 * advertising or publicity pertaining to distribution of the software 13 * without specific, written prior permission. 14 * 15 * Lucent Technologies disclaims all warranties with regard to this 16 * software, including all implied warranties of merchantability and 17 * fitness. In no event shall Lucent Technologies be liable for any 18 * special, indirect or consequential damages or any damages 19 * whatsoever resulting from loss of use, data or profits, whether in 20 * an action of contract, negligence or other tortuous action, arising 21 * out of or in connection with the use or performance of this 22 * software. 23 */ 24 #ifndef _BLT_LIST_H 25 #define _BLT_LIST_H 26 27 typedef struct Blt_ListStruct *Blt_List; 28 typedef struct Blt_ListNodeStruct *Blt_ListNode; 29 30 /* 31 * A Blt_ListNode is the container structure for the Blt_List. 32 */ 33 struct Blt_ListNodeStruct { 34 struct Blt_ListNodeStruct *prevPtr; /* Link to the previous node */ 35 struct Blt_ListNodeStruct *nextPtr; /* Link to the next node */ 36 ClientData clientData; /* Pointer to the data object */ 37 struct Blt_ListStruct *listPtr; /* List to eventually insert node */ 38 union { /* Key has one of these forms: */ 39 CONST char *oneWordValue; /* One-word value for key. */ 40 int *words[1]; /* Multiple integer words for key. 41 * The actual size will be as large 42 * as necessary for this table's 43 * keys. */ 44 char string[4]; /* String for key. The actual size 45 * will be as large as needed to hold 46 * the key. */ 47 } key; /* MUST BE LAST FIELD IN RECORD!! */ 48 }; 49 50 typedef int (Blt_ListCompareProc) _ANSI_ARGS_((Blt_ListNode *node1Ptr, 51 Blt_ListNode *node2Ptr)); 52 53 /* 54 * A Blt_List is a doubly chained list structure. 55 */ 56 struct Blt_ListStruct { 57 struct Blt_ListNodeStruct *headPtr; /* Pointer to first element in list */ 58 struct Blt_ListNodeStruct *tailPtr; /* Pointer to last element in list */ 59 int nNodes; /* Number of node currently in the list. */ 60 int type; /* Type of keys in list. */ 61 }; 62 63 EXTERN void Blt_ListInit _ANSI_ARGS_((Blt_List list, int type)); 64 EXTERN void Blt_ListReset _ANSI_ARGS_((Blt_List list)); 65 EXTERN Blt_List Blt_ListCreate _ANSI_ARGS_((int type)); 66 EXTERN void Blt_ListDestroy _ANSI_ARGS_((Blt_List list)); 67 EXTERN Blt_ListNode Blt_ListCreateNode _ANSI_ARGS_((Blt_List list, 68 CONST char *key)); 69 EXTERN void Blt_ListDeleteNode _ANSI_ARGS_((Blt_ListNode node)); 70 71 EXTERN Blt_ListNode Blt_ListAppend _ANSI_ARGS_((Blt_List list, CONST char *key, 72 ClientData clientData)); 73 EXTERN Blt_ListNode Blt_ListPrepend _ANSI_ARGS_((Blt_List list, CONST char *key, 74 ClientData clientData)); 75 EXTERN void Blt_ListLinkAfter _ANSI_ARGS_((Blt_List list, Blt_ListNode node, 76 Blt_ListNode afterNode)); 77 EXTERN void Blt_ListLinkBefore _ANSI_ARGS_((Blt_List list, Blt_ListNode node, 78 Blt_ListNode beforeNode)); 79 EXTERN void Blt_ListUnlinkNode _ANSI_ARGS_((Blt_ListNode node)); 80 EXTERN Blt_ListNode Blt_ListGetNode _ANSI_ARGS_((Blt_List list, 81 CONST char *key)); 82 EXTERN void Blt_ListDeleteNodeByKey _ANSI_ARGS_((Blt_List list, 83 CONST char *key)); 84 EXTERN Blt_ListNode Blt_ListGetNthNode _ANSI_ARGS_((Blt_List list, 85 int position, int direction)); 86 EXTERN void Blt_ListSort _ANSI_ARGS_((Blt_List list, 87 Blt_ListCompareProc * proc)); 88 89 #define Blt_ListGetLength(list) \ 90 (((list) == NULL) ? 0 : ((struct Blt_ListStruct *)list)->nNodes) 91 #define Blt_ListFirstNode(list) \ 92 (((list) == NULL) ? NULL : ((struct Blt_ListStruct *)list)->headPtr) 93 #define Blt_ListLastNode(list) \ 94 (((list) == NULL) ? NULL : ((struct Blt_ListStruct *)list)->tailPtr) 95 #define Blt_ListPrevNode(node) ((node)->prevPtr) 96 #define Blt_ListNextNode(node) ((node)->nextPtr) 97 #define Blt_ListGetKey(node) \ 98 (((node)->listPtr->type == BLT_STRING_KEYS) \ 99 ? (node)->key.string : (node)->key.oneWordValue) 100 #define Blt_ListGetValue(node) ((node)->clientData) 101 #define Blt_ListSetValue(node, value) \ 102 ((node)->clientData = (ClientData)(value)) 103 #define Blt_ListAppendNode(list, node) \ 104 (Blt_ListLinkBefore((list), (node), (Blt_ListNode)NULL)) 105 #define Blt_ListPrependNode(list, node) \ 106 (Blt_ListLinkAfter((list), (node), (Blt_ListNode)NULL)) 107 108 #endif /* _BLT_LIST_H */ 109