diff options
author | Sébastien Dailly <sebastien@chimrod.com> | 2017-11-24 09:22:24 +0100 |
---|---|---|
committer | Sébastien Dailly <sebastien@chimrod.com> | 2017-11-24 09:23:38 +0100 |
commit | a6b5a6bdd138a5ccc6827bcc73580df1e9218820 (patch) | |
tree | ff577395c1a5951a61a7234322f927f6ead5ee29 /src/unicode.ml | |
parent | ecb6fd62c275af03a07d892313ab3914d81cd40e (diff) |
Moved all the code to src directory
Diffstat (limited to 'src/unicode.ml')
-rwxr-xr-x | src/unicode.ml | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/unicode.ml b/src/unicode.ml new file mode 100755 index 0000000..cc8c087 --- /dev/null +++ b/src/unicode.ml @@ -0,0 +1,51 @@ +type t = Uchar.t array + +type decoder_encoding = Uutf.decoder_encoding + +let array_from_rev_list l = begin + let length = (List.length l) - 1 in + let arr = Array.make (length + 1) (Obj.magic 0) in + List.iteri (fun i elem -> Array.set arr (length - i) elem) l; + arr +end + + +let decode ?encoding str = begin + let decoder = Uutf.decoder ?encoding (`String str) in + let rec loop buf = begin match Uutf.decode decoder with + | `Uchar u -> loop (u::buf) + | `Malformed _ -> loop (Uutf.u_rep::buf) + | `Await -> assert false + | `End -> ( + array_from_rev_list buf + ) + end in + loop [] +end + +let to_utf8 (t:t) = begin + let buf = Buffer.create 512 in + Array.iter (Uutf.Buffer.add_utf_8 buf) t; + Buffer.contents buf +end + +let length = Array.length + +let get t i = Uchar.of_int @@ Array.get t i + +let make i v = Array.make i @@ Uchar.to_int v + +let init s f = Array.init s (fun x -> Uchar.to_int @@ f x) + +let sub = Array.sub + +let blit = Array.blit + +let concat = Array.concat + +let iter f t = Array.iter (fun x -> f @@ Uchar.of_int x) t + + +let to_list t = + Array.map Uchar.of_int t + |> Array.to_list |