# sets $tag and $node from $arg0, for internal use only define _ebtree_set_tag_node set $tag = (unsigned long)$arg0 & 0x1 set $node = (unsigned long)$arg0 & 0xfffffffffffffffe set $node = (struct eb_node *)$node end # get root from any node (leaf of node), returns in $node define ebtree_root set $node = (struct eb_root *)$arg0->node_p if $node == 0 # sole node set $node = (struct eb_root *)$arg0->leaf_p end # walk up while 1 _ebtree_set_tag_node $node if $node->branches.b[1] == 0 break end set $node = $node->node_p end # root returned in $node end # returns $node filled with the first node of ebroot $arg0 define ebtree_first # browse ebtree left until encoutering leaf set $node = (struct eb_node *)$arg0->b[0] while 1 _ebtree_set_tag_node $node if $tag == 0 loop_break end set $node = (struct eb_root *)$node->branches.b[0] end # extract last node _ebtree_set_tag_node $node end # finds next ebtree node after $arg0, and returns it in $node define ebtree_next # get parent set $node = (struct eb_root *)$arg0->leaf_p # Walking up from right branch, so we cannot be below root # while (eb_gettag(t) != EB_LEFT) // #define EB_LEFT 0 while 1 _ebtree_set_tag_node $node if $tag == 0 loop_break end set $node = (struct eb_root *)$node->node_p end set $node = (struct eb_root *)$node->branches.b[1] # walk down (left side => 0) # while (eb_gettag(start) == EB_NODE) // #define EB_NODE 1 while 1 _ebtree_set_tag_node $node if $node == 0 loop_break end if $tag != 1 loop_break end set $node = (struct eb_root *)$node->branches.b[0] end end # sets $tag and $node from $arg0, for internal use only define _ebsctree_set_tag_node set $tag = (unsigned long)$arg0 & 0x1 set $node = (unsigned long)$arg0 & 0xfffffffffffffffe set $node = (struct eb32sc_node *)$node end # returns $node filled with the first node of ebroot $arg0 define ebsctree_first # browse ebsctree left until encoutering leaf set $node = (struct eb32sc_node *)$arg0->b[0] while 1 _ebsctree_set_tag_node $node if $tag == 0 loop_break end set $node = (struct eb_root *)$node->branches.b[0] end # extract last node _ebsctree_set_tag_node $node end # finds next ebtree node after $arg0, and returns it in $node define ebsctree_next # get parent set $node = (struct eb_root *)$arg0->node.leaf_p # Walking up from right branch, so we cannot be below root # while (eb_gettag(t) != EB_LEFT) // #define EB_LEFT 0 while 1 _ebsctree_set_tag_node $node if $tag == 0 loop_break end set $node = (struct eb_root *)$node->node.node_p end set $node = (struct eb_root *)$node->node.branches.b[1] # walk down (left side => 0) # while (eb_gettag(start) == EB_NODE) // #define EB_NODE 1 while 1 _ebsctree_set_tag_node $node if $node == 0 loop_break end if $tag != 1 loop_break end set $node = (struct eb_root *)$node->node.branches.b[0] end end