#include "erl_nif.h" #include #include static ErlNifResourceType* test_RESOURCE = NULL; // Prototypes static ERL_NIF_TERM get_bin_address(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM new_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM size_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM put_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM get_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ErlNifFunc nif_funcs[] = { {"get_bin_address", 1, get_bin_address}, {"new_array", 1, new_array}, {"size_array", 1, size_array}, {"put_array", 3, put_array}, {"get_array", 2, get_array} }; static ERL_NIF_TERM get_bin_address(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; enif_inspect_binary(env, argv[0], &bin); char buf[256]; sprintf(buf, "bin: size=%zu, ptr=%p", bin.size, bin.data); return enif_make_string(env, buf, ERL_NIF_LATIN1); } static ERL_NIF_TERM new_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; unsigned long size; // unsigned char* data; enif_get_ulong(env, argv[0], &size); // enif_inspect_binary(env, argv[1], &bin); enif_alloc_binary(size * sizeof(long), &bin); return enif_make_binary(env, &bin); } static ERL_NIF_TERM size_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; enif_inspect_binary(env, argv[0], &bin); return enif_make_int64(env, bin.size); } static ERL_NIF_TERM put_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; unsigned long* array; unsigned long pos, value; enif_get_ulong(env, argv[0], &pos); enif_get_ulong(env, argv[1], &value); enif_inspect_binary(env, argv[2], &bin); array = (unsigned long*)bin.data; array[pos] = value; return enif_make_atom(env, "ok"); } static ERL_NIF_TERM get_array(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; unsigned long* array; unsigned long pos; enif_get_ulong(env, argv[0], &pos); enif_inspect_binary(env, argv[1], &bin); array = (unsigned long*)bin.data; return enif_make_int64(env, *(array + pos)); } static void test_resource_cleanup(ErlNifEnv* env, void* arg) { /* Delete any dynamically allocated memory stored in test_handle */ /* test_handle* handle = (test_handle*)arg; */ } static int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) { ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER; ErlNifResourceType* rt = enif_open_resource_type(env, NULL, "test_resource", &test_resource_cleanup, flags, NULL); if (rt == NULL) return -1; test_RESOURCE = rt; return 0; } ERL_NIF_INIT(binary_tools, nif_funcs, &on_load, NULL, NULL, NULL);