Skip to content
Snippets Groups Projects
verbose.ml 1.91 KiB
Newer Older
Erwan Jahier's avatar
Erwan Jahier committed
(*----------------------------------------------------------------------
	module : Verbose
	date :
------------------------------------------------------------------------
	description :

	Affichage verbeux avec appel "printf-like" :

Verbose.put "format" args...

N.B. a a l'air de marcher, seul problme c'est peut-tre
     l'efficacit, vu que la string '"format" args...' est
     value mme si on n'est pas en mode verbose ...
     Autrement dit : c'est l'affichage qui est 'bloqu'
     en non-verbose, pas l'valuation du message ... 

N.B. VERSION GORE : le kprintf n'est appel que si besoin,
     sinon c'est une branche "gore" qui est appele :
     - evalue le nb d'args attendu ****ATTENTION = nbre de % !!!
     - "dpile" ces nb args sans rien en faire

----------------------------------------------------------------------*)


(* type msg = string Lazy.t *)

let _level = ref 0

let set_level (l:int) = ( _level := l )
let get_level () = !_level
Erwan Jahier's avatar
Erwan Jahier committed

(**** VERSION PAS TROP GORE *****)
let printf ?(level=1) s = Printf.kprintf
  (fun t -> if (!_level >= level) then (print_string t; flush stdout) else ()) s
let print_string ?(level=1) s = 
  if (!_level >= level) then (print_string s; flush stdout)
Erwan Jahier's avatar
Erwan Jahier committed

(**** VERSION GORE *****)
(*
let count_args s = (
	let max = (String.length s) -1  in
	let res = ref 0 in
	for i = 0 to max do
		if ((String.unsafe_get s i) = '%') 
		then (incr res)
		else ()
	done;
	!res
) 

let put s = (
	if (!_level > 0) then (
		(* let toto = string_of_format s in *)
		(* print_string toto ; flush stdout; *)
		Printf.kprintf (fun t -> prerr_string t) s 
	) else (
		let toto = string_of_format s in
		(* print_string toto ; flush stdout; *)
		let rec f n x = (
		Printf.printf "appel de f %d\n" n; flush stdout;
			if (n > 0) then (
				Obj.magic (f (n-1))
			) else (Obj.magic ())
		) in
		let nbargs = count_args toto in 
		Obj.magic ( f nbargs)
	)
)
*)

(* put "%d %s %d\n" 42 "toto" 43; flush stderr;; *)