X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;ds=inline;f=src%2FnodeSet.ml;h=c2265b2d7430f1ee5b4b4cbcc6971e04acdbee10;hb=3fbeef47be08dd39be31af8dedfcdda30ac63f6f;hp=142476be16f232230f8e0bddf0aecce3baca5f79;hpb=577e04ded43baa0582530316da40777884031dc8;p=SXSI%2Fxpathcomp.git
diff --git a/src/nodeSet.ml b/src/nodeSet.ml
index 142476b..c2265b2 100644
--- a/src/nodeSet.ml
+++ b/src/nodeSet.ml
@@ -52,7 +52,12 @@ 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 _ x =
+ let o = open_out f in
+ output_string o "\n";
+ output_string o (string_of_int x);
+ output_string o "\n\n";
+ close_out o
end
type clist =
@@ -100,23 +105,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 +138,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 =
@@ -193,8 +199,10 @@ module Mat : S with type t = Tree.node mat =
Unix.close
in
ignore (Unix.write fd "\n" 0 13);
- iter (fun node -> Tree.print_xml v node fd) l;
- Tree.flush v fd;
+ if l.length > 0 then begin
+ iter (fun node -> Tree.print_xml v node fd) l;
+ Tree.flush v fd;
+ end;
ignore (Unix.write fd "\n" 0 14);
finish fd