on master help sign in
Modifying the System.getEnv function to return IO (Maybe String)
c8530b3Gabe McArthur
lib/Network/Cgi.idr+9−4
@@ -115,15 +115,20 @@ getContent x = getC x "" where
115 getC (n-1) (strCons x acc)
115 getC (n-1) (strCons x acc)
116 else (return "")
116 else (return "")
117
117
118+getCgiEnv : String -> IO String
119+getCgiEnv key = do
120+ val <- getEnv key
121+ return $ maybe "" id val
122+
118abstract
123abstract
119runCGI : CGI a -> IO a
124runCGI : CGI a -> IO a
120runCGI prog = do
125runCGI prog = do
121− clen_in <- getEnv "CONTENT_LENGTH"
126+ clen_in <- getCgiEnv "CONTENT_LENGTH"
122 let clen = prim__fromStrInt clen_in
127 let clen = prim__fromStrInt clen_in
123 content <- getContent clen
128 content <- getContent clen
124− query <- getEnv "QUERY_STRING"
129+ query <- getCgiEnv "QUERY_STRING"
125− cookie <- getEnv "HTTP_COOKIE"
130+ cookie <- getCgiEnv "HTTP_COOKIE"
126− agent <- getEnv "HTTP_USER_AGENT"
131+ agent <- getCgiEnv "HTTP_USER_AGENT"
127
132
128 let get_vars = getVars ['&',';'] query
133 let get_vars = getVars ['&',';'] query
129 let post_vars = getVars ['&'] content
134 let post_vars = getVars ['&'] content
lib/Prelude.idr+5
@@ -478,6 +478,11 @@ nullPtr : Ptr -> IO Bool
478nullPtr p = do ok <- mkForeign (FFun "isNull" [FPtr] FInt) p
478nullPtr p = do ok <- mkForeign (FFun "isNull" [FPtr] FInt) p
479 return (ok /= 0);
479 return (ok /= 0);
480
480
481+partial
482+nullStr : String -> IO Bool
483+nullStr p = do ok <- mkForeign (FFun "isNullString" [FString] FInt) p
484+ return (ok /= 0);
485+
481partial
486partial
482validFile : File -> IO Bool
487validFile : File -> IO Bool
483validFile (FHandle h) = do x <- nullPtr h
488validFile (FHandle h) = do x <- nullPtr h
lib/System.idr+10−2
@@ -20,8 +20,16 @@ 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−getEnv : String -> IO String
23+getEnv : String -> IO (Maybe String)
24+getEnv key = do
25+ str_ptr <- getEnv'
26+ exists <- nullStr str_ptr
27+ if exists
28+ then pure Nothing
29+ else pure (Just str_ptr)
30+ where
31+ getEnv' : IO String
24−getEnv x = mkForeign (FFun "getenv" [FString] FString) x
32+ getEnv' = mkForeign (FFun "getenv" [FString] FString) key
25
33
26exit : Int -> IO ()
34exit : Int -> IO ()
27exit code = mkForeign (FFun "exit" [FInt] FUnit) code
35exit code = mkForeign (FFun "exit" [FInt] FUnit) code
llvm/defs.c+4
@@ -119,6 +119,10 @@ int isNull(void* ptr) {
119 return ptr==NULL;
119 return ptr==NULL;
120}
120}
121
121
122+int isNullString(char* str) {
123+ return str==NULL;
124+}
125+
122void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {
126void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {
123 memset(((uint8_t*)ptr) + offset, c, size);
127 memset(((uint8_t*)ptr) + offset, c, size);
124}
128}
rts/idris_stdfgn.c+4
@@ -34,6 +34,10 @@ int isNull(void* ptr) {
34 return ptr==NULL;
34 return ptr==NULL;
35}
35}
36
36
37+int isNullString(char* str) {
38+ return str==NULL;
39+}
40+
37void* idris_stdin() {
41void* idris_stdin() {
38 return (void*)stdin;
42 return (void*)stdin;
39}
43}
rts/idris_stdfgn.h+1
@@ -13,6 +13,7 @@ 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);
16void* idris_stdin();
17void* idris_stdin();
17
18
18#endif
19#endif