Use explicit language extensions & remove extension fields from base.cabal
[ghc-base.git] / GHC / IO / Encoding / UTF32.hs
index b26aaae..1eef105 100644 (file)
@@ -1,5 +1,10 @@
-{-# OPTIONS_GHC -fno-implicit-prelude -funbox-strict-fields #-}
-{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE NoImplicitPrelude
+           , BangPatterns
+           , NondecreasingIndentation
+           , MagicHash
+  #-}
+{-# OPTIONS_GHC  -funbox-strict-fields #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  GHC.IO.Encoding.UTF32
@@ -35,7 +40,7 @@ module GHC.IO.Encoding.UTF32 (
 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,18 +53,29 @@ import GHC.IORef
 -- The UTF-32 codec: either UTF-32BE or UTF-32LE with a BOM
 
 utf32  :: TextEncoding
-utf32 = TextEncoding { mkTextDecoder = utf32_DF,
+utf32 = TextEncoding { textEncodingName = "UTF-32",
+                       mkTextDecoder = utf32_DF,
                       mkTextEncoder = utf32_EF }
 
-utf32_DF :: IO TextDecoder
+utf32_DF :: IO (TextDecoder (Maybe DecodeBuffer))
 utf32_DF = do
   seen_bom <- newIORef Nothing
-  return (BufferCodec (utf32_decode seen_bom) (return ()))
-
-utf32_EF :: IO TextEncoder
+  return (BufferCodec {
+             encode   = utf32_decode seen_bom,
+             close    = return (),
+             getState = readIORef seen_bom,
+             setState = writeIORef seen_bom
+          })
+
+utf32_EF :: IO (TextEncoder Bool)
 utf32_EF = do
   done_bom <- newIORef False
-  return (BufferCodec (utf32_encode done_bom) (return ()))
+  return (BufferCodec {
+             encode   = utf32_encode done_bom,
+             close    = return (),
+             getState = readIORef done_bom,
+             setState = writeIORef done_bom
+          })
 
 utf32_encode :: IORef Bool -> EncodeBuffer
 utf32_encode done_bom input
@@ -120,26 +136,51 @@ utf32_native_encode = utf32be_encode
 -- UTF32LE and UTF32BE
 
 utf32be :: TextEncoding
-utf32be = TextEncoding { mkTextDecoder = utf32be_DF,
+utf32be = TextEncoding { textEncodingName = "UTF-32BE",
+                         mkTextDecoder = utf32be_DF,
                         mkTextEncoder = utf32be_EF }
 
-utf32be_DF :: IO TextDecoder
-utf32be_DF = return (BufferCodec utf32be_decode (return ()))
-
-utf32be_EF :: IO TextEncoder
-utf32be_EF = return (BufferCodec utf32be_encode (return ()))
+utf32be_DF :: IO (TextDecoder ())
+utf32be_DF =
+  return (BufferCodec {
+             encode   = utf32be_decode,
+             close    = return (),
+             getState = return (),
+             setState = const $ return ()
+          })
+
+utf32be_EF :: IO (TextEncoder ())
+utf32be_EF =
+  return (BufferCodec {
+             encode   = utf32be_encode,
+             close    = return (),
+             getState = return (),
+             setState = const $ return ()
+          })
 
 
 utf32le :: TextEncoding
-utf32le = TextEncoding { mkTextDecoder = utf32le_DF,
+utf32le = TextEncoding { textEncodingName = "UTF-32LE",
+                         mkTextDecoder = utf32le_DF,
                         mkTextEncoder = utf32le_EF }
 
-utf32le_DF :: IO TextDecoder
-utf32le_DF = return (BufferCodec utf32le_decode (return ()))
-
-utf32le_EF :: IO TextEncoder
-utf32le_EF = return (BufferCodec utf32le_encode (return ()))
-
+utf32le_DF :: IO (TextDecoder ())
+utf32le_DF =
+  return (BufferCodec {
+             encode   = utf32le_decode,
+             close    = return (),
+             getState = return (),
+             setState = const $ return ()
+          })
+
+utf32le_EF :: IO (TextEncoder ())
+utf32le_EF =
+  return (BufferCodec {
+             encode   = utf32le_encode,
+             close    = return (),
+             getState = return (),
+             setState = const $ return ()
+          })
 
 
 utf32be_decode :: DecodeBuffer
@@ -156,8 +197,8 @@ utf32be_decode
               c3 <- readWord8Buf iraw (ir+3)
               let x1 = chr4 c0 c1 c2 c3
               if not (validate x1) then invalid else do
-              writeCharBuf oraw ow x1
-              loop (ir+4) (ow+1)
+              ow' <- writeCharBuf oraw ow x1
+              loop (ir+4) ow'
          where
            invalid = if ir > ir0 then done ir ow else ioe_decodingError
 
@@ -182,8 +223,8 @@ utf32le_decode
               c3 <- readWord8Buf iraw (ir+3)
               let x1 = chr4 c3 c2 c1 c0
               if not (validate x1) then invalid else do
-              writeCharBuf oraw ow x1
-              loop (ir+4) (ow+1)
+              ow' <- writeCharBuf oraw ow x1
+              loop (ir+4) ow'
          where
            invalid = if ir > ir0 then done ir ow else ioe_decodingError