-
Notifications
You must be signed in to change notification settings - Fork 0
/
ba_utils.ml
89 lines (62 loc) · 1.81 KB
/
ba_utils.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
(* some utilities to work with Bigarray *)
type stream_reader = {
mm: (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Genarray.t;
mutable ptr: int;
};;
let get_byte mm ptr =
Bigarray.Genarray.get mm [|ptr|]
let rec _dump_hex mm idx len =
Printf.printf "%02x " (int_of_char (get_byte mm (idx)));
if len == 1 then
()
else
_dump_hex mm (idx+1) (len-1)
let st_get_byte sr =
sr.ptr <- sr.ptr + 1;
int_of_char (Bigarray.Genarray.get sr.mm [|sr.ptr-1|])
let st_skip sr num =
_dump_hex sr.mm sr.ptr num; Printf.printf "skipped %d\n" num;
sr.ptr <- sr.ptr + num
let rec _st_get_uleb sr acc bit =
let b = st_get_byte sr in
let now = acc lor (b lsl bit) in
if (b land 0x80) == 0 then
now
else
_st_get_uleb sr now (bit+7)
let st_get_uleb sr =
_st_get_uleb sr 0 0
let rec dec_int mm ptr togo bits acu =
if togo == 0 then acu
else
let acx = ((int_of_char (get_byte mm (ptr)) ) lsl bits ) lor acu in
(dec_int mm (ptr+1) (togo-1) (bits+8) acx)
(* fake 64bit support *)
let rec dec_int64 mm ptr togo bits acu =
if togo == 0 then acu
else
let acx = ((int_of_char (get_byte mm (ptr)) ) lsl bits ) lor acu in
(dec_int64 mm (ptr+1) (togo-1) (bits+8) acx)
let get_uint32 mm ptr =
dec_int mm ptr 4 0 0
let get_uint16 mm ptr =
dec_int mm ptr 2 0 0
let get_uint64 mm ptr =
dec_int64 mm ptr 8 0 0
let get_bytes mm ptr len =
let out = Bytes.create len in
for idx = 0 to (len-1) do
Bytes.set out idx (get_byte mm (ptr+idx));
done;
out
(* read zero terminated string *)
let rec _read_zt_str mm idx buf =
let chr = get_byte mm idx in
if Char.code chr != 0 then begin
Buffer.add_char buf chr;
_read_zt_str mm (idx+1) buf
end
let read_zt_string mm idx =
let buf = Buffer.create 20 in
_read_zt_str mm idx buf;
Bytes.to_string (Buffer.to_bytes buf)