diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2022-01-01 14:52:47 +0100 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2022-01-01 14:52:47 +0100 |
commit | 001a0f3e82dc15fd4c7fa1dd2705074496300e87 (patch) | |
tree | 5b4a62ee493858439253ce5df3eb648d0628a8b0 /os.c | |
parent | a78b79b9e64900de9bb2dc42e0a64b0207d7ba49 (diff) | |
download | uwu-nolambda-001a0f3e82dc15fd4c7fa1dd2705074496300e87.tar.xz |
Implement nolambda:os module
Diffstat (limited to 'os.c')
-rw-r--r-- | os.c | 69 |
1 files changed, 69 insertions, 0 deletions
@@ -0,0 +1,69 @@ +#include <time.h> +#include <stdlib.h> +#include <errno.h> +#include "api/vm.h" +#include "api/util.h" +#include "api/int.h" +#include "api/nil.h" +#include "api/str.h" +#include "common/err.h" + +UwUVMValue uwu_exit(UwUVMArgs *args) +{ + uwuutil_require_max("nolambda:os:exit", args, 1); + + long exit_code = 0; + + if (args->num == 1) + exit_code = uwuint_get(uwuvm_get_arg(args, 0)); + + exit(exit_code); + return uwunil_create(); +} + +UwUVMValue uwu_sleep(UwUVMArgs *args) +{ + uwuutil_require_exact("nolamda:os:sleep", args, 1); + + UwUVMValue value = uwuvm_get_arg(args, 0); + + if (value.type != &uwuint_type) + error("type error: nolamda:os:sleep requires an integer as $0\n"); + + long millis = uwuint_get(value); + + if (millis < 0) + error("type error: nolamda:os:sleep requires a positive value as $0\n"); + + struct timespec ts = { + .tv_sec = millis / 1000, + .tv_nsec = 1000000 * (millis % 1000), + }; + + while (nanosleep(&ts, &ts) != 0) + if (errno != EINTR) + syserror("nanosleep", NULL); + + return uwunil_create(); +} + +UwUVMValue uwu_execute(UwUVMArgs *args) +{ + uwuutil_require_exact("nolambda:os:execute", args, 1); + + char *command = uwustr_get(uwuvm_get_arg(args, 0)); + int ret = system(command); + free(command); + + return uwuint_create(ret); +} + +UwUVMValue uwu_time(UwUVMArgs *args) +{ + uwuutil_require_exact("nolamda:os:time", args, 0); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + + return uwuint_create(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); +} |