/** what about creating keys that are used for the data stored in nodes? **/ /** @file definition of node Datastructure for the nodes in the tree is defined in this file, */ #ifndef NODE_H #define NODE_H typedef struct Node_AttItem { char *name; char *data; struct Node_AttItem *next; } Node_AttItem; /* Datastructure for the nodes in the tree is defined in this file. Structure of a node,.. don't acces them directly use the other functions in this file to acces them. */ typedef struct Node { struct Node *up, *down, *left, *right; unsigned int flags; Node_AttItem *attrib; } Node; char *node_get (Node *node, char *name); void node_set (Node *node, char *name, char *data); void node_unset (Node *node, char *name); /* convenience macro for the rest of this header*/ #define if_node(a,b) ((a)?(b):0) /* macros to determine if there is a node immedieatly next to the specified in a driection, returns 0 if there isn't the node if there is. Returns: node, 0 if none */ #define node_up(node) if_node((node),(node)->up) #define node_down(node) if_node((node),(node)->down) #define node_right(node) if_node((node),(node)->right) #define node_left(node) if_node((node),(node)->left) /* sets all the flags of a node, if it exists Returns: New flags, or 0 if node didn't exist */ #define node_setflags(node,tflags) if_node((node),(node)->flags=(tflags)) /* gets all the flags of a node, if it exists Returns: flags, or 0 if node didn't exist */ #define node_getflags(node) if_node((node),((node)->flags)) /* returns the state of the specified flag Returns: 1 if flag is set 0 if not */ #define node_getflag(node,flag) if_node((node),((node)->flags&(flag)?1:0)) /* sets the specified flag if state is 1, turns of the flag if state is 0 */ #define node_setflag(node,flag,state)\ {if(state){node_setflags((node),(node)->flags|(flag));}\ else {node_setflags((node), (node)->flags & ( (flag) ^0xffff));}} /* ansi c complained too much about value computed not used so I reverted to a new macro function above not returinging flags */ #define old_node_setflag(node,flag,state)\ (state? node_setflags(node,node->flags|flag)\ /*else*/: node_setflags(node, node->flags & ( flag ^0xffff)) ) /* toggles the specified flag, Returns: 1 if flag were set 0 if flag were turned of */ #define node_toggleflag(node,flag) ( node_setflags((node), (node)->flags^(flag) ) &flag) /* getting of node percentage Returns: priority, or 0 if node didn't exist */ #define node_getpercent_done(node) (node?(node->percent_done):-1) /* sets priority of a node, if it exists Returns: New priority, or 0 if node didn't exist */ #define node_setpercent_done(node,new_percent_done) (node?(node->percent_done=new_percent_done):-1) #define node_getsize(node) (node?(node->size):-1) #define node_setsize(node,new_size) (node?(node->size=new_size):-1) /* allocates a new node, seta all data to zero Returns: new node */ Node *node_new (); Node *node_duplicate (Node *node); /* frees a node an it's related variables */ void node_free (Node *node); #endif /* NODE_H */