"Quit Undo Redo Cut Copy Paste | Send Find "
(* font settings *)
-let font = strvar "tide.ui.tags.edit" "Verdana:size=11"
+let font = strvar "tide.ui.tags.edit" "Verdana:size=10"
let line_spacing = intvar "tide.ui.line_spacing" 1
(* user interface related options *)
else
pos
+let runeerr msg =
+ print_endline msg; 0xFFFD
+
let rec decode rope i len rune =
- let byte = (getc rope i) in
- if len == 0 then
- (rune, i)
- else if not (is_cont_byte byte) then
- (0xFFFD, i)
+ if len == 0 then (rune, i)
else
- decode rope (i + 1) (len - 1) ((rune lsl 6) lor (byte land 0x3F))
+ let byte = (getc rope i) in
+ if not (is_cont_byte byte) then
+ (runeerr "missing cont. byte", i)
+ else
+ decode rope (i + 1) (len - 1) ((rune lsl 6) lor (byte land 0x3F))
let get_rune rope i =
let byte = (getc rope i) in
- if byte < 128 then
- (byte, i+1)
- else if byte >= 245 || byte == 192 || byte == 193 then
- (0xFFFD, i+1)
+ if byte == 192 || byte == 193 then
+ (runeerr "invalid utf8 byte", i + 1)
else
- let byte = (getc rope i) in
- let len = (utfseq byte) in
+ let byte = (getc rope i) and len = (utfseq byte) in
try decode rope (i + 1) (len - 1) (byte land utf8_seqmask.(len))
- with _ -> (0xFFFD, i + 1)
+ with e ->
+ (runeerr "failure decoding", i + 1)
+
+let getr rope i =
+ let rune, next = get_rune rope i in rune
let rec each_rune_rec fn rope pos =
if pos < (length rope) then
val each_rune : (int -> rune -> bool) -> rope -> int -> unit
val getc : rope -> int -> rune
+val getr : rope -> int -> rune
(*
val putc : rope -> int -> rune -> rope
*)
assert( (to_eol rope 1) == 4 );
);
()
+
+let () =
+ test "getr : " (fun () ->
+ let rope = from_string "\x7F" in
+ assert( (getr rope 0) == 0x7F );
+ );
+ test "getr : " (fun () ->
+ let rope = from_string "\xDF\xBF" in
+ assert( (getr rope 0) == 0x7FF );
+ );
+ test "getr : " (fun () ->
+ let rope = from_string "\xEF\xBF\xBF" in
+ assert( (getr rope 0) == 0xFFFF );
+ );
+ test "getr : " (fun () ->
+ let rope = from_string "\xF7\xBF\xBF\xBF" in
+ assert( (getr rope 0) == 0x1FFFFF );
+ );
+ test "getr : " (fun () ->
+ let rope = from_string "\xFB\xBF\xBF\xBF\xBF" in
+ assert( (getr rope 0) == 0x3FFFFFF );
+ );
+ test "getr : " (fun () ->
+ let rope = from_string "\xFD\xBF\xBF\xBF\xBF\xBF" in
+ assert( (getr rope 0) == 0x7FFFFFFF );
+ );
+ ()