{-# LANGUAGE NoImplicitPrelude , BangPatterns , TypeApplications , MultiWayIf #-}{-# OPTIONS_GHC -funbox-strict-fields #-}moduleSystem.OsString.Encoding.InternalwhereimportqualifiedSystem.OsString.Data.ByteString.Short asBS8importqualifiedSystem.OsString.Data.ByteString.Short.Word16 asBS16importSystem.OsString.Internal.Exception importGHC.BaseimportGHC.RealimportGHC.Num-- import GHC.IOimportGHC.IO.BufferimportGHC.IO.Encoding.FailureimportGHC.IO.Encoding.TypesimportData.BitsimportControl.Exception(SomeException,try,Exception(displayException),evaluate)importqualifiedGHC.ForeignasGHCimportData.Either(Either)importGHC.IO(unsafePerformIO)importControl.DeepSeq(force,NFData(rnf))importData.Bifunctor(first)importData.Data(Typeable)importGHC.Show(Show(show))importNumeric(showHex)importForeign.C(CStringLen)importData.Char(chr)importForeignimportGHC.IO.Encoding(getFileSystemEncoding,getLocaleEncoding)-- ------------------------------------------------------------------------------- UCS-2 LE--ucs2le ::TextEncodingucs2le :: TextEncoding ucs2le =CodingFailureMode -> TextEncoding mkUcs2le CodingFailureMode ErrorOnCodingFailuremkUcs2le ::CodingFailureMode->TextEncodingmkUcs2le :: CodingFailureMode -> TextEncoding mkUcs2le CodingFailureMode cfm =TextEncoding{textEncodingName :: String textEncodingName=String "UCS-2LE",mkTextDecoder :: IO (TextDecoder ()) mkTextDecoder=CodingFailureMode -> IO (TextDecoder ()) ucs2le_DF CodingFailureMode cfm ,mkTextEncoder :: IO (TextEncoder ()) mkTextEncoder=CodingFailureMode -> IO (TextEncoder ()) ucs2le_EF CodingFailureMode cfm }ucs2le_DF ::CodingFailureMode->IO(TextDecoder())ucs2le_DF :: CodingFailureMode -> IO (TextDecoder ()) ucs2le_DF CodingFailureMode cfm =TextDecoder () -> IO (TextDecoder ()) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(BufferCodec{encode :: CodeBuffer Word8 Char encode=CodeBuffer Word8 Char ucs2le_decode ,recover :: Buffer Word8 -> Buffer Char -> IO (Buffer Word8, Buffer Char) recover=CodingFailureMode -> Buffer Word8 -> Buffer Char -> IO (Buffer Word8, Buffer Char) recoverDecodeCodingFailureMode cfm ,close :: IO () close=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),getState :: IO () getState=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),setState :: () -> IO () setState=IO () -> () -> IO () forall a b. a -> b -> a const(IO () -> () -> IO ()) -> IO () -> () -> IO () forall a b. (a -> b) -> a -> b $() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return()})ucs2le_EF ::CodingFailureMode->IO(TextEncoder())ucs2le_EF :: CodingFailureMode -> IO (TextEncoder ()) ucs2le_EF CodingFailureMode cfm =TextEncoder () -> IO (TextEncoder ()) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(BufferCodec{encode :: CodeBuffer Char Word8 encode=CodeBuffer Char Word8 ucs2le_encode ,recover :: Buffer Char -> Buffer Word8 -> IO (Buffer Char, Buffer Word8) recover=CodingFailureMode -> Buffer Char -> Buffer Word8 -> IO (Buffer Char, Buffer Word8) recoverEncodeCodingFailureMode cfm ,close :: IO () close=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),getState :: IO () getState=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),setState :: () -> IO () setState=IO () -> () -> IO () forall a b. a -> b -> a const(IO () -> () -> IO ()) -> IO () -> () -> IO () forall a b. (a -> b) -> a -> b $() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return()})ucs2le_decode ::DecodeBufferucs2le_decode :: CodeBuffer Word8 Char ucs2le_decode input :: Buffer Word8 input @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Word8 iraw ,bufL :: forall e. Buffer e -> Int bufL=Int ir0 ,bufR :: forall e. Buffer e -> Int bufR=Int iw ,bufSize :: forall e. Buffer e -> Int bufSize=Int _}output :: Buffer Char output @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Char oraw ,bufL :: forall e. Buffer e -> Int bufL=Int _,bufR :: forall e. Buffer e -> Int bufR=Int ow0 ,bufSize :: forall e. Buffer e -> Int bufSize=Int os }=letloop :: Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop !Int ir !Int ow |Int ow Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int os =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress OutputUnderflowInt ir Int ow |Int ir Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int iw =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress InputUnderflowInt ir Int ow |Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int iw =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress InputUnderflowInt ir Int ow |Bool otherwise=doWord8 c0 <-RawBuffer Word8 -> Int -> IO Word8 readWord8BufRawBuffer Word8 iraw Int ir Word8 c1 <-RawBuffer Word8 -> Int -> IO Word8 readWord8BufRawBuffer Word8 iraw (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1)letx1 :: Int x1 =Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralWord8 c1 Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftL`Int 8Int -> Int -> Int forall a. Num a => a -> a -> a +Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralWord8 c0 Int ow' <-RawBuffer Char -> Int -> Char -> IO Int writeCharBufRawBuffer Char oraw Int ow (Int -> Char unsafeChrInt x1 )Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)Int ow' -- lambda-lifted, to avoid thunks being built in the inner-loop:done :: a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done a why !Int ir !Int ow =(a, Buffer Word8, Buffer Char) -> m (a, Buffer Word8, Buffer Char) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a why ,ifInt ir Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int iw thenBuffer Word8 input {bufL :: Int bufL=Int 0,bufR :: Int bufR=Int 0}elseBuffer Word8 input {bufL :: Int bufL=Int ir },Buffer Char output {bufR :: Int bufR=Int ow })inInt -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop Int ir0 Int ow0 ucs2le_encode ::EncodeBufferucs2le_encode :: CodeBuffer Char Word8 ucs2le_encode input :: Buffer Char input @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Char iraw ,bufL :: forall e. Buffer e -> Int bufL=Int ir0 ,bufR :: forall e. Buffer e -> Int bufR=Int iw ,bufSize :: forall e. Buffer e -> Int bufSize=Int _}output :: Buffer Word8 output @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Word8 oraw ,bufL :: forall e. Buffer e -> Int bufL=Int _,bufR :: forall e. Buffer e -> Int bufR=Int ow0 ,bufSize :: forall e. Buffer e -> Int bufSize=Int os }=letdone :: a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done a why !Int ir !Int ow =(a, Buffer Char, Buffer Word8) -> m (a, Buffer Char, Buffer Word8) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a why ,ifInt ir Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int iw thenBuffer Char input {bufL :: Int bufL=Int 0,bufR :: Int bufR=Int 0}elseBuffer Char input {bufL :: Int bufL=Int ir },Buffer Word8 output {bufR :: Int bufR=Int ow })loop :: Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop !Int ir !Int ow |Int ir Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int iw =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done CodingProgress InputUnderflowInt ir Int ow |Int os Int -> Int -> Int forall a. Num a => a -> a -> a -Int ow Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 2=CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done CodingProgress OutputUnderflowInt ir Int ow |Bool otherwise=do(Char c ,Int ir' )<-RawBuffer Char -> Int -> IO (Char, Int) readCharBufRawBuffer Char iraw Int ir caseChar -> Int ordChar c ofInt x |Int x Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 0x10000->doRawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw Int ow (Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegralInt x )RawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1)(Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegral(Int x Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftR`Int 8))Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop Int ir' (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)|Bool otherwise->CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done CodingProgress InvalidSequenceInt ir Int ow inInt -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop Int ir0 Int ow0 -- ------------------------------------------------------------------------------- UTF-16b---- | Mimics the base encoding for filesystem operations. This should be total on all inputs (word16 byte arrays).---- Note that this has a subtle difference to 'encodeWithBaseWindows'/'decodeWithBaseWindows': it doesn't care for-- the @0x0000@ end marker and will as such produce different results. Use @takeWhile (/= '\NUL')@ on the input-- to recover this behavior.utf16le_b ::TextEncodingutf16le_b :: TextEncoding utf16le_b =CodingFailureMode -> TextEncoding mkUTF16le_b CodingFailureMode ErrorOnCodingFailuremkUTF16le_b ::CodingFailureMode->TextEncodingmkUTF16le_b :: CodingFailureMode -> TextEncoding mkUTF16le_b CodingFailureMode cfm =TextEncoding{textEncodingName :: String textEncodingName=String "UTF-16LE_b",mkTextDecoder :: IO (TextDecoder ()) mkTextDecoder=CodingFailureMode -> IO (TextDecoder ()) utf16le_b_DF CodingFailureMode cfm ,mkTextEncoder :: IO (TextEncoder ()) mkTextEncoder=CodingFailureMode -> IO (TextEncoder ()) utf16le_b_EF CodingFailureMode cfm }utf16le_b_DF ::CodingFailureMode->IO(TextDecoder())utf16le_b_DF :: CodingFailureMode -> IO (TextDecoder ()) utf16le_b_DF CodingFailureMode cfm =TextDecoder () -> IO (TextDecoder ()) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(BufferCodec{encode :: CodeBuffer Word8 Char encode=CodeBuffer Word8 Char utf16le_b_decode ,recover :: Buffer Word8 -> Buffer Char -> IO (Buffer Word8, Buffer Char) recover=CodingFailureMode -> Buffer Word8 -> Buffer Char -> IO (Buffer Word8, Buffer Char) recoverDecodeCodingFailureMode cfm ,close :: IO () close=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),getState :: IO () getState=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),setState :: () -> IO () setState=IO () -> () -> IO () forall a b. a -> b -> a const(IO () -> () -> IO ()) -> IO () -> () -> IO () forall a b. (a -> b) -> a -> b $() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return()})utf16le_b_EF ::CodingFailureMode->IO(TextEncoder())utf16le_b_EF :: CodingFailureMode -> IO (TextEncoder ()) utf16le_b_EF CodingFailureMode cfm =TextEncoder () -> IO (TextEncoder ()) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(BufferCodec{encode :: CodeBuffer Char Word8 encode=CodeBuffer Char Word8 utf16le_b_encode ,recover :: Buffer Char -> Buffer Word8 -> IO (Buffer Char, Buffer Word8) recover=CodingFailureMode -> Buffer Char -> Buffer Word8 -> IO (Buffer Char, Buffer Word8) recoverEncodeCodingFailureMode cfm ,close :: IO () close=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),getState :: IO () getState=() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return(),setState :: () -> IO () setState=IO () -> () -> IO () forall a b. a -> b -> a const(IO () -> () -> IO ()) -> IO () -> () -> IO () forall a b. (a -> b) -> a -> b $() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return()})utf16le_b_decode ::DecodeBufferutf16le_b_decode :: CodeBuffer Word8 Char utf16le_b_decode input :: Buffer Word8 input @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Word8 iraw ,bufL :: forall e. Buffer e -> Int bufL=Int ir0 ,bufR :: forall e. Buffer e -> Int bufR=Int iw ,bufSize :: forall e. Buffer e -> Int bufSize=Int _}output :: Buffer Char output @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Char oraw ,bufL :: forall e. Buffer e -> Int bufL=Int _,bufR :: forall e. Buffer e -> Int bufR=Int ow0 ,bufSize :: forall e. Buffer e -> Int bufSize=Int os }=letloop :: Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop !Int ir !Int ow |Int ow Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int os =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress OutputUnderflowInt ir Int ow |Int ir Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int iw =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress InputUnderflowInt ir Int ow |Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int iw =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress InputUnderflowInt ir Int ow |Bool otherwise=doWord8 c0 <-RawBuffer Word8 -> Int -> IO Word8 readWord8BufRawBuffer Word8 iraw Int ir Word8 c1 <-RawBuffer Word8 -> Int -> IO Word8 readWord8BufRawBuffer Word8 iraw (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1)letx1 :: Int x1 =Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralWord8 c1 Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftL`Int 8Int -> Int -> Int forall a. Num a => a -> a -> a +Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralWord8 c0 if|Int iw Int -> Int -> Int forall a. Num a => a -> a -> a -Int ir Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int 4->doWord8 c2 <-RawBuffer Word8 -> Int -> IO Word8 readWord8BufRawBuffer Word8 iraw (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)Word8 c3 <-RawBuffer Word8 -> Int -> IO Word8 readWord8BufRawBuffer Word8 iraw (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 3)letx2 :: Int x2 =Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralWord8 c3 Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftL`Int 8Int -> Int -> Int forall a. Num a => a -> a -> a +Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralWord8 c2 if|Int 0xd800Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int x1 Bool -> Bool -> Bool &&Int x1 Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int 0xdbff,Int 0xdc00Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int x2 Bool -> Bool -> Bool &&Int x2 Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int 0xdfff->doInt ow' <-RawBuffer Char -> Int -> Char -> IO Int writeCharBufRawBuffer Char oraw Int ow (Int -> Char unsafeChr((Int x1 Int -> Int -> Int forall a. Num a => a -> a -> a -Int 0xd800)Int -> Int -> Int forall a. Num a => a -> a -> a *Int 0x400Int -> Int -> Int forall a. Num a => a -> a -> a +(Int x2 Int -> Int -> Int forall a. Num a => a -> a -> a -Int 0xdc00)Int -> Int -> Int forall a. Num a => a -> a -> a +Int 0x10000))Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 4)Int ow' |Bool otherwise->doInt ow' <-RawBuffer Char -> Int -> Char -> IO Int writeCharBufRawBuffer Char oraw Int ow (Int -> Char unsafeChrInt x1 )Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)Int ow' |Int iw Int -> Int -> Int forall a. Num a => a -> a -> a -Int ir Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int 2->doInt ow' <-RawBuffer Char -> Int -> Char -> IO Int writeCharBufRawBuffer Char oraw Int ow (Int -> Char unsafeChrInt x1 )Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop (Int ir Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)Int ow' |Bool otherwise->CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done CodingProgress InputUnderflowInt ir Int ow -- lambda-lifted, to avoid thunks being built in the inner-loop:done :: a -> Int -> Int -> m (a, Buffer Word8, Buffer Char) done a why !Int ir !Int ow =(a, Buffer Word8, Buffer Char) -> m (a, Buffer Word8, Buffer Char) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a why ,ifInt ir Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int iw thenBuffer Word8 input {bufL :: Int bufL=Int 0,bufR :: Int bufR=Int 0}elseBuffer Word8 input {bufL :: Int bufL=Int ir },Buffer Char output {bufR :: Int bufR=Int ow })inInt -> Int -> IO (CodingProgress, Buffer Word8, Buffer Char) loop Int ir0 Int ow0 utf16le_b_encode ::EncodeBufferutf16le_b_encode :: CodeBuffer Char Word8 utf16le_b_encode input :: Buffer Char input @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Char iraw ,bufL :: forall e. Buffer e -> Int bufL=Int ir0 ,bufR :: forall e. Buffer e -> Int bufR=Int iw ,bufSize :: forall e. Buffer e -> Int bufSize=Int _}output :: Buffer Word8 output @Buffer{bufRaw :: forall e. Buffer e -> RawBuffer e bufRaw=RawBuffer Word8 oraw ,bufL :: forall e. Buffer e -> Int bufL=Int _,bufR :: forall e. Buffer e -> Int bufR=Int ow0 ,bufSize :: forall e. Buffer e -> Int bufSize=Int os }=letdone :: a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done a why !Int ir !Int ow =(a, Buffer Char, Buffer Word8) -> m (a, Buffer Char, Buffer Word8) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a why ,ifInt ir Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int iw thenBuffer Char input {bufL :: Int bufL=Int 0,bufR :: Int bufR=Int 0}elseBuffer Char input {bufL :: Int bufL=Int ir },Buffer Word8 output {bufR :: Int bufR=Int ow })loop :: Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop !Int ir !Int ow |Int ir Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int iw =CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done CodingProgress InputUnderflowInt ir Int ow |Int os Int -> Int -> Int forall a. Num a => a -> a -> a -Int ow Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 2=CodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done CodingProgress OutputUnderflowInt ir Int ow |Bool otherwise=do(Char c ,Int ir' )<-RawBuffer Char -> Int -> IO (Char, Int) readCharBufRawBuffer Char iraw Int ir caseChar -> Int ordChar c ofInt x |Int x Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 0x10000->doRawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw Int ow (Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegralInt x )RawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1)(Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegral(Int x Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftR`Int 8))Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop Int ir' (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)|Bool otherwise->ifInt os Int -> Int -> Int forall a. Num a => a -> a -> a -Int ow Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 4thenCodingProgress -> Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) forall {m :: * -> *} {a}. Monad m => a -> Int -> Int -> m (a, Buffer Char, Buffer Word8) done CodingProgress OutputUnderflowInt ir Int ow elsedoletx' :: Int x' =Int x Int -> Int -> Int forall a. Num a => a -> a -> a -Int 0x10000w1 :: Int w1 =Int x' Int -> Int -> Int forall a. Integral a => a -> a -> a `div`Int 0x400Int -> Int -> Int forall a. Num a => a -> a -> a +Int 0xd800w2 :: Int w2 =Int x' Int -> Int -> Int forall a. Integral a => a -> a -> a `mod`Int 0x400Int -> Int -> Int forall a. Num a => a -> a -> a +Int 0xdc00RawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw Int ow (Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegralInt w1 )RawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 1)(Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegral(Int w1 Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftR`Int 8))RawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 2)(Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegralInt w2 )RawBuffer Word8 -> Int -> Word8 -> IO () writeWord8BufRawBuffer Word8 oraw (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 3)(Int -> Word8 forall a b. (Integral a, Num b) => a -> b fromIntegral(Int w2 Int -> Int -> Int forall a. Bits a => a -> Int -> a `shiftR`Int 8))Int -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop Int ir' (Int ow Int -> Int -> Int forall a. Num a => a -> a -> a +Int 4)inInt -> Int -> IO (CodingProgress, Buffer Char, Buffer Word8) loop Int ir0 Int ow0 -- ------------------------------------------------------------------------------- Windows encoding (ripped off from base)--cWcharsToChars_UCS2 ::[Word16]->[Char]cWcharsToChars_UCS2 :: [Word16] -> String cWcharsToChars_UCS2 =(Word16 -> Char) -> [Word16] -> String forall a b. (a -> b) -> [a] -> [b] map(Int -> Char chr(Int -> Char) -> (Word16 -> Int) -> Word16 -> Char forall b c a. (b -> c) -> (a -> b) -> a -> c .Word16 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral)-- On Windows, wchar_t is 16 bits wide and CWString uses the UTF-16 encoding.-- coding errors generate Chars in the surrogate rangecWcharsToChars ::[Word16]->[Char]cWcharsToChars :: [Word16] -> String cWcharsToChars =(Int -> Char) -> [Int] -> String forall a b. (a -> b) -> [a] -> [b] mapInt -> Char chr([Int] -> String) -> ([Word16] -> [Int]) -> [Word16] -> String forall b c a. (b -> c) -> (a -> b) -> a -> c .[Int] -> [Int] fromUTF16 ([Int] -> [Int]) -> ([Word16] -> [Int]) -> [Word16] -> [Int] forall b c a. (b -> c) -> (a -> b) -> a -> c .(Word16 -> Int) -> [Word16] -> [Int] forall a b. (a -> b) -> [a] -> [b] mapWord16 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralwherefromUTF16 ::[Int]->[Int]fromUTF16 :: [Int] -> [Int] fromUTF16 (Int c1 :Int c2 :[Int] wcs )|Int 0xd800Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int c1 Bool -> Bool -> Bool &&Int c1 Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int 0xdbffBool -> Bool -> Bool &&Int 0xdc00Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int c2 Bool -> Bool -> Bool &&Int c2 Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <=Int 0xdfff=((Int c1 Int -> Int -> Int forall a. Num a => a -> a -> a -Int 0xd800)Int -> Int -> Int forall a. Num a => a -> a -> a *Int 0x400Int -> Int -> Int forall a. Num a => a -> a -> a +(Int c2 Int -> Int -> Int forall a. Num a => a -> a -> a -Int 0xdc00)Int -> Int -> Int forall a. Num a => a -> a -> a +Int 0x10000)Int -> [Int] -> [Int] forall a. a -> [a] -> [a] :[Int] -> [Int] fromUTF16 [Int] wcs fromUTF16 (Int c :[Int] wcs )=Int c Int -> [Int] -> [Int] forall a. a -> [a] -> [a] :[Int] -> [Int] fromUTF16 [Int] wcs fromUTF16 []=[]charsToCWchars ::[Char]->[Word16]charsToCWchars :: String -> [Word16] charsToCWchars =(Char -> [Word16] -> [Word16]) -> [Word16] -> String -> [Word16] forall a b. (a -> b -> b) -> b -> [a] -> b foldr(Int -> [Word16] -> [Word16] utf16Char (Int -> [Word16] -> [Word16]) -> (Char -> Int) -> Char -> [Word16] -> [Word16] forall b c a. (b -> c) -> (a -> b) -> a -> c .Char -> Int ord)[]whereutf16Char ::Int->[Word16]->[Word16]utf16Char :: Int -> [Word16] -> [Word16] utf16Char Int c [Word16] wcs |Int c Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 0x10000=Int -> Word16 forall a b. (Integral a, Num b) => a -> b fromIntegralInt c Word16 -> [Word16] -> [Word16] forall a. a -> [a] -> [a] :[Word16] wcs |Bool otherwise=letc' :: Int c' =Int c Int -> Int -> Int forall a. Num a => a -> a -> a -Int 0x10000inInt -> Word16 forall a b. (Integral a, Num b) => a -> b fromIntegral(Int c' Int -> Int -> Int forall a. Integral a => a -> a -> a `div`Int 0x400Int -> Int -> Int forall a. Num a => a -> a -> a +Int 0xd800)Word16 -> [Word16] -> [Word16] forall a. a -> [a] -> [a] :Int -> Word16 forall a b. (Integral a, Num b) => a -> b fromIntegral(Int c' Int -> Int -> Int forall a. Integral a => a -> a -> a `mod`Int 0x400Int -> Int -> Int forall a. Num a => a -> a -> a +Int 0xdc00)Word16 -> [Word16] -> [Word16] forall a. a -> [a] -> [a] :[Word16] wcs -- ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- FFI--withWindowsString ::String->(Int->PtrWord16->IOa )->IOa withWindowsString :: forall a. String -> (Int -> Ptr Word16 -> IO a) -> IO a withWindowsString =[Word16] -> (Int -> Ptr Word16 -> IO a) -> IO a forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen([Word16] -> (Int -> Ptr Word16 -> IO a) -> IO a) -> (String -> [Word16]) -> String -> (Int -> Ptr Word16 -> IO a) -> IO a forall b c a. (b -> c) -> (a -> b) -> a -> c .String -> [Word16] charsToCWchars peekWindowsString ::(PtrWord16,Int)->IOStringpeekWindowsString :: (Ptr Word16, Int) -> IO String peekWindowsString (Ptr Word16 cp ,Int l )=do[Word16] cs <-Int -> Ptr Word16 -> IO [Word16] forall a. Storable a => Int -> Ptr a -> IO [a] peekArrayInt l Ptr Word16 cp String -> IO String forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return([Word16] -> String cWcharsToChars [Word16] cs )withPosixString ::String->(CStringLen->IOa )->IOa withPosixString :: forall a. String -> (CStringLen -> IO a) -> IO a withPosixString String fp CStringLen -> IO a f =IO TextEncoding getFileSystemEncodingIO TextEncoding -> (TextEncoding -> IO a) -> IO a forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=\TextEncoding enc ->TextEncoding -> String -> (CStringLen -> IO a) -> IO a forall a. TextEncoding -> String -> (CStringLen -> IO a) -> IO a GHC.withCStringLenTextEncoding enc String fp CStringLen -> IO a f withPosixString' ::String->(CStringLen->IOa )->IOa withPosixString' :: forall a. String -> (CStringLen -> IO a) -> IO a withPosixString' String fp CStringLen -> IO a f =IO TextEncoding getLocaleEncodingIO TextEncoding -> (TextEncoding -> IO a) -> IO a forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=\TextEncoding enc ->TextEncoding -> String -> (CStringLen -> IO a) -> IO a forall a. TextEncoding -> String -> (CStringLen -> IO a) -> IO a GHC.withCStringLenTextEncoding enc String fp CStringLen -> IO a f peekPosixString ::CStringLen->IOStringpeekPosixString :: CStringLen -> IO String peekPosixString CStringLen fp =IO TextEncoding getFileSystemEncodingIO TextEncoding -> (TextEncoding -> IO String) -> IO String forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=\TextEncoding enc ->TextEncoding -> CStringLen -> IO String GHC.peekCStringLenTextEncoding enc CStringLen fp peekPosixString' ::CStringLen->IOStringpeekPosixString' :: CStringLen -> IO String peekPosixString' CStringLen fp =IO TextEncoding getLocaleEncodingIO TextEncoding -> (TextEncoding -> IO String) -> IO String forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=\TextEncoding enc ->TextEncoding -> CStringLen -> IO String GHC.peekCStringLenTextEncoding enc CStringLen fp -- | Decode with the given 'TextEncoding'.decodeWithTE ::TextEncoding->BS8.ShortByteString->EitherEncodingException StringdecodeWithTE :: TextEncoding -> ShortByteString -> Either EncodingException String decodeWithTE TextEncoding enc ShortByteString ba =IO (Either EncodingException String) -> Either EncodingException String forall a. IO a -> a unsafePerformIO(IO (Either EncodingException String) -> Either EncodingException String) -> IO (Either EncodingException String) -> Either EncodingException String forall a b. (a -> b) -> a -> b $doEither SomeException String r <-forall e a. Exception e => IO a -> IO (Either e a) trySafe @SomeException(IO String -> IO (Either SomeException String)) -> IO String -> IO (Either SomeException String) forall a b. (a -> b) -> a -> b $ShortByteString -> (CStringLen -> IO String) -> IO String forall a. ShortByteString -> (CStringLen -> IO a) -> IO a BS8.useAsCStringLenShortByteString ba ((CStringLen -> IO String) -> IO String) -> (CStringLen -> IO String) -> IO String forall a b. (a -> b) -> a -> b $\CStringLen fp ->TextEncoding -> CStringLen -> IO String GHC.peekCStringLenTextEncoding enc CStringLen fp Either EncodingException String -> IO (Either EncodingException String) forall a. a -> IO a evaluate(Either EncodingException String -> IO (Either EncodingException String)) -> Either EncodingException String -> IO (Either EncodingException String) forall a b. (a -> b) -> a -> b $Either EncodingException String -> Either EncodingException String forall a. NFData a => a -> a force(Either EncodingException String -> Either EncodingException String) -> Either EncodingException String -> Either EncodingException String forall a b. (a -> b) -> a -> b $(SomeException -> EncodingException) -> Either SomeException String -> Either EncodingException String forall a b c. (a -> b) -> Either a c -> Either b c forall (p :: * -> * -> *) a b c. Bifunctor p => (a -> b) -> p a c -> p b c first((String -> Maybe Word8 -> EncodingException) -> Maybe Word8 -> String -> EncodingException forall a b c. (a -> b -> c) -> b -> a -> c flipString -> Maybe Word8 -> EncodingException EncodingError Maybe Word8 forall a. Maybe a Nothing(String -> EncodingException) -> (SomeException -> String) -> SomeException -> EncodingException forall b c a. (b -> c) -> (a -> b) -> a -> c .SomeException -> String forall e. Exception e => e -> String displayException)Either SomeException String r -- | Encode with the given 'TextEncoding'.encodeWithTE ::TextEncoding->String->EitherEncodingException BS8.ShortByteStringencodeWithTE :: TextEncoding -> String -> Either EncodingException ShortByteString encodeWithTE TextEncoding enc String str =IO (Either EncodingException ShortByteString) -> Either EncodingException ShortByteString forall a. IO a -> a unsafePerformIO(IO (Either EncodingException ShortByteString) -> Either EncodingException ShortByteString) -> IO (Either EncodingException ShortByteString) -> Either EncodingException ShortByteString forall a b. (a -> b) -> a -> b $doEither SomeException ShortByteString r <-forall e a. Exception e => IO a -> IO (Either e a) trySafe @SomeException(IO ShortByteString -> IO (Either SomeException ShortByteString)) -> IO ShortByteString -> IO (Either SomeException ShortByteString) forall a b. (a -> b) -> a -> b $TextEncoding -> String -> (CStringLen -> IO ShortByteString) -> IO ShortByteString forall a. TextEncoding -> String -> (CStringLen -> IO a) -> IO a GHC.withCStringLenTextEncoding enc String str ((CStringLen -> IO ShortByteString) -> IO ShortByteString) -> (CStringLen -> IO ShortByteString) -> IO ShortByteString forall a b. (a -> b) -> a -> b $\CStringLen cstr ->CStringLen -> IO ShortByteString BS8.packCStringLenCStringLen cstr Either EncodingException ShortByteString -> IO (Either EncodingException ShortByteString) forall a. a -> IO a evaluate(Either EncodingException ShortByteString -> IO (Either EncodingException ShortByteString)) -> Either EncodingException ShortByteString -> IO (Either EncodingException ShortByteString) forall a b. (a -> b) -> a -> b $Either EncodingException ShortByteString -> Either EncodingException ShortByteString forall a. NFData a => a -> a force(Either EncodingException ShortByteString -> Either EncodingException ShortByteString) -> Either EncodingException ShortByteString -> Either EncodingException ShortByteString forall a b. (a -> b) -> a -> b $(SomeException -> EncodingException) -> Either SomeException ShortByteString -> Either EncodingException ShortByteString forall a b c. (a -> b) -> Either a c -> Either b c forall (p :: * -> * -> *) a b c. Bifunctor p => (a -> b) -> p a c -> p b c first((String -> Maybe Word8 -> EncodingException) -> Maybe Word8 -> String -> EncodingException forall a b c. (a -> b -> c) -> b -> a -> c flipString -> Maybe Word8 -> EncodingException EncodingError Maybe Word8 forall a. Maybe a Nothing(String -> EncodingException) -> (SomeException -> String) -> SomeException -> EncodingException forall b c a. (b -> c) -> (a -> b) -> a -> c .SomeException -> String forall e. Exception e => e -> String displayException)Either SomeException ShortByteString r -- ------------------------------------------------------------------------------- Encoders / decoders---- | This mimics the filepath decoder base uses on unix (using PEP-383),-- with the small distinction that we're not truncating at NUL bytes (because we're not at-- the outer FFI layer).decodeWithBasePosix ::BS8.ShortByteString->IOStringdecodeWithBasePosix :: ShortByteString -> IO String decodeWithBasePosix ShortByteString ba =ShortByteString -> (CStringLen -> IO String) -> IO String forall a. ShortByteString -> (CStringLen -> IO a) -> IO a BS8.useAsCStringLenShortByteString ba ((CStringLen -> IO String) -> IO String) -> (CStringLen -> IO String) -> IO String forall a b. (a -> b) -> a -> b $\CStringLen fp ->CStringLen -> IO String peekPosixString CStringLen fp -- | This mimics the string decoder base uses on unix,-- with the small distinction that we're not truncating at NUL bytes (because we're not at-- the outer FFI layer).decodeWithBasePosix' ::BS8.ShortByteString->IOStringdecodeWithBasePosix' :: ShortByteString -> IO String decodeWithBasePosix' ShortByteString ba =ShortByteString -> (CStringLen -> IO String) -> IO String forall a. ShortByteString -> (CStringLen -> IO a) -> IO a BS8.useAsCStringLenShortByteString ba ((CStringLen -> IO String) -> IO String) -> (CStringLen -> IO String) -> IO String forall a b. (a -> b) -> a -> b $\CStringLen fp ->CStringLen -> IO String peekPosixString' CStringLen fp -- | This mimics the filepath encoder base uses on unix (using PEP-383),-- with the small distinction that we're not truncating at NUL bytes (because we're not at-- the outer FFI layer).encodeWithBasePosix ::String->IOBS8.ShortByteStringencodeWithBasePosix :: String -> IO ShortByteString encodeWithBasePosix String str =String -> (CStringLen -> IO ShortByteString) -> IO ShortByteString forall a. String -> (CStringLen -> IO a) -> IO a withPosixString String str ((CStringLen -> IO ShortByteString) -> IO ShortByteString) -> (CStringLen -> IO ShortByteString) -> IO ShortByteString forall a b. (a -> b) -> a -> b $\CStringLen cstr ->CStringLen -> IO ShortByteString BS8.packCStringLenCStringLen cstr -- | This mimics the string encoder base uses on unix,-- with the small distinction that we're not truncating at NUL bytes (because we're not at-- the outer FFI layer).encodeWithBasePosix' ::String->IOBS8.ShortByteStringencodeWithBasePosix' :: String -> IO ShortByteString encodeWithBasePosix' String str =String -> (CStringLen -> IO ShortByteString) -> IO ShortByteString forall a. String -> (CStringLen -> IO a) -> IO a withPosixString' String str ((CStringLen -> IO ShortByteString) -> IO ShortByteString) -> (CStringLen -> IO ShortByteString) -> IO ShortByteString forall a b. (a -> b) -> a -> b $\CStringLen cstr ->CStringLen -> IO ShortByteString BS8.packCStringLenCStringLen cstr -- | This mimics the filepath decoder base uses on windows,-- with the small distinction that we're not truncating at NUL bytes (because we're not at-- the outer FFI layer).decodeWithBaseWindows ::BS16.ShortByteString->IOStringdecodeWithBaseWindows :: ShortByteString -> IO String decodeWithBaseWindows ShortByteString ba =ShortByteString -> ((Ptr Word16, Int) -> IO String) -> IO String forall a. ShortByteString -> ((Ptr Word16, Int) -> IO a) -> IO a BS16.useAsCWStringLen ShortByteString ba (((Ptr Word16, Int) -> IO String) -> IO String) -> ((Ptr Word16, Int) -> IO String) -> IO String forall a b. (a -> b) -> a -> b $\(Ptr Word16, Int) fp ->(Ptr Word16, Int) -> IO String peekWindowsString (Ptr Word16, Int) fp -- | This mimics the filepath dencoder base uses on windows,-- with the small distinction that we're not truncating at NUL bytes (because we're not at-- the outer FFI layer).encodeWithBaseWindows ::String->IOBS16.ShortByteStringencodeWithBaseWindows :: String -> IO ShortByteString encodeWithBaseWindows String str =String -> (Int -> Ptr Word16 -> IO ShortByteString) -> IO ShortByteString forall a. String -> (Int -> Ptr Word16 -> IO a) -> IO a withWindowsString String str ((Int -> Ptr Word16 -> IO ShortByteString) -> IO ShortByteString) -> (Int -> Ptr Word16 -> IO ShortByteString) -> IO ShortByteString forall a b. (a -> b) -> a -> b $\Int l Ptr Word16 cstr ->(Ptr Word16, Int) -> IO ShortByteString BS16.packCWStringLen (Ptr Word16 cstr ,Int l )-- ------------------------------------------------------------------------------- Types--dataEncodingException =EncodingError String(MaybeWord8)-- ^ Could not decode a byte sequence because it was invalid under-- the given encoding, or ran out of input in mid-decode.deriving(EncodingException -> EncodingException -> Bool (EncodingException -> EncodingException -> Bool) -> (EncodingException -> EncodingException -> Bool) -> Eq EncodingException forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: EncodingException -> EncodingException -> Bool == :: EncodingException -> EncodingException -> Bool $c/= :: EncodingException -> EncodingException -> Bool /= :: EncodingException -> EncodingException -> Bool Eq,Typeable)showEncodingException ::EncodingException ->StringshowEncodingException :: EncodingException -> String showEncodingException (EncodingError String desc (JustWord8 w ))=String "Cannot decode byte '\\x"String -> String -> String forall a. [a] -> [a] -> [a] ++Word8 -> String -> String forall a. Integral a => a -> String -> String showHexWord8 w (String "': "String -> String -> String forall a. [a] -> [a] -> [a] ++String desc )showEncodingException (EncodingError String desc Maybe Word8 Nothing)=String "Cannot decode input: "String -> String -> String forall a. [a] -> [a] -> [a] ++String desc instanceShowEncodingException whereshow :: EncodingException -> String show=EncodingException -> String showEncodingException instanceExceptionEncodingException instanceNFDataEncodingException wherernf :: EncodingException -> () rnf(EncodingError String desc Maybe Word8 w )=String -> () forall a. NFData a => a -> () rnfString desc () -> () -> () forall a b. a -> b -> b `seq`Maybe Word8 -> () forall a. NFData a => a -> () rnfMaybe Word8 w -- ------------------------------------------------------------------------------- Words--wNUL ::Word16wNUL :: Word16 wNUL =Word16 0x00