X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fregistry%2Fhelm_registry.ml;h=b0fcdab857f417474e1e3f8d3476e47a9c2b6862;hb=5c9e1997848c2f74297a5a243679f4bcb6ae0dc7;hp=a845cb576e2017083a18230e66de0ce766295a93;hpb=bae55b6a8409d2a5b852544c26283a926ba01abf;p=helm.git diff --git a/helm/ocaml/registry/helm_registry.ml b/helm/ocaml/registry/helm_registry.ml index a845cb576..b0fcdab85 100644 --- a/helm/ocaml/registry/helm_registry.ml +++ b/helm/ocaml/registry/helm_registry.ml @@ -27,7 +27,7 @@ open Printf let debug = false let debug_print s = - if debug then prerr_endline ("Helm_registry debugging: " ^ s) + if debug then prerr_endline ("Helm_registry debugging: " ^ (Lazy.force s)) (** *) @@ -118,7 +118,7 @@ let key_is_valid key = raise (Malformed_key key) let set' registry ~key ~value = - debug_print (sprintf "Setting %s = %s" key value); + debug_print (lazy (sprintf "Setting %s = %s" key value)); key_is_valid key; Hashtbl.add registry key value @@ -242,9 +242,9 @@ let xml_tree_of_registry registry = | _ -> assert false in Hashtbl.fold - (fun k v tree -> add_key ("helm_registry" :: (Str.split dot_RE k)) v tree) + (fun k v tree -> add_key ((Str.split dot_RE k)) v tree) registry - (Element ("helm_registry", [], [])) + (Element (root_tag, [], [])) let rec stream_of_xml_tree = function | Cdata s -> Xml.xml_cdata s @@ -262,17 +262,21 @@ let save_to registry fname = Xml.pp_to_outchan token_stream oc; close_out oc -let load_from_absolute registry fname = - let path = ref [] in (*
elements entered so far *) +let rec load_from_absolute ?path registry fname = + let _path = ref (match path with None -> [] | Some p -> p)in + (*
elements entered so far *) let in_key = ref false in (* have we entered a element? *) let cdata = ref "" in (* collected cdata (inside *) - let push_path name = path := name :: !path in - let pop_path () = path := List.tl !path in + let push_path name = _path := name :: !_path in + let pop_path () = _path := List.tl !_path in let start_element tag attrs = match tag, attrs with | "section", ["name", name] -> push_path name | "key", ["name", name] -> in_key := true; push_path name | "helm_registry", _ -> () + | "include", ["href", fname] -> + debug_print (lazy ("including file " ^ fname)); + load_from_absolute ~path:!_path registry fname | tag, _ -> raise (Parse_error (fname, ~-1, ~-1, (sprintf "unexpected element <%s> or wrong attribute set" tag))) @@ -281,12 +285,12 @@ let load_from_absolute registry fname = match tag with | "section" -> pop_path () | "key" -> - let key = String.concat "." (List.rev !path) in + let key = String.concat "." (List.rev !_path) in set registry ~key ~value:!cdata; cdata := ""; in_key := false; pop_path () - | "helm_registry" -> () + | "include" | "helm_registry" -> () | _ -> assert false in let character_data text = @@ -300,7 +304,7 @@ let load_from_absolute registry fname = } in let xml_parser = XmlPushParser.create_parser callbacks in let backup = backup_registry registry in - Hashtbl.clear registry; + if path = None then Hashtbl.clear registry; try XmlPushParser.parse xml_parser (`File fname) with exn ->