-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
## 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`
- `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`
--- /dev/null
+#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);
+}