added a streaming mode, use option [{stream_mode, true}] to use. no tests yet

This commit is contained in:
alisdair sullivan 2010-06-06 13:58:04 -07:00
parent 152c2ec75f
commit fb497a20bc
7 changed files with 136 additions and 9 deletions

View file

@ -93,6 +93,10 @@ maybe_done(<<?comma/?encoding, Rest/binary>>, [array|_] = Stack, Callbacks, Opts
value(Rest, Stack, Callbacks, Opts);
maybe_done(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end);
maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) ->
{fold(end_of_stream, Callbacks), fun(Stream) ->
start(<<Bin/binary, Stream/binary>>, [], fold(reset, Callbacks), Opts)
end};
maybe_done(<<>>, [], Callbacks, Opts) ->
{fold(end_of_stream, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end};
maybe_done(Bin, Stack, Callbacks, Opts) ->
@ -407,6 +411,11 @@ zero(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitesp
maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts);
zero(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts), Acc) ->
maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end);
zero(Bin, [], Callbacks, ?stream_mode(Opts), Acc) ->
CB = fold({integer, lists:reverse(Acc)}, Callbacks),
{fold(end_of_stream, CB), fun(Stream) ->
start(<<Bin/binary, Stream/binary>>, [], fold(reset, CB), Opts)
end};
zero(<<>>, [], Callbacks, Opts, Acc) ->
{fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)),
fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end};
@ -442,6 +451,11 @@ integer(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whit
maybe_done(Rest, Stack, fold({integer, lists:reverse(Acc)}, Callbacks), Opts);
integer(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts), Acc) ->
maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end);
integer(Bin, [], Callbacks, ?stream_mode(Opts), Acc) ->
CB = fold({integer, lists:reverse(Acc)}, Callbacks),
{fold(end_of_stream, CB), fun(Stream) ->
start(<<Bin/binary, Stream/binary>>, [], fold(reset, CB), Opts)
end};
integer(<<>>, [], Callbacks, Opts, Acc) ->
{fold(end_of_stream, fold({integer, lists:reverse(Acc)}, Callbacks)),
fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end};
@ -489,6 +503,11 @@ decimal(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whit
maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts);
decimal(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts), Acc) ->
maybe_comment(Rest, fun(Resume) -> decimal(Resume, Stack, Callbacks, Opts, Acc) end);
decimal(Bin, [], Callbacks, ?stream_mode(Opts), Acc) ->
CB = fold({float, lists:reverse(Acc)}, Callbacks),
{fold(end_of_stream, CB), fun(Stream) ->
start(<<Bin/binary, Stream/binary>>, [], fold(reset, CB), Opts)
end};
decimal(<<>>, [], Callbacks, Opts, Acc) ->
{fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)),
fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end};
@ -544,6 +563,11 @@ exp(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opt
maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end);
exp(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S) ->
maybe_done(Rest, Stack, fold({float, lists:reverse(Acc)}, Callbacks), Opts);
exp(Bin, [], Callbacks, ?stream_mode(Opts), Acc) ->
CB = fold({float, lists:reverse(Acc)}, Callbacks),
{fold(end_of_stream, CB), fun(Stream) ->
start(<<Bin/binary, Stream/binary>>, [], fold(reset, CB), Opts)
end};
exp(<<>>, [], Callbacks, Opts, Acc) ->
{fold(end_of_stream, fold({float, lists:reverse(Acc)}, Callbacks)),
fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end};