From 001a0f3e82dc15fd4c7fa1dd2705074496300e87 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 1 Jan 2022 14:52:47 +0100 Subject: [PATCH] Implement nolambda:os module --- Makefile | 4 ++-- README.md | 4 ++-- os.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ test.uwu | 6 +++++ 4 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 os.c diff --git a/Makefile b/Makefile index 7e163ae..bdf5ded 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -all: flow.so io.so fs.so +all: flow.so io.so fs.so os.so uwu_include_path=../uwulang/ %.so: %.c - gcc -g -I${uwu_include_path} -shared -fpic $< -o $@ -D_GNU_SOURCE + gcc -g -I${uwu_include_path} -shared -fpic $< -o $@ -D_GNU_SOURCE -Wall -Wextra clean: rm -rf *.so diff --git a/README.md b/README.md index 05f7d17..8dbdb0a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ make uwu_include_path=/path/to/uwulang/repo ## Modules -The following modules are implemented: `nolambda:flow`, `nolambda:io`, `nolambda:fs`. The modules `nolambda:os`, `nolambda:global`, and `nolambda:random` are ToDo. +The following modules are implemented: `nolambda:flow`, `nolambda:io`, `nolambda:fs`, `nolambda:os`. The modules `nolambda:global`, and `nolambda:random` are ToDo. ### `nolambda:flow` @@ -43,7 +43,7 @@ Note: all file paths are relative to the _directory the program was started from - `nolambda:os:exit`: Optionally takes an exit code (integer) as $0 and exits the program with the given exit code, or 0 if no exit code was given. Returns `:nil:nil` in theory. - `nolambda:os:sleep`: Takes an integer as $0 and pauses the execution of the program for $1 milliseconds. Returns `:nil:nil`. - `nolambda:os:execute`: Takes a command (arbirary value, converted to string) as $0 and executes it as a shell command. Returns the exit code of the command as an integer. -- `nolambda:os:time`: Returns the current unix time as an integer. +- `nolambda:os:time`: Returns the current unix millis as an integer. ### `nolambda:global` diff --git a/os.c b/os.c new file mode 100644 index 0000000..c147bab --- /dev/null +++ b/os.c @@ -0,0 +1,69 @@ +#include +#include +#include +#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); +} diff --git a/test.uwu b/test.uwu index a0e0681..8e7d32b 100644 --- a/test.uwu +++ b/test.uwu @@ -27,5 +27,11 @@ main flow:linear( io:print("successfully removed file") ), + io:print(os:time), + os:sleep(500), + io:print(os:time), + + os:execute("echo hello world"), + "success" ) -- 2.44.0