Procházet zdrojové kódy

recognize [with_trailer] option, but do not use yet

pull/71/head
lwalkin před 10 roky
rodič
revize
42f2c7e105
5 změnil soubory, kde provedl 28 přidání a 1 odebrání
  1. +4
    -0
      c_src/decoder.c
  2. +1
    -0
      c_src/jiffy.c
  3. +1
    -0
      c_src/jiffy.h
  4. +11
    -1
      src/jiffy.erl
  5. +11
    -0
      test/jiffy_15_trailer_tests.erl

+ 4
- 0
c_src/decoder.c Zobrazit soubor

@ -53,6 +53,7 @@ typedef struct {
int is_partial;
int return_maps;
int use_nil;
int with_trailer;
char* p;
unsigned char* u;
@ -81,6 +82,7 @@ dec_new(ErlNifEnv* env)
d->is_partial = 0;
d->return_maps = 0;
d->use_nil = 0;
d->with_trailer = 0;
d->p = NULL;
d->u = NULL;
@ -712,6 +714,8 @@ decode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
#endif
} else if(enif_compare(val, d->atoms->atom_use_nil) == 0) {
d->use_nil = 1;
} else if(enif_compare(val, d->atoms->atom_with_trailer) == 0) {
d->with_trailer = 1;
} else {
return enif_make_badarg(env);
}

+ 1
- 0
c_src/jiffy.c Zobrazit soubor

@ -28,6 +28,7 @@ load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
st->atom_return_maps = make_atom(env, "return_maps");
st->atom_nil = make_atom(env, "nil");
st->atom_use_nil = make_atom(env, "use_nil");
st->atom_with_trailer = make_atom(env, "with_trailer");
// Markers used in encoding
st->ref_object = make_atom(env, "$object_ref$");

+ 1
- 0
c_src/jiffy.h Zobrazit soubor

@ -42,6 +42,7 @@ typedef struct {
ERL_NIF_TERM atom_return_maps;
ERL_NIF_TERM atom_nil;
ERL_NIF_TERM atom_use_nil;
ERL_NIF_TERM atom_with_trailer;
ERL_NIF_TERM ref_object;
ERL_NIF_TERM ref_array;

+ 11
- 1
src/jiffy.erl Zobrazit soubor

@ -19,13 +19,23 @@ decode(Data, Opts) when is_binary(Data), is_list(Opts) ->
{partial, EJson} ->
finish_decode(EJson);
{iter, Decoder, Val, Objs, Curr} ->
decode_loop(Data, Decoder, Val, Objs, Curr);
trailer_or_error(decode_loop(Data, Decoder, Val, Objs, Curr), Opts, Data);
EJson ->
EJson
end;
decode(Data, Opts) when is_list(Data) ->
decode(iolist_to_binary(Data), Opts).
% Only return trailing data if explicitly requested in the options.
trailer_or_error({with_trailer, _EJson, TrailerData} = WithTrailer, Opts, Data) ->
case lists:member(with_trailer, Opts) of
true -> WithTrailer;
false ->
AtByte = iolist_size(Data) - iolist_size(TrailerData) + 1,
throw({error,{AtByte,invalid_trailing_data}})
end;
trailer_or_error(EJson, _Opts, _Data) -> EJson.
encode(Data) ->
encode(Data, []).

+ 11
- 0
test/jiffy_15_trailer_tests.erl Zobrazit soubor

@ -0,0 +1,11 @@
% This file is part of Jiffy released under the MIT license.
% See the LICENSE file for more information.
-module(jiffy_15_trailer_tests).
-include_lib("eunit/include/eunit.hrl").
trailer_test_() ->
{"trailer", [
?_assertEqual(true, jiffy:decode(<<"true">>, [with_trailer]))
]}.

Načítá se…
Zrušit
Uložit