|
@ -641,6 +641,36 @@ enc_object_element(Encoder* e, int first, ERL_NIF_TERM curr, ERL_NIF_TERM* stack |
|
|
return 0; |
|
|
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 |
|
|
ERL_NIF_TERM |
|
|
encode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) |
|
|
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"); |
|
|
ret = enc_error(e, "internal_error"); |
|
|
goto done; |
|
|
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) { |
|
|
} else if(enif_compare(curr, e->atoms->atom_null) == 0) { |
|
|
if(!enc_literal(e, "null", 4)) { |
|
|
if(!enc_literal(e, "null", 4)) { |
|
|
ret = enc_error(e, "null"); |
|
|
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); |
|
|
stack = enif_make_list_cell(env, curr, stack); |
|
|
#endif |
|
|
#endif |
|
|
} else if(enif_is_list(env, curr)) { |
|
|
} 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 { |
|
|
} else { |
|
|
if(!enc_unknown(e, curr)) { |
|
|
if(!enc_unknown(e, curr)) { |
|
|
ret = enc_error(e, "internal_error"); |
|
|
ret = enc_error(e, "internal_error"); |
|
|