summaryrefslogtreecommitdiff
path: root/uscript/uscript.c
diff options
context:
space:
mode:
Diffstat (limited to 'uscript/uscript.c')
-rw-r--r--uscript/uscript.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/uscript/uscript.c b/uscript/uscript.c
index a7e3ca1..0e6fc4b 100644
--- a/uscript/uscript.c
+++ b/uscript/uscript.c
@@ -36,12 +36,46 @@ void core_len(int argc)
}
}
+void core_range_next(int argc)
+{
+ (void)argc;
+
+ struct us_cfunc *cfunc = get_cfunc(vm_get(-1));
+ double min = get_num(cfunc_get_upval(cfunc, 0));
+ double max = get_num(cfunc_get_upval(cfunc, 1));
+
+ if (min == max) {
+ vm_push(create_zilch());
+ return;
+ }
+
+ vm_push(create_num(min));
+
+ int inc = max > min ? 1 : -1;
+ cfunc_set_upval(cfunc, 0, create_num(min + inc));
+}
+
+void core_range(int argc)
+{
+ if (vm_get(1).type != VAL_NUM || vm_get(2).type != VAL_NUM)
+ log_fatal(1, "core:range expected two numbers");
+
+ struct us_str *str = copy_str("rangenext", -1);
+ struct us_cfunc *cfunc = create_cfunc(str, core_range_next, 0);
+
+ for (int i = 0; i < argc; i++)
+ cfunc_add_upval(cfunc, vm_get(i));
+
+ vm_push(wrap_cfunc(cfunc));
+}
+
void us_init(void)
{
init_vm();
us_set_cfunc("core:len", core_len, 1);
us_set_cfunc("core:log", core_print, 1);
+ us_set_cfunc("core:range", core_range, 2);
}
void us_deinit(void)