const erl = @cImport({ @cInclude("erl_nif.h"); }); pub export fn hello(env: ?*erl.ErlNifEnv, argc: c_int, argv: [*c]const erl.ERL_NIF_TERM) erl.ERL_NIF_TERM{ _ = argv; _ = argc; //const ERL_NIF_LATIN1 = @as(c_uint, 1); return erl.enif_make_string(env, "Hello world!", 1); // ERL_NIF_LATIN1); } pub export fn factorial(env: ?*erl.ErlNifEnv, argc: c_int, argv: [*c]const erl.ERL_NIF_TERM) erl.ERL_NIF_TERM{ if(argc != 1){ return erl.enif_make_badarg(env); } var n: c_long = undefined; if(erl.enif_get_long(env, argv[0], &n) == 0 or n < 0 or n > 20){ return erl.enif_make_badarg(env); } var result: c_ulonglong = 1; var i: c_ulonglong = @as(c_ulonglong, @intCast(n) ); //var i = n; while(i > 1) : (i -= 1){ result *= i; } return erl.enif_make_uint64(env, result); } const nif_funcs = [_]erl.ErlNifFunc{ .{ .name = "hello", .arity = 0, .fptr = hello, .flags = 0, }, .{ .name = "factorial", .arity = 1, .fptr = factorial, .flags = 0, }, }; export fn nif_init() ?*erl.ErlNifEntry{ return &nif_entry; } var nif_entry: erl.ErlNifEntry = .{ .major = 2, .minor = 16, .name = "niftest", .num_of_funcs = nif_funcs.len, .funcs = @constCast(&nif_funcs), .load = null, .reload = null, .upgrade = null, .unload = null, .vm_variant = "beam.vanilla", .options = 1, // 0, .sizeof_ErlNifResourceTypeInit = @sizeOf(erl.ErlNifResourceTypeInit), .min_erts = "erts-12.0", // .entry_version = 3, };