Skip to content

Commit

Permalink
Added ossp_uuid:import/2 function
Browse files Browse the repository at this point in the history
  • Loading branch information
yrashk committed Feb 21, 2011
1 parent 3c383ef commit 596fde3
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 9 deletions.
69 changes: 61 additions & 8 deletions c_src/ossp_uuid.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
#define NIF(name) ERL_NIF_TERM name(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])

NIF(ossp_uuid_nif_make);
NIF(ossp_uuid_nif_import);

static ErlNifFunc nif_funcs[] =
{
{"make", 2, ossp_uuid_nif_make},
{"make", 4, ossp_uuid_nif_make},
{"import", 2, ossp_uuid_nif_import}
};

int make_uuid_ns(uuid_t * uuid, unsigned int mode, ErlNifEnv *env, const ERL_NIF_TERM argv[]) {
Expand Down Expand Up @@ -53,6 +55,7 @@ int make_uuid_ns(uuid_t * uuid, unsigned int mode, ErlNifEnv *env, const ERL_NIF
return 1;
}


NIF(ossp_uuid_nif_make)
{
uuid_t * uuid;
Expand Down Expand Up @@ -88,29 +91,79 @@ NIF(ossp_uuid_nif_make)
} else {
return enif_make_badarg(env);
}


ErlNifBinary result_binary;

if (!strcmp(format, "binary")) {
int len = UUID_LEN_BIN;
ErlNifBinary binary;
enif_alloc_binary(UUID_LEN_BIN, &binary);
uuid_export(uuid, UUID_FMT_BIN, (void **)&binary.data, (size_t *) &len);
result = enif_make_binary(env, &binary);
enif_alloc_binary(UUID_LEN_BIN, &result_binary);
uuid_export(uuid, UUID_FMT_BIN, (void **)(&result_binary.data), (size_t *) &len);
result = enif_make_binary(env, &result_binary);
} else if (!strcmp(format, "text")) {
int len = UUID_LEN_STR;
ErlNifBinary binary;
enif_alloc_binary(UUID_LEN_STR, &binary);
uuid_export(uuid, UUID_FMT_STR, (void **)&binary.data, (size_t *) &len);
result = enif_make_binary(env, &binary);
enif_alloc_binary(UUID_LEN_STR, &result_binary);
uuid_export(uuid, UUID_FMT_STR, (void **)(&result_binary.data), (size_t *) &len);
result = enif_make_binary(env, &result_binary);
} else {
result = enif_make_badarg(env);
}

uuid_destroy(uuid);

return result;
}


NIF(ossp_uuid_nif_import)
{
uuid_t * uuid;
ErlNifBinary binary;
ERL_NIF_TERM result;
unsigned int length;
char format[16];

if (!enif_inspect_iolist_as_binary(env, argv[0], &binary)) {
return enif_make_badarg(env);
}

if (!enif_get_atom_length(env, argv[1], &length, ERL_NIF_LATIN1)) {
return enif_make_badarg(env);
}
enif_get_atom(env, argv[1], (char *) &format, length + 1, ERL_NIF_LATIN1);

uuid_create(&uuid);

if (binary.size == UUID_LEN_BIN) {
uuid_import(uuid, UUID_FMT_BIN, (void *)binary.data, binary.size);
} else if (binary.size == UUID_LEN_STR) {
uuid_import(uuid, UUID_FMT_STR, (void *)binary.data, binary.size);
}


ErlNifBinary result_binary;

if (!strcmp(format, "binary")) {
int len = UUID_LEN_BIN;
enif_alloc_binary(UUID_LEN_BIN, &result_binary);
uuid_export(uuid, UUID_FMT_BIN, (void **)(&result_binary.data), (size_t *) &len);
result = enif_make_binary(env, &result_binary);
} else if (!strcmp(format, "text")) {
int len = UUID_LEN_STR;
enif_alloc_binary(UUID_LEN_STR, &result_binary);
uuid_export(uuid, UUID_FMT_STR, (void **)(&result_binary.data), (size_t *) &len);
result = enif_make_binary(env, &result_binary);
} else {
result = enif_make_badarg(env);
}

uuid_destroy(uuid);

return result;
}



static int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
return 0;
Expand Down
39 changes: 38 additions & 1 deletion src/ossp_uuid.erl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
-module(ossp_uuid).

-export([make/2, make/4]).
-export([make/2, make/4, import/2]).

-on_load(init/0).

Expand All @@ -22,6 +22,9 @@ make(_Mode, _Format) ->
make(_Mode, _Format, _NS, _Name) ->
erlang:nif_error(not_loaded).

import(_IOList, _Format) ->
erlang:nif_error(not_loaded).

%% ===================================================================
%% EUnit tests
%% ===================================================================
Expand Down Expand Up @@ -58,6 +61,40 @@ make_v5_test() ->
S1 = make(v5, text, "ns:URL", "http://example.org"),
?assertEqual(36, size(S1)),
?assertEqual(S1, make(v5, text, "ns:URL", "http://example.org")).


import_v1_test() ->
B1 = make(v1, binary),
S1 = make(v1, text),
?assertEqual(B1, import(B1, binary)),
?assertEqual(import(B1, text), import(import(B1, binary), text)),
?assertEqual(S1, import(S1, text)),
?assertEqual(import(S1, binary), import(import(S1, text), binary)).

import_v3_test() ->
B1 = make(v3, binary,"ns:URL", "http://example.org"),
S1 = make(v3, text,"ns:URL", "http://example.org"),
?assertEqual(B1, import(B1, binary)),
?assertEqual(import(B1, text), import(import(B1, binary), text)),
?assertEqual(S1, import(S1, text)),
?assertEqual(import(S1, binary), import(import(S1, text), binary)).

import_v4_test() ->
B1 = make(v4, binary),
S1 = make(v4, text),
?assertEqual(B1, import(B1, binary)),
?assertEqual(import(B1, text), import(import(B1, binary), text)),
?assertEqual(S1, import(S1, text)),
?assertEqual(import(S1, binary), import(import(S1, text), binary)).

import_v5_test() ->
B1 = make(v5, binary,"ns:URL", "http://example.org"),
S1 = make(v5, text,"ns:URL", "http://example.org"),
?assertEqual(B1, import(B1, binary)),
?assertEqual(import(B1, text), import(import(B1, binary), text)),
?assertEqual(S1, import(S1, text)),
?assertEqual(import(S1, binary), import(import(S1, text), binary)).



-endif.

0 comments on commit 596fde3

Please sign in to comment.