X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FEnvironment.hs;h=3271e29422e0adaf98c46412597bc8744a3d8940;hb=bb534f206682be14daf72b33c6105ab27295c6ac;hp=245a9db41900c5a1b488189e7cdd1a2860118323;hpb=939762d006a3ce057a11ba091e2cb4fb5dcb0a95;p=ghc-base.git diff --git a/System/Environment.hs b/System/Environment.hs index 245a9db..3271e29 100644 --- a/System/Environment.hs +++ b/System/Environment.hs @@ -21,6 +21,9 @@ module System.Environment withArgs, withProgName, #endif +#ifdef __GLASGOW_HASKELL__ + getEnvironment, +#endif ) where import Prelude @@ -31,7 +34,6 @@ import Foreign.C import Control.Exception ( bracket ) import Control.Monad import GHC.IOBase -#include "config.h" #endif #ifdef __HUGS__ @@ -99,7 +101,7 @@ unpackProgName argv = do isPathSeparator :: Char -> Bool isPathSeparator '/' = True -#ifdef mingw32_TARGET_OS +#ifdef mingw32_HOST_OS isPathSeparator '\\' = True #endif isPathSeparator _ = False @@ -168,4 +170,26 @@ setArgs argv = do foreign import ccall unsafe "setProgArgv" setArgsPrim :: Int -> Ptr CString -> IO () + +-- |'getEnvironment' retrieves the entire environment as a +-- list of @(key,value)@ pairs. +-- +-- If an environment entry does not contain an @\'=\'@ character, +-- the @key@ is the whole entry and the @value@ is the empty string. + +getEnvironment :: IO [(String, String)] +getEnvironment = do + pBlock <- getEnvBlock + if pBlock == nullPtr then return [] + else do + stuff <- peekArray0 nullPtr pBlock >>= mapM peekCString + return (map divvy stuff) + where + divvy str = + case break (=='=') str of + (xs,[]) -> (xs,[]) -- don't barf (like Posix.getEnvironment) + (name,_:value) -> (name,value) + +foreign import ccall unsafe "__hscore_environ" + getEnvBlock :: IO (Ptr CString) #endif /* __GLASGOW_HASKELL__ */