X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FEnvironment.hs;h=117b7db0a3d24610838429688022ba6dfd566dc9;hb=9fa9bc17072a58c0bae2cce4764d38677e96ac29;hp=c0fe1f9ae41d7e0348e2dbd218d1e4be76138892;hpb=3d39b8130899c46c9c96b941fddb4e4784e860dc;p=ghc-base.git diff --git a/System/Environment.hs b/System/Environment.hs index c0fe1f9..117b7db 100644 --- a/System/Environment.hs +++ b/System/Environment.hs @@ -1,5 +1,5 @@ ----------------------------------------------------------------------------- --- +-- | -- Module : System.Environment -- Copyright : (c) The University of Glasgow 2001 -- License : BSD-style (see the file libraries/core/LICENSE) @@ -8,7 +8,7 @@ -- Stability : provisional -- Portability : portable -- --- $Id: Environment.hs,v 1.2 2001/08/17 12:50:34 simonmar Exp $ +-- $Id: Environment.hs,v 1.6 2002/04/24 16:31:45 simonmar Exp $ -- -- Miscellaneous information about the system environment. -- @@ -25,6 +25,7 @@ import Prelude import Foreign import Foreign.C +import Control.Monad #ifdef __GLASGOW_HASKELL__ import GHC.IOBase @@ -41,12 +42,13 @@ getArgs = alloca $ \ p_argc -> alloca $ \ p_argv -> do getProgArgv p_argc p_argv - p <- peek p_argc + p <- fromIntegral `liftM` peek p_argc argv <- peek p_argv peekArray (p - 1) (advancePtr argv 1) >>= mapM peekCString + - -foreign import "getProgArgv" getProgArgv :: Ptr Int -> Ptr (Ptr CString) -> IO () +foreign import ccall unsafe "getProgArgv" + getProgArgv :: Ptr CInt -> Ptr (Ptr CString) -> IO () -- Computation `getProgName' returns the name of the program -- as it was invoked. @@ -62,13 +64,23 @@ getProgName = unpackProgName :: Ptr (Ptr CChar) -> IO String -- argv[0] unpackProgName argv = do s <- peekElemOff argv 0 >>= peekCString - return (de_slash "" s) + return (basename s) where - -- re-start accumulating at every '/' - de_slash :: String -> String -> String - de_slash acc [] = reverse acc - de_slash _acc ('/':xs) = de_slash [] xs - de_slash acc (x:xs) = de_slash (x:acc) xs + basename :: String -> String + basename f = go f f + where + go acc [] = acc + go acc (x:xs) + | isPathSeparator x = go xs xs + | otherwise = go acc xs + + isPathSeparator :: Char -> Bool + isPathSeparator '/' = True +#ifdef mingw32_TARGET_OS + isPathSeparator '\\' = True +#endif + isPathSeparator _ = False + -- Computation `getEnv var' returns the value -- of the environment variable {\em var}. @@ -85,5 +97,5 @@ getEnv name = else ioException (IOError Nothing NoSuchThing "getEnv" "no environment variable" (Just name)) -foreign import ccall "getenv" unsafe +foreign import ccall unsafe "getenv" c_getenv :: CString -> IO (Ptr CChar)