let width = ref 78
+let replace = ref false
+
+let string_length_utf8 s =
+ let l = String.length s in
+ let rec aux r i =
+ if i >= l then r else
+ if '\x80' <= s.[i] && s.[i] <= '\xBF'
+ then aux (succ r) (succ i) else aux r (succ i)
+ in
+ l - aux 0 0
+
let complete s =
- let l = !width - String.length s - 6 in
+ let l = !width - string_length_utf8 s - 6 in
if l < 0 then begin
Printf.eprintf "overfull: %S\n" s;
""
| ET.Text s ->
Printf.fprintf och "%s" s
| ET.Mark s ->
- Printf.fprintf och "(* %s**)" s
+ Printf.fprintf och "(* *%s*)" s
| ET.Key (s1, s2) ->
- Printf.fprintf och "(* %s1%s2*)" s1 s2
+ Printf.fprintf och "(* %s%s*)" s1 s2
| ET.Title ss ->
let s = String.concat " " ss in
Printf.fprintf och "(* %s %s*)" s (complete s)
Printf.fprintf och "%s%s%s" s1 s2 s3
let write_srcs file srcs =
- let och = open_out (file ^ ".new") in
+ let target =
+ if !replace then begin
+ Sys.rename file (file ^ ".old");
+ file
+ end else begin
+ file ^ ".new"
+ end
+ in
+ let och = open_out target in
List.iter (out_src och) srcs;
close_out och