From 21bdf35ecbb4a81fde9864d50136802e40fe8be3 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Tue, 5 Mar 2013 18:21:34 -0800 Subject: [PATCH] add resume/6 function to jsx_decoder and move ?incomplete over to using it, still not ready to be exposed however --- src/jsx_decoder.erl | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index 42289f1..822d222 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -29,7 +29,7 @@ -compile({inline, [format_number/1]}). -compile({inline, [maybe_replace/2]}). --export([decoder/3]). +-export([decoder/3, resume/6]). -spec decoder(Handler::module(), State::any(), Config::jsx:config()) -> jsx:decoder(). @@ -110,9 +110,10 @@ decoder(Handler, State, Config) -> case Config#config.incomplete_handler of false -> {incomplete, fun(Stream) when is_binary(Stream) -> - State(<>, Handler, Acc, Stack, Config) + resume(<>, State, Handler, Acc, Stack, Config) ; (end_stream) -> - case State(<>/binary>>, + case resume(<>/binary>>, + State, Handler, Acc, Stack, @@ -129,10 +130,12 @@ decoder(Handler, State, Config) -> case Config#config.incomplete_handler of false -> {incomplete, fun(Stream) when is_binary(Stream) -> - State(<>, Handler, Stack, Config) + resume(<>, State, Handler, unused, Stack, Config) ; (end_stream) -> - case State(<>/binary>>, + case resume(<>/binary>>, + State, Handler, + unused, Stack, Config#config{explicit_end=false}) of {incomplete, _} -> ?error(State, Rest, Handler, Stack, Config) @@ -140,12 +143,33 @@ decoder(Handler, State, Config) -> end end }; - F -> F(Rest, {decoder, State, Handler, null, Stack}, jsx_utils:config_to_list(Config)) + F -> F(Rest, {decoder, State, Handler, unused, Stack}, jsx_utils:config_to_list(Config)) end ). -endif. +resume(Rest, State, Handler, Acc, Stack, Config) -> + case State of + start -> start(Rest, Handler, Stack, Config); + value -> value(Rest, Handler, Stack, Config); + object -> object(Rest, Handler, Stack, Config); + array -> array(Rest, Handler, Stack, Config); + colon -> colon(Rest, Handler, Stack, Config); + key -> key(Rest, Handler, Stack, Config); + string -> string(Rest, Handler, Acc, Stack, Config); + integer -> integer(Rest, Handler, Acc, Stack, Config); + decimal -> decimal(Rest, Handler, Acc, Stack, Config); + exp -> exp(Rest, Handler, Acc, Stack, Config); + true -> true(Rest, Handler, Stack, Config); + false -> false(Rest, Handler, Stack, Config); + null -> null(Rest, Handler, Stack, Config); + comment -> comment(Rest, Handler, Acc, Stack, Config); + maybe_done -> maybe_done(Rest, Handler, Stack, Config); + done -> done(Rest, Handler, Stack, Config) + end. + + new_seq() -> []. new_seq(C) -> [C].