summaryrefslogtreecommitdiff
path: root/libraries/base/System/Environment.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/System/Environment.hs')
-rw-r--r--libraries/base/System/Environment.hs30
1 files changed, 12 insertions, 18 deletions
diff --git a/libraries/base/System/Environment.hs b/libraries/base/System/Environment.hs
index 242845aae6..d8b3e03be5 100644
--- a/libraries/base/System/Environment.hs
+++ b/libraries/base/System/Environment.hs
@@ -32,12 +32,14 @@ module System.Environment
import Foreign
import Foreign.C
import System.IO.Error (mkIOError)
-import Control.Exception.Base (bracket, throwIO)
+import Control.Exception.Base (bracket_, throwIO)
+#ifdef mingw32_HOST_OS
+import Control.Exception.Base (bracket)
+#endif
-- import GHC.IO
import GHC.IO.Exception
import GHC.IO.Encoding (getFileSystemEncoding)
import qualified GHC.Foreign as GHC
-import Data.List
import Control.Monad
#ifdef mingw32_HOST_OS
import GHC.Environment
@@ -369,25 +371,17 @@ withProgArgv :: [String] -> IO a -> IO a
withProgArgv new_args act = do
pName <- System.Environment.getProgName
existing_args <- System.Environment.getArgs
- bracket (setProgArgv new_args)
- (\argv -> do _ <- setProgArgv (pName:existing_args)
- freeProgArgv argv)
- (const act)
-
-freeProgArgv :: Ptr CString -> IO ()
-freeProgArgv argv = do
- size <- lengthArray0 nullPtr argv
- sequence_ [ peek (argv `advancePtr` i) >>= free
- | i <- [size - 1, size - 2 .. 0]]
- free argv
-
-setProgArgv :: [String] -> IO (Ptr CString)
+ bracket_ (setProgArgv new_args)
+ (setProgArgv (pName:existing_args))
+ act
+
+setProgArgv :: [String] -> IO ()
setProgArgv argv = do
enc <- getFileSystemEncoding
- vs <- mapM (GHC.newCString enc) argv >>= newArray0 nullPtr
- c_setProgArgv (genericLength argv) vs
- return vs
+ GHC.withCStringsLen enc argv $ \len css ->
+ c_setProgArgv (fromIntegral len) css
+-- setProgArgv copies the arguments
foreign import ccall unsafe "setProgArgv"
c_setProgArgv :: CInt -> Ptr CString -> IO ()