(* 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 let marshal_flags = [] (** .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 pair: first component is a list of GrafiteAst.command (real moo * content), second component is a list of GrafiteAst.metadata *) let save_moo ~fname (moo, metadata) = let oc = open_out fname in let marshalled = Marshal.to_string (List.rev moo, List.rev metadata) 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: MatitaTypes.moo) = Marshal.from_string marshalled 0 in moo with End_of_file -> raise (Corrupt_moo fname)) ()