Skip to content

Commit bbcfc12

Browse files
author
David Hull
committed
Refactor common array element encoding to new function enc_array_element.
1 parent fd61193 commit bbcfc12

File tree

1 file changed

+33
-36
lines changed

1 file changed

+33
-36
lines changed

c_src/encoder.c

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,35 @@ enc_object_element(Encoder* e, int first, ERL_NIF_TERM curr, ERL_NIF_TERM* stack
611611
return 0;
612612
}
613613

614+
ERL_NIF_TERM
615+
enc_array_element(Encoder* e, int first, ERL_NIF_TERM curr, ERL_NIF_TERM* stackp)
616+
{
617+
ErlNifEnv* env = e->env;
618+
ERL_NIF_TERM stack = *stackp;
619+
ERL_NIF_TERM item;
620+
621+
if(first && !enc_start_array(e)) {
622+
return enc_error(e, "internal_error");
623+
}
624+
if(enif_is_empty_list(env, curr)) {
625+
if(!enc_end_array(e)) {
626+
return enc_error(e, "internal_error");
627+
}
628+
return 0;
629+
}
630+
if(!enif_get_list_cell(env, curr, &item, &curr)) {
631+
return enc_error(e, "internal_error");
632+
}
633+
if(!first && !enc_comma(e)) {
634+
return enc_error(e, "internal_error");
635+
}
636+
stack = enif_make_list_cell(env, curr, stack);
637+
stack = enif_make_list_cell(env, e->atoms->ref_array, stack);
638+
stack = enif_make_list_cell(env, item, stack);
639+
*stackp = stack;
640+
return 0;
641+
}
642+
614643
ERL_NIF_TERM
615644
encode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
616645
{
@@ -732,24 +761,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
732761
ret = enc_error(e, "internal_error");
733762
goto done;
734763
}
735-
if(enif_is_empty_list(env, curr)) {
736-
if(!enc_end_array(e)) {
737-
ret = enc_error(e, "internal_error");
738-
goto done;
739-
}
740-
continue;
741-
}
742-
if(!enc_comma(e)) {
743-
ret = enc_error(e, "internal_error");
744-
goto done;
745-
}
746-
if(!enif_get_list_cell(env, curr, &item, &curr)) {
747-
ret = enc_error(e, "internal_error");
748-
goto done;
749-
}
750-
stack = enif_make_list_cell(env, curr, stack);
751-
stack = enif_make_list_cell(env, e->atoms->ref_array, stack);
752-
stack = enif_make_list_cell(env, item, stack);
764+
ret = enc_array_element(e, 0, curr, &stack);
765+
if(ret) { goto done; }
753766
} else if(enif_compare(curr, e->atoms->atom_null) == 0) {
754767
if(!enc_literal(e, "null", 4)) {
755768
ret = enc_error(e, "null");
@@ -813,24 +826,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
813826
stack = enif_make_list_cell(env, curr, stack);
814827
#endif
815828
} else if(enif_is_list(env, curr)) {
816-
if(!enc_start_array(e)) {
817-
ret = enc_error(e, "internal_error");
818-
goto done;
819-
}
820-
if(enif_is_empty_list(env, curr)) {
821-
if(!enc_end_array(e)) {
822-
ret = enc_error(e, "internal_error");
823-
goto done;
824-
}
825-
continue;
826-
}
827-
if(!enif_get_list_cell(env, curr, &item, &curr)) {
828-
ret = enc_error(e, "internal_error");
829-
goto done;
830-
}
831-
stack = enif_make_list_cell(env, curr, stack);
832-
stack = enif_make_list_cell(env, e->atoms->ref_array, stack);
833-
stack = enif_make_list_cell(env, item, stack);
829+
ret = enc_array_element(e, 1, curr, &stack);
830+
if(ret) { goto done; }
834831
} else {
835832
if(!enc_unknown(e, curr)) {
836833
ret = enc_error(e, "internal_error");

0 commit comments

Comments
 (0)