(***********************************************************************) (* *) (* TAToo *) (* *) (* Kim Nguyen, LRI UMR8623 *) (* Université Paris-Sud & CNRS *) (* *) (* Copyright 2010-2012 Université Paris-Sud and Centre National de la *) (* Recherche Scientifique. All rights reserved. This file is *) (* distributed under the terms of the GNU Lesser General Public *) (* License, with the special exception on linking described in file *) (* ../LICENSE. *) (* *) (***********************************************************************) open Format exception InvalidUtf8Codepoint of int let subscripts = "₀₁₂₃₄₅₆₇₈₉" let superscripts = "⁰¹²³⁴⁵⁶⁷⁸⁹" let char_length c = let code = Char.code c in if code <= 0x7f then 1 else if 0xc2 <= code && code <= 0xdf then 2 else if 0xe0 <= code && code <= 0xef then 3 else if 0xf0 <= code && code <= 0xf4 then 4 else raise (InvalidUtf8Codepoint code) let next_char s i len = let n = i + char_length s.[i] in if n >= len then -1 else n let str_len s = let len = String.length s in let rec loop i acc = if i == -1 then acc else loop (next_char s i len) (acc+1) in loop 0 0 let length = str_len let get_char s i = let len = String.length s in let rec loop j count = if count == i then String.sub s j (char_length s.[j]) else loop (next_char s j len) (count+1) in loop 0 0 let format_number digits i = let s = string_of_int i in let len = String.length s in let buf = Buffer.create (len*4) in for i = 0 to len - 1 do let d = Char.code s.[i] - Char.code '0' in Buffer.add_string buf (get_char digits d) done; Buffer.contents buf let rev_explode s = let len = str_len s in let rec loop i acc = if i >= len then acc else loop (i+1) ((get_char s i) :: acc) in loop 0 [] let explode s = List.rev (rev_explode s) let combine_all comp s = let l = rev_explode s in String.concat "" (List.fold_left (fun acc e -> comp::e::acc) [] l) let subscript = format_number subscripts let superscript = format_number superscripts let down_arrow = "↓" let up_arrow = "↑" let right_arrow = "→" let left_arrow = "←" let epsilon = "ϵ" let bullet = "•" let big_sigma = "∑" let cap = "∩" let cup = "∪" let lnot = "¬" let wedge = "∧" let vee = "∨" let top = "⊤" let bottom = "⊥" let dummy = "☠" let inverse = "⁻¹" let double_right_arrow = "⇒" let combining_overbar = "\204\133" let combining_underbar = "\204\178" let combining_stroke = "\204\182" let combining_vertical_line = "\226\131\146" let overline s = combine_all combining_overbar s let underline s = combine_all combining_underbar s let strike s = combine_all combining_stroke s let padding i = String.make i ' ' let line i = String.make i '_' let ppf f fmt s = pp_print_string fmt (f s) let pp_overline = ppf overline let pp_underline = ppf underline let pp_strike = ppf strike let pp_subscript = ppf subscript let pp_superscript = ppf superscript let dummy_printer _ () = () let pp_print_list ?(sep=dummy_printer) printer fmt l = match l with [] -> () | [ e ] -> printer fmt e | e :: es -> printer fmt e; List.iter (fun x -> sep fmt (); fprintf fmt "%a" printer x) es let pp_print_array ?(sep=dummy_printer) printer fmt a = pp_print_list ~sep:sep printer fmt (Array.to_list a) let print_list ?(sep=" ") printer fmt l = let sep_printer fmt () = pp_print_string fmt sep in pp_print_list ~sep:sep_printer printer fmt l let print_array ?(sep=" ") printer fmt a = print_list ~sep:sep printer fmt (Array.to_list a)