|
@@ -2,7 +2,7 @@
|
|
|
%%% @private
|
|
|
%%% @end
|
|
|
%%%
|
|
|
-%%% Copyright (c) 2013-2015, Takeru Ohta <phjgt308@gmail.com>
|
|
|
+%%% Copyright (c) 2013-2016, Takeru Ohta <phjgt308@gmail.com>
|
|
|
%%%
|
|
|
%%% The MIT License
|
|
|
%%%
|
|
@@ -170,12 +170,12 @@ string(<<$\\, B/binary>>, Base, Start, Nexts, Buf, Opt) ->
|
|
|
<<$u, Bin/binary>> -> unicode_string(Bin, Start, Nexts, <<Buf/binary, Prefix/binary>>, Opt);
|
|
|
_ -> ?ERROR(string, [<<$\\, B/binary>>, Base, Start, Nexts, Buf, Opt])
|
|
|
end;
|
|
|
-string(<<C, Bin/binary>>, Base, Start, Nexts, Buf, Opt) when 16#20 =< C ->
|
|
|
- string(Bin, Base, Start, Nexts, Buf, Opt);
|
|
|
string(<<_, Bin/binary>>, Base, Start, Nexts, Buf, Opt) when Opt?OPT.allow_ctrl_chars ->
|
|
|
string(Bin, Base, Start, Nexts, Buf, Opt);
|
|
|
-string(Bin, Base, Start, Nexts, Buf, Opt) ->
|
|
|
- ?ERROR(string, [Bin, Base, Start, Nexts, Buf, Opt]).
|
|
|
+string(<<C, Bin/binary>>, Base, Start, Nexts, Buf, Opt) when 16#20 =< C ->
|
|
|
+ string(Bin, Base, Start, Nexts, Buf, Opt);
|
|
|
+ string(Bin, Base, Start, Nexts, Buf, Opt) ->
|
|
|
+ ?ERROR(string, [Bin, Base, Start, Nexts, Buf, Opt]).
|
|
|
|
|
|
-spec unicode_string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
|
|
|
unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
|
|
@@ -186,8 +186,8 @@ unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
|
|
|
<<$\\, $u, N2:4/binary, Bin2/binary>> ->
|
|
|
case binary_to_integer(N2, 16) of
|
|
|
Low when 16#DC00 =< Low, Low =< 16#DFFF ->
|
|
|
- Unicode = 16#10000 + (High - 16#D800) * 16#400 + (Low - 16#DC00),
|
|
|
- string(Bin2, Start, Nexts, unicode_to_utf8(Unicode, Buf), Opt);
|
|
|
+ <<Unicode/utf16>> = <<High:16, Low:16>>,
|
|
|
+ string(Bin2, Start, Nexts, <<Buf/binary, Unicode/utf8>>, Opt);
|
|
|
_ -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
|
end;
|
|
|
_ -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
@@ -195,30 +195,11 @@ unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
|
|
|
Unicode when 16#DC00 =< Unicode, Unicode =< 16#DFFF -> % second part of surrogate pair (without first part)
|
|
|
?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt]);
|
|
|
Unicode ->
|
|
|
- string(Bin, Start, Nexts, unicode_to_utf8(Unicode, Buf), Opt)
|
|
|
+ string(Bin, Start, Nexts, <<Buf/binary, Unicode/utf8>>, Opt)
|
|
|
end;
|
|
|
unicode_string(Bin, Start, Nexts, Buf, Opt) ->
|
|
|
?ERROR(unicode_string, [Bin, Start, Nexts, Buf, Opt]).
|
|
|
|
|
|
--spec unicode_to_utf8(0..1114111, binary()) -> binary().
|
|
|
-unicode_to_utf8(Code, Buf) when Code < 16#80 ->
|
|
|
- <<Buf/binary, Code>>;
|
|
|
-unicode_to_utf8(Code, Buf) when Code < 16#800 ->
|
|
|
- A = 2#11000000 bor (Code bsr 6),
|
|
|
- B = 2#10000000 bor (Code band 2#111111),
|
|
|
- <<Buf/binary, A, B>>;
|
|
|
-unicode_to_utf8(Code, Buf) when Code < 16#10000 ->
|
|
|
- A = 2#11100000 bor (Code bsr 12),
|
|
|
- B = 2#10000000 bor ((Code bsr 6) band 2#111111),
|
|
|
- C = 2#10000000 bor (Code band 2#111111),
|
|
|
- <<Buf/binary, A, B, C>>;
|
|
|
-unicode_to_utf8(Code, Buf) ->
|
|
|
- A = 2#11110000 bor (Code bsr 18),
|
|
|
- B = 2#10000000 bor ((Code bsr 12) band 2#111111),
|
|
|
- C = 2#10000000 bor ((Code bsr 6) band 2#111111),
|
|
|
- D = 2#10000000 bor (Code band 2#111111),
|
|
|
- <<Buf/binary, A, B, C, D>>.
|
|
|
-
|
|
|
-spec number(binary(), [next()], binary(), opt()) -> decode_result().
|
|
|
number(<<$-, Bin/binary>>, Nexts, Buf, Opt) -> number_integer_part(Bin, -1, Nexts, Buf, Opt);
|
|
|
number(<<Bin/binary>>, Nexts, Buf, Opt) -> number_integer_part(Bin, 1, Nexts, Buf, Opt).
|