|
@@ -13,6 +13,27 @@ pub export fn hello(env: ?*erl.ErlNifEnv, argc: c_int, argv: [*c]const erl.ERL_N
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+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{
|
|
const nif_funcs = [_]erl.ErlNifFunc{
|
|
.{
|
|
.{
|
|
.name = "hello",
|
|
.name = "hello",
|
|
@@ -20,6 +41,12 @@ const nif_funcs = [_]erl.ErlNifFunc{
|
|
.fptr = hello,
|
|
.fptr = hello,
|
|
.flags = 0,
|
|
.flags = 0,
|
|
},
|
|
},
|
|
|
|
+ .{
|
|
|
|
+ .name = "factorial",
|
|
|
|
+ .arity = 1,
|
|
|
|
+ .fptr = factorial,
|
|
|
|
+ .flags = 0,
|
|
|
|
+ },
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|