on master help sign in
Clean up Data.Text.Encoding
commitfb26001b7e6fe354d8c329a640790474e7a92a12 authorLuigy Leon <luigy@outlook.com> dateWed 5 Oct 2016, 18:57 (10 years ago) parente4a00d9
1 file changed+37−38
Data/Text/Encoding.hs+37−38
Data/Text/Encoding.hs+37−38
@@ -77,7 +77,9 @@ import Data.Text.Internal (Text(..), safe, text)
7777import Data.Text.Internal.Private (runText)
7878import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
7979import Data.Text.Internal.Unsafe.Shift (shiftR)
80−-- import Data.Text.Show ()
80+#ifndef __GHCJS__
81+import Data.Text.Show ()
82+#endif
8183import Data.Text.Unsafe (unsafeDupablePerformIO)
8284import Data.Word (Word8, Word32)
8385import Foreign.C.Types (CSize(..))
@@ -95,24 +97,13 @@ import qualified Data.Text.Internal.Encoding.Fusion as E
9597import qualified Data.Text.Internal.Encoding.Utf16 as U16
9698import qualified Data.Text.Internal.Fusion as F
9799
98−import GHC.Exts (ByteArray#, Int(..), Int#, Any, Addr#, Ptr(..))
99−{-
100100#include "text_cbits.h"
101−-}
102−
103−import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
101+#ifdef __GHCJS__
102+import GHC.Exts (Int(..), Int#)
104103import Data.ByteString (ByteString)
105−import Data.Text.Internal (Text)
106−
107−-------------------------------------
108−import GHC.ForeignPtr
109−import GHCJS.Types
110104import GHCJS.Buffer
111105import Data.JSString (JSString)
112−import Unsafe.Coerce
113−import System.IO.Unsafe
114−-------------------------------------
115−
106+#endif
116107
117108-- $strict
118109--
@@ -145,10 +136,6 @@ decodeLatin1 (PS fp off len) = text a 0 len
145136 c_decode_latin1 (A.maBA dest) (ptr `plusPtr` off) (ptr `plusPtr` (off+len))
146137 return dest
147138
148−foreign import javascript unsafe "h$textFromString" js_fromString :: JSString -> (# ByteArray#, Int# #)
149−foreign import javascript unsafe "h$encodeUtf8($1)" js_encodeUtf8 :: JSString -> Buffer
150−foreign import javascript unsafe "$1['length']" js_length :: JSString -> Int
151−
152139-- | Decode a 'ByteString' containing UTF-8 encoded text.
153140decodeUtf8With :: OnDecodeError -> ByteString -> Text
154141decodeUtf8With onErr (PS fp off len) = runText $ \done -> do
@@ -348,13 +335,18 @@ encodeUtf8BuilderEscaped be =
348335 where
349336 bound = max 4 $ BP.sizeBound be
350337
338+#ifndef __GHCJS__
339+ mkBuildstep (Text arr off len) !k =
340+#else
351341 mkBuildstep (Text t) !k =
352− -- mkBuildstep (Text arr off len) !k =
342+#endif
353343 outerLoop off
354344 where
345+#ifdef __GHCJS__
355346 off = 0
356347 (arr, len) = let (# ba, len' #) = js_fromString t
357348 in (A.Array ba, I# len')
349+#endif
358350 iend = off + len
359351
360352 outerLoop !i0 !br@(B.BufferRange op0 ope)
@@ -394,27 +386,28 @@ encodeUtf8BuilderEscaped be =
394386 where
395387 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
396388
397−
398−
399389-- | Encode text using UTF-8 encoding.
400390encodeUtf8 :: Text -> ByteString
391+#ifndef __GHCJS__
392+encodeUtf8 (Text arr off len)
393+ | len == 0 = B.empty
394+ | otherwise = unsafeDupablePerformIO $ do
395+ fp <- mallocByteString (len*4)
396+ withForeignPtr fp $ \ptr ->
397+ with ptr $ \destPtr -> do
398+ c_encode_utf8 destPtr (A.aBA arr) (fromIntegral off) (fromIntegral len)
399+ newDest <- peek destPtr
400+ let utf8len = newDest `minusPtr` ptr
401+ if utf8len >= len `shiftR` 1
402+ then return (PS fp 0 utf8len)
403+ else do
404+ fp' <- mallocByteString utf8len
405+ withForeignPtr fp' $ \ptr' -> do
406+ memcpy ptr' ptr (fromIntegral utf8len)
407+ return (PS fp' 0 utf8len)
408+#else
401409encodeUtf8 (Text txt) = toByteString 0 (Just (js_length txt)) $ js_encodeUtf8 txt
402−-- encodeUtf8 (Text arr off len)
403−-- | len == 0 = B.empty
404−-- | otherwise = unsafeDupablePerformIO $ do
405−-- fp <- mallocByteString (len*4)
406−-- withForeignPtr fp $ \ptr ->
407−-- with ptr $ \destPtr -> do
408−-- c_encode_utf8 destPtr (A.aBA arr) (fromIntegral off) (fromIntegral len)
409−-- newDest <- peek destPtr
410−-- let utf8len = newDest `minusPtr` ptr
411−-- if utf8len >= len `shiftR` 1
412−-- then return (PS fp 0 utf8len)
413−-- else do
414−-- fp' <- mallocByteString utf8len
415−-- withForeignPtr fp' $ \ptr' -> do
416−-- memcpy ptr' ptr (fromIntegral utf8len)
417−-- return (PS fp' 0 utf8len)
410+#endif
418411
419412-- | Decode text from little endian UTF-16 encoding.
420413decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text
@@ -504,5 +497,11 @@ foreign import ccall unsafe "_hs_text_decode_utf8_state" c_decode_utf8_with_stat
504497foreign import ccall unsafe "_hs_text_decode_latin1" c_decode_latin1
505498 :: MutableByteArray# s -> Ptr Word8 -> Ptr Word8 -> IO ()
506499
500+#ifndef __GHCJS__
507501foreign import ccall unsafe "_hs_text_encode_utf8" c_encode_utf8
508502 :: Ptr (Ptr Word8) -> ByteArray# -> CSize -> CSize -> IO ()
503+#else
504+foreign import javascript unsafe "h$textFromString" js_fromString :: JSString -> (# ByteArray#, Int# #)
505+foreign import javascript unsafe "h$encodeUtf8($1)" js_encodeUtf8 :: JSString -> Buffer
506+foreign import javascript unsafe "$1['length']" js_length :: JSString -> Int
507+#endif