X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2FnodeSet.ml;h=fc0bb0e776093d85a3167939aa90fcebb205fbbd;hb=cb728132e1c5cb0a171ee09e9b3ced16da08f796;hp=142476be16f232230f8e0bddf0aecce3baca5f79;hpb=577e04ded43baa0582530316da40777884031dc8;p=SXSI%2Fxpathcomp.git diff --git a/src/nodeSet.ml b/src/nodeSet.ml index 142476b..fc0bb0e 100644 --- a/src/nodeSet.ml +++ b/src/nodeSet.ml @@ -24,7 +24,7 @@ module type S = val iter : ( elt -> unit) -> t -> unit val fold : ( elt -> 'a -> 'a) -> t -> 'a -> 'a val length : t -> int - val serialize : string -> Tree.t -> t -> unit + val serialize : string -> bool -> Tree.t -> t -> unit end @@ -52,7 +52,13 @@ module Count : S with type t = int = let fold _ _ _ = failwith "fold not implemented" let map _ _ = failwith "map not implemented" let length x = x - let serialize _ _ _ = () + let serialize f b _ x = + let o = open_out f in + if not b then output_string o "\n"; + output_string o (string_of_int x); + output_char o '\n'; + if not b then output_string o "\n"; + close_out o end type clist = @@ -100,23 +106,30 @@ module Mat : S with type t = Tree.node mat = let conscat4 e l1 l2 l3 l4 = conscat e l1 (concat l2 (concat l3 l4)) let subtree_tags tree node tag = - { clist = SubtreeTags(tree, node, tag); - length = Tree.subtree_tags tree node tag } + let len = Tree.subtree_tags tree node tag in + if len == 0 then empty + else + { clist = SubtreeTags(tree, node, tag); + length = len } + let subtree_elements tree node = - { clist = SubtreeElts(tree, node); - length = Tree.subtree_elements tree node } + let len = Tree.subtree_elements tree node in + if len == 0 then empty + else + { clist = SubtreeElts(tree, node); + length = len } let fst_tagged tree t tag = if Tree.tag tree t == tag then t else Tree.tagged_descendant tree t tag - let fst_element tree t = +(* + let fst_element tree t = let tag = Tree.tag tree t in - let t = if Ptset.Int.mem tag - (Ptset.Int.remove Tag.document_node (Tree.element_tags tree)) - then t - else Tree.first_element tree t - in Tree.first_element tree t + if tag == Tag.document_node then + Tree.first_element tree t + else t +*) let element_fold f tree t acc = let rec loop node acc = @@ -126,17 +139,11 @@ module Mat : S with type t = Tree.node mat = let acc' = loop (Tree.first_element tree node) acc in loop (Tree.next_element tree node) acc' in - loop (fst_element tree t) acc + let t' = Tree.first_element tree t in loop t' acc let element_iter f tree t = - let rec loop node = - if node != Tree.nil then begin - f node; - loop (Tree.first_element tree node); - loop (Tree.next_element tree node) - end - in - let t' = fst_element tree t in loop t' + let newf = fun e () -> f e in + element_fold newf tree t () let tag_fold f tree t tag acc = let rec loop close node acc = @@ -185,17 +192,19 @@ module Mat : S with type t = Tree.node mat = let length l = l.length - let serialize name v l = + let serialize name b v l = let fd, finish = if name = "-" then Unix.stdout, ignore else Unix.openfile name [ Unix.O_WRONLY; Unix.O_TRUNC; Unix.O_CREAT ] 0o666, Unix.close in - ignore (Unix.write fd "\n" 0 13); - iter (fun node -> Tree.print_xml v node fd) l; - Tree.flush v fd; - ignore (Unix.write fd "\n" 0 14); + if not b then ignore (Unix.write fd "\n" 0 13); + if l.length > 0 then begin + iter (fun node -> Tree.print_xml v node fd) l; + Tree.flush v fd; + end; + if not b then ignore (Unix.write fd "\n" 0 14); finish fd end