text / Data / Text / UnsafeChar.hs

The default branch has multiple heads

Bryan O'Sullivan c6bb1bb 
Duncan Coutts 8503dd9 
Bryan O'Sullivan 4762cdc 

Bryan O'Sullivan 9071533 


Bryan O'Sullivan 4762cdc 

Bryan O'Sullivan 7dfeb13 
Bryan O'Sullivan 4762cdc 



Bryan O'Sullivan 230d853 
Bryan O'Sullivan d50fd7b 

Bryan O'Sullivan c6bb1bb 

Bryan O'Sullivan d50fd7b 

Bryan O'Sullivan 230d853 
Bryan O'Sullivan 309a0a8 
Bryan O'Sullivan d50fd7b 
Duncan Coutts 8503dd9 
Bryan O'Sullivan c6bb1bb 
Bryan O'Sullivan 406de7b 
Bryan O'Sullivan c6bb1bb 
Bryan O'Sullivan 230d853 
Bryan O'Sullivan fa76866 

Bryan O'Sullivan c6bb1bb 
Bryan O'Sullivan 4762cdc 
Bryan O'Sullivan 230d853 
Duncan Coutts 8503dd9 
Bryan O'Sullivan c6bb1bb 



Duncan Coutts 8503dd9 










Bryan O'Sullivan 230d853 
Bryan O'Sullivan a8fac16 

Bryan O'Sullivan 6f2e782 
Bryan O'Sullivan 230d853 

Bryan O'Sullivan c6bb1bb 



Bryan O'Sullivan a8fac16 
Bryan O'Sullivan 230d853 
Bryan O'Sullivan c6bb1bb 



Bryan O'Sullivan 406de7b 
Bryan O'Sullivan a8fac16 
Bryan O'Sullivan 230d853 

Bryan O'Sullivan 406de7b 

Bryan O'Sullivan 230d853 
Bryan O'Sullivan 406de7b 
Bryan O'Sullivan 309a0a8 
Bryan O'Sullivan 406de7b 















Bryan O'Sullivan 309a0a8 
{-# LANGUAGE CPP, MagicHash #-}

-- |
-- Module      : Data.Text.UnsafeChar
-- Copyright   : (c) 2008, 2009 Tom Harper,
--               (c) 2009, 2010 Bryan O'Sullivan,
--               (c) 2009 Duncan Coutts
--
-- License     : BSD-style
-- Maintainer  : bos@serpentine.com, rtomharper@googlemail.com,
--               duncan@haskell.org
-- Stability   : experimental
-- Portability : GHC
--
-- Fast character manipulation functions.
module Data.Text.UnsafeChar
    (
      ord
    , unsafeChr
    , unsafeChr8
    , unsafeChr32
    , unsafeWrite
    -- , unsafeWriteRev
    ) where

#ifdef ASSERTS
import Control.Exception (assert)
#endif
import Control.Monad.ST (ST)
import Data.Bits ((.&.))
import Data.Text.UnsafeShift (shiftR)
import GHC.Exts (Char(..), Int(..), chr#, ord#, word2Int#)
import GHC.Word (Word8(..), Word16(..), Word32(..))
import qualified Data.Text.Array as A

ord :: Char -> Int
ord (C# c#) = I# (ord# c#)
{-# INLINE ord #-}

unsafeChr :: Word16 -> Char
unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
{-# INLINE unsafeChr #-}

unsafeChr8 :: Word8 -> Char
unsafeChr8 (W8# w#) = C# (chr# (word2Int# w#))
{-# INLINE unsafeChr8 #-}

unsafeChr32 :: Word32 -> Char
unsafeChr32 (W32# w#) = C# (chr# (word2Int# w#))
{-# INLINE unsafeChr32 #-}

-- | Write a character into the array at the given offset.  Returns
-- the number of 'Word16's written.
unsafeWrite :: A.MArray s -> Int -> Char -> ST s Int
unsafeWrite marr i c
    | n < 0x10000 = do
#if defined(ASSERTS)
        assert (i >= 0) . assert (i < A.length marr) $ return ()
#endif
        A.unsafeWrite marr i (fromIntegral n)
        return 1
    | otherwise = do
#if defined(ASSERTS)
        assert (i >= 0) . assert (i < A.length marr - 1) $ return ()
#endif
        A.unsafeWrite marr i lo
        A.unsafeWrite marr (i+1) hi
        return 2
    where n = ord c
          m = n - 0x10000
          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
{-# INLINE unsafeWrite #-}

{-
unsafeWriteRev :: A.MArray s Word16 -> Int -> Char -> ST s Int
unsafeWriteRev marr i c
    | n < 0x10000 = do
        assert (i >= 0) . assert (i < A.length marr) $
          A.unsafeWrite marr i (fromIntegral n)
        return (i-1)
    | otherwise = do
        assert (i >= 1) . assert (i < A.length marr) $
          A.unsafeWrite marr (i-1) lo
        A.unsafeWrite marr i hi
        return (i-2)
    where n = ord c
          m = n - 0x10000
          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
{-# INLINE unsafeWriteRev #-}
-}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.