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
let insert16 s ~pos x =
assert (0 <= x && x <= 0xffff) ;
assert (0 <= pos) ;
assert (String.length s >= pos + 2) ;
let s = Bytes.of_string s in
Bytes.set s pos (Char.chr (x lsr 8)) ;
Bytes.set s (pos+1) (Char.chr (x mod 256)) ;
Bytes.to_string s
let read16 s ~pos =
assert (String.length s >= pos + 2) ;
(Char.code s.[pos+0]) lsl 8 + (Char.code s.[pos+1])
let pad phrase padding_len =
assert (padding_len >= 0) ;
let = String.make (padding_len + 2) 'x' in
(insert16 header 0 padding_len) ^ phrase
let unpad phrase =
let len = String.length phrase in
assert (len >= 2) ;
let k = read16 phrase 0 in
let len = len - (k+2) in
assert (len >= 0) ;
String.sub phrase (k+2) len
let append_char s c = s ^ (String.make 1 c)
let get_last_char s =
let len = String.length s in
assert (len > 0) ;
let last = s.[len-1]
and sub = String.sub s 0 (len-1) in
(last, sub)
let get_first_char s =
let len = String.length s in
assert (len > 0) ;
let first = s.[0]
and sub = String.sub s 1 (len-1) in
(first, sub)