on master help sign in
Adding several functions to interact with environment variables.
5e8a597Gabe McArthur
lib/Prelude.idr+1−1
@@ -480,7 +480,7 @@ nullPtr p = do ok <- mkForeign (FFun "isNull" [FPtr] FInt) p
480
480
481partial
481partial
482nullStr : String -> IO Bool
482nullStr : String -> IO Bool
483−nullStr p = do ok <- mkForeign (FFun "isNullString" [FString] FInt) p
483+nullStr p = do ok <- mkForeign (FFun "isNull" [FString] FInt) p
484 return (ok /= 0);
484 return (ok /= 0);
485
485
486partial
486partial
lib/System.idr+39−2
@@ -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
22
22
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)
30 where
32 where
31 getEnv' : IO String
33 getEnv' : IO String
32 getEnv' = mkForeign (FFun "getenv" [FString] FString) key
34 getEnv' = mkForeign (FFun "getenv" [FString] FString) key
33
35
36+-- Sets an environment variable with a given value.
37+-- Returns true if the operation was successful.
38+setEnv : String -> String -> IO Bool
39+setEnv key value = do
40+ ok <- mkForeign (FFun "setenv" [FString, FString, FInt] FInt) key value 1
41+ return (ok == 0)
42+
43+-- Unsets an environment variable.
44+-- Returns true if the variable was able to be unset.
45+unsetEnv : String -> IO Bool
46+unsetEnv key = do
47+ ok <- mkForeign (FFun "unsetenv" [FString] FInt) key
48+ return (ok == 0)
49+
50+getEnvironment : IO (List (String, String))
51+getEnvironment = getAllPairs 0 []
52+ where
53+ getEnvPair : Int -> IO String
54+ getEnvPair i = mkForeign (FFun "getEnvPair" [FInt] FString) i
55+
56+ splitEq : String -> (String, String)
57+ splitEq str =
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
61+ (k, v')
62+
63+ getAllPairs : Int -> List String -> IO (List (String, String))
64+ getAllPairs n acc = do
65+ envPair <- getEnvPair n
66+ is_nil <- nullStr envPair
67+ if is_nil
68+ then return $ reverse $ map splitEq acc
69+ else getAllPairs (n + 1) (envPair :: acc)
70+
34exit : Int -> IO ()
71exit : Int -> IO ()
35exit code = mkForeign (FFun "exit" [FInt] FUnit) code
72exit code = mkForeign (FFun "exit" [FInt] FUnit) code
36
73
llvm/defs.c+5−2
@@ -1,9 +1,12 @@
1+#include <stdlib.h>
1#include <stdio.h>
2#include <stdio.h>
2#include <gmp.h>
3#include <gmp.h>
3#include <gc.h>
4#include <gc.h>
4#include <string.h>
5#include <string.h>
5#include <inttypes.h>
6#include <inttypes.h>
6
7
8+extern char** environ;
9+
7void putStr(const char *str) {
10void putStr(const char *str) {
8 fputs(str, stdout);
11 fputs(str, stdout);
9}
12}
@@ -119,8 +122,8 @@ int isNull(void* ptr) {
119 return ptr==NULL;
122 return ptr==NULL;
120}
123}
121
124
122−int isNullString(char* str) {
125+char* getEnvPair(int i) {
123− return str==NULL;
126+ return *(environ + i);
124}
127}
125
128
126void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {
129void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {
rts/idris_stdfgn.c+6−4
@@ -1,6 +1,8 @@
1#include "idris_stdfgn.h"
1#include "idris_stdfgn.h"
2#include "idris_rts.h"
2#include "idris_rts.h"
3
3
4+extern char** environ;
5+
4void putStr(char* str) {
6void putStr(char* str) {
5 printf("%s", str);
7 printf("%s", str);
6}
8}
@@ -34,10 +36,10 @@ int isNull(void* ptr) {
34 return ptr==NULL;
36 return ptr==NULL;
35}
37}
36
38
37−int isNullString(char* str) {
38− return str==NULL;
39−}
40−
41void* idris_stdin() {
39void* idris_stdin() {
42 return (void*)stdin;
40 return (void*)stdin;
43}
41}
42+
43+char* getEnvPair(int i) {
44+ return *(environ + i);
45+}
rts/idris_stdfgn.h+2−1
@@ -13,7 +13,8 @@ int fileError(void* h);
13void fputStr(void*h, char* str);
13void fputStr(void*h, char* str);
14
14
15int isNull(void* ptr);
15int isNull(void* ptr);
16−int isNullString(char* str);
17void* idris_stdin();
16void* idris_stdin();
18
17
18+char* getEnvPair(int i);
19+
19#endif
20#endif