From 401573ea604471cf5ed3f4373ec003c49a77e76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Mon, 21 Jan 2013 16:22:08 +0100 Subject: [PATCH] Add geef:oid_fmt(Oid) --- c_src/geef.c | 2 ++ c_src/oid.c | 24 ++++++++++++++++++++++++ c_src/oid.h | 9 +++++++++ src/geef.erl | 5 ++++- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 c_src/oid.c create mode 100644 c_src/oid.h diff --git a/c_src/geef.c b/c_src/geef.c index d6639ed..1a97c9b 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -1,6 +1,7 @@ #include "erl_nif.h" #include "repository.h" #include "reference.h" +#include "oid.h" #include "geef.h" #include #include @@ -78,6 +79,7 @@ static ErlNifFunc geef_funcs[] = {"reference_lookup", 2, geef_reference_lookup}, {"reference_resolve", 1, geef_reference_resolve}, {"reference_id", 1, geef_reference_id}, + {"oid_fmt", 1, geef_oid_fmt}, }; ERL_NIF_INIT(geef, geef_funcs, load, NULL, NULL, unload) diff --git a/c_src/oid.c b/c_src/oid.c new file mode 100644 index 0000000..1b3dcdd --- /dev/null +++ b/c_src/oid.c @@ -0,0 +1,24 @@ +#include +#include "geef.h" +#include "oid.h" + +ERL_NIF_TERM +geef_oid_fmt(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + ErlNifBinary bin, bin_out; + git_oid id; + + if (!enif_inspect_binary(env, argv[0], &bin)) + return enif_make_badarg(env); + + if (bin.size < GIT_OID_RAWSZ) + return enif_make_badarg(env); + + if (!enif_alloc_binary(GIT_OID_HEXSZ, &bin_out)) + return atoms.error; + + git_oid_fromraw(&id, bin.data); + git_oid_fmt((char *)bin_out.data, &id); + + return enif_make_binary(env, &bin_out); +} diff --git a/c_src/oid.h b/c_src/oid.h new file mode 100644 index 0000000..09b6f41 --- /dev/null +++ b/c_src/oid.h @@ -0,0 +1,9 @@ +#ifndef GEEF_OID_H +#define GEEF_OID_H + +#include "erl_nif.h" +#include + +ERL_NIF_TERM geef_oid_fmt(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); + +#endif diff --git a/src/geef.erl b/src/geef.erl index 0eda22a..fe71057 100644 --- a/src/geef.erl +++ b/src/geef.erl @@ -2,7 +2,7 @@ -export([hex_to_raw/1, repository/1, repository_get_path/1, repository_get_odb/1, repository_init/2, repository_is_bare/1, repository_get_workdir/1, reference_list/1, reference_to_id/2, reference_glob/2, reference_lookup/2, reference_resolve/1, - reference_id/1, odb_object_exists/2]). + reference_id/1, odb_object_exists/2, oid_fmt/1]). -on_load(load_enif/0). hex_to_raw(_Val) -> @@ -55,6 +55,9 @@ repository(Path) -> odb_object_exists(_Val, _Val) -> nif_error(?LINE). +oid_fmt(_Oid) -> + nif_error(?LINE). + nif_error(Line) -> exit({nif_not_loaded,module,?MODULE,line,Line}).