on master help sign in
Merge pull request #489 from gabemc/issue/331

Issue #331: Modifying the System.getEnv function to return IO (Maybe String)

commit6c723d2020c19fad0ed21d718aa64abddc67d1cd authorEdwin Brady <edwin.brady@gmail.com> dateSat 21 Sep 2013, 05:10 (13 years ago) parent9e4a18dc8530b3
6 files changed+33−6
lib/Network/Cgi.idr+9−4 lib/Prelude.idr+5 lib/System.idr+10−2 llvm/defs.c+4 rts/idris_stdfgn.c+4 rts/idris_stdfgn.h+1
lib/Network/Cgi.idr+9−4
@@ -115,15 +115,20 @@ getContent x = getC x "" where
115115 getC (n-1) (strCons x acc)
116116 else (return "")
117117
118+getCgiEnv : String -> IO String
119+getCgiEnv key = do
120+ val <- getEnv key
121+ return $ maybe "" id val
122+
118123abstract
119124runCGI : CGI a -> IO a
120125runCGI prog = do
121− clen_in <- getEnv "CONTENT_LENGTH"
126+ clen_in <- getCgiEnv "CONTENT_LENGTH"
122127 let clen = prim__fromStrInt clen_in
123128 content <- getContent clen
124− query <- getEnv "QUERY_STRING"
125− cookie <- getEnv "HTTP_COOKIE"
126− agent <- getEnv "HTTP_USER_AGENT"
129+ query <- getCgiEnv "QUERY_STRING"
130+ cookie <- getCgiEnv "HTTP_COOKIE"
131+ agent <- getCgiEnv "HTTP_USER_AGENT"
127132
128133 let get_vars = getVars ['&',';'] query
129134 let post_vars = getVars ['&'] content
lib/Prelude.idr+5
@@ -478,6 +478,11 @@ nullPtr : Ptr -> IO Bool
478478nullPtr p = do ok <- mkForeign (FFun "isNull" [FPtr] FInt) p
479479 return (ok /= 0);
480480
481+partial
482+nullStr : String -> IO Bool
483+nullStr p = do ok <- mkForeign (FFun "isNullString" [FString] FInt) p
484+ return (ok /= 0);
485+
481486partial
482487validFile : File -> IO Bool
483488validFile (FHandle h) = do x <- nullPtr h
lib/System.idr+10−2
@@ -20,8 +20,16 @@ getArgs = do n <- numArgs
2020 do arg <- getArg i
2121 ga' (arg :: acc) (i+1) n
2222
23−getEnv : String -> IO String
24−getEnv x = mkForeign (FFun "getenv" [FString] FString) x
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
32+ getEnv' = mkForeign (FFun "getenv" [FString] FString) key
2533
2634exit : Int -> IO ()
2735exit code = mkForeign (FFun "exit" [FInt] FUnit) code
llvm/defs.c+4
@@ -119,6 +119,10 @@ int isNull(void* ptr) {
119119 return ptr==NULL;
120120}
121121
122+int isNullString(char* str) {
123+ return str==NULL;
124+}
125+
122126void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {
123127 memset(((uint8_t*)ptr) + offset, c, size);
124128}
rts/idris_stdfgn.c+4
@@ -34,6 +34,10 @@ int isNull(void* ptr) {
3434 return ptr==NULL;
3535}
3636
37+int isNullString(char* str) {
38+ return str==NULL;
39+}
40+
3741void* idris_stdin() {
3842 return (void*)stdin;
3943}
rts/idris_stdfgn.h+1
@@ -13,6 +13,7 @@ int fileError(void* h);
1313void fputStr(void*h, char* str);
1414
1515int isNull(void* ptr);
16+int isNullString(char* str);
1617void* idris_stdin();
1718
1819#endif