From 42f2c7e105ad687047d29f5123b966bbe8638d6d Mon Sep 17 00:00:00 2001 From: lwalkin Date: Fri, 10 Oct 2014 22:51:23 +0000 Subject: [PATCH] recognize [with_trailer] option, but do not use yet --- c_src/decoder.c | 4 ++++ c_src/jiffy.c | 1 + c_src/jiffy.h | 1 + src/jiffy.erl | 12 +++++++++++- test/jiffy_15_trailer_tests.erl | 11 +++++++++++ 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/jiffy_15_trailer_tests.erl diff --git a/c_src/decoder.c b/c_src/decoder.c index b37e056..b71f55d 100644 --- a/c_src/decoder.c +++ b/c_src/decoder.c @@ -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); } diff --git a/c_src/jiffy.c b/c_src/jiffy.c index 31aa854..544fc5c 100644 --- a/c_src/jiffy.c +++ b/c_src/jiffy.c @@ -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$"); diff --git a/c_src/jiffy.h b/c_src/jiffy.h index 6a7d73a..d1d607c 100644 --- a/c_src/jiffy.h +++ b/c_src/jiffy.h @@ -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; diff --git a/src/jiffy.erl b/src/jiffy.erl index 23a0c9d..7e5d34e 100644 --- a/src/jiffy.erl +++ b/src/jiffy.erl @@ -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, []). diff --git a/test/jiffy_15_trailer_tests.erl b/test/jiffy_15_trailer_tests.erl new file mode 100644 index 0000000..9832e89 --- /dev/null +++ b/test/jiffy_15_trailer_tests.erl @@ -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])) + ]}.