let extract_backtrace_position str =
let prefixes =
[
"Raised at ";
"Re-raised at ";
"Raised by primitive operation at ";
"Called from ";
]
in
let rec extract_one_line s prefixes =
match prefixes with
| [] -> None
| prefix :: tl ->
let really_starts, eol = start_substr ~prefix s in
if really_starts then begin
if eol = "unknown location" then
None
else
try
Scanf.sscanf eol "file \"%s@\", line %d, characters %d-%d"
(fun fn line _ _ -> Some (fn, line))
with Scanf.Scan_failure msg ->
None
end else begin
extract_one_line s tl
end
in
List.map
(fun s -> extract_one_line s prefixes)
(split_lines str)