From 1398a747dea8888140d48301e6d5eb5bda5f5786 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Tue, 5 Mar 2013 19:19:16 -0800 Subject: [PATCH] collapse and simplify comment states and move comment errors to error site --- src/jsx_decoder.erl | 156 +++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 83 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index 36152cd..e325cd1 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -196,8 +196,12 @@ value(<>, Handler, Stack, Config) -> array(Rest, handle_event(start_array, Handler, Config), [array|Stack], Config); value(<>, Handler, Stack, Config) when ?is_whitespace(S) -> value(Rest, Handler, Stack, Config); -value(<>, Handler, Stack, Config=#config{comments=true}) -> - comment(Rest, Handler, [value|Stack], Config); +value(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, value, [comment|Stack], Config); +value(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, value, [multicomment|Stack], Config); +value(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(value, <>, Handler, Stack, Config); value(<<>>, Handler, Stack, Config) -> incomplete(value, <<>>, Handler, Stack, Config); value(Bin, Handler, Stack, Config) -> @@ -212,8 +216,12 @@ object(<>, Handler, [key|Stack], Config) -> maybe_done(Rest, handle_event(end_object, Handler, Config), Stack, Config); object(<>, Handler, Stack, Config) when ?is_whitespace(S) -> object(Rest, Handler, Stack, Config); -object(<>, Handler, Stack, Config=#config{comments=true}) -> - comment(Rest, Handler, [object|Stack], Config); +object(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, object, [comment|Stack], Config); +object(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, object, [multicomment|Stack], Config); +object(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(object, <>, Handler, Stack, Config); object(<<>>, Handler, Stack, Config) -> incomplete(object, <<>>, Handler, Stack, Config); object(Bin, Handler, Stack, Config) -> @@ -224,8 +232,12 @@ array(<>, Handler, [array|Stack], Config) -> maybe_done(Rest, handle_event(end_array, Handler, Config), Stack, Config); array(<>, Handler, Stack, Config) when ?is_whitespace(S) -> array(Rest, Handler, Stack, Config); -array(<>, Handler, Stack, Config=#config{comments=true}) -> - comment(Rest, Handler, [array|Stack], Config); +array(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, array, [comment|Stack], Config); +array(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, array, [multicomment|Stack], Config); +array(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(array, <>, Handler, Stack, Config); array(<<>>, Handler, Stack, Config) -> incomplete(array, <<>>, Handler, Stack, Config); array(Bin, Handler, Stack, Config) -> @@ -236,8 +248,12 @@ colon(<>, Handler, [key|Stack], Config) -> value(Rest, Handler, [object|Stack], Config); colon(<>, Handler, Stack, Config) when ?is_whitespace(S) -> colon(Rest, Handler, Stack, Config); -colon(<>, Handler, Stack, Config=#config{comments=true}) -> - comment(Rest, Handler, [colon|Stack], Config); +colon(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, colon, [comment|Stack], Config); +colon(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, colon, [multicomment|Stack], Config); +colon(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(colon, <>, Handler, Stack, Config); colon(<<>>, Handler, Stack, Config) -> incomplete(colon, <<>>, Handler, Stack, Config); colon(Bin, Handler, Stack, Config) -> @@ -250,8 +266,12 @@ key(<>, Handler, Stack, Config=#config{single_quoted_ string(Rest, Handler, new_seq(), [single_quote|Stack], Config); key(<>, Handler, Stack, Config) when ?is_whitespace(S) -> key(Rest, Handler, Stack, Config); -key(<>, Handler, Stack, Config=#config{comments=true}) -> - comment(Rest, Handler, [key|Stack], Config); +key(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, key, [comment|Stack], Config); +key(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, key, [multicomment|Stack], Config); +key(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(key, <>, Handler, Stack, Config); key(<<>>, Handler, Stack, Config) -> incomplete(key, <<>>, Handler, Stack, Config); key(Bin, Handler, Stack, Config) -> @@ -757,8 +777,12 @@ finish_number(<>, Handler, Acc, [array|Stack], Config) -> value(Rest, handle_event(format_number(Acc), Handler, Config), [array|Stack], Config); finish_number(<>, Handler, Acc, Stack, Config) when ?is_whitespace(S) -> maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), Stack, Config); -finish_number(<>, Handler, Acc, Stack, Config=#config{comments=true}) -> - comment(Rest, handle_event(format_number(Acc), Handler, Config), [maybe_done|Stack], Config); +finish_number(<>, Handler, Acc, Stack, Config=#config{comments=true}) -> + comment(Rest, handle_event(format_number(Acc), Handler, Config), maybe_done, [comment|Stack], Config); +finish_number(<>, Handler, Acc, Stack, Config=#config{comments=true}) -> + comment(Rest, handle_event(format_number(Acc), Handler, Config), maybe_done, [multicomment|Stack], Config); +finish_number(<>, Handler, Acc, Stack, Config=#config{comments=true}) -> + incomplete(maybe_done, <>, handle_event(format_number(Acc), Handler, Config), Stack, Config); finish_number(<<>>, Handler, {NumType, Acc}, Stack, Config) -> case NumType of integer -> incomplete(integer, <<>>, Handler, Acc, Stack, Config); @@ -820,72 +844,30 @@ null(Bin, Handler, Stack, Config) -> ?error(null, Bin, Handler, Stack, Config). -%% this just exists to bridge to when i can properly clean up comments -comment(Bin, Handler, Resume, Stack, Config) -> - comment(Bin, Handler, [Resume|Stack], Config). - -comment(<>, Handler, Stack, Config) -> - single_comment(Rest, Handler, Stack, Config); -comment(<>, Handler, Stack, Config) -> - multi_comment(Rest, Handler, Stack, Config); -%% nested /**/ comments -comment(<<_/utf8, Rest/binary>>, Handler, [comment|Stack], Config) -> - multi_comment(Rest, Handler, Stack, Config); -comment(<<_, Rest/binary>>, Handler, [comment|Stack], Config=#config{replaced_bad_utf8=true}) -> - multi_comment(Rest, Handler, Stack, Config); -comment(<<>>, Handler, [Resume|Stack], Config) -> - incomplete(comment, <<>>, Handler, Resume, Stack, Config); -comment(Bin, Handler, Stack, Config) -> - ?error(comment, Bin, Handler, Stack, Config). - - -single_comment(<>, Handler, Stack, Config) -> - end_comment(Rest, Handler, Stack, Config); -single_comment(<<_/utf8, Rest/binary>>, Handler, Stack, Config) -> - single_comment(Rest, Handler, Stack, Config); -single_comment(<<_, Rest/binary>>, Handler, Stack, Config=#config{replaced_bad_utf8=true}) -> - single_comment(Rest, Handler, Stack, Config); -single_comment(<<>>, Handler, [done], Config=#config{explicit_end=false}) -> - end_comment(<<>>, Handler, [done], Config); -single_comment(<<>>, Handler, [Resume|Stack], Config) -> +comment(<>, Handler, Resume, [comment|Stack], Config) -> + resume(Rest, Resume, Handler, unused, Stack, Config); +comment(<>, Handler, Resume, Stack, Config) -> + comment(Rest, Handler, Resume, [multicomment|Stack], Config); +comment(<>, Handler, Resume, [multicomment|_] = Stack, Config) -> incomplete(comment, <>, Handler, Resume, Stack, Config); -single_comment(Bin, Handler, Stack, Config) -> - ?error(comment, <>, Handler, Stack, Config). - - -multi_comment(<>, Handler, Stack, Config) -> - end_multi_comment(Rest, Handler, Stack, Config); -multi_comment(<>, Handler, Stack, Config) -> - comment(Rest, Handler, [comment|Stack], Config); -multi_comment(<<_S/utf8, Rest/binary>>, Handler, Stack, Config) -> - multi_comment(Rest, Handler, Stack, Config); -multi_comment(<<_, Rest/binary>>, Handler, Stack, Config=#config{replaced_bad_utf8=true}) -> - multi_comment(Rest, Handler, Stack, Config); -multi_comment(<<>>, Handler, [Resume|Stack], Config) -> +comment(<>, Handler, Resume, [multicomment|Stack], Config) -> + case Stack of + [multicomment|_] -> comment(Rest, Handler, Resume, Stack, Config); + _ -> resume(Rest, Resume, Handler, unused, Stack, Config) + end; +comment(<>, Handler, Resume, [multicomment|_] = Stack, Config) -> incomplete(comment, <>, Handler, Resume, Stack, Config); -multi_comment(Bin, Handler, Stack, Config) -> - ?error(comment, <>, Handler, Stack, Config). - - -end_multi_comment(<>, Handler, Stack, Config) -> - end_comment(Rest, Handler, Stack, Config); -end_multi_comment(<<>>, Handler, [Resume|Stack], Config) -> - incomplete(comment, <>, Handler, Resume, Stack, Config); -end_multi_comment(Bin, Handler, Stack, Config) -> - multi_comment(Bin, Handler, Stack, Config). - - -end_comment(Rest, Handler, [Resume|Stack], Config) -> - case Resume of - 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) - ; maybe_done -> maybe_done(Rest, Handler, Stack, Config) - ; done -> done(Rest, Handler, Stack, Config) - ; comment -> multi_comment(Rest, Handler, Stack, Config) - end. +comment(<<_/utf8, Rest/binary>>, Handler, Resume, Stack, Config) -> + comment(Rest, Handler, Resume, Stack, Config); +comment(<<_, Rest/binary>>, Handler, Resume, Stack, Config=#config{replaced_bad_utf8=true}) -> + comment(Rest, Handler, Resume, Stack, Config); +comment(<<>>, Handler, done, [Comment], Config=#config{explicit_end=false}) + when Comment == comment; Comment == multicomment -> + resume(<<>>, done, Handler, unused, [], Config); +comment(<<>>, Handler, Resume, Stack, Config) -> + incomplete(comment, <<>>, Handler, Resume, Stack, Config); +comment(Bin, Handler, Resume, Stack, Config) -> + ?error(comment, Bin, Handler, Resume, Stack, Config). maybe_done(Rest, Handler, [], Config) -> @@ -900,8 +882,12 @@ maybe_done(<>, Handler, [array|_] = Stack, Config) -> value(Rest, Handler, Stack, Config); maybe_done(<>, Handler, Stack, Config) when ?is_whitespace(S) -> maybe_done(Rest, Handler, Stack, Config); -maybe_done(<>, Handler, Stack, Config=#config{comments=true}) -> - comment(Rest, Handler, [maybe_done|Stack], Config); +maybe_done(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, maybe_done, [comment|Stack], Config); +maybe_done(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, maybe_done, [multicomment|Stack], Config); +maybe_done(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(maybe_done, <>, Handler, Stack, Config); maybe_done(<<>>, Handler, Stack, Config) when length(Stack) > 0 -> incomplete(maybe_done, <<>>, Handler, Stack, Config); maybe_done(Bin, Handler, Stack, Config) -> @@ -910,8 +896,12 @@ maybe_done(Bin, Handler, Stack, Config) -> done(<>, Handler, [], Config) when ?is_whitespace(S) -> done(Rest, Handler, [], Config); -done(<>, Handler, [], Config=#config{comments=true}) -> - comment(Rest, Handler, [done], Config); +done(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, done, [comment|Stack], Config); +done(<>, Handler, Stack, Config=#config{comments=true}) -> + comment(Rest, Handler, done, [multicomment|Stack], Config); +done(<>, Handler, Stack, Config=#config{comments=true}) -> + incomplete(done, <>, Handler, Stack, Config); done(<<>>, {Handler, State}, [], Config=#config{explicit_end=true}) -> {incomplete, fun(Stream) when is_binary(Stream) -> done(<>, {Handler, State}, [], Config) @@ -2033,15 +2023,15 @@ custom_error_handler_test_() -> Decode(<<"[]"/utf8, 0>>, [{error_handler, Error}]) )}, {"comment error", ?_assertEqual( - {comment, <<" ]"/utf8>>}, + {value, <<"/ ]"/utf8>>}, Decode(<<"[ / ]">>, [{error_handler, Error}, comments]) )}, {"single_comment error", ?_assertEqual( - {comment, <<"/"/utf8, 192>>}, + {comment, <<192>>}, Decode(<<"[ //"/utf8, 192>>, [{error_handler, Error}, comments]) )}, {"multi_comment error", ?_assertEqual( - {comment, <<"*"/utf8, 192>>}, + {comment, <<192>>}, Decode(<<"[ /*"/utf8, 192>>, [{error_handler, Error}, comments]) )} ].