#load "./wasi_defs"
#load "./wasi_fs"
+#load "./wasi_env"
use core
use wasi
use runtime
+use main { MAIN_PKG :: package }
use wasi {
IOVec, SubscriptionTagged, Subscription, Event, Size,
__runtime_initialize();
context.thread_id = 0;
- #if (typeof (package main).main) == #type () -> void {
- (package main).main();
+ #if (typeof MAIN_PKG.main) == #type () -> void {
+ MAIN_PKG.main();
} else {
args : [] cstr;
args[i] = cast(cstr) (cast([&] u32) args.data)[i];
}
- (package main).main(args);
+ MAIN_PKG.main(args);
}
__flush_stdio();
--- /dev/null
+package runtime.platform
+
+use wasi { environ_get, environ_sizes_get, Size }
+use core {Pair, string, slice}
+
+#local {
+ all_env: [] Pair(str, str);
+}
+
+#local
+__lookup_all_envs :: () {
+ if all_env do return;
+
+ allocator := context.allocator;
+
+ env_count, env_buf_size : Size;
+ environ_sizes_get(&env_count, &env_buf_size);
+
+ env_var := make([] cstr, env_count, allocator);
+ env_buf := make([] u8, env_buf_size, allocator);
+
+ environ_get(env_var.data, env_buf.data);
+
+ // Fix pointers to be only 4 bytes wide
+ while i := cast(i32) (env_var.count - 1); i >= 0 {
+ defer i -= 1;
+ env_var[i] = cast(cstr) (cast([&]u32) env_var.data)[i];
+ }
+
+ result := make([..] Pair(str, str), env_count, allocator);
+ for env: env_var {
+ s := string.from_cstr(env);
+ var, val := string.bisect(s, '=');
+ result << .{var, val};
+ }
+
+ delete(&env_var, allocator);
+
+ all_env = result;
+}
+
+__get_all_env :: () -> [] Pair(str, str) {
+ __lookup_all_envs();
+
+ return all_env;
+}
+
+__get_env :: (key: str) -> ? str {
+ __lookup_all_envs();
+
+ return slice.first(all_env, #(it.first == key))
+ |> Optional.from_ptr()
+ |> Optional.transform(x => x.second);
+}
+
+
+