From fbf6c30c5324b75e417751d1da9a2d7579fa2bbc Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Tue, 1 Jun 2010 02:31:07 -0700 Subject: [PATCH] fixed bug that prevented termination and bug that allowed 1. as a valid value --- src/jsx_utf16.erl | 157 +++++++++++++++++--------------- src/jsx_utf16le.erl | 157 +++++++++++++++++--------------- src/jsx_utf32.erl | 159 +++++++++++++++++--------------- src/jsx_utf32le.erl | 157 +++++++++++++++++--------------- src/jsx_utf8.erl | 217 +++++++++++++++++++++++--------------------- 5 files changed, 445 insertions(+), 402 deletions(-) diff --git a/src/jsx_utf16.erl b/src/jsx_utf16.erl index 75bd0db..f78bb54 100644 --- a/src/jsx_utf16.erl +++ b/src/jsx_utf16.erl @@ -69,7 +69,7 @@ start(<>, Stack, Callbacks, Opts) when ?is_nonzero(S) integer(Rest, Stack, Callbacks, Opts, [S]); start(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> start(Resume, Stack, Callbacks, Opts) end); -start(Bin, Stack, Callbacks, Opts) -> +start(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> start(<>, Stack, Callbacks, Opts) end}. @@ -87,7 +87,7 @@ 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, Stack, Callbacks, Opts) -> +maybe_done(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> maybe_done(<>, Stack, Callbacks, Opts) end}. @@ -99,7 +99,7 @@ object(<>, [key|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_object, Callbacks), Opts); object(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> object(Resume, Stack, Callbacks, Opts) end); -object(Bin, Stack, Callbacks, Opts) -> +object(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> object(<>, Stack, Callbacks, Opts) end}. @@ -127,7 +127,7 @@ array(<>, [array|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_array, Callbacks), Opts); array(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> array(Resume, Stack, Callbacks, Opts) end); -array(Bin, Stack, Callbacks, Opts) -> +array(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> array(<>, Stack, Callbacks, Opts) end}. @@ -153,7 +153,7 @@ value(<>, Stack, Callbacks, Opts) -> array(Rest, [array|Stack], fold(start_array, Callbacks), Opts); value(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> value(Resume, Stack, Callbacks, Opts) end); -value(Bin, Stack, Callbacks, Opts) -> +value(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> value(<>, Stack, Callbacks, Opts) end}. @@ -163,7 +163,7 @@ colon(<>, [key|Stack], Callbacks, Opts) -> value(Rest, [object|Stack], Callbacks, Opts); colon(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> colon(Resume, Stack, Callbacks, Opts) end); -colon(Bin, Stack, Callbacks, Opts) -> +colon(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> colon(<>, Stack, Callbacks, Opts) end}. @@ -173,7 +173,7 @@ key(<>, Stack, Callbacks, Opts) -> string(Rest, Stack, Callbacks, Opts, []); key(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> key(Resume, Stack, Callbacks, Opts) end); -key(Bin, Stack, Callbacks, Opts) -> +key(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> key(<>, Stack, Callbacks, Opts) end}. @@ -193,7 +193,7 @@ string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -string(Bin, Stack, Callbacks, Opts, Acc) -> +string(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}. @@ -216,7 +216,7 @@ escape(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> escape(<>, Stack, Callbacks, Opts, Acc) when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -escape(Bin, Stack, Callbacks, Opts, Acc) -> +escape(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> escape(<>, Stack, Callbacks, Opts, Acc) end}. @@ -258,7 +258,7 @@ escaped_unicode(<>, Stack, Callbacks, Opts, String, [C string(Rest, Stack, Callbacks, Opts, [D, C, B, A, $u, ?rsolidus] ++ String); escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) -> escaped_unicode(Rest, Stack, Callbacks, Opts, String, [S] ++ Acc); -escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) -> +escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) end}. @@ -273,180 +273,189 @@ negative(<<$0/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> zero(Rest, Stack, Callbacks, Opts, "0" ++ Acc); negative(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -negative(Bin, Stack, Callbacks, Opts, Acc) -> +negative(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> negative(<>, Stack, Callbacks, Opts, Acc) end}. zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; -zero(Bin, Stack, Callbacks, Opts, Acc) -> +zero(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> zero(<>, Stack, Callbacks, Opts, Acc) end}. integer(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) -> integer(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); integer(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; -integer(Bin, Stack, Callbacks, Opts, Acc) -> +integer(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> integer(<>, Stack, Callbacks, Opts, Acc) end}. -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> - fraction(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); -fraction(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> + +initial_decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +initial_decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +initial_decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> + {incomplete, fun(Stream) -> initial_decimal(Stream, Stack, Callbacks, Opts, Acc) end}. + + +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [array|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +decimal(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> +decimal(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> - maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end); -fraction(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), - fun(Stream) -> fraction(Stream, [], Callbacks, Opts, Acc) end}; -fraction(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> fraction(<>, Stack, Callbacks, Opts, Acc) end}. +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> + 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(<<>>, [], Callbacks, Opts, Acc) -> + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), + fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; +decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> + {incomplete, fun(Stream) -> decimal(<>, Stack, Callbacks, Opts, Acc) end}. e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative -> ex(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -e(Bin, Stack, Callbacks, Opts, Acc) -> +e(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> e(<>, Stack, Callbacks, Opts, Acc) end}. ex(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -ex(Bin, Stack, Callbacks, Opts, Acc) -> +ex(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> ex(<>, Stack, Callbacks, Opts, Acc) end}. exp(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, Stack, Callbacks, Opts, Acc) -> exp(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); exp(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> 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({number, lists:reverse(Acc)}, Callbacks), Opts); + maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; -exp(Bin, Stack, Callbacks, Opts, Acc) -> +exp(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> exp(<>, Stack, Callbacks, Opts, Acc) end}. tr(<<$r/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> tru(Rest, Stack, Callbacks, Opts); -tr(Bin, Stack, Callbacks, Opts) -> +tr(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> tr(<>, Stack, Callbacks, Opts) end}. tru(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> true(Rest, Stack, Callbacks, Opts); -tru(Bin, Stack, Callbacks, Opts) -> +tru(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> tru(<>, Stack, Callbacks, Opts) end}. true(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, true}, Callbacks), Opts); -true(Bin, Stack, Callbacks, Opts) -> +true(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> true(<>, Stack, Callbacks, Opts) end}. fa(<<$a/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fal(Rest, Stack, Callbacks, Opts); -fa(Bin, Stack, Callbacks, Opts) -> +fa(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> fa(<>, Stack, Callbacks, Opts) end}. fal(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fals(Rest, Stack, Callbacks, Opts); -fal(Bin, Stack, Callbacks, Opts) -> +fal(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> fal(<>, Stack, Callbacks, Opts) end}. fals(<<$s/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> false(Rest, Stack, Callbacks, Opts); -fals(Bin, Stack, Callbacks, Opts) -> +fals(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> fals(<>, Stack, Callbacks, Opts) end}. false(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, false}, Callbacks), Opts); -false(Bin, Stack, Callbacks, Opts) -> +false(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> false(<>, Stack, Callbacks, Opts) end}. nu(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> nul(Rest, Stack, Callbacks, Opts); -nu(Bin, Stack, Callbacks, Opts) -> +nu(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> nu(<>, Stack, Callbacks, Opts) end}. nul(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> null(Rest, Stack, Callbacks, Opts); -nul(Bin, Stack, Callbacks, Opts) -> +nul(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> nul(<>, Stack, Callbacks, Opts) end}. null(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, null}, Callbacks), Opts); -null(Bin, Stack, Callbacks, Opts) -> +null(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> null(<>, Stack, Callbacks, Opts) end}. @@ -458,7 +467,7 @@ null(Bin, Stack, Callbacks, Opts) -> maybe_comment(<>, Resume) -> comment(Rest, Resume); -maybe_comment(Bin, Resume) -> +maybe_comment(Bin, Resume) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> maybe_comment(<>, Resume) end}. @@ -466,11 +475,11 @@ comment(<>, Resume) -> maybe_comment_done(Rest, Resume); comment(<<_/?encoding, Rest/binary>>, Resume) -> comment(Rest, Resume); -comment(Bin, Resume) -> +comment(Bin, Resume) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> comment(<>, Resume) end}. maybe_comment_done(<>, Resume) -> Resume(Rest); -maybe_comment_done(Bin, Resume) -> +maybe_comment_done(Bin, Resume) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> maybe_comment_done(<>, Resume) end}. \ No newline at end of file diff --git a/src/jsx_utf16le.erl b/src/jsx_utf16le.erl index 1be5556..e9d6a04 100644 --- a/src/jsx_utf16le.erl +++ b/src/jsx_utf16le.erl @@ -69,7 +69,7 @@ start(<>, Stack, Callbacks, Opts) when ?is_nonzero(S) integer(Rest, Stack, Callbacks, Opts, [S]); start(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> start(Resume, Stack, Callbacks, Opts) end); -start(Bin, Stack, Callbacks, Opts) -> +start(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> start(<>, Stack, Callbacks, Opts) end}. @@ -87,7 +87,7 @@ 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, Stack, Callbacks, Opts) -> +maybe_done(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> maybe_done(<>, Stack, Callbacks, Opts) end}. @@ -99,7 +99,7 @@ object(<>, [key|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_object, Callbacks), Opts); object(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> object(Resume, Stack, Callbacks, Opts) end); -object(Bin, Stack, Callbacks, Opts) -> +object(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> object(<>, Stack, Callbacks, Opts) end}. @@ -127,7 +127,7 @@ array(<>, [array|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_array, Callbacks), Opts); array(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> array(Resume, Stack, Callbacks, Opts) end); -array(Bin, Stack, Callbacks, Opts) -> +array(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> array(<>, Stack, Callbacks, Opts) end}. @@ -153,7 +153,7 @@ value(<>, Stack, Callbacks, Opts) -> array(Rest, [array|Stack], fold(start_array, Callbacks), Opts); value(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> value(Resume, Stack, Callbacks, Opts) end); -value(Bin, Stack, Callbacks, Opts) -> +value(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> value(<>, Stack, Callbacks, Opts) end}. @@ -163,7 +163,7 @@ colon(<>, [key|Stack], Callbacks, Opts) -> value(Rest, [object|Stack], Callbacks, Opts); colon(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> colon(Resume, Stack, Callbacks, Opts) end); -colon(Bin, Stack, Callbacks, Opts) -> +colon(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> colon(<>, Stack, Callbacks, Opts) end}. @@ -173,7 +173,7 @@ key(<>, Stack, Callbacks, Opts) -> string(Rest, Stack, Callbacks, Opts, []); key(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> key(Resume, Stack, Callbacks, Opts) end); -key(Bin, Stack, Callbacks, Opts) -> +key(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> key(<>, Stack, Callbacks, Opts) end}. @@ -193,7 +193,7 @@ string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -string(Bin, Stack, Callbacks, Opts, Acc) -> +string(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}. @@ -216,7 +216,7 @@ escape(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> escape(<>, Stack, Callbacks, Opts, Acc) when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -escape(Bin, Stack, Callbacks, Opts, Acc) -> +escape(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> escape(<>, Stack, Callbacks, Opts, Acc) end}. @@ -258,7 +258,7 @@ escaped_unicode(<>, Stack, Callbacks, Opts, String, [C string(Rest, Stack, Callbacks, Opts, [D, C, B, A, $u, ?rsolidus] ++ String); escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) -> escaped_unicode(Rest, Stack, Callbacks, Opts, String, [S] ++ Acc); -escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) -> +escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) end}. @@ -273,180 +273,189 @@ negative(<<$0/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> zero(Rest, Stack, Callbacks, Opts, "0" ++ Acc); negative(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -negative(Bin, Stack, Callbacks, Opts, Acc) -> +negative(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> negative(<>, Stack, Callbacks, Opts, Acc) end}. zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; -zero(Bin, Stack, Callbacks, Opts, Acc) -> +zero(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> zero(<>, Stack, Callbacks, Opts, Acc) end}. integer(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) -> integer(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); integer(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; -integer(Bin, Stack, Callbacks, Opts, Acc) -> +integer(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> integer(<>, Stack, Callbacks, Opts, Acc) end}. -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> - fraction(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); -fraction(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> + +initial_decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +initial_decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +initial_decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> + {incomplete, fun(Stream) -> initial_decimal(Stream, Stack, Callbacks, Opts, Acc) end}. + + +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [array|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +decimal(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> +decimal(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> - maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end); -fraction(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), - fun(Stream) -> fraction(Stream, [], Callbacks, Opts, Acc) end}; -fraction(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> fraction(<>, Stack, Callbacks, Opts, Acc) end}. +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> + 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(<<>>, [], Callbacks, Opts, Acc) -> + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), + fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; +decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> + {incomplete, fun(Stream) -> decimal(<>, Stack, Callbacks, Opts, Acc) end}. e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative -> ex(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -e(Bin, Stack, Callbacks, Opts, Acc) -> +e(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> e(<>, Stack, Callbacks, Opts, Acc) end}. ex(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -ex(Bin, Stack, Callbacks, Opts, Acc) -> +ex(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> ex(<>, Stack, Callbacks, Opts, Acc) end}. exp(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, Stack, Callbacks, Opts, Acc) -> exp(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); exp(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> 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({number, lists:reverse(Acc)}, Callbacks), Opts); + maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; -exp(Bin, Stack, Callbacks, Opts, Acc) -> +exp(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> exp(<>, Stack, Callbacks, Opts, Acc) end}. tr(<<$r/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> tru(Rest, Stack, Callbacks, Opts); -tr(Bin, Stack, Callbacks, Opts) -> +tr(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> tr(<>, Stack, Callbacks, Opts) end}. tru(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> true(Rest, Stack, Callbacks, Opts); -tru(Bin, Stack, Callbacks, Opts) -> +tru(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> tru(<>, Stack, Callbacks, Opts) end}. true(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, true}, Callbacks), Opts); -true(Bin, Stack, Callbacks, Opts) -> +true(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> true(<>, Stack, Callbacks, Opts) end}. fa(<<$a/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fal(Rest, Stack, Callbacks, Opts); -fa(Bin, Stack, Callbacks, Opts) -> +fa(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> fa(<>, Stack, Callbacks, Opts) end}. fal(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fals(Rest, Stack, Callbacks, Opts); -fal(Bin, Stack, Callbacks, Opts) -> +fal(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> fal(<>, Stack, Callbacks, Opts) end}. fals(<<$s/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> false(Rest, Stack, Callbacks, Opts); -fals(Bin, Stack, Callbacks, Opts) -> +fals(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> fals(<>, Stack, Callbacks, Opts) end}. false(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, false}, Callbacks), Opts); -false(Bin, Stack, Callbacks, Opts) -> +false(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> false(<>, Stack, Callbacks, Opts) end}. nu(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> nul(Rest, Stack, Callbacks, Opts); -nu(Bin, Stack, Callbacks, Opts) -> +nu(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> nu(<>, Stack, Callbacks, Opts) end}. nul(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> null(Rest, Stack, Callbacks, Opts); -nul(Bin, Stack, Callbacks, Opts) -> +nul(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> nul(<>, Stack, Callbacks, Opts) end}. null(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, null}, Callbacks), Opts); -null(Bin, Stack, Callbacks, Opts) -> +null(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> null(<>, Stack, Callbacks, Opts) end}. @@ -458,7 +467,7 @@ null(Bin, Stack, Callbacks, Opts) -> maybe_comment(<>, Resume) -> comment(Rest, Resume); -maybe_comment(Bin, Resume) -> +maybe_comment(Bin, Resume) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> maybe_comment(<>, Resume) end}. @@ -466,11 +475,11 @@ comment(<>, Resume) -> maybe_comment_done(Rest, Resume); comment(<<_/?encoding, Rest/binary>>, Resume) -> comment(Rest, Resume); -comment(Bin, Resume) -> +comment(Bin, Resume) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> comment(<>, Resume) end}. maybe_comment_done(<>, Resume) -> Resume(Rest); -maybe_comment_done(Bin, Resume) -> +maybe_comment_done(Bin, Resume) when byte_size(Bin) < 2 -> {incomplete, fun(Stream) -> maybe_comment_done(<>, Resume) end}. \ No newline at end of file diff --git a/src/jsx_utf32.erl b/src/jsx_utf32.erl index 0a5a505..0264d44 100644 --- a/src/jsx_utf32.erl +++ b/src/jsx_utf32.erl @@ -69,7 +69,7 @@ start(<>, Stack, Callbacks, Opts) when ?is_nonzero(S) integer(Rest, Stack, Callbacks, Opts, [S]); start(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> start(Resume, Stack, Callbacks, Opts) end); -start(Bin, Stack, Callbacks, Opts) -> +start(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> start(<>, Stack, Callbacks, Opts) end}. @@ -87,7 +87,7 @@ 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, Stack, Callbacks, Opts) -> +maybe_done(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> maybe_done(<>, Stack, Callbacks, Opts) end}. @@ -99,7 +99,7 @@ object(<>, [key|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_object, Callbacks), Opts); object(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> object(Resume, Stack, Callbacks, Opts) end); -object(Bin, Stack, Callbacks, Opts) -> +object(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> object(<>, Stack, Callbacks, Opts) end}. @@ -127,7 +127,7 @@ array(<>, [array|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_array, Callbacks), Opts); array(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> array(Resume, Stack, Callbacks, Opts) end); -array(Bin, Stack, Callbacks, Opts) -> +array(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> array(<>, Stack, Callbacks, Opts) end}. @@ -153,7 +153,7 @@ value(<>, Stack, Callbacks, Opts) -> array(Rest, [array|Stack], fold(start_array, Callbacks), Opts); value(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> value(Resume, Stack, Callbacks, Opts) end); -value(Bin, Stack, Callbacks, Opts) -> +value(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> value(<>, Stack, Callbacks, Opts) end}. @@ -163,7 +163,7 @@ colon(<>, [key|Stack], Callbacks, Opts) -> value(Rest, [object|Stack], Callbacks, Opts); colon(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> colon(Resume, Stack, Callbacks, Opts) end); -colon(Bin, Stack, Callbacks, Opts) -> +colon(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> colon(<>, Stack, Callbacks, Opts) end}. @@ -173,7 +173,7 @@ key(<>, Stack, Callbacks, Opts) -> string(Rest, Stack, Callbacks, Opts, []); key(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> key(Resume, Stack, Callbacks, Opts) end); -key(Bin, Stack, Callbacks, Opts) -> +key(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> key(<>, Stack, Callbacks, Opts) end}. @@ -193,7 +193,7 @@ string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -string(Bin, Stack, Callbacks, Opts, Acc) -> +string(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}. @@ -216,7 +216,7 @@ escape(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> escape(<>, Stack, Callbacks, Opts, Acc) when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -escape(Bin, Stack, Callbacks, Opts, Acc) -> +escape(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> escape(<>, Stack, Callbacks, Opts, Acc) end}. @@ -258,7 +258,7 @@ escaped_unicode(<>, Stack, Callbacks, Opts, String, [C string(Rest, Stack, Callbacks, Opts, [D, C, B, A, $u, ?rsolidus] ++ String); escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) -> escaped_unicode(Rest, Stack, Callbacks, Opts, String, [S] ++ Acc); -escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) -> +escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) end}. @@ -273,180 +273,189 @@ negative(<<$0/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> zero(Rest, Stack, Callbacks, Opts, "0" ++ Acc); negative(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -negative(Bin, Stack, Callbacks, Opts, Acc) -> +negative(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> negative(<>, Stack, Callbacks, Opts, Acc) end}. zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; -zero(Bin, Stack, Callbacks, Opts, Acc) -> +zero(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> zero(<>, Stack, Callbacks, Opts, Acc) end}. integer(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) -> integer(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); integer(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; -integer(Bin, Stack, Callbacks, Opts, Acc) -> +integer(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> integer(<>, Stack, Callbacks, Opts, Acc) end}. -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> - fraction(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); -fraction(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> + +initial_decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +initial_decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +initial_decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> + {incomplete, fun(Stream) -> initial_decimal(Stream, Stack, Callbacks, Opts, Acc) end}. + + +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [array|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +decimal(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> +decimal(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> - maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end); -fraction(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), - fun(Stream) -> fraction(Stream, [], Callbacks, Opts, Acc) end}; -fraction(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> fraction(<>, Stack, Callbacks, Opts, Acc) end}. +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> + 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(<<>>, [], Callbacks, Opts, Acc) -> + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), + fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; +decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> + {incomplete, fun(Stream) -> decimal(<>, Stack, Callbacks, Opts, Acc) end}. e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative -> ex(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -e(Bin, Stack, Callbacks, Opts, Acc) -> +e(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> e(<>, Stack, Callbacks, Opts, Acc) end}. ex(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -ex(Bin, Stack, Callbacks, Opts, Acc) -> +ex(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> ex(<>, Stack, Callbacks, Opts, Acc) end}. exp(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, Stack, Callbacks, Opts, Acc) -> exp(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); exp(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> 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({number, lists:reverse(Acc)}, Callbacks), Opts); + maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; -exp(Bin, Stack, Callbacks, Opts, Acc) -> +exp(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> exp(<>, Stack, Callbacks, Opts, Acc) end}. tr(<<$r/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> tru(Rest, Stack, Callbacks, Opts); -tr(Bin, Stack, Callbacks, Opts) -> +tr(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> tr(<>, Stack, Callbacks, Opts) end}. tru(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> true(Rest, Stack, Callbacks, Opts); -tru(Bin, Stack, Callbacks, Opts) -> +tru(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> tru(<>, Stack, Callbacks, Opts) end}. true(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, true}, Callbacks), Opts); -true(Bin, Stack, Callbacks, Opts) -> +true(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> true(<>, Stack, Callbacks, Opts) end}. fa(<<$a/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fal(Rest, Stack, Callbacks, Opts); -fa(Bin, Stack, Callbacks, Opts) -> +fa(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> fa(<>, Stack, Callbacks, Opts) end}. fal(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fals(Rest, Stack, Callbacks, Opts); -fal(Bin, Stack, Callbacks, Opts) -> +fal(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> fal(<>, Stack, Callbacks, Opts) end}. fals(<<$s/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> false(Rest, Stack, Callbacks, Opts); -fals(Bin, Stack, Callbacks, Opts) -> +fals(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> fals(<>, Stack, Callbacks, Opts) end}. false(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, false}, Callbacks), Opts); -false(Bin, Stack, Callbacks, Opts) -> +false(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> false(<>, Stack, Callbacks, Opts) end}. nu(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> nul(Rest, Stack, Callbacks, Opts); -nu(Bin, Stack, Callbacks, Opts) -> +nu(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> nu(<>, Stack, Callbacks, Opts) end}. nul(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> null(Rest, Stack, Callbacks, Opts); -nul(Bin, Stack, Callbacks, Opts) -> +nul(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> nul(<>, Stack, Callbacks, Opts) end}. null(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, null}, Callbacks), Opts); -null(Bin, Stack, Callbacks, Opts) -> +null(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> null(<>, Stack, Callbacks, Opts) end}. @@ -458,7 +467,7 @@ null(Bin, Stack, Callbacks, Opts) -> maybe_comment(<>, Resume) -> comment(Rest, Resume); -maybe_comment(Bin, Resume) -> +maybe_comment(Bin, Resume) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> maybe_comment(<>, Resume) end}. @@ -466,11 +475,11 @@ comment(<>, Resume) -> maybe_comment_done(Rest, Resume); comment(<<_/?encoding, Rest/binary>>, Resume) -> comment(Rest, Resume); -comment(Bin, Resume) -> +comment(Bin, Resume) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> comment(<>, Resume) end}. maybe_comment_done(<>, Resume) -> Resume(Rest); -maybe_comment_done(Bin, Resume) -> - {incomplete, fun(Stream) -> maybe_comment_done(<>, Resume) end}. \ No newline at end of file +maybe_comment_done(Bin, Resume) when byte_size(Bin) < 4 -> + {incomplete, fun(Stream) -> maybe_comment_done(<>, Resume) end}.< 4 \ No newline at end of file diff --git a/src/jsx_utf32le.erl b/src/jsx_utf32le.erl index 505b14f..a366088 100644 --- a/src/jsx_utf32le.erl +++ b/src/jsx_utf32le.erl @@ -69,7 +69,7 @@ start(<>, Stack, Callbacks, Opts) when ?is_nonzero(S) integer(Rest, Stack, Callbacks, Opts, [S]); start(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> start(Resume, Stack, Callbacks, Opts) end); -start(Bin, Stack, Callbacks, Opts) -> +start(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> start(<>, Stack, Callbacks, Opts) end}. @@ -87,7 +87,7 @@ 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, Stack, Callbacks, Opts) -> +maybe_done(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> maybe_done(<>, Stack, Callbacks, Opts) end}. @@ -99,7 +99,7 @@ object(<>, [key|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_object, Callbacks), Opts); object(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> object(Resume, Stack, Callbacks, Opts) end); -object(Bin, Stack, Callbacks, Opts) -> +object(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> object(<>, Stack, Callbacks, Opts) end}. @@ -127,7 +127,7 @@ array(<>, [array|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_array, Callbacks), Opts); array(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> array(Resume, Stack, Callbacks, Opts) end); -array(Bin, Stack, Callbacks, Opts) -> +array(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> array(<>, Stack, Callbacks, Opts) end}. @@ -153,7 +153,7 @@ value(<>, Stack, Callbacks, Opts) -> array(Rest, [array|Stack], fold(start_array, Callbacks), Opts); value(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> value(Resume, Stack, Callbacks, Opts) end); -value(Bin, Stack, Callbacks, Opts) -> +value(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> value(<>, Stack, Callbacks, Opts) end}. @@ -163,7 +163,7 @@ colon(<>, [key|Stack], Callbacks, Opts) -> value(Rest, [object|Stack], Callbacks, Opts); colon(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> colon(Resume, Stack, Callbacks, Opts) end); -colon(Bin, Stack, Callbacks, Opts) -> +colon(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> colon(<>, Stack, Callbacks, Opts) end}. @@ -173,7 +173,7 @@ key(<>, Stack, Callbacks, Opts) -> string(Rest, Stack, Callbacks, Opts, []); key(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> key(Resume, Stack, Callbacks, Opts) end); -key(Bin, Stack, Callbacks, Opts) -> +key(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> key(<>, Stack, Callbacks, Opts) end}. @@ -193,7 +193,7 @@ string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -string(Bin, Stack, Callbacks, Opts, Acc) -> +string(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}. @@ -216,7 +216,7 @@ escape(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> escape(<>, Stack, Callbacks, Opts, Acc) when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -escape(Bin, Stack, Callbacks, Opts, Acc) -> +escape(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> escape(<>, Stack, Callbacks, Opts, Acc) end}. @@ -258,7 +258,7 @@ escaped_unicode(<>, Stack, Callbacks, Opts, String, [C string(Rest, Stack, Callbacks, Opts, [D, C, B, A, $u, ?rsolidus] ++ String); escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) -> escaped_unicode(Rest, Stack, Callbacks, Opts, String, [S] ++ Acc); -escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) -> +escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) end}. @@ -273,180 +273,189 @@ negative(<<$0/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> zero(Rest, Stack, Callbacks, Opts, "0" ++ Acc); negative(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -negative(Bin, Stack, Callbacks, Opts, Acc) -> +negative(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> negative(<>, Stack, Callbacks, Opts, Acc) end}. zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; -zero(Bin, Stack, Callbacks, Opts, Acc) -> +zero(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> zero(<>, Stack, Callbacks, Opts, Acc) end}. integer(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) -> integer(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); integer(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; -integer(Bin, Stack, Callbacks, Opts, Acc) -> +integer(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> integer(<>, Stack, Callbacks, Opts, Acc) end}. -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> - fraction(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); -fraction(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> + +initial_decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +initial_decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +initial_decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> + {incomplete, fun(Stream) -> initial_decimal(Stream, Stack, Callbacks, Opts, Acc) end}. + + +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [array|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +decimal(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> +decimal(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> - maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end); -fraction(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), - fun(Stream) -> fraction(Stream, [], Callbacks, Opts, Acc) end}; -fraction(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> fraction(<>, Stack, Callbacks, Opts, Acc) end}. +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> + 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(<<>>, [], Callbacks, Opts, Acc) -> + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), + fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; +decimal(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> + {incomplete, fun(Stream) -> decimal(<>, Stack, Callbacks, Opts, Acc) end}. e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative -> ex(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -e(Bin, Stack, Callbacks, Opts, Acc) -> +e(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> e(<>, Stack, Callbacks, Opts, Acc) end}. ex(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -ex(Bin, Stack, Callbacks, Opts, Acc) -> +ex(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> ex(<>, Stack, Callbacks, Opts, Acc) end}. exp(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, Stack, Callbacks, Opts, Acc) -> exp(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); exp(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> 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({number, lists:reverse(Acc)}, Callbacks), Opts); + maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; -exp(Bin, Stack, Callbacks, Opts, Acc) -> +exp(Bin, Stack, Callbacks, Opts, Acc) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> exp(<>, Stack, Callbacks, Opts, Acc) end}. tr(<<$r/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> tru(Rest, Stack, Callbacks, Opts); -tr(Bin, Stack, Callbacks, Opts) -> +tr(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> tr(<>, Stack, Callbacks, Opts) end}. tru(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> true(Rest, Stack, Callbacks, Opts); -tru(Bin, Stack, Callbacks, Opts) -> +tru(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> tru(<>, Stack, Callbacks, Opts) end}. true(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, true}, Callbacks), Opts); -true(Bin, Stack, Callbacks, Opts) -> +true(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> true(<>, Stack, Callbacks, Opts) end}. fa(<<$a/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fal(Rest, Stack, Callbacks, Opts); -fa(Bin, Stack, Callbacks, Opts) -> +fa(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> fa(<>, Stack, Callbacks, Opts) end}. fal(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fals(Rest, Stack, Callbacks, Opts); -fal(Bin, Stack, Callbacks, Opts) -> +fal(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> fal(<>, Stack, Callbacks, Opts) end}. fals(<<$s/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> false(Rest, Stack, Callbacks, Opts); -fals(Bin, Stack, Callbacks, Opts) -> +fals(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> fals(<>, Stack, Callbacks, Opts) end}. false(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, false}, Callbacks), Opts); -false(Bin, Stack, Callbacks, Opts) -> +false(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> false(<>, Stack, Callbacks, Opts) end}. nu(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> nul(Rest, Stack, Callbacks, Opts); -nu(Bin, Stack, Callbacks, Opts) -> +nu(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> nu(<>, Stack, Callbacks, Opts) end}. nul(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> null(Rest, Stack, Callbacks, Opts); -nul(Bin, Stack, Callbacks, Opts) -> +nul(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> nul(<>, Stack, Callbacks, Opts) end}. null(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, null}, Callbacks), Opts); -null(Bin, Stack, Callbacks, Opts) -> +null(Bin, Stack, Callbacks, Opts) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> null(<>, Stack, Callbacks, Opts) end}. @@ -458,7 +467,7 @@ null(Bin, Stack, Callbacks, Opts) -> maybe_comment(<>, Resume) -> comment(Rest, Resume); -maybe_comment(Bin, Resume) -> +maybe_comment(Bin, Resume) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> maybe_comment(<>, Resume) end}. @@ -466,11 +475,11 @@ comment(<>, Resume) -> maybe_comment_done(Rest, Resume); comment(<<_/?encoding, Rest/binary>>, Resume) -> comment(Rest, Resume); -comment(Bin, Resume) -> +comment(Bin, Resume) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> comment(<>, Resume) end}. maybe_comment_done(<>, Resume) -> Resume(Rest); -maybe_comment_done(Bin, Resume) -> +maybe_comment_done(Bin, Resume) when byte_size(Bin) < 4 -> {incomplete, fun(Stream) -> maybe_comment_done(<>, Resume) end}. \ No newline at end of file diff --git a/src/jsx_utf8.erl b/src/jsx_utf8.erl index 92a9c61..a5620eb 100644 --- a/src/jsx_utf8.erl +++ b/src/jsx_utf8.erl @@ -69,8 +69,8 @@ start(<>, Stack, Callbacks, Opts) when ?is_nonzero(S) integer(Rest, Stack, Callbacks, Opts, [S]); start(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> start(Resume, Stack, Callbacks, Opts) end); -start(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> start(<>, Stack, Callbacks, Opts) end}. +start(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> start(Stream, Stack, Callbacks, Opts) end}. maybe_done(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> @@ -87,8 +87,8 @@ 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, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> maybe_done(<>, Stack, Callbacks, Opts) end}. +maybe_done(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> maybe_done(Stream, Stack, Callbacks, Opts) end}. object(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> @@ -99,8 +99,8 @@ object(<>, [key|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_object, Callbacks), Opts); object(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> object(Resume, Stack, Callbacks, Opts) end); -object(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> object(<>, Stack, Callbacks, Opts) end}. +object(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> object(Stream, Stack, Callbacks, Opts) end}. array(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> @@ -127,8 +127,8 @@ array(<>, [array|Stack], Callbacks, Opts) -> maybe_done(Rest, Stack, fold(end_array, Callbacks), Opts); array(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> array(Resume, Stack, Callbacks, Opts) end); -array(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> array(<>, Stack, Callbacks, Opts) end}. +array(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> array(Stream, Stack, Callbacks, Opts) end}. value(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> @@ -153,8 +153,8 @@ value(<>, Stack, Callbacks, Opts) -> array(Rest, [array|Stack], fold(start_array, Callbacks), Opts); value(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> value(Resume, Stack, Callbacks, Opts) end); -value(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> value(<>, Stack, Callbacks, Opts) end}. +value(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> value(Stream, Stack, Callbacks, Opts) end}. colon(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> @@ -163,8 +163,8 @@ colon(<>, [key|Stack], Callbacks, Opts) -> value(Rest, [object|Stack], Callbacks, Opts); colon(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> colon(Resume, Stack, Callbacks, Opts) end); -colon(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> colon(<>, Stack, Callbacks, Opts) end}. +colon(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> colon(Stream, Stack, Callbacks, Opts) end}. key(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> @@ -173,8 +173,8 @@ key(<>, Stack, Callbacks, Opts) -> string(Rest, Stack, Callbacks, Opts, []); key(<>, Stack, Callbacks, ?comments_enabled(Opts)) -> maybe_comment(Rest, fun(Resume) -> key(Resume, Stack, Callbacks, Opts) end); -key(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> key(<>, Stack, Callbacks, Opts) end}. +key(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> key(Stream, Stack, Callbacks, Opts) end}. %% string has an additional parameter, an accumulator (Acc) used to hold the intermediate @@ -193,8 +193,8 @@ string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -string(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}. +string(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> string(Stream, Stack, Callbacks, Opts, Acc) end}. %% only thing to note here is the additional accumulator passed to escaped_unicode used @@ -216,8 +216,8 @@ escape(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> escape(<>, Stack, Callbacks, Opts, Acc) when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus -> string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -escape(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> escape(<>, Stack, Callbacks, Opts, Acc) end}. +escape(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> escape(Stream, Stack, Callbacks, Opts, Acc) end}. %% this code is ugly and unfortunate, but so is json's handling of escaped unicode @@ -258,8 +258,8 @@ escaped_unicode(<>, Stack, Callbacks, Opts, String, [C string(Rest, Stack, Callbacks, Opts, [D, C, B, A, $u, ?rsolidus] ++ String); escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) -> escaped_unicode(Rest, Stack, Callbacks, Opts, String, [S] ++ Acc); -escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) -> - {incomplete, fun(Stream) -> escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) end}. +escaped_unicode(<<>>, Stack, Callbacks, Opts, String, Acc) -> + {incomplete, fun(Stream) -> escaped_unicode(Stream, Stack, Callbacks, Opts, String, Acc) end}. %% like strings, numbers are collected in an intermediate accumulator before @@ -273,181 +273,188 @@ negative(<<$0/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> zero(Rest, Stack, Callbacks, Opts, "0" ++ Acc); negative(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -negative(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> negative(<>, Stack, Callbacks, Opts, Acc) end}. +negative(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> negative(Stream, Stack, Callbacks, Opts, Acc) end}. zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); zero(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); zero(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); zero(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end}; -zero(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> zero(<>, Stack, Callbacks, Opts, Acc) end}. +zero(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end}. integer(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({integer, lists:reverse(Acc)}, Callbacks)), Opts); integer(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts); integer(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); + initial_decimal(Rest, Stack, Callbacks, Opts, [?decimalpoint] ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) -> integer(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); integer(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); integer(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + 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(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end}; -integer(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> integer(<>, Stack, Callbacks, Opts, Acc) end}. +integer(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end}. -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> - fraction(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); -fraction(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, Opts, Acc) -> - fraction(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); -fraction(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> - e(Rest, Stack, Callbacks, Opts, "e" ++ Acc); -fraction(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> - maybe_done(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); -fraction(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> - maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end); -fraction(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), - fun(Stream) -> fraction(Stream, [], Callbacks, Opts, Acc) end}; -fraction(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> fraction(<>, Stack, Callbacks, Opts, Acc) end}. +initial_decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +initial_decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +initial_decimal(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> initial_decimal(Stream, Stack, Callbacks, Opts, Acc) end}. + +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> + decimal(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [array|Stack], Callbacks, Opts, Acc) -> + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); +decimal(<>, [object|Stack], Callbacks, Opts, Acc) -> + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); +decimal(<>, Stack, Callbacks, Opts, Acc) -> + decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); +decimal(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); +decimal(<<$E/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) -> + e(Rest, Stack, Callbacks, Opts, "e0." ++ Acc); +decimal(<>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) -> + 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(<<>>, [], Callbacks, Opts, Acc) -> + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), + fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end}; +decimal(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> decimal(Stream, Stack, Callbacks, Opts, Acc) end}. e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); e(<>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative -> ex(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -e(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> e(<>, Stack, Callbacks, Opts, Acc) end}. +e(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> e(Stream, Stack, Callbacks, Opts, Acc) end}. ex(<>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); -ex(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> ex(<>, Stack, Callbacks, Opts, Acc) end}. +ex(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> ex(Stream, Stack, Callbacks, Opts, Acc) end}. exp(<>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) -> exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_object, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_object, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [array|Stack], Callbacks, Opts, Acc) -> - maybe_done(Rest, Stack, fold(end_array, fold({number, lists:reverse(Acc)}, Callbacks)), Opts); + maybe_done(Rest, Stack, fold(end_array, fold({float, lists:reverse(Acc)}, Callbacks)), Opts); exp(<>, [object|Stack], Callbacks, Opts, Acc) -> - key(Rest, [key|Stack], fold({number, lists:reverse(Acc)}, Callbacks), Opts); + key(Rest, [key|Stack], fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, [array|_] = Stack, Callbacks, Opts, Acc) -> - value(Rest, Stack, fold({number, lists:reverse(Acc)}, Callbacks), Opts); + value(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<>, Stack, Callbacks, Opts, Acc) -> exp(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc); exp(<>, Stack, Callbacks, ?comments_enabled(Opts), Acc) -> 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({number, lists:reverse(Acc)}, Callbacks), Opts); + maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts); exp(<<>>, [], Callbacks, Opts, Acc) -> - {fold(end_of_stream, fold({number, lists:reverse(Acc)}, Callbacks)), + {fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)), fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end}; -exp(Bin, Stack, Callbacks, Opts, Acc) -> - {incomplete, fun(Stream) -> exp(<>, Stack, Callbacks, Opts, Acc) end}. +exp(<<>>, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end}. tr(<<$r/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> tru(Rest, Stack, Callbacks, Opts); -tr(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> tr(<>, Stack, Callbacks, Opts) end}. +tr(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> tr(Stream, Stack, Callbacks, Opts) end}. tru(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> true(Rest, Stack, Callbacks, Opts); -tru(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> tru(<>, Stack, Callbacks, Opts) end}. +tru(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> tru(Stream, Stack, Callbacks, Opts) end}. true(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, true}, Callbacks), Opts); -true(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> true(<>, Stack, Callbacks, Opts) end}. +true(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> true(Stream, Stack, Callbacks, Opts) end}. fa(<<$a/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fal(Rest, Stack, Callbacks, Opts); -fa(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> fa(<>, Stack, Callbacks, Opts) end}. +fa(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> fa(Stream, Stack, Callbacks, Opts) end}. fal(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> fals(Rest, Stack, Callbacks, Opts); -fal(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> fal(<>, Stack, Callbacks, Opts) end}. +fal(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> fal(Stream, Stack, Callbacks, Opts) end}. fals(<<$s/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> false(Rest, Stack, Callbacks, Opts); -fals(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> fals(<>, Stack, Callbacks, Opts) end}. +fals(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> fals(Stream, Stack, Callbacks, Opts) end}. false(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, false}, Callbacks), Opts); -false(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> false(<>, Stack, Callbacks, Opts) end}. +false(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> false(Stream, Stack, Callbacks, Opts) end}. nu(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> nul(Rest, Stack, Callbacks, Opts); -nu(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> nu(<>, Stack, Callbacks, Opts) end}. +nu(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> nu(Stream, Stack, Callbacks, Opts) end}. nul(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> null(Rest, Stack, Callbacks, Opts); -nul(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> nul(<>, Stack, Callbacks, Opts) end}. +nul(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> nul(Stream, Stack, Callbacks, Opts) end}. null(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) -> maybe_done(Rest, Stack, fold({literal, null}, Callbacks), Opts); -null(Bin, Stack, Callbacks, Opts) -> - {incomplete, fun(Stream) -> null(<>, Stack, Callbacks, Opts) end}. +null(<<>>, Stack, Callbacks, Opts) -> + {incomplete, fun(Stream) -> null(Stream, Stack, Callbacks, Opts) end}. %% comments are c style, /* blah blah */ and are STRONGLY discouraged. any unicode @@ -458,19 +465,19 @@ null(Bin, Stack, Callbacks, Opts) -> maybe_comment(<>, Resume) -> comment(Rest, Resume); -maybe_comment(Bin, Resume) -> - {incomplete, fun(Stream) -> maybe_comment(<>, Resume) end}. +maybe_comment(<<>>, Resume) -> + {incomplete, fun(Stream) -> maybe_comment(Stream, Resume) end}. comment(<>, Resume) -> maybe_comment_done(Rest, Resume); comment(<<_/?encoding, Rest/binary>>, Resume) -> comment(Rest, Resume); -comment(Bin, Resume) -> - {incomplete, fun(Stream) -> comment(<>, Resume) end}. +comment(<<>>, Resume) -> + {incomplete, fun(Stream) -> comment(Stream, Resume) end}. maybe_comment_done(<>, Resume) -> Resume(Rest); -maybe_comment_done(Bin, Resume) -> - {incomplete, fun(Stream) -> maybe_comment_done(<>, Resume) end}. \ No newline at end of file +maybe_comment_done(<<>>, Resume) -> + {incomplete, fun(Stream) -> maybe_comment_done(Stream, Resume) end}. \ No newline at end of file