]> git.lizzy.rs Git - uwu-nolambda.git/blobdiff - random.c
Implement nolamda:random module
[uwu-nolambda.git] / random.c
diff --git a/random.c b/random.c
new file mode 100644 (file)
index 0000000..dea81aa
--- /dev/null
+++ b/random.c
@@ -0,0 +1,53 @@
+#include <stdlib.h>
+#include "api/vm.h"
+#include "api/util.h"
+#include "api/int.h"
+#include "api/nil.h"
+#include "common/err.h"
+
+UwUVMValue uwu_random(UwUVMArgs *args)
+{
+       uwuutil_require_exact("nolambda:random:random", args, 2);
+
+       UwUVMValue value0 = uwuvm_get_arg(args, 0);
+
+       if (value0.type != &uwuint_type)
+               error("type error: nolamda:random:random requires an integer as $0\n");
+
+       UwUVMValue value1 = uwuvm_get_arg(args, 1);
+
+       if (value1.type != &uwuint_type)
+               error("type error: nolamda:random:random requires an integer as $1\n");
+
+       long min = uwuint_get(value0);
+       long max = uwuint_get(value1) + 1;
+
+       long range = max - min;
+
+       if (range < 0)
+               error("type error: range passed to nolambda:random:random is empty\n");
+
+       if (range > RAND_MAX)
+               error("type error: range passed to nolambda:random:random is bigger than nolambda:random:max");
+
+       return uwuint_create(min + rand() % range);
+}
+
+UwUVMValue uwu_max(UwUVMArgs *args)
+{
+       uwuutil_require_exact("nolambda:random:max", args, 0);
+       return uwuint_create(RAND_MAX);
+}
+
+UwUVMValue uwu_seed(UwUVMArgs *args)
+{
+       uwuutil_require_exact("nolambda:random:seed", args, 1);
+
+       UwUVMValue value = uwuvm_get_arg(args, 0);
+
+       if (value.type != &uwuint_type)
+               error("type error: nolamda:random:seed requires an integer as $0\n");
+
+       srand(uwuint_get(value) % RAND_MAX);
+       return uwunil_create();
+}