aboutsummaryrefslogtreecommitdiff
path: root/std/special/bootstrap.zig
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-04-02 19:14:23 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-04-02 19:14:23 -0400
commit640389bb2b04766e58e206c53ee2048c54534eb9 (patch)
tree5d0d463ee30fedce1678f018294ca1b51aae2a10 /std/special/bootstrap.zig
parent8fd0fddce5d44344dd7914ae86a4d976b99f9cc3 (diff)
downloadzig-640389bb2b04766e58e206c53ee2048c54534eb9.tar.gz
zig-640389bb2b04766e58e206c53ee2048c54534eb9.zip
expose environment variables in standard library
closes #118
Diffstat (limited to 'std/special/bootstrap.zig')
-rw-r--r--std/special/bootstrap.zig29
1 files changed, 25 insertions, 4 deletions
diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig
index 92cac016d7..0705fbb296 100644
--- a/std/special/bootstrap.zig
+++ b/std/special/bootstrap.zig
@@ -32,21 +32,42 @@ export nakedcc fn _start() -> noreturn {
callMainAndExit()
}
-fn callMain() -> %void {
+fn callMain(envp: &?&u8) -> %void {
const args = @alloca([]u8, argc);
for (args) |_, i| {
const ptr = argv[i];
args[i] = ptr[0...std.cstr.len(ptr)];
}
+
+ var env_count: usize = 0;
+ while (envp[env_count] != null; env_count += 1) {}
+ const environ = @alloca(std.os.EnvPair, env_count);
+ for (environ) |_, env_i| {
+ const ptr = ??envp[env_i];
+
+ var line_i: usize = 0;
+ while (ptr[line_i] != 0 and ptr[line_i] != '='; line_i += 1) {}
+
+ var end_i: usize = line_i;
+ while (ptr[end_i] != 0; end_i += 1) {}
+
+ environ[env_i] = std.os.EnvPair {
+ .key = ptr[0...line_i],
+ .value = ptr[line_i + 1...end_i],
+ };
+ }
+ std.os.environ = environ;
+
return root.main(args);
}
fn callMainAndExit() -> noreturn {
- callMain() %% exit(1);
+ const envp = @ptrcast(&?&u8, &argv[argc + 1]);
+ callMain(envp) %% exit(1);
exit(0);
}
-export fn main(c_argc: i32, c_argv: &&u8) -> i32 {
+export fn main(c_argc: i32, c_argv: &&u8, c_envp: &?&u8) -> i32 {
@setGlobalLinkage(main, if (want_main_symbol) GlobalLinkage.Strong else GlobalLinkage.Internal);
if (!want_main_symbol) {
unreachable;
@@ -54,6 +75,6 @@ export fn main(c_argc: i32, c_argv: &&u8) -> i32 {
argc = usize(c_argc);
argv = c_argv;
- callMain() %% return 1;
+ callMain(c_envp) %% return 1;
return 0;
}