(***********************************************************************) (* v * The Coq Proof Assistant / The Coq Development Team *) (* nc := 0 (* ascii char *) | '\128'..'\191' -> nc := 0 (* cannot start with a continuation byte *) | '\192'..'\223' -> nc := 1 (* expect 1 continuation byte *) | '\224'..'\239' -> nc := 2 (* expect 2 continuation bytes *) | '\240'..'\247' -> nc := 3 (* expect 3 continuation bytes *) | '\248'..'\251' -> nc := 4 (* expect 4 continuation bytes *) | '\252'..'\253' -> nc := 5 (* expect 5 continuation bytes *) | '\254'..'\255' -> nc := 0 (* invalid byte *) end ; incr p ; while !p < len && !nc > 0 do match s.[!p] with | '\128'..'\191' (* next continuation byte *) -> incr p ; decr nc | _ (* not a continuation byte *) -> nc := 0 done ; incr cnt done ; !cnt (* formatting commands *) let str s = [< 'Ppcmd_print (utf8_length s,s) >] let stras (i,s) = [< 'Ppcmd_print (i,s) >] let brk (a,b) = [< 'Ppcmd_print_break (a,b) >] let tbrk (a,b) = [< 'Ppcmd_print_tbreak (a,b) >] let tab () = [< 'Ppcmd_set_tab >] let fnl () = [< 'Ppcmd_force_newline >] let pifb () = [< 'Ppcmd_print_if_broken >] let ws n = [< 'Ppcmd_white_space n >] (* derived commands *) let mt () = [< >] let spc () = [< 'Ppcmd_print_break (1,0) >] let cut () = [< 'Ppcmd_print_break (0,0) >] let align () = [< 'Ppcmd_print_break (0,0) >] let int n = str (string_of_int n) let real r = str (string_of_float r) let bool b = str (string_of_bool b) let rec escape_string s = let rec escape_at s i = if i<0 then s else if s.[i] == '\\' || s.[i] == '"' then let s' = String.sub s 0 i^"\\"^String.sub s i (String.length s - i) in escape_at s' (i-1) else escape_at s (i-1) in escape_at s (String.length s - 1) let qstring s = str ("\""^(escape_string s)^"\"") let qs = qstring (* boxing commands *) let h n s = [< 'Ppcmd_box(Pp_hbox n,s) >] let v n s = [< 'Ppcmd_box(Pp_vbox n,s) >] let hv n s = [< 'Ppcmd_box(Pp_hvbox n,s) >] let hov n s = [< 'Ppcmd_box(Pp_hovbox n,s) >] let t s = [< 'Ppcmd_box(Pp_tbox,s) >] (* Opening and closing of boxes *) let hb n = [< 'Ppcmd_open_box(Pp_hbox n) >] let vb n = [< 'Ppcmd_open_box(Pp_vbox n) >] let hvb n = [< 'Ppcmd_open_box(Pp_hvbox n) >] let hovb n = [< 'Ppcmd_open_box(Pp_hovbox n) >] let tb () = [< 'Ppcmd_open_box Pp_tbox >] let close () = [< 'Ppcmd_close_box >] let tclose () = [< 'Ppcmd_close_tbox >] let (++) = Stream.iapp (* pretty printing functions *) let pp_dirs ft = let maxbox = (get_gp ft).max_depth in let pp_open_box = function | Pp_hbox n -> Format.pp_open_hbox ft () | Pp_vbox n -> Format.pp_open_vbox ft n | Pp_hvbox n -> Format.pp_open_hvbox ft n | Pp_hovbox n -> Format.pp_open_hovbox ft n | Pp_tbox -> Format.pp_open_tbox ft () in let rec pp_cmd = function | Ppcmd_print(n,s) -> Format.pp_print_as ft n s | Ppcmd_box(bty,ss) -> (* Prevent evaluation of the stream! *) pp_open_box bty ; if not (Format.over_max_boxes ()) then Stream.iter pp_cmd ss; Format.pp_close_box ft () | Ppcmd_open_box bty -> pp_open_box bty | Ppcmd_close_box -> Format.pp_close_box ft () | Ppcmd_close_tbox -> Format.pp_close_tbox ft () | Ppcmd_white_space n -> Format.pp_print_break ft n 0 | Ppcmd_print_break(m,n) -> Format.pp_print_break ft m n | Ppcmd_set_tab -> Format.pp_set_tab ft () | Ppcmd_print_tbreak(m,n) -> Format.pp_print_tbreak ft m n | Ppcmd_force_newline -> Format.pp_force_newline ft () | Ppcmd_print_if_broken -> Format.pp_print_if_newline ft () in let pp_dir = function | Ppdir_ppcmds cmdstream -> Stream.iter pp_cmd cmdstream | Ppdir_print_newline -> Format.pp_print_newline ft () | Ppdir_print_flush -> Format.pp_print_flush ft () in fun dirstream -> try Stream.iter pp_dir dirstream with | e -> Format.pp_print_flush ft () ; raise e (* pretty print on stdout and stderr *) let pp_std_dirs = pp_dirs !std_ft let pp_err_dirs = pp_dirs err_ft let ppcmds x = Ppdir_ppcmds x (* pretty printing functions WITHOUT FLUSH *) let pp_with ft strm = pp_dirs ft [< 'Ppdir_ppcmds strm >] let ppnl_with ft strm = pp_dirs ft [< 'Ppdir_ppcmds [< strm ; 'Ppcmd_force_newline >] >] let warning_with ft string = ppnl_with ft [< str "Warning: " ; str string >] let warn_with ft pps = ppnl_with ft [< str "Warning: " ; pps >] let pp_flush_with ft = Format.pp_print_flush ft (* pretty printing functions WITH FLUSH *) let msg_with ft strm = pp_dirs ft [< 'Ppdir_ppcmds strm ; 'Ppdir_print_flush >] let msgnl_with ft strm = pp_dirs ft [< 'Ppdir_ppcmds strm ; 'Ppdir_print_newline >] let msg_warning_with ft strm= pp_dirs ft [< 'Ppdir_ppcmds [< str "Warning: "; strm>]; 'Ppdir_print_newline >] (* pretty printing functions WITHOUT FLUSH *) let pp x = pp_with !std_ft x let ppnl x = ppnl_with !std_ft x let pperr = pp_with err_ft let pperrnl = ppnl_with err_ft let message s = ppnl (str s) let warning x = warning_with err_ft x let warn x = warn_with err_ft x let pp_flush x = Format.pp_print_flush !std_ft x let flush_all() = flush stderr; flush stdout; pp_flush() (* pretty printing functions WITH FLUSH *) let msg x = msg_with !std_ft x let msgnl x = msgnl_with !std_ft x let msgerr = msg_with err_ft let msgerrnl = msgnl_with err_ft let msg_warning x = msg_warning_with err_ft x