X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Flexicon%2FlexiconMarshal.ml;h=7b9422db577ad66f1daebad802e362976c7cfb4d;hb=b1527286e32c8651d65619af61e3f638b3b89f8d;hp=bd87a9521358984410ba5461ee8d7fa1a5ca8606;hpb=827e35d6058ebba3a4a4fa6eb3c160f0cd0fd1e8;p=helm.git diff --git a/helm/ocaml/lexicon/lexiconMarshal.ml b/helm/ocaml/lexicon/lexiconMarshal.ml index bd87a9521..7b9422db5 100644 --- a/helm/ocaml/lexicon/lexiconMarshal.ml +++ b/helm/ocaml/lexicon/lexiconMarshal.ml @@ -23,16 +23,22 @@ * http://helm.cs.unibo.it/ *) -exception Checksum_failure of string -exception Corrupt_lexicon of string -exception Version_mismatch of string +(* $Id$ *) type lexicon = LexiconAst.command list -let marshal_flags = [] +let format_name = "lexicon" + +let save_lexicon_to_file ~fname lexicon = + HMarshal.save ~fmt:format_name ~version:LexiconAst.magic ~fname lexicon + +let load_lexicon_from_file ~fname = + let raw = HMarshal.load ~fmt:format_name ~version:LexiconAst.magic ~fname in + (raw: lexicon) let rehash_cmd_uris = - let rehash_uri uri = UriManager.uri_of_string (UriManager.string_of_uri uri) in + let rehash_uri uri = + UriManager.uri_of_string (UriManager.string_of_uri uri) in function | LexiconAst.Interpretation (loc, dsc, args, cic_appl_pattern) -> let rec aux = @@ -53,44 +59,9 @@ let rehash_cmd_uris = prerr_endline (LexiconAstPp.pp_command cmd); assert false -(** .lexicon file format - * - an integer -- magic number -- denoting the version of the dumped data - * structure. Different magic numbers stand for incompatible data structures - * - an integer -- checksum -- denoting the hash value (computed with - * Hashtbl.hash) of the string representation of the dumped data structur - * - marshalled data: list of LexiconAst.command - *) - -let save_lexicon ~fname lexicon = - let ensure_path_exists path = - let dir = Filename.dirname path in - HExtlib.mkdir dir - in - ensure_path_exists fname; - let oc = open_out fname in - let marshalled = Marshal.to_string (List.rev lexicon) marshal_flags in - let checksum = Hashtbl.hash marshalled in - output_binary_int oc LexiconAst.magic; - output_binary_int oc checksum; - output_string oc marshalled; - close_out oc +let save_lexicon ~fname lexicon = save_lexicon_to_file ~fname (List.rev lexicon) let load_lexicon ~fname = - let ic = open_in fname in - HExtlib.finally - (fun () -> close_in ic) - (fun () -> - try - let lexicon_magic = input_binary_int ic in - if lexicon_magic <> LexiconAst.magic then raise (Version_mismatch fname); - let lexicon_checksum = input_binary_int ic in - let marshalled = HExtlib.input_all ic in - let checksum = Hashtbl.hash marshalled in - if checksum <> lexicon_checksum then raise (Checksum_failure fname); - let (lexicon:lexicon) = - Marshal.from_string marshalled 0 - in - List.map rehash_cmd_uris lexicon - with End_of_file -> raise (Corrupt_lexicon fname)) - () + let lexicon = load_lexicon_from_file ~fname in + List.map rehash_cmd_uris lexicon