let input_rev_sexps
?text_line ?text_char
?(buf_pos = 0) ?(buf = String.create 8192) ic =
let rev_sexps_ref = ref [] in
let buf_len = String.length buf in
let is_incomplete_ref = ref false in
let buf_pos_ref = ref buf_pos in
let rec loop this_parse pos len =
if len > 0 then
let parse_res =
try this_parse ~pos ~len buf
with Parse_error pe -> reraise_parse_error pe !buf_pos_ref
in
match parse_res with
| Done (sexp, new_pos) ->
rev_sexps_ref := sexp :: !rev_sexps_ref;
let n_parsed = new_pos.buf_pos - pos in
is_incomplete_ref := false;
let text_line = new_pos.text_line in
let text_char = new_pos.text_char in
let this_parse ~pos ~len str =
parse ~text_line ~text_char ~pos ~len str
in
if n_parsed = len then
let new_len = input ic buf 0 buf_len in
buf_pos_ref := !buf_pos_ref + new_pos.buf_pos;
loop this_parse 0 new_len
else loop this_parse new_pos.buf_pos (len - n_parsed)
| Cont (ws_only, this_parse) ->
is_incomplete_ref := not ws_only;
buf_pos_ref := !buf_pos_ref + len + pos;
loop this_parse 0 (input ic buf 0 buf_len)
else if !is_incomplete_ref then
failwith
"Sexplib.Sexp.input_rev_sexps: reached EOF with incomplete S-expression"
else !rev_sexps_ref
in
let this_parse ~pos ~len str = parse ?text_line ?text_char ~pos ~len str in
loop this_parse 0 (input ic buf 0 buf_len)