source: trunk/kitgen/8.x/blt/generic/bltList.h@ 176

Last change on this file since 176 was 175, checked in by demin, 12 years ago

initial commit

File size: 4.5 KB
Line 
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
27typedef struct Blt_ListStruct *Blt_List;
28typedef struct Blt_ListNodeStruct *Blt_ListNode;
29
30/*
31 * A Blt_ListNode is the container structure for the Blt_List.
32 */
33struct 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
50typedef 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 */
56struct 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
63EXTERN void Blt_ListInit _ANSI_ARGS_((Blt_List list, int type));
64EXTERN void Blt_ListReset _ANSI_ARGS_((Blt_List list));
65EXTERN Blt_List Blt_ListCreate _ANSI_ARGS_((int type));
66EXTERN void Blt_ListDestroy _ANSI_ARGS_((Blt_List list));
67EXTERN Blt_ListNode Blt_ListCreateNode _ANSI_ARGS_((Blt_List list,
68 CONST char *key));
69EXTERN void Blt_ListDeleteNode _ANSI_ARGS_((Blt_ListNode node));
70
71EXTERN Blt_ListNode Blt_ListAppend _ANSI_ARGS_((Blt_List list, CONST char *key,
72 ClientData clientData));
73EXTERN Blt_ListNode Blt_ListPrepend _ANSI_ARGS_((Blt_List list, CONST char *key,
74 ClientData clientData));
75EXTERN void Blt_ListLinkAfter _ANSI_ARGS_((Blt_List list, Blt_ListNode node,
76 Blt_ListNode afterNode));
77EXTERN void Blt_ListLinkBefore _ANSI_ARGS_((Blt_List list, Blt_ListNode node,
78 Blt_ListNode beforeNode));
79EXTERN void Blt_ListUnlinkNode _ANSI_ARGS_((Blt_ListNode node));
80EXTERN Blt_ListNode Blt_ListGetNode _ANSI_ARGS_((Blt_List list,
81 CONST char *key));
82EXTERN void Blt_ListDeleteNodeByKey _ANSI_ARGS_((Blt_List list,
83 CONST char *key));
84EXTERN Blt_ListNode Blt_ListGetNthNode _ANSI_ARGS_((Blt_List list,
85 int position, int direction));
86EXTERN 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 */
Note: See TracBrowser for help on using the repository browser.