X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FEnvironment.hs;h=de60de890fbc03d7129de673416f55a7bb0b165f;hb=1665160f03da488bb63202c75396b6640ec17d1b;hp=99b25bbc9edc954e231f493c0fa50d0844fd7ac5;hpb=9f3b4ae6cba7835faa57ddc5b859dd00c23c56fd;p=ghc-base.git diff --git a/System/Environment.hs b/System/Environment.hs index 99b25bb..de60de8 100644 --- a/System/Environment.hs +++ b/System/Environment.hs @@ -17,36 +17,45 @@ module System.Environment getArgs, -- :: IO [String] getProgName, -- :: IO String getEnv, -- :: String -> IO String -#ifndef __HUGS__ +#ifndef __NHC__ withArgs, withProgName, #endif +#ifdef __GLASGOW_HASKELL__ + getEnvironment, +#endif ) where import Prelude -import System.IO ( bracket ) -#ifndef __HUGS__ +#ifdef __GLASGOW_HASKELL__ import Foreign import Foreign.C +import Control.Exception ( bracket ) import Control.Monad -#endif - -#ifdef __GLASGOW_HASKELL__ import GHC.IOBase +#include "ghcconfig.h" #endif #ifdef __HUGS__ import Hugs.System #endif +#ifdef __NHC__ +import System + ( getArgs + , getProgName + , getEnv + ) +#endif + -- --------------------------------------------------------------------------- -- getArgs, getProgName, getEnv --- Computation `getArgs' returns a list of the program's command +-- | Computation 'getArgs' returns a list of the program's command -- line arguments (not including the program name). -#ifndef __HUGS__ +#ifdef __GLASGOW_HASKELL__ getArgs :: IO [String] getArgs = alloca $ \ p_argc -> @@ -99,11 +108,13 @@ unpackProgName argv = do isPathSeparator _ = False --- Computation `getEnv var' returns the value --- of the environment variable {\em var}. - --- This computation may fail with --- NoSuchThing: The environment variable does not exist. +-- | Computation 'getEnv' @var@ returns the value +-- of the environment variable @var@. +-- +-- This computation may fail with: +-- +-- * 'System.IO.Error.isDoesNotExistError' if the environment variable +-- does not exist. getEnv :: String -> IO String getEnv name = @@ -118,16 +129,19 @@ foreign import ccall unsafe "getenv" c_getenv :: CString -> IO (Ptr CChar) {-| -@withArgs args act@ - while executing action @act@, have 'System.getArgs' +'withArgs' @args act@ - while executing action @act@, have 'getArgs' return @args@. -} +withArgs :: [String] -> IO a -> IO a withArgs xs act = do p <- System.Environment.getProgName withArgv (p:xs) act {-| -@withProgName name act@ - while executing action @act@, have 'System.getProgName'return @name@. +'withProgName' @name act@ - while executing action @act@, +have 'getProgName' return @name@. -} +withProgName :: String -> IO a -> IO a withProgName nm act = do xs <- System.Environment.getArgs withArgv (nm:xs) act @@ -135,6 +149,7 @@ withProgName nm act = do -- Worker routine which marshals and replaces an argv vector for -- the duration of an action. +withArgv :: [String] -> IO a -> IO a withArgv new_args act = do pName <- System.Environment.getProgName existing_args <- System.Environment.getArgs @@ -156,4 +171,26 @@ setArgs argv = do foreign import ccall unsafe "setProgArgv" setArgsPrim :: Int -> Ptr CString -> IO () -#endif /* __HUGS__ */ + +-- |'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__ */