(* Copyright (C) 2005, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://helm.cs.unibo.it/ *) exception Checksum_failure of string exception Corrupt_moo of string exception Version_mismatch of string type ast_command = (Cic.term, Cic.obj) GrafiteAst.command type moo = ast_command list let marshal_flags = [] let rehash_cmd_uris = let rehash_uri uri = UriManager.uri_of_string (UriManager.string_of_uri uri) in function | GrafiteAst.Default (loc, name, uris) -> let uris = List.map rehash_uri uris in GrafiteAst.Default (loc, name, uris) | GrafiteAst.Interpretation (loc, dsc, args, cic_appl_pattern) -> let rec aux = function | CicNotationPt.UriPattern uri -> CicNotationPt.UriPattern (rehash_uri uri) | CicNotationPt.ApplPattern args -> CicNotationPt.ApplPattern (List.map aux args) | CicNotationPt.VarPattern _ | CicNotationPt.ImplicitPattern as pat -> pat in let appl_pattern = aux cic_appl_pattern in GrafiteAst.Interpretation (loc, dsc, args, appl_pattern) | GrafiteAst.Coercion (loc, term, close) -> GrafiteAst.Coercion (loc, CicUtil.rehash_term term, close) | GrafiteAst.Notation _ | GrafiteAst.Alias _ as cmd -> cmd | cmd -> prerr_endline "Found a command not expected in a .moo:"; prerr_endline (GrafiteAstPp.pp_cic_command cmd); assert false (** .moo 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 GrafiteAst.command *) let save_moo ~fname moo = let oc = open_out fname in let marshalled = Marshal.to_string (List.rev moo) marshal_flags in let checksum = Hashtbl.hash marshalled in output_binary_int oc GrafiteAst.magic; output_binary_int oc checksum; output_string oc marshalled; close_out oc let load_moo ~fname = let ic = open_in fname in HExtlib.finally (fun () -> close_in ic) (fun () -> try let moo_magic = input_binary_int ic in if moo_magic <> GrafiteAst.magic then raise (Version_mismatch fname); let moo_checksum = input_binary_int ic in let marshalled = HExtlib.input_all ic in let checksum = Hashtbl.hash marshalled in if checksum <> moo_checksum then raise (Checksum_failure fname); let (moo:moo) = Marshal.from_string marshalled 0 in List.map rehash_cmd_uris moo with End_of_file -> raise (Corrupt_moo fname)) ()