open Format type t = string type level = int let loggers = [ "parsing"; "indexing"; "top-down-run"; "top-down-approx"; "result-set"; "level2-jit"; "res-jit"; "twopass"; "transition"; "bottom-up" ] let active_loggers : (t, int) Hashtbl.t = Hashtbl.create 17 let margin = List.fold_left (fun m l -> max m (String.length l)) 0 loggers let available () = loggers let is_logger s = List.mem s loggers let level s = try Hashtbl.find active_loggers s with Not_found -> 0 let is_active s = Hashtbl.mem active_loggers s let activate s lvl = if not (is_active s) then Hashtbl.add active_loggers s lvl let deactivate s = Hashtbl.remove active_loggers s let logger_output = ref err_formatter let set_output f = logger_output := f let log t l fmt = if l <= level t then begin pp_open_hovbox !logger_output (margin + 3); fprintf !logger_output "%-.*s : " margin t; kfprintf (fun _ -> pp_close_box !logger_output (); fprintf !logger_output "@?@\n"; ) !logger_output fmt end else ifprintf !logger_output fmt let print ppf fmt = fprintf ppf fmt let _verbose = ref false let set_verbose b = _verbose := b let msg ppf fmt = if !_verbose then fprintf ppf fmt else ifprintf ppf fmt let start_msg ppf s = msg ppf "@[%s" s let end_msg ppf s = msg ppf "@]%s@?" s let verbose a b = msg a b