ソースを参照

Add use_undefined option to turn null into undefined

pull/87/head
Jeremie Lasalle Ratelle 10年前
コミット
862bfd6d73
3個のファイルの変更22行の追加2行の削除
  1. +18
    -2
      c_src/decoder.c
  2. +2
    -0
      c_src/jiffy.c
  3. +2
    -0
      c_src/jiffy.h

+ 18
- 2
c_src/decoder.c ファイルの表示

@ -53,6 +53,7 @@ typedef struct {
int is_partial;
int return_maps;
int use_nil;
int use_undefined;
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->use_undefined = 0;
d->p = NULL;
d->u = NULL;
@ -711,8 +713,16 @@ decode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
return enif_make_badarg(env);
#endif
} else if(enif_compare(val, d->atoms->atom_use_nil) == 0) {
/* use_nil and use_undefined are mutually exclusive */
if (d->use_undefined)
return enif_make_badarg(env);
d->use_nil = 1;
} else {
} else if(enif_compare(val, d->atoms->atom_use_undefined) == 0) {
if (d->use_nil)
return enif_make_badarg(env);
d->use_undefined = 1;
}
else {
return enif_make_badarg(env);
}
}
@ -783,7 +793,13 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ret = dec_error(d, "invalid_literal");
goto done;
}
val = d->use_nil ? d->atoms->atom_nil : d->atoms->atom_null;
if(d->use_nil) {
val = d->atoms->atom_nil;
} else if(d->use_undefined) {
val = d->atoms->atom_undefined;
} else {
val = d->atoms->atom_null;
}
dec_pop(d, st_value);
d->i += 4;
break;

+ 2
- 0
c_src/jiffy.c ファイルの表示

@ -14,6 +14,7 @@ load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
st->atom_ok = make_atom(env, "ok");
st->atom_error = make_atom(env, "error");
st->atom_null = make_atom(env, "null");
st->atom_undefined = make_atom(env, "undefined");
st->atom_true = make_atom(env, "true");
st->atom_false = make_atom(env, "false");
st->atom_bignum = make_atom(env, "bignum");
@ -28,6 +29,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_use_undefined = make_atom(env, "use_undefined");
// Markers used in encoding
st->ref_object = make_atom(env, "$object_ref$");

+ 2
- 0
c_src/jiffy.h ファイルの表示

@ -16,6 +16,7 @@ typedef struct {
ERL_NIF_TERM atom_ok;
ERL_NIF_TERM atom_error;
ERL_NIF_TERM atom_null;
ERL_NIF_TERM atom_undefined;
ERL_NIF_TERM atom_true;
ERL_NIF_TERM atom_false;
ERL_NIF_TERM atom_bignum;
@ -30,6 +31,7 @@ typedef struct {
ERL_NIF_TERM atom_return_maps;
ERL_NIF_TERM atom_nil;
ERL_NIF_TERM atom_use_nil;
ERL_NIF_TERM atom_use_undefined;
ERL_NIF_TERM ref_object;
ERL_NIF_TERM ref_array;

読み込み中…
キャンセル
保存