X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Flib%2Fstd%2FPrelHandle.hsc;h=586214175296dbeef13bfd8f23e187a37c6ee9ce;hb=ea138284b7343bb1810cfbd0284a608dc57f7d46;hp=9c72ab20a7c2d38beb2499288af1235e20939e34;hpb=97b49b48e387146e65d5a6ac4c3cefbe0ba5e9a5;p=ghc-hetmet.git diff --git a/ghc/lib/std/PrelHandle.hsc b/ghc/lib/std/PrelHandle.hsc index 9c72ab2..5862141 100644 --- a/ghc/lib/std/PrelHandle.hsc +++ b/ghc/lib/std/PrelHandle.hsc @@ -4,7 +4,7 @@ #undef DEBUG -- ----------------------------------------------------------------------------- --- $Id: PrelHandle.hsc,v 1.10 2001/06/22 12:36:33 rrt Exp $ +-- $Id: PrelHandle.hsc,v 1.15 2001/07/13 15:01:28 simonmar Exp $ -- -- (c) The University of Glasgow, 1994-2001 -- @@ -22,9 +22,11 @@ module PrelHandle ( stdin, stdout, stderr, IOMode(..), IOModeEx(..), openFile, openFileEx, openFd, - hClose, hFileSize, hIsEOF, isEOF, hLookAhead, hSetBuffering, hSetBinaryMode, + hFileSize, hIsEOF, isEOF, hLookAhead, hSetBuffering, hSetBinaryMode, hFlush, + hClose, hClose_help, + HandlePosn(..), hGetPosn, hSetPosn, SeekMode(..), hSeek, @@ -38,7 +40,7 @@ module PrelHandle ( ) where -#include "cbits/HsStd.h" +#include "HsStd.h" import Monad @@ -127,9 +129,7 @@ but we might want to revisit this in the future --SDM ]. {-# INLINE withHandle #-} withHandle :: String -> Handle -> (Handle__ -> IO (Handle__,a)) -> IO a withHandle fun h@(FileHandle m) act = withHandle' fun h m act -withHandle fun h@(DuplexHandle r w) act = do - withHandle' fun h r act - withHandle' fun h w act +withHandle fun h@(DuplexHandle m _) act = withHandle' fun h m act withHandle' fun h m act = block $ do @@ -626,6 +626,9 @@ openFile' filepath ex_mode = ReadWriteMode -> rw_flags AppendMode -> append_flags + truncate | WriteMode <- mode = True + | otherwise = False + binary_flags #ifdef HAVE_O_BINARY | binary = o_BINARY @@ -644,21 +647,24 @@ openFile' filepath ex_mode = throwErrnoIfMinus1Retry "openFile" (c_open f (fromIntegral oflags) 0o666) - openFd fd filepath mode binary + openFd fd filepath mode binary truncate + -- ASSERT: if we just created the file, then openFd won't fail + -- (so we don't need to worry about removing the newly created file + -- in the event of an error). std_flags = o_NONBLOCK .|. o_NOCTTY output_flags = std_flags .|. o_CREAT read_flags = std_flags .|. o_RDONLY -write_flags = output_flags .|. o_WRONLY .|. o_TRUNC +write_flags = output_flags .|. o_WRONLY rw_flags = output_flags .|. o_RDWR -append_flags = output_flags .|. o_WRONLY .|. o_APPEND +append_flags = write_flags .|. o_APPEND -- --------------------------------------------------------------------------- -- openFd -openFd :: FD -> FilePath -> IOMode -> Bool -> IO Handle -openFd fd filepath mode binary = do +openFd :: FD -> FilePath -> IOMode -> Bool -> Bool -> IO Handle +openFd fd filepath mode binary truncate = do -- turn on non-blocking mode setNonBlockingFD fd @@ -687,6 +693,10 @@ openFd fd filepath mode binary = do when (r == -1) $ ioException (IOError Nothing ResourceBusy "openFile" "file is locked" Nothing) + + -- truncate the file if necessary + when truncate (fileTruncate filepath) + mkFileHandle fd filepath ha_type binary @@ -764,8 +774,9 @@ hClose h@(DuplexHandle r w) = do haType = ClosedHandle } -hClose' h m = - withHandle__' "hClose" h m $ \ handle_ -> do +hClose' h m = withHandle__' "hClose" h m $ hClose_help + +hClose_help handle_ = case haType handle_ of ClosedHandle -> return handle_ _ -> do @@ -1163,19 +1174,19 @@ hIsTerminalDevice handle = do -- hSetBinaryMode #ifdef _WIN32 -hSetBinaryMode handle bin = - withHandle "hSetBinaryMode" handle $ \ handle_ -> +hSetBinaryMode handle bin = + withAllHandles__ "hSetBinaryMode" handle $ \ handle_ -> do let flg | bin = (#const O_BINARY) | otherwise = (#const O_TEXT) throwErrnoIfMinus1_ "hSetBinaryMode" (setmode (fromIntegral (haFD handle_)) flg) - return (handle_{haIsBin=bin}, ()) + return handle_{haIsBin=bin} foreign import "setmode" setmode :: CInt -> CInt -> IO CInt #else hSetBinaryMode handle bin = - withHandle "hSetBinaryMode" handle $ \ handle_ -> - return (handle_{haIsBin=bin}, ()) + withAllHandles__ "hSetBinaryMode" handle $ \ handle_ -> + return handle_{haIsBin=bin} #endif -- -----------------------------------------------------------------------------