diff options
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/random.c b/random.c new file mode 100644 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(); +} |