detect utf8 bom and ignore if present

This commit is contained in:
alisdair sullivan 2012-04-04 20:46:41 -07:00
parent 5e87f02fc5
commit e69ac5f371
3 changed files with 29 additions and 1 deletions

1
priv/test_cases/bom.json Normal file
View file

@ -0,0 +1 @@
[]

3
priv/test_cases/bom.test Normal file
View file

@ -0,0 +1,3 @@
{name, "byte order mark"}.
{jsx, [start_array, end_array, end_json]}.
{json, "bom.json"}.

View file

@ -29,7 +29,7 @@
-spec decoder(Handler::module(), State::any(), Opts::jsx:opts()) -> jsx:decoder().
decoder(Handler, State, Opts) ->
fun(JSON) -> value(JSON, {Handler, Handler:init(State)}, [], jsx_utils:parse_opts(Opts)) end.
fun(JSON) -> start(JSON, {Handler, Handler:init(State)}, [], jsx_utils:parse_opts(Opts)) end.
-include("jsx_opts.hrl").
@ -128,6 +128,30 @@ decoder(Handler, State, Opts) ->
-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))).
start(<<16#ef, Rest/binary>>, Handler, Stack, Opts) ->
maybe_bom(Rest, Handler, Stack, Opts);
start(<<>>, Handler, Stack, Opts) ->
?incomplete(start, <<>>, Handler, Stack, Opts);
start(Bin, Handler, Stack, Opts) ->
value(Bin, Handler, Stack, Opts).
maybe_bom(<<16#bb, Rest/binary>>, Handler, Stack, Opts) ->
definitely_bom(Rest, Handler, Stack, Opts);
maybe_bom(<<>>, Handler, Stack, Opts) ->
?incomplete(maybe_bom, <<>>, Handler, Stack, Opts);
maybe_bom(Bin, Handler, Stack, Opts) ->
?error([Bin, Handler, Stack, Opts]).
definitely_bom(<<16#bf, Rest/binary>>, Handler, Stack, Opts) ->
value(Rest, Handler, Stack, Opts);
definitely_bom(<<>>, Handler, Stack, Opts) ->
?incomplete(definitely_bom, <<>>, Handler, Stack, Opts);
definitely_bom(Bin, Handler, Stack, Opts) ->
?error([Bin, Handler, Stack, Opts]).
value(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
string(Rest, Handler, [?new_seq()|Stack], Opts);
value(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quoted_strings=true}) ->