CAMLreturn (caml_copy_string(tag));
}
+extern "C" CAMLprim value caml_xml_tree_tag_name(value tree, value tagid){
+ CAMLparam2(tree,tagid);
+ const char* tag;
+ tag = (const char*) XMLTREE(tree)->GetTagName((TagType) (Int_val(tagid)));
+
+ CAMLreturn (caml_copy_string(tag));
+}
+
+
extern "C" CAMLprim value caml_xml_tree_tag_id(value tree,value id){
CAMLparam2(tree,id);
CAMLreturn (Val_int(XMLTREE(tree)->Tag(TREENODEVAL(id))));
unsigned char* tag;
tag = (unsigned char*) (String_val(str));
id = Val_int(XMLTREE(tree)->RegisterTag(tag));
- free(tag);
CAMLreturn (id);
}
let main filename query output =
-
(* Just a trick to allow the C++ code to print debugging stuff first *)
let v = time (fun () -> let v = Tree.Binary.parse_xml_uri filename;
in Printf.eprintf "Parsing document : %!";v
) ()
in
+ let _ = Tag.init (Tree.Binary.tag_pool v) in
MM(v,__LOCATION__);
Printf.eprintf "Parsing query : ";
let query = try
(* Distributed under the terms of the LGPL (see LICENCE) *)
(******************************************************************************)
(* maybe utf8 string... *)
-module T =
-struct
- type t = string
-
- (* special tag which denotes attribute nodes, should not be a valid
- xml tag name *)
- let attribute = "<@>"
- (* Likewise for strings *)
- let pcdata = "<$>"
-
- let compare : t -> t -> int = String.compare
-
- let hash (s:t) =
- let rec loop acc = function
- | -1 -> acc
- | n -> loop (( acc lsl 6 ) + (acc lsl 16) - acc + (Char.code s.[n])) (n-1)
-
- in
- loop 0 ((String.length s)-1)
-
- let equal x y = compare x y == 0
-end
-module HMap = Map.Make (struct type t = int let compare x y = x - y end)
-module HTag =
-struct
type t = int
-let attribute = T.hash T.attribute
-let pcdata = T.hash T.pcdata
+type pool
-let pool = ref HMap.empty
+external null_pool : unit -> pool = "caml_xml_tree_nullt"
+external null_tag : unit -> t = "caml_xml_tree_nullt"
+external register_tag : pool -> string -> t = "caml_xml_tree_register_tag"
+external tag_name : pool -> t -> string = "caml_xml_tree_tag_name"
+let nullt = null_tag ()
+let pcdata = max_int
+let attribute = max_int - 1
-let add_pool s =
- let hash = T.hash s in
- pool := HMap.add hash s !pool
-
-let clear_pool () =
- pool := HMap.empty;
- add_pool "";
- add_pool T.attribute;
- add_pool T.pcdata
-
-let _ = clear_pool ()
+let pool = ref (null_pool ())
-let init l =
- clear_pool ()
+let init p = pool := p
-let tag s =
- let hash = T.hash s in
- try
- let s' = HMap.find hash !pool
- in
- if s <> s' then
- failwith (Printf.sprintf "hash conflict s1=%s, s2=%s, %i" s s' hash)
- else hash
- with
- Not_found ->
- add_pool s;
- hash
+let tag s = match s with
+ | "<$>" -> pcdata
+ | "<@>" -> attribute
+ | _ -> register_tag !pool s
-let compare x y = x - y
+let compare = (-)
let equal = (==)
-let hash t = T.hash t
-let print fmt t =
- Format.fprintf fmt "%s" (
- try
- HMap.find t !pool
- with
- Not_found -> failwith (Printf.sprintf "%i not found!" t))
-let to_string x = HMap.find x !pool
+let to_string t =
+ if t = pcdata then "<$>"
+ else if t = attribute then "<@>"
+ else tag_name !pool t
-end
-module STag =
-struct
- type t = string
- let attribute = T.attribute
- let pcdata = T.pcdata
- external tag : string -> t = "%identity"
- external clear_pool : unit -> unit = "%identity"
- let init _ = ()
- let compare = String.compare
- let equal = (=)
- let print fmt s = Format.fprintf fmt "%s" s
- external to_string : t -> string = "%identity"
-end
-
-include STag
+let print ppf t = Format.fprintf ppf "%s" (to_string t)
(* Distributed under the terms of the LGPL (see LICENCE) *)
(******************************************************************************)
type t
+type pool
+
val attribute : t
val pcdata : t
val tag : string -> t
-val init : string array -> unit
-val clear_pool : unit -> unit
+val init : pool -> unit
val compare : t -> t -> int
val equal : t -> t -> bool
val print : Format.formatter -> t -> unit
type t
val parse_xml_uri : string -> t
val parse_xml_string : string -> t
+ val tag_pool : t -> Tag.pool
val string : t -> string
val descr : t -> descr
val left : t -> t
external is_leaf : t -> [`Tree] node -> bool = "caml_xml_tree_is_leaf"
- external tag : t -> [`Tree ] node -> Tag.t = "caml_xml_tree_tag"
- external tag_id : t -> [`Tree ] node -> unit = "caml_xml_tree_tag_id"
+(* external tag : t -> [`Tree ] node -> T = "caml_xml_tree_tag"*)
+ external tag_id : t -> [`Tree ] node -> Tag.t = "caml_xml_tree_tag_id"
let is_last t n = equal nil (next_sibling t n)
begin
Printf.eprintf "Node %i has tag '%s' DocOrder=%i, DocID of PrevText,MyText,NextText : (%i = %s,%i = %s,%i = %s)\n%!"
(int_of_node id)
- (Tag.to_string (tag t id))
+ (Tag.to_string (tag_id t id))
(node_xml_id t id)
(int_of_node (prev_text t id))
(Text.get_text t (prev_text t id))
let parse_xml_uri str = node_of_t (parse_xml_uri str)
let parse_xml_string str = node_of_t (parse_xml_string str)
+
+ external pool : doc -> Tag.pool = "%identity"
+ let tag_pool t = pool t.doc
+
let compare a b = match a.node,b.node with
| Node(NC i),Node(NC j) -> compare i j
| _, Node(NC( _ )) -> 1
let tag =
function { node=Node(SC _) } -> Tag.pcdata
- | { doc=d; node=Node(NC n)} -> tag d n
- | _ -> failwith "Tag"
+ | { doc=d; node=Node(NC n)} -> tag_id d n
+ | _ -> failwith "tag"
- let tag_id =
+(* let tag_id =
function { node=Node(SC _) } -> ()
| { doc=d; node=Node(NC n)} -> tag_id d n
| _ -> ()
-
+*)
let string_below t id =
let pid = parent_doc t.doc id in
match t.node with
type t
val parse_xml_uri : string -> t
val parse_xml_string : string -> t
+ val tag_pool : t -> Tag.pool
val string : t -> string
val descr : t -> descr
val left : t -> t