Newer
Older
(*----------------------------------------------------------------------
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
Erwan Jahier
committed
let set_level (l:int) = ( _level := l )
let get_level () = !_level
let printf ?(level=1) s = Printf.kprintf
(fun t -> if (!_level >= level) then (print_string t; flush stdout) else ()) s
if (!_level >= level) then (print_string s; flush stdout)
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
(**** 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;; *)