X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fnaive_tree.ml;h=33c953df3e85cf3197a4a503eeb1768e4138e2cf;hp=65ef3345ac45757f7555fd046422c3d33132d2de;hb=aade6d9ba2e2b65e021de8a1c3a2d3874aa5742e;hpb=5b5dcd45cf86701ccfe917c1d6ad73b83bb523c3 diff --git a/src/naive_tree.ml b/src/naive_tree.ml index 65ef334..33c953d 100644 --- a/src/naive_tree.ml +++ b/src/naive_tree.ml @@ -13,10 +13,6 @@ (* *) (***********************************************************************) -(* - Time-stamp: -*) - type node = { tag : QName.t; preorder : int; @@ -54,6 +50,7 @@ let rec dummy = { type t = { root : node; size : int; + by_preorder : node array; (* TODO add other intersting stuff *) } @@ -211,8 +208,19 @@ struct Expat.final psr; let root = List.hd ctx.stack in root.next_sibling <- nil; + let a = Array.create ctx.current_preorder nil in + let rec loop n = + if n != nil then + begin + a.(n.preorder) <- n; + loop n.first_child; + loop n.next_sibling; + end + in + loop root; { root = root; - size = ctx.current_preorder + size = ctx.current_preorder; + by_preorder = a } ) @@ -321,5 +329,7 @@ let tag _ n = n.tag let data _ n = n.data let kind _ n = n.kind let preorder _ n = n.preorder - +let by_preorder t i = + if i >= 0 && i < t.size then Array.unsafe_get t.by_preorder i + else let e = Invalid_argument "by_preorder" in raise e let print_node fmt n = Parser.debug_node fmt n