diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index b16199b..e3daebd 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -726,9 +726,9 @@ strip_continuations(<>, Handler, Acc, Stack, Config, _) -> %% this all gets really gross and should probably eventually be folded into %% but for now it fakes being part of string on incompletes and errors unescape(<>, Handler, Acc, Stack, Config=#config{dirty_strings=true}) -> - string(<>, Handler, [Acc, ?rsolidus], Stack, Config); + string(<>, Handler, [Acc, <>], Stack, Config); unescape(<>, Handler, Acc, Stack, Config=#config{dirty_strings=true}) -> - string(Rest, Handler, [Acc, ?rsolidus, C], Stack, Config); + string(Rest, Handler, [Acc, <>], Stack, Config); unescape(<<$b, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, [Acc, maybe_replace($\b, Config)], Stack, Config); unescape(<<$f, Rest/binary>>, Handler, Acc, Stack, Config) -> @@ -742,7 +742,7 @@ unescape(<<$t, Rest/binary>>, Handler, Acc, Stack, Config) -> unescape(<>, Handler, Acc, Stack, Config) -> string(Rest, Handler, [Acc, maybe_replace($\", Config)], Stack, Config); unescape(<>, Handler, Acc, Stack, Config=#config{strict_single_quotes=false}) -> - string(Rest, Handler, [Acc, ?singlequote], Stack, Config); + string(Rest, Handler, [Acc, <>], Stack, Config); unescape(<>, Handler, Acc, Stack, Config) -> string(Rest, Handler, [Acc, maybe_replace($\\, Config)], Stack, Config); unescape(<>, Handler, Acc, Stack, Config) -> @@ -793,7 +793,7 @@ unescape(Bin, Handler, Acc, Stack, Config) -> true -> incomplete(string, <>, Handler, Acc, Stack, Config); false -> case Config#config.strict_escapes of true -> ?error(string, <>, Handler, Acc, Stack, Config); - false -> string(Bin, Handler, [Acc, ?rsolidus], Stack, Config) + false -> string(Bin, Handler, [Acc, <>], Stack, Config) end end. @@ -806,19 +806,19 @@ is_partial_escape(<<>>) -> true; is_partial_escape(_) -> false. -maybe_replace(C, #config{dirty_strings=true}) -> C; -maybe_replace($\b, #config{escaped_strings=true}) -> [$\\, $b]; -maybe_replace($\t, #config{escaped_strings=true}) -> [$\\, $t]; -maybe_replace($\n, #config{escaped_strings=true}) -> [$\\, $n]; -maybe_replace($\f, #config{escaped_strings=true}) -> [$\\, $f]; -maybe_replace($\r, #config{escaped_strings=true}) -> [$\\, $r]; -maybe_replace($\", #config{escaped_strings=true}) -> [$\\, $\"]; +maybe_replace(C, #config{dirty_strings=true}) -> <>; +maybe_replace($\b, #config{escaped_strings=true}) -> <<$\\, $b>>; +maybe_replace($\t, #config{escaped_strings=true}) -> <<$\\, $t>>; +maybe_replace($\n, #config{escaped_strings=true}) -> <<$\\, $n>>; +maybe_replace($\f, #config{escaped_strings=true}) -> <<$\\, $f>>; +maybe_replace($\r, #config{escaped_strings=true}) -> <<$\\, $r>>; +maybe_replace($\", #config{escaped_strings=true}) -> <<$\\, $\">>; maybe_replace($/, Config=#config{escaped_strings=true}) -> case Config#config.escaped_forward_slashes of - true -> [$\\, $/] - ; false -> $/ + true -> <<$\\, $/>> + ; false -> <<$/>> end; -maybe_replace($\\, #config{escaped_strings=true}) -> [$\\, $\\]; +maybe_replace($\\, #config{escaped_strings=true}) -> <<$\\, $\\>>; maybe_replace(X, Config=#config{escaped_strings=true}) when X == 16#2028; X == 16#2029 -> case Config#config.unescaped_jsonp of true -> <> @@ -832,11 +832,11 @@ maybe_replace(X, _Config) -> <>. %% convert a codepoint to it's \uXXXX equiv. json_escape_sequence(X) when X < 65536 -> <> = <>, - [$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))]; + <<$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))>>; json_escape_sequence(X) -> Adjusted = X - 16#10000, <> = <>, - json_escape_sequence(A + 16#d800) ++ json_escape_sequence(B + 16#dc00). + [json_escape_sequence(A + 16#d800), json_escape_sequence(B + 16#dc00)]. %% ascii "1" is [49], "2" is [50], etc... diff --git a/src/jsx_parser.erl b/src/jsx_parser.erl index 1773361..7113c71 100644 --- a/src/jsx_parser.erl +++ b/src/jsx_parser.erl @@ -471,50 +471,43 @@ strip_continuations(<>, N) when X >= 128, X =< 191 -> strip_continuations(Bin, _) -> Bin. -maybe_replace($\b, #config{escaped_strings=true}) -> - [$\\, $b]; -maybe_replace($\t, #config{escaped_strings=true}) -> - [$\\, $t]; -maybe_replace($\n, #config{escaped_strings=true}) -> - [$\\, $n]; -maybe_replace($\f, #config{escaped_strings=true}) -> - [$\\, $f]; -maybe_replace($\r, #config{escaped_strings=true}) -> - [$\\, $r]; -maybe_replace($\", #config{escaped_strings=true}) -> - [$\\, $\"]; +maybe_replace($\b, #config{escaped_strings=true}) -> <<$\\, $b>>; +maybe_replace($\t, #config{escaped_strings=true}) -> <<$\\, $t>>; +maybe_replace($\n, #config{escaped_strings=true}) -> <<$\\, $n>>; +maybe_replace($\f, #config{escaped_strings=true}) -> <<$\\, $f>>; +maybe_replace($\r, #config{escaped_strings=true}) -> <<$\\, $r>>; +maybe_replace($\", #config{escaped_strings=true}) -> <<$\\, $\">>; maybe_replace($/, Config=#config{escaped_strings=true}) -> case Config#config.escaped_forward_slashes of - true -> [$\\, $/]; - false -> [$/] + true -> <<$\\, $/>>; + false -> <<$/>> end; -maybe_replace($\\, #config{escaped_strings=true}) -> - [$\\, $\\]; +maybe_replace($\\, #config{escaped_strings=true}) -> <<$\\, $\\>>; maybe_replace(X, #config{escaped_strings=true}) when X < 32 -> json_escape_sequence(X); maybe_replace(X, Config=#config{escaped_strings=true}) when X == 16#2028; X == 16#2029 -> case Config#config.unescaped_jsonp of - true -> [<>]; + true -> <>; false -> json_escape_sequence(X) end; maybe_replace(Atom, #config{strict_utf8=true}) when is_atom(Atom) -> erlang:error(badarg); maybe_replace(surrogate, _Config) -> - [<<16#fffd/utf8>>]; + <<16#fffd/utf8>>; maybe_replace(badutf, _Config) -> - [<<16#fffd/utf8>>]; + <<16#fffd/utf8>>; maybe_replace(X, _Config) -> - [<>]. + <>. %% convert a codepoint to it's \uXXXX equiv. json_escape_sequence(X) when X < 65536 -> <> = <>, - [$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))]; + <<$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))>>; json_escape_sequence(X) -> Adjusted = X - 16#10000, <> = <>, - json_escape_sequence(A + 16#d800) ++ json_escape_sequence(B + 16#dc00). + [json_escape_sequence(A + 16#d800), json_escape_sequence(B + 16#dc00)]. to_hex(10) -> $a; @@ -1030,9 +1023,9 @@ bad_utf8_test_() -> json_escape_sequence_test_() -> [ - {"json escape sequence test - 16#0000", ?_assertEqual(json_escape_sequence(16#0000), "\\u0000")}, - {"json escape sequence test - 16#abc", ?_assertEqual(json_escape_sequence(16#abc), "\\u0abc")}, - {"json escape sequence test - 16#def", ?_assertEqual(json_escape_sequence(16#def), "\\u0def")} + {"json escape sequence test - 16#0000", ?_assertEqual(<<"\\u0000"/utf8>>, json_escape_sequence(16#0000))}, + {"json escape sequence test - 16#abc", ?_assertEqual(<<"\\u0abc"/utf8>>, json_escape_sequence(16#abc))}, + {"json escape sequence test - 16#def", ?_assertEqual(<<"\\u0def"/utf8>>, json_escape_sequence(16#def))} ].