1
(* $Id: bytesvect.ml,v 1.5 2003/04/27 17:47:59 yori Exp $ *)
2
(* Copyright 2002, 2003 Yamagata Yoriyuki *)
7
mutable contents : string;
10
(* get b v i : read b-bytes from the k-th byte of v *)
12
let rec get_raw acc b v k =
13
if b = 0 then acc else
14
let acc' = (acc lsl 8) lor (Char.code v.[k]) in
15
get_raw acc' (pred b) v (succ k)
17
let get v i = get_raw 0 v.bytes v.contents (i * v.bytes)
19
let rec unsafe_get_raw acc b v k =
20
if b = 0 then acc else
21
let acc' = (acc lsl 8) lor (Char.code (String.unsafe_get v k)) in
22
unsafe_get_raw acc' (pred b) v (succ k)
24
let unsafe_get v i = unsafe_get_raw 0 v.bytes v.contents (i * v.bytes)
26
let rec set_bytes_raw b v k n =
27
let c = (n lsr ((b - 1) lsl 3)) land 255 in
29
if b > 1 then set_bytes_raw (b - 1) v (k + 1) n
31
let rec bytes n = if n = 0 then 0 else 1 + bytes (n lsr 8)
36
let save = {len = v.len; bytes = v.bytes; contents = v.contents; id = 0} in
37
let len = (String.length v.contents) / v.bytes in
38
v.contents <- String.make (len * b) (Char.chr 0);
40
for i = 0 to len - 1 do
41
set_bytes_raw b v.contents (b * i) (get save i)
44
set_bytes_raw v.bytes v.contents (i * v.bytes) n
47
let b = max (bytes df) 1 in
51
contents = String.make (b * i0) (Char.chr 0);
54
for i = 0 to i0 - 1 do set v i df done; v
59
contents = String.copy v.contents;
63
let len = (String.length v.contents) / v.bytes in
64
for i = 0 to len - 1 do
70
let set_id v id = v.id <- id