packages feed

text 0.11.1.2 → 0.11.1.3

raw patch · 2 files changed

+17/−15 lines, 2 files

Files

Data/Text/Encoding.hs view
@@ -144,7 +144,7 @@ -- | Encode text using UTF-8 encoding. encodeUtf8 :: Text -> ByteString encodeUtf8 (Text arr off len) = unsafePerformIO $ do-  let size0 = min len 4+  let size0 = max len 4   mallocByteString size0 >>= start size0 off 0  where   start size n0 m0 fp = withForeignPtr fp $ loop n0 m0@@ -152,36 +152,38 @@     loop n1 m1 ptr = go n1 m1      where       go !n !m-        | n-off == len = return $! PS fp 0 m-        | size-m < 4 = {-# SCC "encodeUtf8/resize" #-} do-            let newSize = size `shiftL` 1-            fp' <- mallocByteString newSize-            withForeignPtr fp' $ \ptr' -> memcpy ptr' ptr (fromIntegral m)-            start newSize n m fp'+        | n-off == len = return (PS fp 0 m)         | otherwise = do             let poke8 k v = poke (ptr `plusPtr` k) (fromIntegral v :: Word8)-                w = A.unsafeIndex arr n-            case undefined of-             _| w <= 0x7F  -> do+                ensure k act+                  | size-m >= k = act+                  | otherwise = {-# SCC "resizeUtf8/ensure" #-} do+                      let newSize = size `shiftL` 1+                      fp' <- mallocByteString newSize+                      withForeignPtr fp' $ \ptr' ->+                        memcpy ptr' ptr (fromIntegral m)+                      start newSize n m fp'+                {-# INLINE ensure #-}+            case A.unsafeIndex arr n of+             w| w <= 0x7F  -> ensure 1 $ do                   poke8 m w                   go (n+1) (m+1)-              | w <= 0x7FF -> do+              | w <= 0x7FF -> ensure 2 $ do                   poke8 m     $ (w `shiftR` 6) + 0xC0                   poke8 (m+1) $ (w .&. 0x3f) + 0x80                   go (n+1) (m+2)-              | 0xD800 <= w && w <= 0xDBFF -> do+              | 0xD800 <= w && w <= 0xDBFF -> ensure 4 $ do                   let c = ord $ U16.chr2 w (A.unsafeIndex arr (n+1))                   poke8 m     $ (c `shiftR` 18) + 0xF0                   poke8 (m+1) $ ((c `shiftR` 12) .&. 0x3F) + 0x80                   poke8 (m+2) $ ((c `shiftR` 6) .&. 0x3F) + 0x80                   poke8 (m+3) $ (c .&. 0x3F) + 0x80                   go (n+2) (m+4)-              | otherwise -> do+              | otherwise -> ensure 3 $ do                   poke8 m     $ (w `shiftR` 12) + 0xE0                   poke8 (m+1) $ ((w `shiftR` 6) .&. 0x3F) + 0x80                   poke8 (m+2) $ (w .&. 0x3F) + 0x80                   go (n+1) (m+3)-{- INLINE encodeUtf8 #-}  -- | Decode text from little endian UTF-16 encoding. decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text
text.cabal view
@@ -1,5 +1,5 @@ name:           text-version:        0.11.1.2+version:        0.11.1.3 homepage:       https://bitbucket.org/bos/text bug-reports:    https://bitbucket.org/bos/text/issues synopsis:       An efficient packed Unicode text type.