{-# LANGUAGE MagicHash, BangPatterns #-}
-- |
-- Module : Data.Text.Internal.Encoding.Utf16
-- Copyright : (c) 2008, 2009 Tom Harper,
-- (c) 2009 Bryan O'Sullivan,
-- (c) 2009 Duncan Coutts
--
-- License : BSD-style
-- Maintainer : bos@serpentine.com
-- Stability : experimental
-- Portability : GHC
--
-- /Warning/: this is an internal module, and does not have a stable
-- API or name. Functions in this module may not check or enforce
-- preconditions expected by public modules. Use at your own risk!
--
-- Basic UTF-16 validation and character manipulation.
module Data.Text.Internal.Encoding.Utf16 ( chr2 , validate1 , validate2 ) where import GHC.Exts import
GHC.Word
(Word16(..))
chr2
::
Word16
->
Word16
->
Char
chr2
(
W16#
a#
) (
W16#
b#
) =
C#
(
chr#
(
upper#
+#
lower#
+#
0x10000#)) where !
x#
=
word2Int#
a#
!
y#
=
word2Int#
b#
!
upper#
=
uncheckedIShiftL#
(
x#
-#
0xD800#) 10# !
lower#
=
y#
-#
0xDC00#
{-# INLINE
chr2
#-}
validate1
::
Word16
->
Bool
validate1
x1
=
x1
<
0xD800
||
x1
>
0xDFFF
{-# INLINE
validate1
#-}
validate2
::
Word16
->
Word16
->
Bool
validate2
x1
x2
=
x1
>=
0xD800
&&
x1
<=
0xDBFF
&&
x2
>=
0xDC00
&&
x2
<=
0xDFFF
{-# INLINE
validate2
#-}