@@ -77,7 +77,9 @@ import Data.Text.Internal (Text(..), safe, text)
77import Data.Text.Internal.Private (runText)
77import Data.Text.Internal.Private (runText)
78import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
78import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
79import Data.Text.Internal.Unsafe.Shift (shiftR)
79import Data.Text.Internal.Unsafe.Shift (shiftR)
80−-- import Data.Text.Show ()
81+import Data.Text.Show ()
81import Data.Text.Unsafe (unsafeDupablePerformIO)
83import Data.Text.Unsafe (unsafeDupablePerformIO)
82import Data.Word (Word8, Word32)
84import Data.Word (Word8, Word32)
83import Foreign.C.Types (CSize(..))
85import Foreign.C.Types (CSize(..))
@@ -95,24 +97,13 @@ import qualified Data.Text.Internal.Encoding.Fusion as E
95import qualified Data.Text.Internal.Encoding.Utf16 as U16
97import qualified Data.Text.Internal.Encoding.Utf16 as U16
96import qualified Data.Text.Internal.Fusion as F
98import qualified Data.Text.Internal.Fusion as F
98−import GHC.Exts (ByteArray#, Int(..), Int#, Any, Addr#, Ptr(..))
100#include "text_cbits.h"
100#include "text_cbits.h"
101−-}
101+#ifdef __GHCJS__
102−
102+import GHC.Exts (Int(..), Int#)
103−import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
104import Data.ByteString (ByteString)
103import Data.ByteString (ByteString)
105−import Data.Text.Internal (Text)
107−-------------------------------------
108−import GHC.ForeignPtr
110import GHCJS.Buffer
104import GHCJS.Buffer
111import Data.JSString (JSString)
105import Data.JSString (JSString)
112−import Unsafe.Coerce
106+#endif
113−import System.IO.Unsafe
114−-------------------------------------
117-- $strict
108-- $strict
@@ -145,10 +136,6 @@ decodeLatin1 (PS fp off len) = text a 0 len
145 c_decode_latin1 (A.maBA dest) (ptr `plusPtr` off) (ptr `plusPtr` (off+len))
136 c_decode_latin1 (A.maBA dest) (ptr `plusPtr` off) (ptr `plusPtr` (off+len))
146 return dest
137 return dest
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
152-- | Decode a 'ByteString' containing UTF-8 encoded text.
139-- | Decode a 'ByteString' containing UTF-8 encoded text.
153decodeUtf8With :: OnDecodeError -> ByteString -> Text
140decodeUtf8With :: OnDecodeError -> ByteString -> Text
154decodeUtf8With onErr (PS fp off len) = runText $ \done -> do
141decodeUtf8With onErr (PS fp off len) = runText $ \done -> do
@@ -348,13 +335,18 @@ encodeUtf8BuilderEscaped be =
349 bound = max 4 $ BP.sizeBound be
336 bound = max 4 $ BP.sizeBound be
339+ mkBuildstep (Text arr off len) !k =
351 mkBuildstep (Text t) !k =
341 mkBuildstep (Text t) !k =
352− -- mkBuildstep (Text arr off len) !k =
342+#endif
353 outerLoop off
343 outerLoop off
356 (arr, len) = let (# ba, len' #) = js_fromString t
347 (arr, len) = let (# ba, len' #) = js_fromString t
357 in (A.Array ba, I# len')
348 in (A.Array ba, I# len')
358 iend = off + len
350 iend = off + len
360 outerLoop !i0 !br@(B.BufferRange op0 ope)
352 outerLoop !i0 !br@(B.BufferRange op0 ope)
@@ -394,27 +386,28 @@ encodeUtf8BuilderEscaped be =
395 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
387 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
399-- | Encode text using UTF-8 encoding.
389-- | Encode text using UTF-8 encoding.
400encodeUtf8 :: Text -> ByteString
390encodeUtf8 :: Text -> ByteString
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)
404+ fp' <- mallocByteString utf8len
405+ withForeignPtr fp' $ \ptr' -> do
406+ memcpy ptr' ptr (fromIntegral utf8len)
407+ return (PS fp' 0 utf8len)
401encodeUtf8 (Text txt) = toByteString 0 (Just (js_length txt)) $ js_encodeUtf8 txt
409encodeUtf8 (Text txt) = toByteString 0 (Just (js_length txt)) $ js_encodeUtf8 txt
402−-- encodeUtf8 (Text arr off len)
410+#endif
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)
414−-- fp' <- mallocByteString utf8len
415−-- withForeignPtr fp' $ \ptr' -> do
416−-- memcpy ptr' ptr (fromIntegral utf8len)
417−-- return (PS fp' 0 utf8len)
419-- | Decode text from little endian UTF-16 encoding.
412-- | Decode text from little endian UTF-16 encoding.
420decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text
413decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text
@@ -504,5 +497,11 @@ foreign import ccall unsafe "_hs_text_decode_utf8_state" c_decode_utf8_with_stat
504foreign import ccall unsafe "_hs_text_decode_latin1" c_decode_latin1
497foreign import ccall unsafe "_hs_text_decode_latin1" c_decode_latin1
505 :: MutableByteArray# s -> Ptr Word8 -> Ptr Word8 -> IO ()
498 :: MutableByteArray# s -> Ptr Word8 -> Ptr Word8 -> IO ()
507foreign import ccall unsafe "_hs_text_encode_utf8" c_encode_utf8
501foreign import ccall unsafe "_hs_text_encode_utf8" c_encode_utf8
508 :: Ptr (Ptr Word8) -> ByteArray# -> CSize -> CSize -> IO ()
502 :: Ptr (Ptr Word8) -> ByteArray# -> CSize -> CSize -> IO ()
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