let gen_input_rev_sexps my_parse ?parse_pos ?(buf = String.create 8192) ic =
let rev_sexps_ref = ref [] in
let buf_len = String.length buf in
let rec loop this_parse ~pos ~len ~is_incomplete =
if len > 0 then
match this_parse ~pos ~len buf with
| Done (sexp, ({ Parse_pos.buf_pos } as parse_pos)) ->
rev_sexps_ref := sexp :: !rev_sexps_ref;
let n_parsed = buf_pos - pos in
let this_parse = mk_this_parse ~parse_pos my_parse in
if n_parsed = len then
let new_len = input ic buf 0 buf_len in
loop this_parse ~pos:0 ~len:new_len ~is_incomplete:false
else
loop this_parse
~pos:buf_pos ~len:(len - n_parsed) ~is_incomplete:false
| Cont (ws_only, this_parse) ->
loop this_parse
~pos:0 ~len:(input ic buf 0 buf_len) ~is_incomplete:(not ws_only)
else if is_incomplete then
failwith
"Sexplib.Sexp.input_rev_sexps: reached EOF with incomplete S-expression"
else !rev_sexps_ref
in
let len = input ic buf 0 buf_len in
let this_parse = mk_this_parse ?parse_pos my_parse in
loop this_parse ~pos:0 ~len ~is_incomplete:false