Просмотр исходного кода

Refactor common array encoding to new function enc_array_element.

pull/139/head
David Hull 8 лет назад
Родитель
Сommit
5b7cf0bd4e
1 измененных файлов: 34 добавлений и 36 удалений
  1. +34
    -36
      c_src/encoder.c

+ 34
- 36
c_src/encoder.c Просмотреть файл

@ -641,6 +641,36 @@ enc_object_element(Encoder* e, int first, ERL_NIF_TERM curr, ERL_NIF_TERM* stack
return 0;
}
ERL_NIF_TERM
enc_array_element(Encoder* e, int first, ERL_NIF_TERM curr, ERL_NIF_TERM* stackp)
{
ErlNifEnv* env = e->env;
ERL_NIF_TERM stack = *stackp;
ERL_NIF_TERM item;
if(first && !enc_start_array(e)) {
return enc_error(e, "internal_error");
}
if(enif_is_empty_list(env, curr)) {
if(!enc_end_array(e)) {
return enc_error(e, "internal_error");
}
return 0;
}
if(!first && !enc_comma(e)) {
return enc_error(e, "internal_error");
}
if(!enif_get_list_cell(env, curr, &item, &curr)) {
return enc_error(e, "internal_error");
}
stack = enif_make_list_cell(env, curr, stack);
stack = enif_make_list_cell(env, e->atoms->ref_array, stack);
stack = enif_make_list_cell(env, item, stack);
*stackp = stack;
return 0;
}
ERL_NIF_TERM
encode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
@ -762,24 +792,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ret = enc_error(e, "internal_error");
goto done;
}
if(enif_is_empty_list(env, curr)) {
if(!enc_end_array(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
continue;
}
if(!enc_comma(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
if(!enif_get_list_cell(env, curr, &item, &curr)) {
ret = enc_error(e, "internal_error");
goto done;
}
stack = enif_make_list_cell(env, curr, stack);
stack = enif_make_list_cell(env, e->atoms->ref_array, stack);
stack = enif_make_list_cell(env, item, stack);
ret = enc_array_element(e, 0, curr, &stack);
if(ret) { goto done; }
} else if(enif_compare(curr, e->atoms->atom_null) == 0) {
if(!enc_literal(e, "null", 4)) {
ret = enc_error(e, "null");
@ -854,24 +868,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
stack = enif_make_list_cell(env, curr, stack);
#endif
} else if(enif_is_list(env, curr)) {
if(!enc_start_array(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
if(enif_is_empty_list(env, curr)) {
if(!enc_end_array(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
continue;
}
if(!enif_get_list_cell(env, curr, &item, &curr)) {
ret = enc_error(e, "internal_error");
goto done;
}
stack = enif_make_list_cell(env, curr, stack);
stack = enif_make_list_cell(env, e->atoms->ref_array, stack);
stack = enif_make_list_cell(env, item, stack);
ret = enc_array_element(e, 1, curr, &stack);
if(ret) { goto done; }
} else {
if(!enc_unknown(e, curr)) {
ret = enc_error(e, "internal_error");

Загрузка…
Отмена
Сохранить