aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/pp.ml
diff options
context:
space:
mode:
authorGravatar Clément Pit--Claudel <clement.pitclaudel@live.com>2015-04-23 01:14:49 -0400
committerGravatar Enrico Tassi <Enrico.Tassi@inria.fr>2015-05-04 13:17:23 +0200
commit2a295131a1a72dd56e6e7abdeaeca07b1b69ab6d (patch)
treef23c8dc1ce9238ebf5cb05f61f57aa21dd8ee8ca /lib/pp.ml
parentf19d0c7baf91fb410de77baed391b0a16db9c4e2 (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.ml21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/pp.ml b/lib/pp.ml
index 9667f7270..30bc30a9a 100644
--- a/lib/pp.ml
+++ b/lib/pp.ml
@@ -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