1 /**
2 	what about creating keys that are used for the data stored in nodes?
3 **/
4 
5 /**
6   @file
7 
8   definition of node
9 
10   Datastructure for the nodes in the tree is defined in this file,
11 */
12 
13 #ifndef NODE_H
14 #define NODE_H
15 
16 typedef struct Node_AttItem {
17 	char *name;
18 	char *data;
19 	struct Node_AttItem *next;
20 } Node_AttItem;
21 
22 
23 /*
24   Datastructure for the nodes in the tree is defined in this file.
25 
26  Structure of a node,.. don't acces them directly use the other functions
27  in this file to acces them.
28 */
29 
30 typedef struct Node {
31 	struct Node *up, *down, *left, *right;
32 	unsigned int flags;
33 	Node_AttItem *attrib;
34 } Node;
35 
36 
37 char *node_get (Node *node, char *name);
38 void node_set (Node *node, char *name, char *data);
39 void node_unset (Node *node, char *name);
40 
41 /* convenience macro for the rest of this header*/
42 #define if_node(a,b)		((a)?(b):0)
43 
44 /*	macros to determine if there is a node immedieatly next to the
45    specified in a driection, returns 0 if there isn't the node if
46    there is.
47 
48 	Returns: node,  0 if none
49 */
50 #define node_up(node)		if_node((node),(node)->up)
51 #define node_down(node)		if_node((node),(node)->down)
52 #define node_right(node)	if_node((node),(node)->right)
53 #define node_left(node)		if_node((node),(node)->left)
54 
55 /* sets all the flags of a node, if it exists
56 	Returns: New flags, or 0 if node didn't exist
57 */
58 #define node_setflags(node,tflags)	if_node((node),(node)->flags=(tflags))
59 
60 /* gets all the flags of a node, if it exists
61 	Returns: flags, or 0 if node didn't exist
62 */
63 #define node_getflags(node)			if_node((node),((node)->flags))
64 
65 
66 /* returns the state of the specified flag
67 	Returns: 1 if flag is set 0 if not
68 */
69 #define node_getflag(node,flag)	if_node((node),((node)->flags&(flag)?1:0))
70 
71 /*	sets the specified flag if state is 1, turns of the flag if state is 0
72 
73 */
74 #define node_setflag(node,flag,state)\
75 	{if(state){node_setflags((node),(node)->flags|(flag));}\
76 	else	{node_setflags((node), (node)->flags & ( (flag)  ^0xffff));}}
77 
78 /* ansi c complained too much about value computed not used
79    so I reverted to a new macro function above not returinging flags
80 */
81 #define old_node_setflag(node,flag,state)\
82 	(state?   node_setflags(node,node->flags|flag)\
83 	/*else*/: node_setflags(node, node->flags & ( flag  ^0xffff)) )
84 
85 
86 /* toggles the specified flag,
87 
88 	Returns: 1 if flag were set 0 if flag were turned of
89 */
90 #define node_toggleflag(node,flag) (   node_setflags((node), (node)->flags^(flag) )   &flag)
91 
92 
93 /* getting of node percentage
94 	Returns: priority, or 0 if node didn't exist
95 */
96 #define node_getpercent_done(node)		(node?(node->percent_done):-1)
97 
98 /* sets priority of a node, if it exists
99 	Returns: New priority, or 0 if node didn't exist
100 */
101 #define node_setpercent_done(node,new_percent_done)	(node?(node->percent_done=new_percent_done):-1)
102 
103 #define node_getsize(node)		(node?(node->size):-1)
104 #define node_setsize(node,new_size)	(node?(node->size=new_size):-1)
105 /* allocates a new node, seta all data to zero
106 
107 	Returns: new node
108 */
109 Node *node_new ();
110 
111 Node *node_duplicate (Node *node);
112 
113 /* frees a node an it's related variables
114 */
115 void node_free (Node *node);
116 
117 #endif /* NODE_H */
118