diff --git a/c_src/signature.c b/c_src/signature.c index 5719f39..30d2d57 100644 --- a/c_src/signature.c +++ b/c_src/signature.c @@ -102,37 +102,52 @@ static int geef_string_to_bin(ErlNifBinary *bin, const char *str) return 0; } -ERL_NIF_TERM -geef_signature_default(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +int geef_signature_to_erl(ERL_NIF_TERM *out, ErlNifEnv *env, git_signature *sig) { - git_signature *sig; - geef_repository *repo; ErlNifBinary name, email; - if (!enif_get_resource(env, argv[0], geef_repository_type, (void **) &repo)) - return enif_make_badarg(env); - memset(&name, 0, sizeof(ErlNifBinary)); memset(&email, 0, sizeof(ErlNifBinary)); - if (git_signature_default(&sig, repo->repo) < 0) - return geef_error(env); - if (geef_string_to_bin(&name, sig->name) < 0) goto oom; if (geef_string_to_bin(&email, sig->email) < 0) goto oom; - return enif_make_tuple5(env, atoms.ok, + *out = enif_make_tuple5(env, atoms.ok, enif_make_binary(env, &name), enif_make_binary(env, &email), enif_make_ulong(env, sig->when.time), enif_make_uint(env, sig->when.offset)); + + return 0; + oom: - git_signature_free(sig); enif_release_binary(&name); enif_release_binary(&email); + return -1; +} - return geef_oom(env); +ERL_NIF_TERM +geef_signature_default(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + git_signature *sig; + geef_repository *repo; + ERL_NIF_TERM term_sig; + int error; + + if (!enif_get_resource(env, argv[0], geef_repository_type, (void **) &repo)) + return enif_make_badarg(env); + + if (git_signature_default(&sig, repo->repo) < 0) + return geef_error(env); + + error = geef_signature_to_erl(&term_sig, env, sig); + git_signature_free(sig); + + if (error < 0) + return geef_oom(env); + + return term_sig; } ERL_NIF_TERM diff --git a/c_src/signature.h b/c_src/signature.h index b3e1e97..9018293 100644 --- a/c_src/signature.h +++ b/c_src/signature.h @@ -7,4 +7,6 @@ ERL_NIF_TERM geef_signature_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM arg ERL_NIF_TERM geef_signature_default(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); int geef_signature_from_erl(git_signature **out, ErlNifEnv *env, ERL_NIF_TERM *err, ERL_NIF_TERM term); +int geef_signature_to_erl(ERL_NIF_TERM *out, ErlNifEnv *env, git_signature *sig); + #endif