| 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 */
|
|---|