소스 검색

Add validate/1,2 call

pull/195/head
Jose M Perez 5 년 전
부모
커밋
61c0f023a9
5개의 변경된 파일37개의 추가작업 그리고 16개의 파일을 삭제
  1. +11
    -10
      c_src/decoder.c
  2. +17
    -1
      src/jiffy.erl
  3. +2
    -2
      test/jiffy_01_yajl_tests.erl
  4. +6
    -2
      test/jiffy_15_return_trailer_tests.erl
  5. +1
    -1
      test/jiffy_18_partials_tests.erl

+ 11
- 10
c_src/decoder.c 파일 보기

@ -65,8 +65,8 @@ typedef struct {
int st_size; int st_size;
int st_top; int st_top;
unsigned int current_depth;
unsigned int max_levels;
int current_depth;
int max_levels;
unsigned int level_start; unsigned int level_start;
unsigned int empty_element; unsigned int empty_element;
} Decoder; } Decoder;
@ -105,7 +105,7 @@ dec_new(ErlNifEnv* env)
} }
d->current_depth = 0; d->current_depth = 0;
d->max_levels = 0;
d->max_levels = -1;
d->level_start = 0; d->level_start = 0;
d->empty_element = 1; d->empty_element = 1;
@ -199,14 +199,14 @@ dec_pop_assert(Decoder* d, char val)
static void inline static void inline
level_increase(Decoder* d) { level_increase(Decoder* d) {
if(d->max_levels && (d->max_levels == d->current_depth++)) {
if(d->max_levels >= 0 && (d->max_levels == d->current_depth++)) {
d->level_start = d->i; d->level_start = d->i;
} }
} }
static int inline static int inline
level_decrease(Decoder* d, ERL_NIF_TERM* value) { level_decrease(Decoder* d, ERL_NIF_TERM* value) {
if (d->max_levels && d->max_levels == --d->current_depth) {
if (d->max_levels >= 0 && d->max_levels == --d->current_depth) {
// Only builds term in threshold // Only builds term in threshold
unsigned ulen = d->i - d->level_start + 1; unsigned ulen = d->i - d->level_start + 1;
if(!d->copy_strings) { if(!d->copy_strings) {
@ -222,7 +222,7 @@ level_decrease(Decoder* d, ERL_NIF_TERM* value) {
static int inline static int inline
level_allows_terms(Decoder* d) { level_allows_terms(Decoder* d) {
return (!d->max_levels) || (d->max_levels >= d->current_depth);
return (d->max_levels < 0) || (d->max_levels >= d->current_depth);
} }
int int
@ -689,12 +689,12 @@ make_array(ErlNifEnv* env, ERL_NIF_TERM list)
} }
int int
get_max_levels(ErlNifEnv* env, ERL_NIF_TERM val, unsigned int* max_levels_p)
get_max_levels(ErlNifEnv* env, ERL_NIF_TERM val, int* max_levels_p)
{ {
jiffy_st* st = (jiffy_st*) enif_priv_data(env); jiffy_st* st = (jiffy_st*) enif_priv_data(env);
const ERL_NIF_TERM* tuple; const ERL_NIF_TERM* tuple;
int arity; int arity;
unsigned int max_levels;
int max_levels;
if(!enif_get_tuple(env, val, &arity, &tuple)) { if(!enif_get_tuple(env, val, &arity, &tuple)) {
return 0; return 0;
@ -708,11 +708,11 @@ get_max_levels(ErlNifEnv* env, ERL_NIF_TERM val, unsigned int* max_levels_p)
return 0; return 0;
} }
if(!enif_get_uint(env, tuple[1], &max_levels)) {
if(!enif_get_int(env, tuple[1], &max_levels)) {
return 0; return 0;
} }
if(max_levels == 0) {
if(max_levels < 0) {
return 0; return 0;
} }
@ -1168,6 +1168,7 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
} }
decode_done: decode_done:
level_decrease(d, &val);
if(d->i < bin.size && d->return_trailer) { if(d->i < bin.size && d->return_trailer) {
trailer = enif_make_sub_binary(env, argv[0], d->i, bin.size - d->i); trailer = enif_make_sub_binary(env, argv[0], d->i, bin.size - d->i);

+ 17
- 1
src/jiffy.erl 파일 보기

@ -2,7 +2,7 @@
% See the LICENSE file for more information. % See the LICENSE file for more information.
-module(jiffy). -module(jiffy).
-export([decode/1, decode/2, encode/1, encode/2]).
-export([decode/1, decode/2, encode/1, encode/2, validate/1, validate/2]).
-define(NOT_LOADED, not_loaded(?LINE)). -define(NOT_LOADED, not_loaded(?LINE)).
-compile([no_native]). -compile([no_native]).
@ -115,6 +115,22 @@ encode(Data, Options) ->
end. end.
-spec validate(iolist() | binary()) -> boolean() | {has_trailer, true, binary()}.
validate(Data) ->
validate(Data, []).
-spec validate(iolist() | binary(), decode_options()) -> boolean() | {has_trailer, true, binary()}.
validate(Data, Opts) when is_binary(Data), is_list(Opts) ->
try decode(Data, lists:keystore(max_levels, 1, Opts, {max_levels, 0})) of
{has_trailer, _FlatEJson, Trailer} -> {has_trailer, true, Trailer};
_FlatEJson -> true
catch _:_ -> false
end;
validate(Data, Opts) when is_list(Data) ->
validate(iolist_to_binary(Data), Opts).
finish_decode({bignum, Value}) -> finish_decode({bignum, Value}) ->
list_to_integer(binary_to_list(Value)); list_to_integer(binary_to_list(Value));
finish_decode({bignum_e, Value}) -> finish_decode({bignum_e, Value}) ->

+ 2
- 2
test/jiffy_01_yajl_tests.erl 파일 보기

@ -14,9 +14,9 @@ yajl_test_() ->
gen({Name, Json, {error, Erl}}) -> gen({Name, Json, {error, Erl}}) ->
{Name, ?_assertError(Erl, jiffy:decode(Json))};
{Name, [?_assertEqual(false, jiffy:validate(Json)), ?_assertError(Erl, jiffy:decode(Json))]};
gen({Name, Json, Erl}) -> gen({Name, Json, Erl}) ->
{Name, ?_assertEqual(Erl, jiffy:decode(Json))}.
{Name, [?_assertEqual(true, jiffy:validate(Json)), ?_assertEqual(Erl, jiffy:decode(Json))]}.
read_cases() -> read_cases() ->

+ 6
- 2
test/jiffy_15_return_trailer_tests.erl 파일 보기

@ -15,5 +15,9 @@ trailer_test_() ->
{<<"1 2 3">>, {has_trailer, 1, <<"2 3">>}} {<<"1 2 3">>, {has_trailer, 1, <<"2 3">>}}
], ],
{"Test return_trailer", lists:map(fun({Data, Result}) -> {"Test return_trailer", lists:map(fun({Data, Result}) ->
?_assertEqual(Result, jiffy:decode(Data, Opts))
end, Cases)}.
ValidateResult = if is_tuple(Result) -> setelement(2, Result, true);
true -> Result
end,
[?_assertEqual(ValidateResult, jiffy:validate(Data, Opts)),
?_assertEqual(Result, jiffy:decode(Data, Opts))]
end, Cases)}.

+ 1
- 1
test/jiffy_18_partials_tests.erl 파일 보기

@ -12,7 +12,7 @@ decode_levels_test_() ->
EJson = jiffy:decode(Json, [{max_levels, MaxLevels} | Opts]), EJson = jiffy:decode(Json, [{max_levels, MaxLevels} | Opts]),
FullEJson = to_full_json(EJson, MaxLevels, Opts), FullEJson = to_full_json(EJson, MaxLevels, Opts),
?_assertEqual(jiffy:decode(Json, Opts), FullEJson) ?_assertEqual(jiffy:decode(Json, Opts), FullEJson)
end || MaxLevels <- lists:seq(1, MaxOptMaxLevels), Opts <- generate_options_groups()]
end || MaxLevels <- lists:seq(0, MaxOptMaxLevels), Opts <- generate_options_groups()]
end, jsons())}. end, jsons())}.
encode_resources_test_() -> encode_resources_test_() ->

불러오는 중...
취소
저장