7796b7356f428758c439300aa93e4d230a72b1f1
[SXSI/xpathcomp.git] / src / logger.ml
1 open Format
2
3 type t = string
4 type level = int
5
6 let loggers = [ "top-down-run";
7                 "top-down-approx";
8                 "result-set";
9                 "level2-jit";
10                 "res-jit";
11                 "twopass";
12                 "transition";
13                 "bottom-up" ]
14 let active_loggers : (t, int) Hashtbl.t = Hashtbl.create 17
15 let margin = List.fold_left (fun m l -> max m (String.length l)) 0 loggers
16 let available () = loggers
17
18 let is_logger s = List.mem s loggers
19 let level s = try Hashtbl.find active_loggers s with Not_found -> 0
20 let is_active s = Hashtbl.mem active_loggers s
21 let activate s lvl = if not (is_active s) then Hashtbl.add active_loggers s lvl
22 let deactivate s = Hashtbl.remove active_loggers s
23
24 let logger_output = ref err_formatter
25 let set_output f = logger_output := f
26
27 let log t l fmt =
28   if l <= level t
29   then begin
30     pp_open_hovbox !logger_output (margin + 3);
31     fprintf !logger_output "%-.*s : " margin t;
32     kfprintf (fun _ ->
33       pp_close_box !logger_output ();
34       fprintf !logger_output "@?@\n";
35     ) !logger_output fmt
36   end
37   else
38     ifprintf !logger_output fmt
39
40 let print ppf fmt =
41   pp_open_hovbox ppf 0;
42   kfprintf (fun _ ->
43     pp_close_box ppf ();
44     fprintf ppf "@?")
45     ppf fmt