@@ -51,7 +51,6 @@ module Data.Text.Encoding
51 -- * Encoding Text to ByteStrings
51 -- * Encoding Text to ByteStrings
52 , encodeUtf8
52 , encodeUtf8
53 , encodeUtf8_0
53 , encodeUtf8_0
55 , encodeUtf8_2
54 , encodeUtf8_2
56 , encodeUtf16LE
55 , encodeUtf16LE
57 , encodeUtf16BE
56 , encodeUtf16BE
@@ -89,12 +88,6 @@ import qualified Data.ByteString.Builder.Prim.Internal as BP
89import qualified Data.ByteString.Lazy as BL
88import qualified Data.ByteString.Lazy as BL
92−#if __GLASGOW_HASKELL__ >= 706
93−import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
95−import Foreign.ForeignPtr (unsafeForeignPtrToPtr)
98import Data.Text ()
91import Data.Text ()
99import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
92import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
100import Data.Text.Internal (Text(..), safe, textP)
93import Data.Text.Internal (Text(..), safe, textP)
@@ -103,7 +96,7 @@ import Data.Text.Internal.Private (runText)
103import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
96import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
104import Data.Word (Word8, Word32)
97import Data.Word (Word8, Word32)
105import Foreign.C.Types (CSize(..))
98import Foreign.C.Types (CSize(..))
106−import Foreign.ForeignPtr (touchForeignPtr, withForeignPtr)
99+import Foreign.ForeignPtr (withForeignPtr)
107import Foreign.Marshal.Utils (with)
100import Foreign.Marshal.Utils (with)
108import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
101import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
109import Foreign.Storable (Storable, peek, poke)
102import Foreign.Storable (Storable, peek, poke)
@@ -445,83 +438,6 @@ encodeUtf8_0 (Text arr off len) = unsafeDupablePerformIO $ do
445 poke8 (m+2) $ (w .&. 0x3F) + 0x80
438 poke8 (m+2) $ (w .&. 0x3F) + 0x80
446 go (n+1) (m+3)
439 go (n+1) (m+3)
448−encodeUtf8_1 :: Text -> ByteString
449−encodeUtf8_1 (Text arr off len)
450− | len == 0 = B.empty
451− | otherwise = unsafeDupablePerformIO $ do
452− fp0 <- mallocByteString len
453− withForeignPtr fp0 $ go1 off fp0
456− poke8 p v = poke p (fromIntegral v :: Word8)
457− resize k fp ptr = {-# SCC "encodeUtf8_1/resize" #-} do
458− fp' <- mallocByteString (len*k)
459− withForeignPtr fp $ \ptr0 -> do
460− let m = ptr `minusPtr` ptr0
461− memcpy (unsafeForeignPtrToPtr fp') ptr0 (fromIntegral m)
463− {-# NOINLINE resize #-}
464− ensure k n fp ptr go = {-# SCC "encodeUtf8_1/ensure" #-} do
465− fp' <- resize k fp ptr
466− let !m = ptr `minusPtr` unsafeForeignPtrToPtr fp
467− go n fp' (unsafeForeignPtrToPtr fp' `plusPtr` m)
468− do1 ptr n w k = poke8 ptr w >> k (n+1) (ptr `plusPtr` 1)
469− loop act !n0 fp !ptr0 = hot n0 ptr0
472− let !l = ptr `minusPtr` unsafeForeignPtrToPtr fp
475− | otherwise = act (A.unsafeIndex arr n) n fp ptr hot
477− go1 = loop $ \ w !n fp ptr cont ->
479− _| w <= 0x7F -> do1 ptr n w cont
480− | w <= 0x7FF -> ensure 2 n fp ptr go2
481− | w < 0xD800 || w > 0xDBFF -> ensure 3 n fp ptr go3
482− | otherwise -> ensure 4 n fp ptr go4
484− poke8 ptr $ (w `shiftR` 6) + 0xC0
485− poke8 (ptr `plusPtr` 1) $ (w .&. 0x3f) + 0x80
486− k (n+1) (ptr `plusPtr` 2)
487− go2 = loop $ \ w !n fp !ptr cont ->
489− _| w <= 0x7F -> do1 ptr n w cont
490− | w <= 0x7FF -> do2 ptr n w cont
491− | w < 0xD800 || w > 0xDBFF -> ensure 3 n fp ptr go3
492− | otherwise -> ensure 4 n fp ptr go4
494− poke8 ptr $ (w `shiftR` 12) + 0xE0
495− poke8 (ptr `plusPtr` 1) $ ((w `shiftR` 6) .&. 0x3F) + 0x80
496− poke8 (ptr `plusPtr` 2) $ (w .&. 0x3F) + 0x80
497− k (n+1) (ptr `plusPtr` 3)
498− go3 = loop body where body w !n fp !ptr cont =
500− _| w <= 0x7F -> do1 ptr n w cont
501− | w <= 0x7FF -> do2 ptr n w cont
502− | w < 0xD800 || w > 0xDBFF -> do3 ptr n w cont
503− | otherwise -> ensure 4 n fp ptr go4
505− go4 !n0 fp ptr0 = do
508− let !l = ptr `minusPtr` unsafeForeignPtrToPtr fp
512− case A.unsafeIndex arr n of
513− w| w <= 0x7F -> do1 ptr n w hot
514− | w <= 0x7FF -> do2 ptr n w hot
515− | w < 0xD800 || w > 0xDBFF -> do3 ptr n w hot
517− let c = ord $ U16.chr2 w (A.unsafeIndex arr (n+1))
518− poke8 ptr $ (c `shiftR` 18) + 0xF0
519− poke8 (ptr `plusPtr` 1) $ ((c `shiftR` 12) .&. 0x3F) + 0x80
520− poke8 (ptr `plusPtr` 2) $ ((c `shiftR` 6) .&. 0x3F) + 0x80
521− poke8 (ptr `plusPtr` 3) $ (c .&. 0x3F) + 0x80
522− hot (n+2) (ptr `plusPtr` 4)
525encodeUtf8_2 :: Text -> ByteString
441encodeUtf8_2 :: Text -> ByteString
526encodeUtf8_2 (Text arr off len)
442encodeUtf8_2 (Text arr off len)
527 | len == 0 = B.empty
443 | len == 0 = B.empty