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