X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIO%2FEncoding%2FUTF16.hs;h=c3b384752e6c06f054f0210a3fbc588322d8a74d;hb=41e8fba828acbae1751628af50849f5352b27873;hp=a5a6b622af6fbc94599e90137521d79b6e4f6241;hpb=ccc931d0905f6e0d55cb90b045881d4515112411;p=ghc-base.git diff --git a/GHC/IO/Encoding/UTF16.hs b/GHC/IO/Encoding/UTF16.hs index a5a6b62..c3b3847 100644 --- a/GHC/IO/Encoding/UTF16.hs +++ b/GHC/IO/Encoding/UTF16.hs @@ -1,5 +1,11 @@ -{-# OPTIONS_GHC -fno-implicit-prelude -funbox-strict-fields #-} -{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE CPP + , NoImplicitPrelude + , BangPatterns + , NondecreasingIndentation + , MagicHash + #-} +{-# OPTIONS_GHC -funbox-strict-fields #-} + ----------------------------------------------------------------------------- -- | -- Module : GHC.IO.Encoding.UTF16 @@ -35,7 +41,7 @@ module GHC.IO.Encoding.UTF16 ( import GHC.Base import GHC.Real import GHC.Num -import GHC.IO +-- import GHC.IO import GHC.IO.Exception import GHC.IO.Buffer import GHC.IO.Encoding.Types @@ -48,10 +54,11 @@ import GHC.IORef import System.Posix.Internals import Foreign.C import GHC.Show +import GHC.Ptr puts :: String -> IO () puts s = do withCStringLen (s++"\n") $ \(p,len) -> - c_write 1 p (fromIntegral len) + c_write 1 (castPtr p) (fromIntegral len) return () #endif @@ -59,7 +66,8 @@ puts s = do withCStringLen (s++"\n") $ \(p,len) -> -- The UTF-16 codec: either UTF16BE or UTF16LE with a BOM utf16 :: TextEncoding -utf16 = TextEncoding { mkTextDecoder = utf16_DF, +utf16 = TextEncoding { textEncodingName = "UTF-16", + mkTextDecoder = utf16_DF, mkTextEncoder = utf16_EF } utf16_DF :: IO (TextDecoder (Maybe DecodeBuffer)) @@ -138,7 +146,8 @@ bom2 = bomL -- UTF16LE and UTF16BE utf16be :: TextEncoding -utf16be = TextEncoding { mkTextDecoder = utf16be_DF, +utf16be = TextEncoding { textEncodingName = "UTF-16BE", + mkTextDecoder = utf16be_DF, mkTextEncoder = utf16be_EF } utf16be_DF :: IO (TextDecoder ()) @@ -160,7 +169,8 @@ utf16be_EF = }) utf16le :: TextEncoding -utf16le = TextEncoding { mkTextDecoder = utf16le_DF, +utf16le = TextEncoding { textEncodingName = "UTF16-LE", + mkTextDecoder = utf16le_DF, mkTextEncoder = utf16le_EF } utf16le_DF :: IO (TextDecoder ()) @@ -195,15 +205,15 @@ utf16be_decode c1 <- readWord8Buf iraw (ir+1) let x1 = fromIntegral c0 `shiftL` 8 + fromIntegral c1 if validate1 x1 - then do writeCharBuf oraw ow (unsafeChr (fromIntegral x1)) - loop (ir+2) (ow+1) + then do ow' <- writeCharBuf oraw ow (unsafeChr (fromIntegral x1)) + loop (ir+2) ow' else if iw - ir < 4 then done ir ow else do c2 <- readWord8Buf iraw (ir+2) c3 <- readWord8Buf iraw (ir+3) let x2 = fromIntegral c2 `shiftL` 8 + fromIntegral c3 if not (validate2 x1 x2) then invalid else do - writeCharBuf oraw ow (chr2 x1 x2) - loop (ir+4) (ow+1) + ow' <- writeCharBuf oraw ow (chr2 x1 x2) + loop (ir+4) ow' where invalid = if ir > ir0 then done ir ow else ioe_decodingError @@ -227,15 +237,15 @@ utf16le_decode c1 <- readWord8Buf iraw (ir+1) let x1 = fromIntegral c1 `shiftL` 8 + fromIntegral c0 if validate1 x1 - then do writeCharBuf oraw ow (unsafeChr (fromIntegral x1)) - loop (ir+2) (ow+1) + then do ow' <- writeCharBuf oraw ow (unsafeChr (fromIntegral x1)) + loop (ir+2) ow' else if iw - ir < 4 then done ir ow else do c2 <- readWord8Buf iraw (ir+2) c3 <- readWord8Buf iraw (ir+3) let x2 = fromIntegral c3 `shiftL` 8 + fromIntegral c2 if not (validate2 x1 x2) then invalid else do - writeCharBuf oraw ow (chr2 x1 x2) - loop (ir+4) (ow+1) + ow' <- writeCharBuf oraw ow (chr2 x1 x2) + loop (ir+4) ow' where invalid = if ir > ir0 then done ir ow else ioe_decodingError