aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-01-01 14:52:47 +0100
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-01-01 14:52:47 +0100
commit001a0f3e82dc15fd4c7fa1dd2705074496300e87 (patch)
tree5b4a62ee493858439253ce5df3eb648d0628a8b0
parenta78b79b9e64900de9bb2dc42e0a64b0207d7ba49 (diff)
downloaduwu-nolambda-001a0f3e82dc15fd4c7fa1dd2705074496300e87.tar.xz
Implement nolambda:os module
-rw-r--r--Makefile4
-rw-r--r--README.md4
-rw-r--r--os.c69
-rw-r--r--test.uwu6
4 files changed, 79 insertions, 4 deletions
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 <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);
+}
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"
)