{-# LANGUAGE CPP #-} {-# LANGUAGE BangPatterns, MagicHash, UnboxedTuples, NoImplicitPrelude #-} {-# OPTIONS_GHC -O2 -fno-warn-name-shadowing #-} module GHC.Internal.Encoding.UTF8 ( utf8DecodeCharAddr# , utf8DecodeCharPtr , utf8DecodeCharByteArray# , utf8DecodeByteArray# , utf8DecodeForeignPtr , utf8CountCharsByteArray# , utf8CompareByteArray# , utf8EncodePtr , utf8EncodeByteArray# , utf8EncodedLength ) where import GHC.Types import GHC.Internal.Base import GHC.Internal.IO import GHC.Internal.ST import GHC.Internal.Word import GHC.Internal.ForeignPtr import GHC.Internal.Num import GHC.Internal.Bits import GHC.Internal.Real import GHC.Internal.Ptr {-# INLINE utf8DecodeChar# #-} utf8DecodeChar# :: (Int# -> Word#) -> (# Char#, Int# #) utf8DecodeChar# :: (Int# -> Word#) -> (# Char#, Int# #) utf8DecodeChar# Int# -> Word# indexWord8# = let !ch0 :: Int# ch0 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 0#) in case () of () _ | Int# -> Bool isTrue# (Int# ch0 Int# -> Int# -> Int# <=# Int# 0x7F#) -> (# Int# -> Char# chr# Int# ch0, Int# 1# #) | Int# -> Bool isTrue# ((Int# ch0 Int# -> Int# -> Int# >=# Int# 0xC0#) Int# -> Int# -> Int# `andI#` (Int# ch0 Int# -> Int# -> Int# <=# Int# 0xDF#)) -> let !ch1 :: Int# ch1 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 1#) in if Int# -> Bool isTrue# ((Int# ch1 Int# -> Int# -> Int# <# Int# 0x80#) Int# -> Int# -> Int# `orI#` (Int# ch1 Int# -> Int# -> Int# >=# Int# 0xC0#)) then Int# -> (# Char#, Int# #) fail Int# 1# else (# Int# -> Char# chr# (((Int# ch0 Int# -> Int# -> Int# -# Int# 0xC0#) Int# -> Int# -> Int# `uncheckedIShiftL#` Int# 6#) Int# -> Int# -> Int# +# (Int# ch1 Int# -> Int# -> Int# -# Int# 0x80#)), Int# 2# #) | Int# -> Bool isTrue# ((Int# ch0 Int# -> Int# -> Int# >=# Int# 0xE0#) Int# -> Int# -> Int# `andI#` (Int# ch0 Int# -> Int# -> Int# <=# Int# 0xEF#)) -> let !ch1 :: Int# ch1 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 1#) in if Int# -> Bool isTrue# ((Int# ch1 Int# -> Int# -> Int# <# Int# 0x80#) Int# -> Int# -> Int# `orI#` (Int# ch1 Int# -> Int# -> Int# >=# Int# 0xC0#)) then Int# -> (# Char#, Int# #) fail Int# 1# else let !ch2 :: Int# ch2 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 2#) in if Int# -> Bool isTrue# ((Int# ch2 Int# -> Int# -> Int# <# Int# 0x80#) Int# -> Int# -> Int# `orI#` (Int# ch2 Int# -> Int# -> Int# >=# Int# 0xC0#)) then Int# -> (# Char#, Int# #) fail Int# 2# else (# Int# -> Char# chr# (((Int# ch0 Int# -> Int# -> Int# -# Int# 0xE0#) Int# -> Int# -> Int# `uncheckedIShiftL#` Int# 12#) Int# -> Int# -> Int# +# ((Int# ch1 Int# -> Int# -> Int# -# Int# 0x80#) Int# -> Int# -> Int# `uncheckedIShiftL#` Int# 6#) Int# -> Int# -> Int# +# (Int# ch2 Int# -> Int# -> Int# -# Int# 0x80#)), Int# 3# #) | Int# -> Bool isTrue# ((Int# ch0 Int# -> Int# -> Int# >=# Int# 0xF0#) Int# -> Int# -> Int# `andI#` (Int# ch0 Int# -> Int# -> Int# <=# Int# 0xF8#)) -> let !ch1 :: Int# ch1 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 1#) in if Int# -> Bool isTrue# ((Int# ch1 Int# -> Int# -> Int# <# Int# 0x80#) Int# -> Int# -> Int# `orI#` (Int# ch1 Int# -> Int# -> Int# >=# Int# 0xC0#)) then Int# -> (# Char#, Int# #) fail Int# 1# else let !ch2 :: Int# ch2 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 2#) in if Int# -> Bool isTrue# ((Int# ch2 Int# -> Int# -> Int# <# Int# 0x80#) Int# -> Int# -> Int# `orI#` (Int# ch2 Int# -> Int# -> Int# >=# Int# 0xC0#)) then Int# -> (# Char#, Int# #) fail Int# 2# else let !ch3 :: Int# ch3 = Word# -> Int# word2Int# (Int# -> Word# indexWord8# Int# 3#) in if Int# -> Bool isTrue# ((Int# ch3 Int# -> Int# -> Int# <# Int# 0x80#) Int# -> Int# -> Int# `orI#` (Int# ch3 Int# -> Int# -> Int# >=# Int# 0xC0#)) then Int# -> (# Char#, Int# #) fail Int# 3# else (# Int# -> Char# chr# (((Int# ch0 Int# -> Int# -> Int# -# Int# 0xF0#) Int# -> Int# -> Int# `uncheckedIShiftL#` Int# 18#) Int# -> Int# -> Int# +# ((Int# ch1 Int# -> Int# -> Int# -# Int# 0x80#) Int# -> Int# -> Int# `uncheckedIShiftL#` Int# 12#) Int# -> Int# -> Int# +# ((Int# ch2 Int# -> Int# -> Int# -# Int# 0x80#) Int# -> Int# -> Int# `uncheckedIShiftL#` Int# 6#) Int# -> Int# -> Int# +# (Int# ch3 Int# -> Int# -> Int# -# Int# 0x80#)), Int# 4# #) | Bool otherwise -> Int# -> (# Char#, Int# #) fail Int# 1# where fail :: Int# -> (# Char#, Int# #) fail :: Int# -> (# Char#, Int# #) fail Int# nBytes# = (# Char# '\0'#, Int# nBytes# #) utf8DecodeCharAddr# :: Addr# -> Int# -> (# Char#, Int# #) utf8DecodeCharAddr# :: Addr# -> Int# -> (# Char#, Int# #) utf8DecodeCharAddr# Addr# a# Int# off# = #if !MIN_VERSION_ghc_prim(0,10,0) utf8DecodeChar# (\i# -> indexWord8OffAddr# a# (i# +# off#)) #else (Int# -> Word#) -> (# Char#, Int# #) utf8DecodeChar# (\Int# i# -> Word8# -> Word# word8ToWord# (Addr# -> Int# -> Word8# indexWord8OffAddr# Addr# a# (Int# i# Int# -> Int# -> Int# +# Int# off#))) #endif utf8DecodeCharPtr :: Ptr Word8 -> (Char, Int) utf8DecodeCharPtr :: Ptr Word8 -> (Char, Int) utf8DecodeCharPtr !(Ptr Addr# a#) = case Addr# -> Int# -> (# Char#, Int# #) utf8DecodeCharAddr# Addr# a# Int# 0# of (# Char# c#, Int# nBytes# #) -> ( Char# -> Char C# Char# c#, Int# -> Int I# Int# nBytes# ) utf8DecodeCharByteArray# :: ByteArray# -> Int# -> (# Char#, Int# #) utf8DecodeCharByteArray# :: ByteArray# -> Int# -> (# Char#, Int# #) utf8DecodeCharByteArray# ByteArray# ba# Int# off# = #if !MIN_VERSION_ghc_prim(0,10,0) utf8DecodeChar# (\i# -> indexWord8Array# ba# (i# +# off#)) #else (Int# -> Word#) -> (# Char#, Int# #) utf8DecodeChar# (\Int# i# -> Word8# -> Word# word8ToWord# (ByteArray# -> Int# -> Word8# indexWord8Array# ByteArray# ba# (Int# i# Int# -> Int# -> Int# +# Int# off#))) #endif {-# INLINE utf8Decode# #-} utf8Decode# :: (IO ()) -> (Int# -> (# Char#, Int# #)) -> Int# -> IO [Char] utf8Decode# :: IO () -> (Int# -> (# Char#, Int# #)) -> Int# -> IO [Char] utf8Decode# IO () retain Int# -> (# Char#, Int# #) decodeChar# Int# len# = Int# -> IO [Char] unpack Int# 0# where unpack :: Int# -> IO [Char] unpack Int# i# | Int# -> Bool isTrue# (Int# i# Int# -> Int# -> Int# >=# Int# len#) = IO () retain IO () -> IO [Char] -> IO [Char] forall a b. IO a -> IO b -> IO b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> [Char] -> IO [Char] forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return [] | Bool otherwise = case Int# -> (# Char#, Int# #) decodeChar# Int# i# of (# Char# c#, Int# nBytes# #) -> do rest <- IO [Char] -> IO [Char] forall a. IO a -> IO a unsafeDupableInterleaveIO (IO [Char] -> IO [Char]) -> IO [Char] -> IO [Char] forall a b. (a -> b) -> a -> b $ Int# -> IO [Char] unpack (Int# i# Int# -> Int# -> Int# +# Int# nBytes#) return (C# c# : rest) utf8DecodeForeignPtr :: ForeignPtr Word8 -> Int -> Int -> [Char] utf8DecodeForeignPtr :: ForeignPtr Word8 -> Int -> Int -> [Char] utf8DecodeForeignPtr ForeignPtr Word8 fp Int offset (I# Int# len#) = IO [Char] -> [Char] forall a. IO a -> a unsafeDupablePerformIO (IO [Char] -> [Char]) -> IO [Char] -> [Char] forall a b. (a -> b) -> a -> b $ do let !(Ptr Addr# a#) = ForeignPtr Word8 -> Ptr Word8 forall a. ForeignPtr a -> Ptr a unsafeForeignPtrToPtr ForeignPtr Word8 fp Ptr Word8 -> Int -> Ptr (ZonkAny 0) forall a b. Ptr a -> Int -> Ptr b `plusPtr` Int offset IO () -> (Int# -> (# Char#, Int# #)) -> Int# -> IO [Char] utf8Decode# (ForeignPtr Word8 -> IO () forall a. ForeignPtr a -> IO () touchForeignPtr ForeignPtr Word8 fp) (Addr# -> Int# -> (# Char#, Int# #) utf8DecodeCharAddr# Addr# a#) Int# len# utf8DecodeByteArray# :: ByteArray# -> [Char] utf8DecodeByteArray# :: ByteArray# -> [Char] utf8DecodeByteArray# ByteArray# ba# = IO [Char] -> [Char] forall a. IO a -> a unsafeDupablePerformIO (IO [Char] -> [Char]) -> IO [Char] -> [Char] forall a b. (a -> b) -> a -> b $ let len# :: Int# len# = ByteArray# -> Int# sizeofByteArray# ByteArray# ba# in IO () -> (Int# -> (# Char#, Int# #)) -> Int# -> IO [Char] utf8Decode# (() -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return ()) (ByteArray# -> Int# -> (# Char#, Int# #) utf8DecodeCharByteArray# ByteArray# ba#) Int# len# utf8CompareByteArray# :: ByteArray# -> ByteArray# -> Ordering utf8CompareByteArray# :: ByteArray# -> ByteArray# -> Ordering utf8CompareByteArray# ByteArray# a1 ByteArray# a2 = Int# -> Int# -> Ordering go Int# 0# Int# 0# where !sz1 :: Int# sz1 = ByteArray# -> Int# sizeofByteArray# ByteArray# a1 !sz2 :: Int# sz2 = ByteArray# -> Int# sizeofByteArray# ByteArray# a2 go :: Int# -> Int# -> Ordering go Int# off1 Int# off2 | Int# -> Bool isTrue# ((Int# off1 Int# -> Int# -> Int# >=# Int# sz1) Int# -> Int# -> Int# `andI#` (Int# off2 Int# -> Int# -> Int# >=# Int# sz2)) = Ordering EQ | Int# -> Bool isTrue# (Int# off1 Int# -> Int# -> Int# >=# Int# sz1) = Ordering LT | Int# -> Bool isTrue# (Int# off2 Int# -> Int# -> Int# >=# Int# sz2) = Ordering GT | Bool otherwise = #if !MIN_VERSION_ghc_prim(0,10,0) let !b1_1 = indexWord8Array# a1 off1 !b2_1 = indexWord8Array# a2 off2 #else let !b1_1 :: Word# b1_1 = Word8# -> Word# word8ToWord# (ByteArray# -> Int# -> Word8# indexWord8Array# ByteArray# a1 Int# off1) !b2_1 :: Word# b2_1 = Word8# -> Word# word8ToWord# (ByteArray# -> Int# -> Word8# indexWord8Array# ByteArray# a2 Int# off2) #endif in case Word# b1_1 of Word# 0xC0## -> case Word# b2_1 of Word# 0xC0## -> Int# -> Int# -> Ordering go (Int# off1 Int# -> Int# -> Int# +# Int# 1#) (Int# off2 Int# -> Int# -> Int# +# Int# 1#) #if !MIN_VERSION_ghc_prim(0,10,0) _ -> case indexWord8Array# a1 (off1 +# 1#) of #else Word# _ -> case Word8# -> Word# word8ToWord# (ByteArray# -> Int# -> Word8# indexWord8Array# ByteArray# a1 (Int# off1 Int# -> Int# -> Int# +# Int# 1#)) of #endif Word# 0x80## -> Ordering LT Word# _ -> Int# -> Int# -> Ordering go (Int# off1 Int# -> Int# -> Int# +# Int# 1#) (Int# off2 Int# -> Int# -> Int# +# Int# 1#) Word# _ -> case Word# b2_1 of #if !MIN_VERSION_ghc_prim(0,10,0) 0xC0## -> case indexWord8Array# a2 (off2 +# 1#) of #else Word# 0xC0## -> case Word8# -> Word# word8ToWord# (ByteArray# -> Int# -> Word8# indexWord8Array# ByteArray# a2 (Int# off2 Int# -> Int# -> Int# +# Int# 1#)) of #endif Word# 0x80## -> Ordering GT Word# _ -> Int# -> Int# -> Ordering go (Int# off1 Int# -> Int# -> Int# +# Int# 1#) (Int# off2 Int# -> Int# -> Int# +# Int# 1#) Word# _ | Int# -> Bool isTrue# (Word# b1_1 Word# -> Word# -> Int# `gtWord#` Word# b2_1) -> Ordering GT | Int# -> Bool isTrue# (Word# b1_1 Word# -> Word# -> Int# `ltWord#` Word# b2_1) -> Ordering LT | Bool otherwise -> Int# -> Int# -> Ordering go (Int# off1 Int# -> Int# -> Int# +# Int# 1#) (Int# off2 Int# -> Int# -> Int# +# Int# 1#) utf8CountCharsByteArray# :: ByteArray# -> Int utf8CountCharsByteArray# :: ByteArray# -> Int utf8CountCharsByteArray# ByteArray# ba = Int# -> Int# -> Int go Int# 0# Int# 0# where len# :: Int# len# = ByteArray# -> Int# sizeofByteArray# ByteArray# ba go :: Int# -> Int# -> Int go Int# i# Int# n# | Int# -> Bool isTrue# (Int# i# Int# -> Int# -> Int# >=# Int# len#) = Int# -> Int I# Int# n# | Bool otherwise = case ByteArray# -> Int# -> (# Char#, Int# #) utf8DecodeCharByteArray# ByteArray# ba Int# i# of (# Char# _, Int# nBytes# #) -> Int# -> Int# -> Int go (Int# i# Int# -> Int# -> Int# +# Int# nBytes#) (Int# n# Int# -> Int# -> Int# +# Int# 1#) {-# INLINE utf8EncodeChar #-} utf8EncodeChar :: (Int# -> Word8# -> State# s -> State# s) -> Char -> ST s Int utf8EncodeChar :: forall s. (Int# -> Word8# -> State# s -> State# s) -> Char -> ST s Int utf8EncodeChar Int# -> Word8# -> State# s -> State# s write# Char c = let x :: Word x = Int -> Word forall a b. (Integral a, Num b) => a -> b fromIntegral (Char -> Int ord Char c) in case () of () _ | Word x Word -> Word -> Bool forall a. Ord a => a -> a -> Bool > Word 0 Bool -> Bool -> Bool && Word x Word -> Word -> Bool forall a. Ord a => a -> a -> Bool <= Word 0x007f -> do Int -> Word -> ST s () write Int 0 Word x Int -> ST s Int forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return Int 1 | Word x Word -> Word -> Bool forall a. Ord a => a -> a -> Bool <= Word 0x07ff -> do Int -> Word -> ST s () write Int 0 (Word 0xC0 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. ((Word x Word -> Int -> Word forall a. Bits a => a -> Int -> a `shiftR` Int 6) Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x1F)) Int -> Word -> ST s () write Int 1 (Word 0x80 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. (Word x Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x3F)) Int -> ST s Int forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return Int 2 | Word x Word -> Word -> Bool forall a. Ord a => a -> a -> Bool <= Word 0xffff -> do Int -> Word -> ST s () write Int 0 (Word 0xE0 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. (Word x Word -> Int -> Word forall a. Bits a => a -> Int -> a `shiftR` Int 12) Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x0F) Int -> Word -> ST s () write Int 1 (Word 0x80 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. (Word x Word -> Int -> Word forall a. Bits a => a -> Int -> a `shiftR` Int 6) Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x3F) Int -> Word -> ST s () write Int 2 (Word 0x80 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. (Word x Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x3F)) Int -> ST s Int forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return Int 3 | Bool otherwise -> do Int -> Word -> ST s () write Int 0 (Word 0xF0 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. (Word x Word -> Int -> Word forall a. Bits a => a -> Int -> a `shiftR` Int 18)) Int -> Word -> ST s () write Int 1 (Word 0x80 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. ((Word x Word -> Int -> Word forall a. Bits a => a -> Int -> a `shiftR` Int 12) Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x3F)) Int -> Word -> ST s () write Int 2 (Word 0x80 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. ((Word x Word -> Int -> Word forall a. Bits a => a -> Int -> a `shiftR` Int 6) Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x3F)) Int -> Word -> ST s () write Int 3 (Word 0x80 Word -> Word -> Word forall a. Bits a => a -> a -> a .|. (Word x Word -> Word -> Word forall a. Bits a => a -> a -> a .&. Word 0x3F)) Int -> ST s Int forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return Int 4 where {-# INLINE write #-} write :: Int -> Word -> ST s () write (I# Int# off#) (W# Word# c#) = STRep s () -> ST s () forall s a. STRep s a -> ST s a ST (STRep s () -> ST s ()) -> STRep s () -> ST s () forall a b. (a -> b) -> a -> b $ \State# s s -> #if !MIN_VERSION_ghc_prim(0,10,0) case write# off# (narrowWord8# c#) s of #else case Int# -> Word8# -> State# s -> State# s write# Int# off# (Word# -> Word8# wordToWord8# Word# c#) State# s s of #endif State# s s -> (# State# s s, () #) utf8EncodePtr :: Ptr Word8 -> String -> IO () utf8EncodePtr :: Ptr Word8 -> [Char] -> IO () utf8EncodePtr (Ptr Addr# a#) [Char] str = Addr# -> [Char] -> IO () go Addr# a# [Char] str where go :: Addr# -> [Char] -> IO () go !Addr# _ [] = () -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return () go Addr# a# (Char c:[Char] cs) = do #if !MIN_VERSION_ghc_prim(0,10,0) I# off# <- stToIO $ utf8EncodeChar (\i w -> writeWord8OffAddr# a# i (extendWord8# w)) c #else I# off# <- ST RealWorld Int -> IO Int forall a. ST RealWorld a -> IO a stToIO (ST RealWorld Int -> IO Int) -> ST RealWorld Int -> IO Int forall a b. (a -> b) -> a -> b $ (Int# -> Word8# -> State# RealWorld -> State# RealWorld) -> Char -> ST RealWorld Int forall s. (Int# -> Word8# -> State# s -> State# s) -> Char -> ST s Int utf8EncodeChar (Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld forall d. Addr# -> Int# -> Word8# -> State# d -> State# d writeWord8OffAddr# Addr# a#) Char c #endif go (a# `plusAddr#` off#) cs utf8EncodeByteArray# :: String -> ByteArray# utf8EncodeByteArray# :: [Char] -> ByteArray# utf8EncodeByteArray# [Char] str = (State# RealWorld -> ByteArray#) -> ByteArray# forall o. (State# RealWorld -> o) -> o runRW# ((State# RealWorld -> ByteArray#) -> ByteArray#) -> (State# RealWorld -> ByteArray#) -> ByteArray# forall a b. (a -> b) -> a -> b $ \State# RealWorld s -> case [Char] -> Int utf8EncodedLength [Char] str of { I# Int# len# -> case Int# -> State# RealWorld -> (# State# RealWorld, MutableByteArray# RealWorld #) forall d. Int# -> State# d -> (# State# d, MutableByteArray# d #) newByteArray# Int# len# State# RealWorld s of { (# State# RealWorld s, MutableByteArray# RealWorld mba# #) -> case MutableByteArray# RealWorld -> Int# -> [Char] -> ST RealWorld () forall {s}. MutableByteArray# s -> Int# -> [Char] -> ST s () go MutableByteArray# RealWorld mba# Int# 0# [Char] str of { ST STRep RealWorld () f_go -> case STRep RealWorld () f_go State# RealWorld s of { (# State# RealWorld s, () #) -> case MutableByteArray# RealWorld -> State# RealWorld -> (# State# RealWorld, ByteArray# #) forall d. MutableByteArray# d -> State# d -> (# State# d, ByteArray# #) unsafeFreezeByteArray# MutableByteArray# RealWorld mba# State# RealWorld s of { (# State# RealWorld _, ByteArray# ba# #) -> ByteArray# ba# }}}}} where go :: MutableByteArray# s -> Int# -> [Char] -> ST s () go MutableByteArray# s _ Int# _ [] = () -> ST s () forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return () go MutableByteArray# s mba# Int# i# (Char c:[Char] cs) = do #if !MIN_VERSION_ghc_prim(0,10,0) I# off# <- utf8EncodeChar (\j# w -> writeWord8Array# mba# (i# +# j#) (extendWord8# w)) c #else I# off# <- (Int# -> Word8# -> State# s -> State# s) -> Char -> ST s Int forall s. (Int# -> Word8# -> State# s -> State# s) -> Char -> ST s Int utf8EncodeChar (\Int# j# -> MutableByteArray# s -> Int# -> Word8# -> State# s -> State# s forall d. MutableByteArray# d -> Int# -> Word8# -> State# d -> State# d writeWord8Array# MutableByteArray# s mba# (Int# i# Int# -> Int# -> Int# +# Int# j#)) Char c #endif go mba# (i# +# off#) cs utf8EncodedLength :: String -> Int utf8EncodedLength :: [Char] -> Int utf8EncodedLength [Char] str = Int -> [Char] -> Int forall {t}. Num t => t -> [Char] -> t go Int 0 [Char] str where go :: t -> [Char] -> t go !t n [] = t n go t n (Char c:[Char] cs) | Char -> Int ord Char c Int -> Int -> Bool forall a. Ord a => a -> a -> Bool > Int 0 Bool -> Bool -> Bool && Char -> Int ord Char c Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Int 0x007f = t -> [Char] -> t go (t nt -> t -> t forall a. Num a => a -> a -> a +t 1) [Char] cs | Char -> Int ord Char c Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Int 0x07ff = t -> [Char] -> t go (t nt -> t -> t forall a. Num a => a -> a -> a +t 2) [Char] cs | Char -> Int ord Char c Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Int 0xffff = t -> [Char] -> t go (t nt -> t -> t forall a. Num a => a -> a -> a +t 3) [Char] cs | Bool otherwise = t -> [Char] -> t go (t nt -> t -> t forall a. Num a => a -> a -> a +t 4) [Char] cs
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4