niftest.zig 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. const erl = @cImport({
  2. @cInclude("erl_nif.h");
  3. });
  4. pub export fn hello(env: ?*erl.ErlNifEnv, argc: c_int, argv: [*c]const erl.ERL_NIF_TERM) erl.ERL_NIF_TERM{
  5. _ = argv;
  6. _ = argc;
  7. //const ERL_NIF_LATIN1 = @as(c_uint, 1);
  8. return erl.enif_make_string(env, "Hello world!", 1); // ERL_NIF_LATIN1);
  9. }
  10. pub export fn factorial(env: ?*erl.ErlNifEnv, argc: c_int, argv: [*c]const erl.ERL_NIF_TERM) erl.ERL_NIF_TERM{
  11. if(argc != 1){
  12. return erl.enif_make_badarg(env);
  13. }
  14. var n: c_long = undefined;
  15. if(erl.enif_get_long(env, argv[0], &n) == 0 or n < 0 or n > 20){
  16. return erl.enif_make_badarg(env);
  17. }
  18. var result: c_ulonglong = 1;
  19. var i: c_ulonglong = @as(c_ulonglong, @intCast(n) );
  20. //var i = n;
  21. while(i > 1) : (i -= 1){
  22. result *= i;
  23. }
  24. return erl.enif_make_uint64(env, result);
  25. }
  26. const nif_funcs = [_]erl.ErlNifFunc{
  27. .{
  28. .name = "hello",
  29. .arity = 0,
  30. .fptr = hello,
  31. .flags = 0,
  32. },
  33. .{
  34. .name = "factorial",
  35. .arity = 1,
  36. .fptr = factorial,
  37. .flags = 0,
  38. },
  39. };
  40. export fn nif_init() ?*erl.ErlNifEntry{
  41. return &nif_entry;
  42. }
  43. var nif_entry: erl.ErlNifEntry = .{
  44. .major = 2,
  45. .minor = 16,
  46. .name = "niftest",
  47. .num_of_funcs = nif_funcs.len,
  48. .funcs = @constCast(&nif_funcs),
  49. .load = null,
  50. .reload = null,
  51. .upgrade = null,
  52. .unload = null,
  53. .vm_variant = "beam.vanilla",
  54. .options = 1, // 0,
  55. .sizeof_ErlNifResourceTypeInit = @sizeOf(erl.ErlNifResourceTypeInit),
  56. .min_erts = "erts-12.0", // .entry_version = 3,
  57. };