blob: eee855caead586d498021fe0350e4014cb0ae740 (
plain)
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
|
(* $Id$ *)
(* Extensible buffers *)
type extensible_buffer = {
mutable buffer : string;
mutable pos : int;
mutable len : int}
let new_buffer () = {
buffer = String.create len:128;
pos = 0;
len = 128
}
let print_in_buffer buf s =
let l = String.length s in
if buf.pos + l > buf.len then begin
buf.buffer <- buf.buffer ^ (String.create len:(l+128));
buf.len <- buf.len + 128 + l
end;
String.blit s pos:0 to:buf.buffer to_pos:buf.pos len:l;
buf.pos <- buf.pos + l
let get_buffer buf =
String.sub buf.buffer pos:0 len:buf.pos
(* Used by list converters *)
let catenate_sep sep =
function
[] -> ""
| [x] -> x
| x::l ->
let b = new_buffer() in
print_in_buffer b x;
List.iter l
fun:(function s -> print_in_buffer b sep; print_in_buffer b s);
get_buffer b
(* Parsing results of Tcl *)
(* List.split a string according to char_sep predicate *)
let split_str char_sep str =
let len = String.length str in
let rec skip_sep cur =
if cur >= len then cur
else if char_sep str.[cur] then skip_sep (succ cur)
else cur in
let rec split beg cur =
if cur >= len then
if beg = cur then []
else [String.sub str pos:beg len:(len - beg)]
else if char_sep str.[cur]
then
let nextw = skip_sep cur in
(String.sub str pos:beg len:(cur - beg))
::(split nextw nextw)
else split beg (succ cur) in
let wstart = skip_sep 0 in
split wstart wstart
|