blob: 0d0e6307ee8b91a1ca2b8ee215ef93bdc43b1ad8 (
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
|
{
open Lexing
}
let space =
[' ' '\010' '\013' '\009' '\012']
let char = ['A'-'Z' 'a'-'z' '_' '0'-'9']
let ident = char+
let value = ('"'|'[')( [^ '='] | ('\\''"') )*('"'|']')
let list_value = [^';']+ ';'
rule next_config = parse
| ident
{ let id = lexeme lexbuf in
let v = value lexbuf in
(id,v)
}
| _ { next_config lexbuf}
| eof { raise End_of_file }
and value = parse
| value { let s = lexeme lexbuf in
String.sub s 1 (String.length s - 2)}
| _ { value lexbuf }
| eof { raise End_of_file }
and split_list = parse
| list_value {
let h = lexeme lexbuf in
h::(split_list lexbuf)
}
| _ { split_list lexbuf}
| eof {[]}
{
let get_config f =
let ci = open_in f in
let lb = from_channel ci in
let result = ref [] in
begin try
while true do
let r = next_config lb in
result := r::!result
done
with End_of_file -> close_in ci;
end;
!result
let split s =
let cs = ref "" in
let l = ref [] in
String.iter
(fun c -> if c = ';' then begin l:= !cs::!l; cs:="" end
else cs := !cs^(Char.escaped c))
s;
if !cs ="" then !l else !cs::!l
}
|