]> git.lizzy.rs Git - uwu-nolambda.git/blobdiff - os.c
Implement nolambda:os module
[uwu-nolambda.git] / os.c
diff --git a/os.c b/os.c
new file mode 100644 (file)
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);
+}