Current section

Files

Jump to
hydro c_src hydro_nif.c
Raw

c_src/hydro_nif.c

#include "erl_nif.h"
#include <string.h>
#include <hydrogen.h>
#define ATOM_OK "ok"
#define ATOM_ERROR "error"
#define ATOM_TRUE "true"
#define ATOM_FALSE "false"
static int
hydro_load(ErlNifEnv * env, void **priv_data, ERL_NIF_TERM load_info)
{
return hydro_init();
}
static int
hydro_upgrade(ErlNifEnv * env, void **priv, void **old_priv, ERL_NIF_TERM info)
{
return 0;
}
static void hydro_unload(ErlNifEnv * env, void *priv)
{
return;
}
static ERL_NIF_TERM hydro_error(ErlNifEnv * env, char *error_atom)
{
return enif_make_tuple2(env, enif_make_atom(env, "error"),
enif_make_atom(env, error_atom));
}
static ERL_NIF_TERM
enif_hydro_random_buf(ErlNifEnv * env, int argc, ERL_NIF_TERM const argv[])
{
unsigned req_size;
ErlNifBinary result;
if ((argc != 1) || (!enif_get_uint(env, argv[0], &req_size))) {
return enif_make_badarg(env);
}
if (!enif_alloc_binary(req_size, &result)) {
return hydro_error(env, "alloc_failed");
}
hydro_random_buf(result.data, result.size);
return enif_make_binary(env, &result);
}
static ErlNifFunc nif_funcs[] = {
{"hydro_random_buf", 1,
enif_hydro_random_buf, ERL_NIF_DIRTY_JOB_CPU_BOUND},
};
ERL_NIF_INIT(hydro_api, nif_funcs, &hydro_load, NULL, &hydro_upgrade, &hydro_unload);