1
(* $Id: xString.ml,v 1.3 2004/09/04 16:07:38 yori Exp $ *)
2
(* Copyright 2002, 2003 Yamagata Yoriyuki. distributed with LGPL *)
4
module type XStringSig = sig
5
type xstring = UChar.t XArray.t
7
val get : xstring -> int -> UChar.t
8
val set : xstring -> int -> UChar.t -> unit
9
val length : xstring -> int
12
val look : xstring -> index -> UChar.t
13
val nth : xstring -> int -> index
14
val first : xstring -> index
15
val last : xstring -> index
16
val out_of_range : xstring -> index -> bool
17
val next : xstring -> index -> index
18
val prev : xstring -> index -> index
19
val move : xstring -> index -> int -> index
20
val compare_index : xstring -> index -> index -> int
22
val make : ?bufsize:int -> int -> UChar.t -> xstring
23
val clear : xstring -> unit
24
val reset : xstring -> unit
25
val copy : xstring -> xstring
26
val sub : xstring -> int -> int -> xstring
27
val add_char : xstring -> UChar.t -> unit
28
val add_text : xstring -> 'a UText.text -> unit
29
val add_xstring : xstring -> xstring -> unit
30
val shrink : xstring -> int -> unit
31
val append : xstring -> xstring -> xstring
32
val utext_of : xstring -> UText.t
33
val ustring_of : xstring -> UText.ustring
35
val iter : (UChar.t -> unit) -> xstring -> unit
36
val compare : xstring -> xstring -> int
39
module XStringAux : XStringSig = struct
41
type xstring = UChar.t XArray.t
43
let rec compare_aux i t1 t2 =
44
if i >= length t1 then
45
if i >= length t2 then 0 else ~-1
46
else if i >= length t2 then 1 else
47
match UChar.compare (XArray.get t1 i) (XArray.get t2 i) with
48
0 -> compare_aux (i + 1) t1 t2
51
let compare t1 t2 = compare_aux 0 t1 t2
52
let add_xstring = add_xarray
53
let add_char = add_element
54
let add_text b t = UText.iter (add_char b) t
55
let ustring_of b = UText.init_ustring (length b) (get b)
56
let utext_of b = UText.init (length b) (get b)
63
let init len f = XArray.init len (UChar.chr_of_uint 0) f
69
let create bufsize = make ~bufsize 0 (UChar.chr_of_uint 0)
71
let add_string = add_xstring
72
let add_buffer = add_xstring