let of_string_bigstring loc this_parse ws_buf get_len get_sub str =
match this_parse str with
| Done (_, { Parse_pos.buf_pos }) when buf_pos <> get_len str ->
let prefix_len = min (get_len str - buf_pos) 20 in
let prefix = get_sub str buf_pos prefix_len in
let msg =
sprintf
"Sexplib.Sexp.%s: S-expression followed by data at position %d: %S..."
loc buf_pos prefix
in
failwith msg
| Done (sexp, _) -> sexp
| Cont (ws_only, this_parse) ->
if ws_only then failwith (sprintf "Sexplib.Sexp.%s: whitespace only" loc);
match this_parse ~pos:0 ~len:1 ws_buf with
| Done (sexp, _) -> sexp
| Cont _ ->
failwith (
sprintf "Sexplib.Sexp.%s: got incomplete S-expression: %s"
loc (get_sub str 0 (get_len str)))