(original) (raw)

{-# LANGUAGE Trustworthy #-} {-# LANGUAGE CPP , NoImplicitPrelude , ExistentialQuantification #-} {-# OPTIONS_GHC -funbox-strict-fields #-} {-# OPTIONS_HADDOCK not-home #-}

module GHC.IO.Handle.Types ( Handle(..), Handle__(..), showHandle, checkHandleInvariants, BufferList(..), HandleType(..), isReadableHandleType, isWritableHandleType, isReadWriteHandleType, isAppendHandleType, BufferMode(..), BufferCodec(..), NewlineMode(..), Newline(..), nativeNewline, universalNewlineMode, noNewlineTranslation, nativeNewlineMode ) where

#undef DEBUG

import GHC.Base import GHC.MVar import GHC.IO import GHC.IO.Buffer import GHC.IO.BufferedIO import GHC.IO.Encoding.Types import GHC.IORef import GHC.Show import GHC.Read import GHC.Word import GHC.IO.Device import Data.Typeable #if defined(DEBUG) import Control.Monad #endif

data Handle = FileHandle
FilePath

    !([MVar](GHC.MVar.html#MVar) [Handle__](GHC.IO.Handle.Types.html#Handle%5F%5F))

| DuplexHandle
FilePath

    !([MVar](GHC.MVar.html#MVar) [Handle__](GHC.IO.Handle.Types.html#Handle%5F%5F))                
    !([MVar](GHC.MVar.html#MVar) [Handle__](GHC.IO.Handle.Types.html#Handle%5F%5F))                

instance Eq Handle where (FileHandle FilePath _ MVar Handle__ h1) == :: Handle -> Handle -> Bool == (FileHandle FilePath _ MVar Handle__ h2) = MVar Handle__ h1 MVar Handle__ -> MVar Handle__ -> Bool forall a. Eq a => a -> a -> Bool == MVar Handle__ h2 (DuplexHandle FilePath _ MVar Handle__ h1 MVar Handle__ ) == (DuplexHandle FilePath _ MVar Handle_ h2 MVar Handle__ ) = MVar Handle_ h1 MVar Handle__ -> MVar Handle__ -> Bool forall a. Eq a => a -> a -> Bool == MVar Handle__ h2 Handle _ == Handle _ = Bool False

data Handle__ = forall dev enc_state dec_state . (RawIO dev, IODevice dev, BufferedIO dev, Typeable dev) => Handle__ { () haDevice :: dev, Handle__ -> HandleType haType :: HandleType,
Handle__ -> IORef (Buffer Word8) haByteBuffer :: !(IORef (Buffer Word8)), Handle__ -> BufferMode haBufferMode :: BufferMode, () haLastDecode :: !(IORef (dec_state, Buffer Word8)),

  Handle__ -> IORef (Buffer CharBufElem)

haCharBuffer :: !(IORef (Buffer CharBufElem)), Handle__ -> IORef (BufferList CharBufElem) haBuffers :: !(IORef (BufferList CharBufElem)),
() haEncoder :: Maybe (TextEncoder enc_state), () haDecoder :: Maybe (TextDecoder dec_state), Handle__ -> Maybe TextEncoding haCodec :: Maybe TextEncoding, Handle__ -> Newline haInputNL :: Newline, Handle__ -> Newline haOutputNL :: Newline, Handle__ -> Maybe (MVar Handle__) haOtherSide :: Maybe (MVar Handle__)

}

data BufferList e = BufferListNil | BufferListCons (RawBuffer e) (BufferList e)

data HandleType = ClosedHandle | SemiClosedHandle | ReadHandle | WriteHandle | AppendHandle | ReadWriteHandle

isReadableHandleType :: HandleType -> Bool isReadableHandleType :: HandleType -> Bool isReadableHandleType HandleType ReadHandle = Bool True isReadableHandleType HandleType ReadWriteHandle = Bool True isReadableHandleType HandleType _ = Bool False

isWritableHandleType :: HandleType -> Bool isWritableHandleType :: HandleType -> Bool isWritableHandleType HandleType AppendHandle = Bool True isWritableHandleType HandleType WriteHandle = Bool True isWritableHandleType HandleType ReadWriteHandle = Bool True isWritableHandleType HandleType _ = Bool False

isReadWriteHandleType :: HandleType -> Bool isReadWriteHandleType :: HandleType -> Bool isReadWriteHandleType ReadWriteHandle{} = Bool True isReadWriteHandleType HandleType _ = Bool False

isAppendHandleType :: HandleType -> Bool isAppendHandleType :: HandleType -> Bool isAppendHandleType HandleType AppendHandle = Bool True isAppendHandleType HandleType _ = Bool False

checkHandleInvariants :: Handle__ -> IO () #if defined(DEBUG) checkHandleInvariants h_ = do bbuf <- readIORef (haByteBuffer h_) checkBuffer bbuf cbuf <- readIORef (haCharBuffer h_) checkBuffer cbuf when (isWriteBuffer cbuf && not (isEmptyBuffer cbuf)) $ errorWithoutStackTrace ("checkHandleInvariants: char write buffer non-empty: " ++ summaryBuffer bbuf ++ ", " ++ summaryBuffer cbuf) when (isWriteBuffer bbuf /= isWriteBuffer cbuf) $ errorWithoutStackTrace ("checkHandleInvariants: buffer modes differ: " ++ summaryBuffer bbuf ++ ", " ++ summaryBuffer cbuf)

#else checkHandleInvariants :: Handle__ -> IO () checkHandleInvariants Handle__ _ = () -> IO () forall (m :: * -> *) a. Monad m => a -> m a return () #endif

data BufferMode = NoBuffering
| LineBuffering

| BlockBuffering (Maybe Int)

deriving ( BufferMode -> BufferMode -> Bool (BufferMode -> BufferMode -> Bool) -> (BufferMode -> BufferMode -> Bool) -> Eq BufferMode forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: BufferMode -> BufferMode -> Bool $c/= :: BufferMode -> BufferMode -> Bool == :: BufferMode -> BufferMode -> Bool $c== :: BufferMode -> BufferMode -> Bool Eq
, Eq BufferMode Eq BufferMode -> (BufferMode -> BufferMode -> Ordering) -> (BufferMode -> BufferMode -> Bool) -> (BufferMode -> BufferMode -> Bool) -> (BufferMode -> BufferMode -> Bool) -> (BufferMode -> BufferMode -> Bool) -> (BufferMode -> BufferMode -> BufferMode) -> (BufferMode -> BufferMode -> BufferMode) -> Ord BufferMode BufferMode -> BufferMode -> Bool BufferMode -> BufferMode -> Ordering BufferMode -> BufferMode -> BufferMode forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a min :: BufferMode -> BufferMode -> BufferMode $cmin :: BufferMode -> BufferMode -> BufferMode max :: BufferMode -> BufferMode -> BufferMode $cmax :: BufferMode -> BufferMode -> BufferMode

= :: BufferMode -> BufferMode -> Bool $c>= :: BufferMode -> BufferMode -> Bool :: BufferMode -> BufferMode -> Bool $c> :: BufferMode -> BufferMode -> Bool <= :: BufferMode -> BufferMode -> Bool $c<= :: BufferMode -> BufferMode -> Bool < :: BufferMode -> BufferMode -> Bool $c< :: BufferMode -> BufferMode -> Bool compare :: BufferMode -> BufferMode -> Ordering $ccompare :: BufferMode -> BufferMode -> Ordering Ord
, ReadPrec [BufferMode] ReadPrec BufferMode Int -> ReadS BufferMode ReadS [BufferMode] (Int -> ReadS BufferMode) -> ReadS [BufferMode] -> ReadPrec BufferMode -> ReadPrec [BufferMode] -> Read BufferMode forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a readListPrec :: ReadPrec [BufferMode] $creadListPrec :: ReadPrec [BufferMode] readPrec :: ReadPrec BufferMode $creadPrec :: ReadPrec BufferMode readList :: ReadS [BufferMode] $creadList :: ReadS [BufferMode] readsPrec :: Int -> ReadS BufferMode $creadsPrec :: Int -> ReadS BufferMode Read , Int -> BufferMode -> ShowS [BufferMode] -> ShowS BufferMode -> FilePath (Int -> BufferMode -> ShowS) -> (BufferMode -> FilePath) -> ([BufferMode] -> ShowS) -> Show BufferMode forall a. (Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a showList :: [BufferMode] -> ShowS $cshowList :: [BufferMode] -> ShowS show :: BufferMode -> FilePath $cshow :: BufferMode -> FilePath showsPrec :: Int -> BufferMode -> ShowS $cshowsPrec :: Int -> BufferMode -> ShowS Show )

data Newline = LF
| CRLF
deriving ( Newline -> Newline -> Bool (Newline -> Newline -> Bool) -> (Newline -> Newline -> Bool) -> Eq Newline forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Newline -> Newline -> Bool $c/= :: Newline -> Newline -> Bool == :: Newline -> Newline -> Bool $c== :: Newline -> Newline -> Bool Eq
, Eq Newline Eq Newline -> (Newline -> Newline -> Ordering) -> (Newline -> Newline -> Bool) -> (Newline -> Newline -> Bool) -> (Newline -> Newline -> Bool) -> (Newline -> Newline -> Bool) -> (Newline -> Newline -> Newline) -> (Newline -> Newline -> Newline) -> Ord Newline Newline -> Newline -> Bool Newline -> Newline -> Ordering Newline -> Newline -> Newline forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a min :: Newline -> Newline -> Newline $cmin :: Newline -> Newline -> Newline max :: Newline -> Newline -> Newline $cmax :: Newline -> Newline -> Newline

= :: Newline -> Newline -> Bool $c>= :: Newline -> Newline -> Bool :: Newline -> Newline -> Bool $c> :: Newline -> Newline -> Bool <= :: Newline -> Newline -> Bool $c<= :: Newline -> Newline -> Bool < :: Newline -> Newline -> Bool $c< :: Newline -> Newline -> Bool compare :: Newline -> Newline -> Ordering $ccompare :: Newline -> Newline -> Ordering Ord
, ReadPrec [Newline] ReadPrec Newline Int -> ReadS Newline ReadS [Newline] (Int -> ReadS Newline) -> ReadS [Newline] -> ReadPrec Newline -> ReadPrec [Newline] -> Read Newline forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a readListPrec :: ReadPrec [Newline] $creadListPrec :: ReadPrec [Newline] readPrec :: ReadPrec Newline $creadPrec :: ReadPrec Newline readList :: ReadS [Newline] $creadList :: ReadS [Newline] readsPrec :: Int -> ReadS Newline $creadsPrec :: Int -> ReadS Newline Read , Int -> Newline -> ShowS [Newline] -> ShowS Newline -> FilePath (Int -> Newline -> ShowS) -> (Newline -> FilePath) -> ([Newline] -> ShowS) -> Show Newline forall a. (Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a showList :: [Newline] -> ShowS $cshowList :: [Newline] -> ShowS show :: Newline -> FilePath $cshow :: Newline -> FilePath showsPrec :: Int -> Newline -> ShowS $cshowsPrec :: Int -> Newline -> ShowS Show )

data NewlineMode = NewlineMode { NewlineMode -> Newline inputNL :: Newline,

              NewlineMode -> Newline

outputNL :: Newline

             }
         deriving ( NewlineMode -> NewlineMode -> Bool

(NewlineMode -> NewlineMode -> Bool) -> (NewlineMode -> NewlineMode -> Bool) -> Eq NewlineMode forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: NewlineMode -> NewlineMode -> Bool $c/= :: NewlineMode -> NewlineMode -> Bool == :: NewlineMode -> NewlineMode -> Bool $c== :: NewlineMode -> NewlineMode -> Bool Eq
, Eq NewlineMode Eq NewlineMode -> (NewlineMode -> NewlineMode -> Ordering) -> (NewlineMode -> NewlineMode -> Bool) -> (NewlineMode -> NewlineMode -> Bool) -> (NewlineMode -> NewlineMode -> Bool) -> (NewlineMode -> NewlineMode -> Bool) -> (NewlineMode -> NewlineMode -> NewlineMode) -> (NewlineMode -> NewlineMode -> NewlineMode) -> Ord NewlineMode NewlineMode -> NewlineMode -> Bool NewlineMode -> NewlineMode -> Ordering NewlineMode -> NewlineMode -> NewlineMode forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a min :: NewlineMode -> NewlineMode -> NewlineMode $cmin :: NewlineMode -> NewlineMode -> NewlineMode max :: NewlineMode -> NewlineMode -> NewlineMode $cmax :: NewlineMode -> NewlineMode -> NewlineMode

= :: NewlineMode -> NewlineMode -> Bool $c>= :: NewlineMode -> NewlineMode -> Bool :: NewlineMode -> NewlineMode -> Bool $c> :: NewlineMode -> NewlineMode -> Bool <= :: NewlineMode -> NewlineMode -> Bool $c<= :: NewlineMode -> NewlineMode -> Bool < :: NewlineMode -> NewlineMode -> Bool $c< :: NewlineMode -> NewlineMode -> Bool compare :: NewlineMode -> NewlineMode -> Ordering $ccompare :: NewlineMode -> NewlineMode -> Ordering Ord
, ReadPrec [NewlineMode] ReadPrec NewlineMode Int -> ReadS NewlineMode ReadS [NewlineMode] (Int -> ReadS NewlineMode) -> ReadS [NewlineMode] -> ReadPrec NewlineMode -> ReadPrec [NewlineMode] -> Read NewlineMode forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a readListPrec :: ReadPrec [NewlineMode] $creadListPrec :: ReadPrec [NewlineMode] readPrec :: ReadPrec NewlineMode $creadPrec :: ReadPrec NewlineMode readList :: ReadS [NewlineMode] $creadList :: ReadS [NewlineMode] readsPrec :: Int -> ReadS NewlineMode $creadsPrec :: Int -> ReadS NewlineMode Read , Int -> NewlineMode -> ShowS [NewlineMode] -> ShowS NewlineMode -> FilePath (Int -> NewlineMode -> ShowS) -> (NewlineMode -> FilePath) -> ([NewlineMode] -> ShowS) -> Show NewlineMode forall a. (Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a showList :: [NewlineMode] -> ShowS $cshowList :: [NewlineMode] -> ShowS show :: NewlineMode -> FilePath $cshow :: NewlineMode -> FilePath showsPrec :: Int -> NewlineMode -> ShowS $cshowsPrec :: Int -> NewlineMode -> ShowS Show )

nativeNewline :: Newline #if defined(mingw32_HOST_OS) nativeNewline = CRLF #else nativeNewline :: Newline nativeNewline = Newline LF #endif

universalNewlineMode :: NewlineMode universalNewlineMode :: NewlineMode universalNewlineMode = NewlineMode { inputNL :: Newline inputNL = Newline CRLF, outputNL :: Newline outputNL = Newline nativeNewline }

nativeNewlineMode :: NewlineMode nativeNewlineMode :: NewlineMode nativeNewlineMode = NewlineMode { inputNL :: Newline inputNL = Newline nativeNewline, outputNL :: Newline outputNL = Newline nativeNewline }

noNewlineTranslation :: NewlineMode noNewlineTranslation :: NewlineMode noNewlineTranslation = NewlineMode { inputNL :: Newline inputNL = Newline LF, outputNL :: Newline outputNL = Newline LF }

instance Show HandleType where showsPrec :: Int -> HandleType -> ShowS showsPrec Int _ HandleType t = case HandleType t of HandleType ClosedHandle -> FilePath -> ShowS showString FilePath "closed" HandleType SemiClosedHandle -> FilePath -> ShowS showString FilePath "semi-closed" HandleType ReadHandle -> FilePath -> ShowS showString FilePath "readable" HandleType WriteHandle -> FilePath -> ShowS showString FilePath "writable" HandleType AppendHandle -> FilePath -> ShowS showString FilePath "writable (append)" HandleType ReadWriteHandle -> FilePath -> ShowS showString FilePath "read-writable"

instance Show Handle where showsPrec :: Int -> Handle -> ShowS showsPrec Int _ (FileHandle FilePath file MVar Handle__ ) = FilePath -> ShowS showHandle FilePath file showsPrec Int _ (DuplexHandle FilePath file MVar Handle_ _ MVar Handle__ _) = FilePath -> ShowS showHandle FilePath file

showHandle :: FilePath -> String -> String showHandle :: FilePath -> ShowS showHandle FilePath file = FilePath -> ShowS showString FilePath "{handle: " ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c . FilePath -> ShowS showString FilePath file ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c . FilePath -> ShowS showString FilePath "}"