summaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
Diffstat (limited to 'std')
-rw-r--r--std/env.zc71
1 files changed, 71 insertions, 0 deletions
diff --git a/std/env.zc b/std/env.zc
new file mode 100644
index 0000000..7d5fd5a
--- /dev/null
+++ b/std/env.zc
@@ -0,0 +1,71 @@
+import "./core.zc"
+import "./option.zc"
+import "./string.zc"
+
+raw {
+ char *_z_env_get(char *name) {
+ return getenv(name);
+ }
+
+ int _z_env_set(char *name, char *value, int overwrite) {
+ return setenv(name, value, overwrite);
+ }
+
+ int _z_env_unset(char *name) {
+ return unsetenv(name);
+ }
+}
+
+extern fn _z_env_get(name: char*) -> char*;
+extern fn _z_env_set(name: char*, value: char*, overwrite: int) -> int;
+extern fn _z_env_unset(name: char*) -> int;
+
+@derive(Eq)
+enum EnvRes {
+ ERR,
+ OK,
+}
+
+struct Env {}
+
+impl Env {
+ fn get(name: string) -> Option<string> {
+ var value: string = _z_env_get(name);
+ if (value == NULL) {
+ return Option<string>::None();
+ }
+
+ return Option<string>::Some(value);
+ }
+
+ fn get_dup(name: string) -> Option<String> {
+ var value: string = _z_env_get(name);
+ if (value == NULL) {
+ return Option<String>::None();
+ }
+
+ var v = String::from(value);
+ var o = Option<String>::Some(v);
+ v.forget();
+
+ return o;
+ }
+
+ fn set(name: string, value: string) -> EnvRes {
+ var ret: int = _z_env_set(name, value, 0);
+
+ return (ret == 0) ? EnvRes::OK() : EnvRes::ERR();
+ }
+
+ fn set_overwrite(name: string, value: string) -> EnvRes {
+ var ret: int = _z_env_set(name, value, 1);
+
+ return (ret == 0) ? EnvRes::OK() : EnvRes::ERR();
+ }
+
+ fn unset(name: string) -> EnvRes {
+ var ret: int = _z_env_unset(name);
+
+ return (ret == 0) ? EnvRes::OK() : EnvRes::ERR();
+ }
+}