diff options
Diffstat (limited to 'uscript/uscript.c')
| -rw-r--r-- | uscript/uscript.c | 34 |
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) |
