X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FEnvironment.hs;h=20b709f550813a3fc6b09301047f3a27317b0646;hb=f7a485978f04e84b086f1974b88887cc72d832d0;hp=c0fe1f9ae41d7e0348e2dbd218d1e4be76138892;hpb=3d39b8130899c46c9c96b941fddb4e4784e860dc;p=ghc-base.git diff --git a/System/Environment.hs b/System/Environment.hs index c0fe1f9..20b709f 100644 --- a/System/Environment.hs +++ b/System/Environment.hs @@ -1,15 +1,13 @@ ----------------------------------------------------------------------------- --- +-- | -- Module : System.Environment -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : portable -- --- $Id: Environment.hs,v 1.2 2001/08/17 12:50:34 simonmar Exp $ --- -- Miscellaneous information about the system environment. -- ----------------------------------------------------------------------------- @@ -25,6 +23,7 @@ import Prelude import Foreign import Foreign.C +import Control.Monad #ifdef __GLASGOW_HASKELL__ import GHC.IOBase @@ -41,12 +40,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 +62,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 +95,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)