let last rope =
limit_index rope ((length rope) - 1)
-let rec getc rope i =
+let rec getb rope i =
match rope with
| Leaf (s,off,_) ->
Char.code s.[off + i]
| Node (l,r,h,len) ->
let left_len = (length l) in
if i < left_len then
- getc l i
+ getb l i
else
- getc r (i - left_len)
+ getb r (i - left_len)
(* UTF-8 **********************************************************************)
with Return v -> v
let rec utfbeg rope pos =
- if (pos > 0) && (is_cont_byte (getc rope pos)) then
+ if (pos > 0) && (is_cont_byte (getb rope pos)) then
utfbeg rope (pos - 1)
else
pos
let rec decode rope i len rune =
if len == 0 then (rune, i)
else
- let byte = (getc rope i) in
+ let byte = (getb 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
+ let byte = (getb rope i) in
if byte == 192 || byte == 193 then
(runeerr "invalid utf8 byte", i + 1)
else
- let byte = (getc rope i) and len = (utfseq byte) in
+ let byte = (getb rope i) and len = (utfseq byte) in
try decode rope (i + 1) (len - 1) (byte land utf8_seqmask.(len))
with e ->
(runeerr "failure decoding", i + 1)
-let getr rope i =
+let getc rope i =
let rune, next = get_rune rope i in rune
let rec each_rune_rec fn rope pos =
(* inefficient form of iteri *)
let rec iteri fn rope pos =
- if pos < (length rope) && (fn pos (getc rope pos)) then
+ if pos < (length rope) && (fn pos (getb rope pos)) then
iteri fn rope (pos + 1)
let gets rope i j =
let middle = from_string s in
(join (join left middle) right)
-let putc rope i c =
+let putb rope i c =
puts rope (String.make 1 (Char.chr c)) i
+let putc = putb
+
let nextc rope pos =
limit_index rope (pos + 1)
let is_bol rope pos =
if pos == 0 then true
else let prev = (prevc rope pos) in
- ((getc rope prev) == 0x0A)
+ ((getb rope prev) == 0x0A)
let is_eol rope pos =
if pos >= (last rope) then true
- else ((getc rope pos) == 0x0A)
+ else ((getb rope pos) == 0x0A)
let rec move_till step testfn rope pos =
let adjust_pos = if step < 0 then prevc else nextc in
val iteri : (int -> rune -> bool) -> rope -> int -> unit
val each_rune : (int -> rune -> bool) -> rope -> int -> unit
+val getb : rope -> int -> int
val getc : rope -> int -> rune
-val getr : rope -> int -> rune
-(*
-val putc : rope -> int -> rune -> rope
-*)
val gets : rope -> int -> int -> string
+val putb : rope -> int -> int -> rope
+val putc : rope -> int -> rune -> rope
val puts : rope -> string -> int -> rope
val nextc : rope -> int -> int
val to_bol : rope -> int -> int
val to_eol : rope -> int -> int
-
open Test
open Rope
-
+(*
let () = (* empty tests *)
test "empty : should be an empty rope" (fun () ->
let rope = Rope.empty in
assert( (to_eol rope 1) == 4 );
);
()
+*)
-let () =
- test "getr : " (fun () ->
+let () = (* getc() tests *)
+ test "getc : " (fun () ->
let rope = from_string "\x7F" in
- assert( (getr rope 0) == 0x7F );
+ assert( (getc rope 0) == 0x7F );
);
- test "getr : " (fun () ->
+ test "getc : " (fun () ->
let rope = from_string "\xDF\xBF" in
- assert( (getr rope 0) == 0x7FF );
+ assert( (getc rope 0) == 0x7FF );
);
- test "getr : " (fun () ->
+ test "getc : " (fun () ->
let rope = from_string "\xEF\xBF\xBF" in
- assert( (getr rope 0) == 0xFFFF );
+ assert( (getc rope 0) == 0xFFFF );
);
- test "getr : " (fun () ->
+ test "getc : " (fun () ->
let rope = from_string "\xF7\xBF\xBF\xBF" in
- assert( (getr rope 0) == 0x1FFFFF );
+ assert( (getc rope 0) == 0x1FFFFF );
);
- test "getr : " (fun () ->
+ test "getc : " (fun () ->
let rope = from_string "\xFB\xBF\xBF\xBF\xBF" in
- assert( (getr rope 0) == 0x3FFFFFF );
+ assert( (getc rope 0) == 0x3FFFFFF );
);
- test "getr : " (fun () ->
+ test "getc : " (fun () ->
let rope = from_string "\xFD\xBF\xBF\xBF\xBF\xBF" in
- assert( (getr rope 0) == 0x7FFFFFFF );
+ assert( (getc rope 0) == 0x7FFFFFFF );
);
()