diff options
author | Clément Pit--Claudel <clement.pitclaudel@live.com> | 2015-04-23 01:14:49 -0400 |
---|---|---|
committer | Enrico Tassi <Enrico.Tassi@inria.fr> | 2015-05-04 13:17:23 +0200 |
commit | 2a295131a1a72dd56e6e7abdeaeca07b1b69ab6d (patch) | |
tree | f23c8dc1ce9238ebf5cb05f61f57aa21dd8ee8ca /lib/pp.ml | |
parent | f19d0c7baf91fb410de77baed391b0a16db9c4e2 (diff) |
Add a [Redirect] vernacular command
The command [Redirect "filename" (...)] redirects all the output of
[(...)] to file "filename.out". This is useful for storing the results of
an [Eval compute], for redirecting the results of a large search, for
automatically generating traces of interesting developments, and so on.
Diffstat (limited to 'lib/pp.ml')
-rw-r--r-- | lib/pp.ml | 21 |
1 files changed, 21 insertions, 0 deletions
@@ -448,6 +448,27 @@ let logger = ref std_logger let make_pp_emacs() = print_emacs:=true; logger:=emacs_logger let make_pp_nonemacs() = print_emacs:=false; logger := std_logger +let ft_logger old_logger ft ~id level mesg = match level with + | Debug _ -> msgnl_with ft (debugbody mesg) + | Info -> msgnl_with ft (infobody mesg) + | Notice -> msgnl_with ft mesg + | Warning -> old_logger ~id:id level mesg + | Error -> old_logger ~id:id level mesg + +let with_output_to_file fname func input = + let old_logger = !logger in + let channel = open_out (String.concat "." [fname; "out"]) in + logger := ft_logger old_logger (Format.formatter_of_out_channel channel); + try + let output = func input in + logger := old_logger; + close_out channel; + output + with reraise -> + let reraise = Backtrace.add_backtrace reraise in + logger := old_logger; + close_out channel; + Exninfo.iraise reraise let feedback_id = ref (Feedback.Edit 0) let feedback_route = ref Feedback.default_route |