@@ -20,17 +20,54 @@ getArgs = do n <- numArgs
20 do arg <- getArg i
20 do arg <- getArg i
21 ga' (arg :: acc) (i+1) n
21 ga' (arg :: acc) (i+1) n
23+-- Retrieves an value from the environment, if the given key is present,
24+-- otherwise it returns Nothing.
23getEnv : String -> IO (Maybe String)
25getEnv : String -> IO (Maybe String)
24getEnv key = do
26getEnv key = do
25 str_ptr <- getEnv'
27 str_ptr <- getEnv'
26− exists <- nullStr str_ptr
28+ is_nil <- nullStr str_ptr
27− if exists
29+ if is_nil
28 then pure Nothing
30 then pure Nothing
29 else pure (Just str_ptr)
31 else pure (Just str_ptr)
31 getEnv' : IO String
33 getEnv' : IO String
32 getEnv' = mkForeign (FFun "getenv" [FString] FString) key
34 getEnv' = mkForeign (FFun "getenv" [FString] FString) key
36+-- Sets an environment variable with a given value.
37+-- Returns true if the operation was successful.
38+setEnv : String -> String -> IO Bool
40+ ok <- mkForeign (FFun "setenv" [FString, FString, FInt] FInt) key value 1
43+-- Unsets an environment variable.
44+-- Returns true if the variable was able to be unset.
45+unsetEnv : String -> IO Bool
47+ ok <- mkForeign (FFun "unsetenv" [FString] FInt) key
50+getEnvironment : IO (List (String, String))
51+getEnvironment = getAllPairs 0 []
53+ getEnvPair : Int -> IO String
54+ getEnvPair i = mkForeign (FFun "getEnvPair" [FInt] FString) i
56+ splitEq : String -> (String, String)
58+ -- FIXME: There has to be a better way to split this up
59+ let (k, v) = break (== '=') str in
60+ let (_, v') = break (/= '=') v in
63+ getAllPairs : Int -> List String -> IO (List (String, String))
64+ getAllPairs n acc = do
65+ envPair <- getEnvPair n
66+ is_nil <- nullStr envPair
68+ then return $ reverse $ map splitEq acc
69+ else getAllPairs (n + 1) (envPair :: acc)
34exit : Int -> IO ()
71exit : Int -> IO ()
35exit code = mkForeign (FFun "exit" [FInt] FUnit) code
72exit code = mkForeign (FFun "exit" [FInt] FUnit) code