|
@@ -194,23 +194,26 @@ string(<<C, Bin/binary>>, Base, Start, Nexts, Buf, Opt) when 16#20 =< C ->
|
|
|
|
|
|
-spec unicode_string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
|
|
-spec unicode_string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
|
|
unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
|
|
unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
|
|
- case binary_to_integer(N, 16) of
|
|
|
|
|
|
+ try binary_to_integer(N, 16) of
|
|
High when 16#D800 =< High, High =< 16#DBFF ->
|
|
High when 16#D800 =< High, High =< 16#DBFF ->
|
|
%% surrogate pair
|
|
%% surrogate pair
|
|
case Bin of
|
|
case Bin of
|
|
<<$\\, $u, N2:4/binary, Bin2/binary>> ->
|
|
<<$\\, $u, N2:4/binary, Bin2/binary>> ->
|
|
- case binary_to_integer(N2, 16) of
|
|
|
|
|
|
+ try binary_to_integer(N2, 16) of
|
|
Low when 16#DC00 =< Low, Low =< 16#DFFF ->
|
|
Low when 16#DC00 =< Low, Low =< 16#DFFF ->
|
|
<<Unicode/utf16>> = <<High:16, Low:16>>,
|
|
<<Unicode/utf16>> = <<High:16, Low:16>>,
|
|
string(Bin2, Start, Nexts, <<Buf/binary, Unicode/utf8>>, Opt);
|
|
string(Bin2, Start, Nexts, <<Buf/binary, Unicode/utf8>>, Opt);
|
|
_ -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
_ -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
|
|
+ catch error:badarg -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
end;
|
|
end;
|
|
_ -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
_ -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
end;
|
|
end;
|
|
- Unicode when 16#DC00 =< Unicode, Unicode =< 16#DFFF -> % second part of surrogate pair (without first part)
|
|
|
|
|
|
+ Unicode when 16#DC00 =< Unicode, Unicode =< 16#DFFF; % second part of surrogate pair (without first part)
|
|
|
|
+ 0 > Unicode ->
|
|
?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt]);
|
|
?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt]);
|
|
Unicode ->
|
|
Unicode ->
|
|
string(Bin, Start, Nexts, <<Buf/binary, Unicode/utf8>>, Opt)
|
|
string(Bin, Start, Nexts, <<Buf/binary, Unicode/utf8>>, Opt)
|
|
|
|
+ catch error:badarg -> ?ERROR(unicode_string, [<<N/binary, Bin/binary>>, Start, Nexts, Buf, Opt])
|
|
end;
|
|
end;
|
|
unicode_string(Bin, Start, Nexts, Buf, Opt) ->
|
|
unicode_string(Bin, Start, Nexts, Buf, Opt) ->
|
|
?ERROR(unicode_string, [Bin, Start, Nexts, Buf, Opt]).
|
|
?ERROR(unicode_string, [Bin, Start, Nexts, Buf, Opt]).
|
|
@@ -271,7 +274,11 @@ number_exponation_part(<<C, Bin/binary>>, N, DecimalOffset, ExpSign, Exp, _, Nex
|
|
number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp * 10 + C - $0, false, Nexts, Buf, Opt);
|
|
number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp * 10 + C - $0, false, Nexts, Buf, Opt);
|
|
number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Nexts, Buf, Opt) ->
|
|
number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Nexts, Buf, Opt) ->
|
|
Pos = ExpSign * Exp - DecimalOffset,
|
|
Pos = ExpSign * Exp - DecimalOffset,
|
|
- next(Bin, N * math:pow(10, Pos), Nexts, Buf, Opt);
|
|
|
|
|
|
+ try N * math:pow(10, Pos)
|
|
|
|
+ of Res -> next(Bin, Res, Nexts, Buf, Opt)
|
|
|
|
+ catch error:badarith ->
|
|
|
|
+ ?ERROR(number_exponation_part, [Bin, N, DecimalOffset, ExpSign, Exp, false, Nexts, Buf, Opt])
|
|
|
|
+ end;
|
|
number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt) ->
|
|
number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt) ->
|
|
?ERROR(number_exponation_part, [Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt]).
|
|
?ERROR(number_exponation_part, [Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt]).
|
|
|
|
|