From 588c8365478caf4b58505f84c535a51c53cc1511 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Fri, 12 Aug 2011 06:34:45 -0700 Subject: [PATCH] minor change to guards on the fun returned when incomplete input detected --- src/jsx_decoder.hrl | 38 ++++++++++++++++++++++---------------- src/jsx_encoder.erl | 6 +++--- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/jsx_decoder.hrl b/src/jsx_decoder.hrl index 08a6f30..b540a2d 100644 --- a/src/jsx_decoder.hrl +++ b/src/jsx_decoder.hrl @@ -218,13 +218,13 @@ partial_utf(_) -> false. incomplete(State, Bin, T, Args) -> case ?partial_codepoint(Bin) of true -> - {jsx, incomplete, fun(end_stream) -> - {error, {badjson, end_stream}} - ; (Stream) -> + {jsx, incomplete, fun(Stream) + when is_binary(Stream) -> erlang:apply(?MODULE, State, [<>, T] ++ Args ) + ; (Else) -> {error, {badjson, Else}} end} ; false -> {error, {badjson, Bin}} end. @@ -415,10 +415,11 @@ string(<>, T, Stack, Opts, Acc) string(Bin, T, Stack, Opts, Acc) -> case partial_utf(Bin) of true -> - {jsx, incomplete, fun(end_stream) -> - {error, {badjson, end_stream}} - ; (Stream) -> + {jsx, incomplete, fun(Stream) + when is_binary(Stream) -> string(<>, T, Stack, Opts, Acc) + ; (Else) -> + {error, {badjson, Else}} end} ; false -> case Opts#opts.loose_unicode of @@ -670,8 +671,9 @@ zero(<>, T, Stack, Opts, Acc) when ?is_whitespace(S) -> zero(<<>>, T, [], Opts, Acc) -> {jsx, incomplete, fun(end_stream) -> done(<<>>, [format_number(Acc)] ++ T, Opts) - ; (Stream) -> + ; (Stream) when is_binary(Stream) -> zero(Stream, T, [], Opts, Acc) + ; (Else) -> {error, {badjson, Else}} end}; zero(Bin, T, Stack, Opts, Acc) -> incomplete(zero, Bin, T, [Stack, Opts, Acc]). @@ -698,8 +700,9 @@ integer(<>, T, Stack, Opts, Acc) when ?is_whitespace(S) -> integer(<<>>, T, [], Opts, Acc) -> {jsx, incomplete, fun(end_stream) -> done(<<>>, [format_number(Acc)] ++ T, Opts) - ; (Stream) -> + ; (Stream) when is_binary(Stream) -> integer(Stream, T, [], Opts, Acc) + ; (Else) -> {error, {badjson, Else}} end}; integer(Bin, T, Stack, Opts, Acc) -> incomplete(integer, Bin, T, [Stack, Opts, Acc]). @@ -731,8 +734,9 @@ decimal(<>, T, Stack, Opts, Acc) when ?is_whitespace(S) -> decimal(<<>>, T, [], Opts, Acc) -> {jsx, incomplete, fun(end_stream) -> done(<<>>, [format_number(Acc)] ++ T, Opts) - ; (Stream) -> + ; (Stream) when is_binary(Stream) -> decimal(Stream, T, [], Opts, Acc) + ; (Else) -> {error, {badjson, Else}} end}; decimal(Bin, T, Stack, Opts, Acc) -> incomplete(decimal, Bin, T, [Stack, Opts, Acc]). @@ -771,8 +775,9 @@ exp(<>, T, Stack, Opts, Acc) when ?is_whitespace(S) -> exp(<<>>, T, [], Opts, Acc) -> {jsx, incomplete, fun(end_stream) -> done(<<>>, [format_number(Acc)] ++ T, Opts) - ; (Stream) -> + ; (Stream) when is_binary(Stream) -> exp(Stream, T, [], Opts, Acc) + ; (Else) -> {error, {badjson, Else}} end}; exp(Bin, T, Stack, Opts, Acc) -> incomplete(exp, Bin, T, [Stack, Opts, Acc]). @@ -933,7 +938,7 @@ check_replaced(List) -> ). check_good(List) -> - lists:dropwhile(fun({_, [{string, _}|_]}) -> true ; (_) -> false end, + lists:dropwhile(fun({_, [{string, _}]}) -> true ; (_) -> false end, check(List, [], []) ). @@ -944,13 +949,14 @@ check([H|T], Opts, Acc) -> decode(JSON, Opts) -> - F = jsx:decoder([iterate] ++ Opts), - loop(F(JSON), []). + case (jsx:decoder(Opts))(JSON) of + {jsx, Events, _} -> loop(Events, []) + ; {error, {badjson, _}} -> {error, badjson} + end. -loop({jsx, end_json, _}, Acc) -> lists:reverse(Acc); -loop({jsx, incomplete, More}, Acc) -> loop(More(end_stream), Acc); -loop({jsx, Event, Next}, Acc) -> loop(Next(), [Event] ++ Acc); +loop([end_json], Acc) -> lists:reverse(Acc); +loop([Event|Events], Acc) -> loop(Events, [Event] ++ Acc); loop(_, _) -> {error, badjson}. diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index e37530c..0c5d368 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -55,13 +55,13 @@ encoder(Opts) -> emit([], {State, Rest, T, Args}) -> erlang:apply(?MODULE, State, [Rest, T] ++ Args); emit([incomplete], {State, Rest, T, Args}) -> - {jsx, incomplete, fun(end_stream) -> - {error, {badjson, []}} - ; (Stream) -> + {jsx, incomplete, fun(Stream) + when is_binary(Stream) -> erlang:apply(?MODULE, State, [Rest ++ Stream, T] ++ Args ) + ; (Else) -> {error, {badjson, Else}} end}; emit([Event|Events], {_State, _Rest, iterate, _Args} = Next) -> {jsx, Event, fun() -> emit(Events, Next) end};