LoginSignup
0
0

More than 5 years have passed since last update.

erl_nif のメモ(その2)

Posted at

その1の、その後。

nif.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

#define UNUSED(p) (void)(p)

// -- --

typedef struct {
  int id;
} nif_t;

// -- --

static ERL_NIF_TERM open(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {

  if (1 == argc &&
      enif_is_number(env, argv[0])) {

    int id = 0;
    enif_get_int(env, argv[0], &id);

    ERL_NIF_TERM term;

    nif_t *resource = (nif_t *)enif_make_new_binary(env, sizeof(nif_t), &term);

    if (NULL != resource) {

      resource->id = id;

      printf("open: resource=%ld, id=%d\r\n", (long)resource, resource->id);

      return enif_make_tuple2(env,
                              enif_make_atom(env, "ok"),
                              term);
    } else {

      return enif_make_tuple2(env,
                              enif_make_atom(env, "error"),
                              enif_make_string(env, "enomem", ERL_NIF_LATIN1));
    }
  }

  return enif_make_badarg(env);
}

static ERL_NIF_TERM close(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {

  if (1 == argc) {

    ErlNifBinary bin;

    if (enif_inspect_binary(env, argv[0], &bin) && sizeof(nif_t) == bin.size) {

      ERL_NIF_TERM term;

      nif_t *resource = (nif_t *)enif_make_new_binary(env, sizeof(nif_t), &term);

      memcpy(resource, bin.data, bin.size);

      printf("close: resource=%ld, id=%d\r\n", (long)resource, resource->id);

      return enif_make_atom(env, "ok");
    }
  }

  return enif_make_badarg(env);
}

// -- --

static ErlNifFunc funcs[] = {
  {"open", 1, open},
  {"close", 1, close},
};

static int load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info) {

  UNUSED(env), UNUSED(load_info);

  *priv_data = NULL;

  return 0;
}

/*
 */
ERL_NIF_INIT(nif, funcs, load, NULL, NULL, NULL);
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V5.10.4  (abort with ^G)
1> 
1> {ok,B} = nif:open(123).
open: resource=444388128, id=123
{ok,<<123,0,0,0>>}
2> nif:close(B).
close: resource=444424072, id=123
ok
3> q().

crypto を真似て。戻りの binary が <<>> でないのも良い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0