diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index de4b0c4..d2b57c7 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -298,6 +298,8 @@ string(<<32, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 32), Stack, Config); string(<<33, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 33), Stack, Config); +string(<>, Handler, Acc, Stack, Config) -> + doublequote(Rest, Handler, Acc, Stack, Config); string(<<35, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 35), Stack, Config); string(<<36, Rest/binary>>, Handler, Acc, Stack, Config) -> @@ -306,6 +308,8 @@ string(<<37, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 37), Stack, Config); string(<<38, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 38), Stack, Config); +string(<>, Handler, Acc, Stack, Config) -> + singlequote(Rest, Handler, Acc, Stack, Config); string(<<40, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 40), Stack, Config); string(<<41, Rest/binary>>, Handler, Acc, Stack, Config) -> @@ -478,12 +482,6 @@ string(<<126, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 126), Stack, Config); string(<<127, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 127), Stack, Config); -string(<>, Handler, Acc, [key|_] = Stack, Config) -> - colon(Rest, handle_event({key, end_seq(Acc, Config)}, Handler, Config), Stack, Config); -string(<>, Handler, Acc, [single_quote|_] = Stack, Config) -> - string(Rest, Handler,acc_seq(Acc, maybe_replace(?doublequote, Config)), Stack, Config); -string(<>, Handler, Acc, Stack, Config) -> - maybe_done(Rest, handle_event({string, end_seq(Acc, Config)}, Handler, Config), Stack, Config); string(<>, Handler, Acc, [single_quote|_] = Stack, Config=#config{dirty_strings=true}) -> string(Rest, Handler, acc_seq(Acc, [?rsolidus, ?doublequote]), Stack, Config); string(<>, Handler, Acc, Stack, Config=#config{dirty_strings=true}) -> @@ -498,12 +496,6 @@ string(<>, Handler, Acc, Stack, Config) -> unescape(Rest, Handler, Acc, Stack, Config); string(<>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, maybe_replace(?solidus, Config)), Stack, Config); -string(<>, Handler, Acc, [single_quote, key|Stack], Config) -> - colon(Rest, handle_event({key, end_seq(Acc, Config)}, Handler, Config), [key|Stack], Config); -string(<>, Handler, Acc, [single_quote|Stack], Config) -> - maybe_done(Rest, handle_event({string, end_seq(Acc, Config)}, Handler, Config), Stack, Config); -string(<>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, ?singlequote), Stack, Config); string(<>, Handler, Acc, Stack, Config) when X >= 16#20, X < 16#2028 -> string(Rest, Handler, acc_seq(Acc, X), Stack, Config); string(<>, Handler, Acc, Stack, Config) when X == 16#2028; X == 16#2029 -> @@ -579,6 +571,24 @@ string(Bin, Handler, Acc, Stack, Config) -> false -> ?error(string, Bin, Handler, Acc, Stack, Config) end. + +doublequote(<>, Handler, Acc, [key|_] = Stack, Config) -> + colon(Rest, handle_event({key, end_seq(Acc, Config)}, Handler, Config), Stack, Config); +doublequote(<>, Handler, Acc, [single_quote|_] = Stack, Config) -> + string(Rest, Handler,acc_seq(Acc, maybe_replace(?doublequote, Config)), Stack, Config); +doublequote(<<>>, Handler, Acc, [single_quote|_] = Stack, Config) -> + incomplete(string, <>, Handler, Acc, Stack, Config); +doublequote(<>, Handler, Acc, Stack, Config) -> + maybe_done(Rest, handle_event({string, end_seq(Acc, Config)}, Handler, Config), Stack, Config). + +singlequote(<>, Handler, Acc, [single_quote, key|Stack], Config) -> + colon(Rest, handle_event({key, end_seq(Acc, Config)}, Handler, Config), [key|Stack], Config); +singlequote(<>, Handler, Acc, [single_quote|Stack], Config) -> + maybe_done(Rest, handle_event({string, end_seq(Acc, Config)}, Handler, Config), Stack, Config); +singlequote(<>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, ?singlequote), Stack, Config). + + %% when parsing strings, the naive detection of partial codepoints is %% insufficient. this incredibly anal function should detect all badly formed %% utf sequences