Browse Source

recognize [with_trailer] option, but do not use yet

pull/71/head
lwalkin 10 years ago
parent
commit
42f2c7e105
5 changed files with 28 additions and 1 deletions
  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 View File

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

+ 1
- 0
c_src/jiffy.c View File

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

+ 1
- 0
c_src/jiffy.h View File

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

+ 11
- 1
src/jiffy.erl View File

@ -19,13 +19,23 @@ decode(Data, Opts) when is_binary(Data), is_list(Opts) ->
{partial, EJson} -> {partial, EJson} ->
finish_decode(EJson); finish_decode(EJson);
{iter, Decoder, Val, Objs, Curr} -> {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 ->
EJson EJson
end; end;
decode(Data, Opts) when is_list(Data) -> decode(Data, Opts) when is_list(Data) ->
decode(iolist_to_binary(Data), Opts). 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) ->
encode(Data, []). encode(Data, []).

+ 11
- 0
test/jiffy_15_trailer_tests.erl View File

@ -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]))
]}.

Loading…
Cancel
Save