(****************************************************************************)
(*                                                                          *)
(*                                   OCaml                                  *)
(*                                                                          *)
(*                            INRIA Rocquencourt                            *)
(*                                                                          *)
   Copyright   2006    Institut National de Recherche   en   Informatique et   
   en Automatique .   All rights reserved .   This file is distributed under   
   the terms of the GNU Library General Public License , with the special   
(*  exception on linking described in LICENSE at the top of the Camlp4      *)
(*  source tree.                                                            *)
(*                                                                          *)
(****************************************************************************)

  Authors : 
  * - Daniel de Rauglaudre : initial version 
  * -   : refactoring 
 
 * - Daniel de Rauglaudre: initial version
 * - Nicolas Pouillard: refactoring
 *)

module Id : Sig.Id = struct
  value name = "Camlp4Printers.DumpOCamlAst";
  value version = Sys.ocaml_version;
end;

module Make (Syntax : Sig.Camlp4Syntax)
: (Sig.Printer Syntax.Ast).S
= struct
  include Syntax;
  module Ast2pt = Struct.Camlp4Ast2OCamlAst.Make Ast;

  value with_open_out_file x f =
    match x with
    [ Some file -> do { let oc = open_out_bin file;
                        f oc;
                        flush oc;
                        close_out oc }
    | None -> do { set_binary_mode_out stdout True; f stdout; flush stdout } ];

  value dump_pt magic fname pt oc = do {
    output_string oc magic;
    output_value oc (if fname = "-" then "" else fname);
    output_value oc pt;
  };

  value print_interf ?(input_file = "-") ?output_file ast =
    let pt = Ast2pt.sig_item ast in
    with_open_out_file output_file (dump_pt Camlp4_config.ocaml_ast_intf_magic_number input_file pt);

  value print_implem ?(input_file = "-") ?output_file ast =
    let pt = Ast2pt.str_item ast in
    with_open_out_file output_file (dump_pt Camlp4_config.ocaml_ast_impl_magic_number input_file pt);

end;

**************************************************************************
                                                                          
                                   OCaml                                  
                                                                          
                            INRIA Rocquencourt                            
                                                                          
  exception on linking described in LICENSE at the top of the Camlp4      
  source tree.                                                            
                                                                          
**************************************************************************
   Copyright   2006    Institut National de Recherche   en   Informatique et   
   en Automatique .   All rights reserved .   This file is distributed under   
   the terms of the GNU Library General Public License , with the special   

  Authors : 
  * - Daniel de Rauglaudre : initial version 
  * -   : refactoring 
 
 * - Daniel de Rauglaudre: initial version
 * - Nicolas Pouillard: refactoring
 *)

module Id : Sig.Id = struct
  value name = "Camlp4Printers.DumpOCamlAst";
  value version = Sys.ocaml_version;
end;

module Make (Syntax : Sig.Camlp4Syntax)
: (Sig.Printer Syntax.Ast).S
= struct
  include Syntax;
  module Ast2pt = Struct.Camlp4Ast2OCamlAst.Make Ast;

  value with_open_out_file x f =
    match x with
    [ Some file -> do { let oc = open_out_bin file;
                        f oc;
                        flush oc;
                        close_out oc }
    | None -> do { set_binary_mode_out stdout True; f stdout; flush stdout } ];

  value dump_pt magic fname pt oc = do {
    output_string oc magic;
    output_value oc (if fname = "-" then "" else fname);
    output_value oc pt;
  };

  value print_interf ?(input_file = "-") ?output_file ast =
    let pt = Ast2pt.sig_item ast in
    with_open_out_file output_file (dump_pt Camlp4_config.ocaml_ast_intf_magic_number input_file pt);

  value print_implem ?(input_file = "-") ?output_file ast =
    let pt = Ast2pt.str_item ast in
    with_open_out_file output_file (dump_pt Camlp4_config.ocaml_ast_impl_magic_number input_file pt);

end;
