let parse_conf_file fname =
let pp_lpos { Lexing.pos_fname = _fname;
pos_lnum = lnum; pos_bol = bol; pos_cnum = cnum } =
Printf.sprintf "%d:%d" lnum (cnum - bol)
in
let ic = open_in fname in
let lexbuf = Lexing.from_channel ic in
try
let stanzas = Cudf_822_parser.doc_822 Cudf_822_lexer.token_822 lexbuf in
let r =
List.flatten (
List.map (fun stanza ->
let (_,sl) = List.assoc "solver" stanza in
let l = List.map (fun (k, (_loc, v)) -> (k,v)) stanza in
List.filter_map (fun s ->
match ExtString.String.strip s with
|"" -> None
|x -> Some(x,l)
) (ExtString.String.nsplit sl ",")
) stanzas
)
in
close_in ic; r
with Cudf_types.Parse_error_822 (msg, (startpos, endpos)) ->
fatal "Parse error on file %s:%s--%s" fname (pp_lpos startpos) (pp_lpos endpos)