diff --git a/src/jsx.erl b/src/jsx.erl index 62c9d3f..a30e34a 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -33,7 +33,10 @@ decoder() -> decoder([]). decoder(Opts) -> - F = fun(end_of_stream, State) -> lists:reverse(State) ;(Event, State) -> [Event] ++ State end, + F = fun(end_of_stream, State) -> lists:reverse(State) + ; (reset, _State) -> [] + ; (Event, State) -> [Event] ++ State + end, decoder({F, []}, Opts). decoder({F, _} = Callbacks, OptsList) when is_list(OptsList), is_function(F) -> @@ -60,16 +63,19 @@ start(Callbacks, Opts, F) -> end. parse_opts(Opts) -> - parse_opts(Opts, {false, codepoint}). + parse_opts(Opts, {false, codepoint, false}). parse_opts([], Opts) -> Opts; -parse_opts([{comments, Value}|Rest], {_Comments, EscapedUnicode}) -> +parse_opts([{comments, Value}|Rest], {_Comments, EscapedUnicode, Stream}) -> true = lists:member(Value, [true, false]), - parse_opts(Rest, {Value, EscapedUnicode}); -parse_opts([{escaped_unicode, Value}|Rest], {Comments, _EscapedUnicode}) -> + parse_opts(Rest, {Value, EscapedUnicode, Stream}); +parse_opts([{escaped_unicode, Value}|Rest], {Comments, _EscapedUnicode, Stream}) -> true = lists:member(Value, [ascii, codepoint, none]), - parse_opts(Rest, {Comments, Value}); + parse_opts(Rest, {Comments, Value, Stream}); +parse_opts([{stream_mode, Value}|Rest], {Comments, EscapedUnicode, _Stream}) -> + true = lists:member(Value, [true, false]), + parse_opts(Rest, {Comments, EscapedUnicode, Value}); parse_opts([_UnknownOpt|Rest], Opts) -> parse_opts(Rest, Opts). diff --git a/src/jsx_common.hrl b/src/jsx_common.hrl index 510407b..5b28360 100644 --- a/src/jsx_common.hrl +++ b/src/jsx_common.hrl @@ -22,9 +22,10 @@ %% option flags --define(comments_enabled(X), {true, _} = X). --define(escaped_unicode_to_ascii(X), {_, ascii} = X). --define(escaped_unicode_to_codepoint(X), {_, codepoint} = X). +-define(comments_enabled(X), {true, _, _} = X). +-define(escaped_unicode_to_ascii(X), {_, ascii, _} = X). +-define(escaped_unicode_to_codepoint(X), {_, codepoint, _} = X). +-define(stream_mode(X), {_, _, true} = X). %% whitespace -define(space, 16#20). diff --git a/src/jsx_utf16.erl b/src/jsx_utf16.erl index ea01fcf..434102f 100644 --- a/src/jsx_utf16.erl +++ b/src/jsx_utf16.erl @@ -93,6 +93,10 @@ maybe_done(<>, [array|_] = Stack, Callbacks, Opts value(Rest, Stack, Callbacks, Opts); maybe_done(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end); +maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) -> + {fold(end_of_stream, Callbacks), fun(Stream) -> + start(<>, [], fold(reset, Callbacks), Opts) + end}; maybe_done(<<>>, [], Callbacks, Opts) -> {fold(end_of_stream, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end}; maybe_done(Bin, Stack, Callbacks, Opts) -> @@ -407,6 +411,11 @@ zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitesp maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end); +zero(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; zero(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; @@ -442,6 +451,11 @@ integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end); +integer(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; integer(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; @@ -489,6 +503,11 @@ decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); decimal(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> decimal(Resume, Stack, Callbacks, Opts, Acc) end); +decimal(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; decimal(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; @@ -544,6 +563,11 @@ exp(<>, Stack, Callbacks, ?comments_enabled(Opt maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end); exp(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +exp(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; exp(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; diff --git a/src/jsx_utf16le.erl b/src/jsx_utf16le.erl index ab2708b..216c9f2 100644 --- a/src/jsx_utf16le.erl +++ b/src/jsx_utf16le.erl @@ -93,6 +93,10 @@ maybe_done(<>, [array|_] = Stack, Callbacks, Opts value(Rest, Stack, Callbacks, Opts); maybe_done(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end); +maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) -> + {fold(end_of_stream, Callbacks), fun(Stream) -> + start(<>, [], fold(reset, Callbacks), Opts) + end}; maybe_done(<<>>, [], Callbacks, Opts) -> {fold(end_of_stream, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end}; maybe_done(Bin, Stack, Callbacks, Opts) -> @@ -407,6 +411,11 @@ zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitesp maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end); +zero(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; zero(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; @@ -442,6 +451,11 @@ integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end); +integer(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; integer(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; @@ -489,6 +503,11 @@ decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); decimal(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> decimal(Resume, Stack, Callbacks, Opts, Acc) end); +decimal(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; decimal(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; @@ -544,6 +563,11 @@ exp(<>, Stack, Callbacks, ?comments_enabled(Opt maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end); exp(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +exp(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; exp(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; diff --git a/src/jsx_utf32.erl b/src/jsx_utf32.erl index 160581d..a81251a 100644 --- a/src/jsx_utf32.erl +++ b/src/jsx_utf32.erl @@ -93,6 +93,10 @@ maybe_done(<>, [array|_] = Stack, Callbacks, Opts value(Rest, Stack, Callbacks, Opts); maybe_done(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end); +maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) -> + {fold(end_of_stream, Callbacks), fun(Stream) -> + start(<>, [], fold(reset, Callbacks), Opts) + end}; maybe_done(<<>>, [], Callbacks, Opts) -> {fold(end_of_stream, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end}; maybe_done(Bin, Stack, Callbacks, Opts) -> @@ -407,6 +411,11 @@ zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitesp maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end); +zero(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; zero(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; @@ -442,6 +451,11 @@ integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end); +integer(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; integer(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; @@ -489,6 +503,11 @@ decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); decimal(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> decimal(Resume, Stack, Callbacks, Opts, Acc) end); +decimal(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; decimal(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; @@ -544,6 +563,11 @@ exp(<>, Stack, Callbacks, ?comments_enabled(Opt maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end); exp(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +exp(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; exp(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; diff --git a/src/jsx_utf32le.erl b/src/jsx_utf32le.erl index 242ebe5..906b284 100644 --- a/src/jsx_utf32le.erl +++ b/src/jsx_utf32le.erl @@ -93,6 +93,10 @@ maybe_done(<>, [array|_] = Stack, Callbacks, Opts value(Rest, Stack, Callbacks, Opts); maybe_done(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end); +maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) -> + {fold(end_of_stream, Callbacks), fun(Stream) -> + start(<>, [], fold(reset, Callbacks), Opts) + end}; maybe_done(<<>>, [], Callbacks, Opts) -> {fold(end_of_stream, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end}; maybe_done(Bin, Stack, Callbacks, Opts) -> @@ -407,6 +411,11 @@ zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitesp maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end); +zero(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; zero(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; @@ -442,6 +451,11 @@ integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end); +integer(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; integer(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; @@ -489,6 +503,11 @@ decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); decimal(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> decimal(Resume, Stack, Callbacks, Opts, Acc) end); +decimal(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; decimal(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; @@ -544,6 +563,11 @@ exp(<>, Stack, Callbacks, ?comments_enabled(Opt maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end); exp(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +exp(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; exp(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; diff --git a/src/jsx_utf8.erl b/src/jsx_utf8.erl index 7a5d467..c77f472 100644 --- a/src/jsx_utf8.erl +++ b/src/jsx_utf8.erl @@ -88,6 +88,10 @@ maybe_done(<>, Stack, Callbacks, ?comments_enab maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end); maybe_done(<<>>, [], Callbacks, Opts) -> {fold(end_of_stream, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end}; +maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) -> + {fold(end_of_stream, Callbacks), fun(Stream) -> + start(<>, [], fold(reset, Callbacks), Opts) + end}; maybe_done(<<>>, Stack, Callbacks, Opts) -> {incomplete, fun(Stream) -> maybe_done(Stream, Stack, Callbacks, Opts) end}; maybe_done(_, _, _, _) -> {error, badjson}. @@ -351,6 +355,11 @@ zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitesp maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end); +zero(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; zero(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; @@ -381,6 +390,11 @@ integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end); +integer(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({integer, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; integer(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; @@ -416,6 +430,11 @@ decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whit maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); decimal(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> maybe_comment(Rest, fun(Resume) -> decimal(Resume, Stack, Callbacks, Opts, Acc) end); +decimal(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; decimal(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; @@ -456,6 +475,11 @@ exp(<>, Stack, Callbacks, ?comments_enabled(Opt maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end); exp(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +exp(Bin, [], Callbacks, ?stream_mode(Opts), Acc) -> + CB = fold({float, lists:reverse(Acc)}, Callbacks), + {fold(end_of_stream, CB), fun(Stream) -> + start(<>, [], fold(reset, CB), Opts) + end}; exp(<<>>, [], Callbacks, Opts, Acc) -> {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end};