change seq macros to functions

This commit is contained in:
alisdair sullivan 2013-03-02 14:56:32 -08:00
parent 8ee653a6cf
commit 6df04635b8

View file

@ -133,13 +133,13 @@ decoder(Handler, State, Config) ->
-endif.
-define(new_seq(), []).
-define(new_seq(C), [C]).
new_seq() -> [].
new_seq(C) -> [C].
-define(acc_seq(Seq, C), [C] ++ Seq).
-define(acc_seq(Seq, C, D), [C, D] ++ Seq).
acc_seq(Seq, C) -> [C] ++ Seq.
acc_seq(Seq, C, D) -> [C, D] ++ Seq.
-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))).
end_seq(Seq) -> unicode:characters_to_binary(lists:reverse(Seq)).
handle_event([], Handler, _Config) -> Handler;
@ -174,9 +174,9 @@ definitely_bom(Bin, Handler, Stack, Config) ->
value(<<?doublequote, Rest/binary>>, Handler, Stack, Config) ->
string(Rest, Handler, ?new_seq(), Stack, Config);
string(Rest, Handler, new_seq(), Stack, Config);
value(<<?singlequote, Rest/binary>>, Handler, Stack, Config = #config{single_quoted_strings=true}) ->
string(Rest, Handler, ?new_seq(), [single_quote|Stack], Config);
string(Rest, Handler, new_seq(), [single_quote|Stack], Config);
value(<<$t, Rest/binary>>, Handler, Stack, Config) ->
true(Rest, Handler, Stack, Config);
value(<<$f, Rest/binary>>, Handler, Stack, Config) ->
@ -204,9 +204,9 @@ value(Bin, Handler, Stack, Config) ->
object(<<?doublequote, Rest/binary>>, Handler, Stack, Config) ->
string(Rest, Handler, ?new_seq(), Stack, Config);
string(Rest, Handler, new_seq(), Stack, Config);
object(<<?singlequote, Rest/binary>>, Handler, Stack, Config = #config{single_quoted_strings=true}) ->
string(Rest, Handler, ?new_seq(), [single_quote|Stack], Config);
string(Rest, Handler, new_seq(), [single_quote|Stack], Config);
object(<<?end_object, Rest/binary>>, Handler, [key|Stack], Config) ->
maybe_done(Rest, handle_event(end_object, Handler, Config), Stack, Config);
object(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
@ -244,9 +244,9 @@ colon(Bin, Handler, Stack, Config) ->
key(<<?doublequote, Rest/binary>>, Handler, Stack, Config) ->
string(Rest, Handler, ?new_seq(), Stack, Config);
string(Rest, Handler, new_seq(), Stack, Config);
key(<<?singlequote, Rest/binary>>, Handler, Stack, Config = #config{single_quoted_strings=true}) ->
string(Rest, Handler, ?new_seq(), [single_quote|Stack], Config);
string(Rest, Handler, new_seq(), [single_quote|Stack], Config);
key(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_whitespace(S) ->
key(Rest, Handler, Stack, Config);
key(<<?solidus, Rest/binary>>, Handler, Stack, Config=#config{comments=true}) ->
@ -260,264 +260,264 @@ key(Bin, Handler, Stack, Config) ->
%% explicitly whitelist ascii set for better efficiency (seriously, it's worth
%% almost a 20% increase)
string(<<32, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 32), 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(Rest, Handler, acc_seq(Acc, 33), Stack, Config);
string(<<?doublequote, Rest/binary>>, Handler, Acc, Stack, Config) ->
case Stack of
[key|_] ->
colon(Rest, handle_event({key, ?end_seq(Acc)}, Handler, Config), Stack, Config);
colon(Rest, handle_event({key, end_seq(Acc)}, Handler, Config), Stack, Config);
[single_quote|_] ->
string(Rest, Handler,?acc_seq(Acc, maybe_replace(?doublequote, Config)), Stack, Config);
string(Rest, Handler,acc_seq(Acc, maybe_replace(?doublequote, Config)), Stack, Config);
_ ->
maybe_done(Rest, handle_event({string, ?end_seq(Acc)}, Handler, Config), Stack, Config)
maybe_done(Rest, handle_event({string, end_seq(Acc)}, Handler, Config), Stack, Config)
end;
string(<<35, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 35), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 35), Stack, Config);
string(<<36, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 36), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 36), Stack, Config);
string(<<37, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 37), 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(Rest, Handler, acc_seq(Acc, 38), Stack, Config);
string(<<?singlequote, Rest/binary>>, Handler, Acc, Stack, Config) ->
case Stack of
[single_quote, key|S] ->
colon(Rest, handle_event({key, ?end_seq(Acc)}, Handler, Config), [key|S], Config)
colon(Rest, handle_event({key, end_seq(Acc)}, Handler, Config), [key|S], Config)
; [single_quote|S] ->
maybe_done(Rest, handle_event({string, ?end_seq(Acc)}, Handler, Config), S, Config)
maybe_done(Rest, handle_event({string, end_seq(Acc)}, Handler, Config), S, Config)
; _ ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace(?singlequote, Config)), Stack, Config)
string(Rest, Handler, acc_seq(Acc, maybe_replace(?singlequote, Config)), Stack, Config)
end;
string(<<40, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 40), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 40), Stack, Config);
string(<<41, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 41), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 41), Stack, Config);
string(<<42, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 42), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 42), Stack, Config);
string(<<43, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 43), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 43), Stack, Config);
string(<<44, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 44), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 44), Stack, Config);
string(<<45, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 45), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 45), Stack, Config);
string(<<46, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 46), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 46), Stack, Config);
string(<<?solidus, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace(?solidus, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace(?solidus, Config)), Stack, Config);
string(<<48, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 48), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 48), Stack, Config);
string(<<49, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 49), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 49), Stack, Config);
string(<<50, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 50), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 50), Stack, Config);
string(<<51, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 51), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 51), Stack, Config);
string(<<52, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 52), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 52), Stack, Config);
string(<<53, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 53), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 53), Stack, Config);
string(<<54, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 54), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 54), Stack, Config);
string(<<55, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 55), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 55), Stack, Config);
string(<<56, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 56), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 56), Stack, Config);
string(<<57, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 57), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 57), Stack, Config);
string(<<58, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 58), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 58), Stack, Config);
string(<<59, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 59), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 59), Stack, Config);
string(<<60, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 60), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 60), Stack, Config);
string(<<61, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 61), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 61), Stack, Config);
string(<<62, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 62), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 62), Stack, Config);
string(<<63, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 63), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 63), Stack, Config);
string(<<64, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 64), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 64), Stack, Config);
string(<<65, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 65), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 65), Stack, Config);
string(<<66, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 66), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 66), Stack, Config);
string(<<67, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 67), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 67), Stack, Config);
string(<<68, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 68), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 68), Stack, Config);
string(<<69, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 69), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 69), Stack, Config);
string(<<70, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 70), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 70), Stack, Config);
string(<<71, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 71), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 71), Stack, Config);
string(<<72, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 72), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 72), Stack, Config);
string(<<73, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 73), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 73), Stack, Config);
string(<<74, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 74), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 74), Stack, Config);
string(<<75, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 75), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 75), Stack, Config);
string(<<76, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 76), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 76), Stack, Config);
string(<<77, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 77), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 77), Stack, Config);
string(<<78, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 78), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 78), Stack, Config);
string(<<79, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 79), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 79), Stack, Config);
string(<<80, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 80), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 80), Stack, Config);
string(<<81, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 81), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 81), Stack, Config);
string(<<82, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 82), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 82), Stack, Config);
string(<<83, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 83), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 83), Stack, Config);
string(<<84, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 84), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 84), Stack, Config);
string(<<85, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 85), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 85), Stack, Config);
string(<<86, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 86), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 86), Stack, Config);
string(<<87, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 87), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 87), Stack, Config);
string(<<88, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 88), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 88), Stack, Config);
string(<<89, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 89), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 89), Stack, Config);
string(<<90, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 90), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 90), Stack, Config);
string(<<91, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 91), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 91), Stack, Config);
string(<<?rsolidus/utf8, Rest/binary>>, Handler, Acc, Stack, Config) ->
unescape(Rest, Handler, Acc, Stack, Config);
string(<<93, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 93), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 93), Stack, Config);
string(<<94, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 94), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 94), Stack, Config);
string(<<95, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 95), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 95), Stack, Config);
string(<<96, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 96), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 96), Stack, Config);
string(<<97, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 97), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 97), Stack, Config);
string(<<98, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 98), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 98), Stack, Config);
string(<<99, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 99), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 99), Stack, Config);
string(<<100, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 100), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 100), Stack, Config);
string(<<101, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 101), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 101), Stack, Config);
string(<<102, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 102), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 102), Stack, Config);
string(<<103, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 103), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 103), Stack, Config);
string(<<104, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 104), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 104), Stack, Config);
string(<<105, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 105), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 105), Stack, Config);
string(<<106, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 106), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 106), Stack, Config);
string(<<107, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 107), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 107), Stack, Config);
string(<<108, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 108), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 108), Stack, Config);
string(<<109, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 109), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 109), Stack, Config);
string(<<110, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 110), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 110), Stack, Config);
string(<<111, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 111), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 111), Stack, Config);
string(<<112, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 112), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 112), Stack, Config);
string(<<113, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 113), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 113), Stack, Config);
string(<<114, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 114), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 114), Stack, Config);
string(<<115, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 115), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 115), Stack, Config);
string(<<116, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 116), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 116), Stack, Config);
string(<<117, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 117), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 117), Stack, Config);
string(<<118, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 118), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 118), Stack, Config);
string(<<119, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 119), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 119), Stack, Config);
string(<<120, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 120), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 120), Stack, Config);
string(<<121, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 121), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 121), Stack, Config);
string(<<122, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 122), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 122), Stack, Config);
string(<<123, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 123), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 123), Stack, Config);
string(<<124, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 124), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 124), Stack, Config);
string(<<125, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 125), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 125), Stack, Config);
string(<<126, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, 126), 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(Rest, Handler, acc_seq(Acc, 127), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#20, X < 16#2028 ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X == 16#2028; X == 16#2029 ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace(X, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace(X, Config)), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X > 16#2029, X < 16#d800 ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X > 16#dfff, X < 16#fdd0 ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X > 16#fdef, X < 16#fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#10000, X < 16#1fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#20000, X < 16#2fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#30000, X < 16#3fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#40000, X < 16#4fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#50000, X < 16#5fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#60000, X < 16#6fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#70000, X < 16#7fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#80000, X < 16#8fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#90000, X < 16#9fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#a0000, X < 16#afffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#b0000, X < 16#bfffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#c0000, X < 16#cfffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#d0000, X < 16#dfffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#e0000, X < 16#efffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#f0000, X < 16#ffffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
string(<<X/utf8, Rest/binary>>, Handler, Acc, Stack, Config) when X >= 16#100000, X < 16#10fffe ->
string(Rest, Handler, ?acc_seq(Acc, X), Stack, Config);
string(Rest, Handler, acc_seq(Acc, X), Stack, Config);
%% surrogates
string(<<237, X, _, Rest/binary>>, Handler, Acc, Stack, #config{replaced_bad_utf8=true} = Config)
when X >= 160 ->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
%% u+fffe and u+ffff for R14BXX
string(<<239, 191, X, Rest/binary>>, Handler, Acc, Stack, #config{replaced_bad_utf8=true} = Config)
when X == 190; X == 191 ->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
%% u+xfffe, u+xffff, control codes and other noncharacters
string(<<_/utf8, Rest/binary>>, Handler, Acc, Stack, #config{replaced_bad_utf8=true} = Config) ->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
%% overlong encodings and missing continuations of a 2 byte sequence
string(<<X, Rest/binary>>, Handler, Acc, Stack, #config{replaced_bad_utf8=true} = Config)
when X >= 192, X =< 223 ->
@ -534,7 +534,7 @@ string(<<X, Rest/binary>>, Handler, Acc, Stack, #config{replaced_bad_utf8=true}
string(<<_, Rest/binary>> = Bin, Handler, Acc, Stack, #config{replaced_bad_utf8=true} = Config) ->
case partial_utf(Bin) of
true -> ?incomplete(string, Bin, Handler, Acc, Stack, Config);
false -> string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config)
false -> string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config)
end;
string(Bin, Handler, Acc, Stack, Config) ->
case partial_utf(Bin) of
@ -566,7 +566,7 @@ partial_utf(_) -> false.
%% possible magic numbers are reinserted into the stream that get us back to
%% the same state without complicated machinery
strip_continuations(Rest, Handler, Acc, Stack, Config, 0) ->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
strip_continuations(<<X, Rest/binary>>, Handler, Acc, Stack, Config, N) when X >= 128, X =< 191 ->
strip_continuations(Rest, Handler, Acc, Stack, Config, N - 1);
%% incomplete
@ -578,27 +578,27 @@ strip_continuations(<<>>, Handler, Acc, Stack, Config, N) ->
end;
%% not a continuation byte, dispatch back to string
strip_continuations(Rest, Handler, Acc, Stack, Config, _) ->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config).
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config).
unescape(<<$b, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\b, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\b, Config)), Stack, Config);
unescape(<<$f, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\f, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\f, Config)), Stack, Config);
unescape(<<$n, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\n, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\n, Config)), Stack, Config);
unescape(<<$r, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\r, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\r, Config)), Stack, Config);
unescape(<<$t, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\t, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\t, Config)), Stack, Config);
unescape(<<?rsolidus, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\\, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\\, Config)), Stack, Config);
unescape(<<?solidus, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($/, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($/, Config)), Stack, Config);
unescape(<<?doublequote, Rest/binary>>, Handler, Acc, Stack, Config) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace($\", Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace($\", Config)), Stack, Config);
unescape(<<?singlequote, Rest/binary>>, Handler, Acc, Stack, Config=#config{single_quoted_strings=true}) ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace(?singlequote, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace(?singlequote, Config)), Stack, Config);
unescape(<<$u, $d, A, B, C, ?rsolidus, $u, $d, X, Y, Z, Rest/binary>>, Handler, Acc, Stack, Config)
when (A == $8 orelse A == $9 orelse A == $a orelse A == $b),
(X == $c orelse X == $d orelse X == $e orelse X == $f),
@ -607,12 +607,12 @@ unescape(<<$u, $d, A, B, C, ?rsolidus, $u, $d, X, Y, Z, Rest/binary>>, Handler,
High = erlang:list_to_integer([$d, A, B, C], 16),
Low = erlang:list_to_integer([$d, X, Y, Z], 16),
Codepoint = (High - 16#d800) * 16#400 + (Low - 16#dc00) + 16#10000,
string(Rest, Handler, ?acc_seq(Acc, Codepoint), Stack, Config);
string(Rest, Handler, acc_seq(Acc, Codepoint), Stack, Config);
unescape(<<$u, $d, A, B, C, ?rsolidus, $u, W, X, Y, Z, Rest/binary>>, Handler, Acc, Stack, Config)
when (A == $8 orelse A == $9 orelse A == $a orelse A == $b),
?is_hex(B), ?is_hex(C), ?is_hex(W), ?is_hex(X), ?is_hex(Y), ?is_hex(Z)
->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd, 16#fffd), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 16#fffd, 16#fffd), Stack, Config);
unescape(<<$u, $d, A, B, C, ?rsolidus, Rest/binary>> = Bin, Handler, Acc, Stack, Config)
when (A == $8 orelse A == $9 orelse A == $a orelse A == $b) andalso
?is_hex(B), ?is_hex(C)
@ -620,7 +620,7 @@ unescape(<<$u, $d, A, B, C, ?rsolidus, Rest/binary>> = Bin, Handler, Acc, Stack,
case is_partial_escape(Rest) of
true -> ?incomplete(string, <<?rsolidus, Bin/binary>>, Handler, Acc, Stack, Config);
false when Config#config.replaced_bad_utf8 ->
string(<<?rsolidus, Rest/binary>>, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config);
string(<<?rsolidus, Rest/binary>>, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
false -> ?error([Bin, Handler, Acc, Stack, Config])
end;
unescape(<<$u, $d, A, B, C>> = Bin, Handler, Acc, Stack, Config)
@ -632,13 +632,13 @@ unescape(<<$u, A, B, C, D, Rest/binary>> = Bin, Handler, Acc, Stack, Config)
when ?is_hex(A), ?is_hex(B), ?is_hex(C), ?is_hex(D) ->
case erlang:list_to_integer([A, B, C, D], 16) of
Codepoint when Codepoint < 16#d800; Codepoint > 16#dfff ->
string(Rest, Handler, ?acc_seq(Acc, maybe_replace(Codepoint, Config)), Stack, Config);
string(Rest, Handler, acc_seq(Acc, maybe_replace(Codepoint, Config)), Stack, Config);
_ when Config#config.replaced_bad_utf8 ->
string(Rest, Handler, ?acc_seq(Acc, 16#fffd), Stack, Config);
string(Rest, Handler, acc_seq(Acc, 16#fffd), Stack, Config);
_ -> ?error([Bin, Handler, Acc, Stack, Config])
end;
unescape(Bin, Handler, Acc, Stack, Config=#config{ignored_bad_escapes=true}) ->
string(Bin, Handler, ?acc_seq(Acc, ?rsolidus), Stack, Config);
string(Bin, Handler, acc_seq(Acc, ?rsolidus), Stack, Config);
unescape(Bin, Handler, Acc, Stack, Config) ->
case is_partial_escape(Bin) of
true -> ?incomplete(string, <<?rsolidus/utf8, Bin/binary>>, Handler, Acc, Stack, Config);