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 | |
parent | a78b79b9e64900de9bb2dc42e0a64b0207d7ba49 (diff) | |
download | uwu-nolambda-001a0f3e82dc15fd4c7fa1dd2705074496300e87.tar.xz |
Implement nolambda:os module
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | os.c | 69 | ||||
-rw-r--r-- | test.uwu | 6 |
4 files changed, 79 insertions, 4 deletions
@@ -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 @@ -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` @@ -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); +} @@ -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" ) |