@@ -1,14 +1,24 @@
11{-# LANGUAGE MagicHash #-}
2−module Data.Text.Utf8 where
3−
4−import Data.Char(ord)
5−import Data.Bits
6−
2+module Data.Text.Utf8
3+ (
4+ ord2
5+ , ord3
6+ , ord4
7+ , chr2
8+ , chr3
9+ , chr4
10+ , validate1
11+ , validate2
12+ , validate3
13+ , validate4
14+ ) where
15+
16+import Data.Char (ord)
17+import Data.Bits (shiftR, (.&.))
718import GHC.Exts
8−import GHC.Prim
9−import GHC.Word
19+import GHC.Word (Word8(..))
1020
11−between :: Word8 -> Word8 -> Word8 -> Bool
21+between :: Word8 -> Word8 -> Word8 -> Bool
1222between x y z = x >= y && x <= z
1323{-# INLINE between #-}
1424
@@ -79,55 +89,40 @@ validate2 x1 x2 = between x1 0xC2 0xDF && between x2 0x80 0xBF
7989{-# INLINE validate2 #-}
8090
8191validate3 :: Word8 -> Word8 -> Word8 -> Bool
92+{-# INLINE validate3 #-}
8293validate3 x1 x2 x3 = validate3_1 x1 x2 x3 ||
8394 validate3_2 x1 x2 x3 ||
8495 validate3_3 x1 x2 x3 ||
8596 validate3_4 x1 x2 x3
86−{-# INLINE validate3 #-}
97+ where
98+ validate3_1 x1 x2 x3 = (x1 == 0xE0) &&
99+ between x2 0xA0 0xBF &&
100+ between x3 0x80 0xBF
101+ validate3_2 x1 x2 x3 = between x1 0xE1 0xEC &&
102+ between x2 0x80 0xBF &&
103+ between x3 0x80 0xBF
104+ validate3_3 x1 x2 x3 = x1 == 0xED &&
105+ between x2 0x80 0x9F &&
106+ between x3 0x80 0xBF
107+ validate3_4 x1 x2 x3 = between x1 0xEE 0xEF &&
108+ between x2 0x80 0xBF &&
109+ between x3 0x80 0xBF
87110
88111validate4 :: Word8 -> Word8 -> Word8 -> Word8 -> Bool
112+{-# INLINE validate4 #-}
89113validate4 x1 x2 x3 x4 = validate4_1 x1 x2 x3 x4 ||
90114 validate4_2 x1 x2 x3 x4 ||
91115 validate4_3 x1 x2 x3 x4
92−{-# INLINE validate4 #-}
93−
94−
95−
96−validate3_1 x1 x2 x3 = (x1 == 0xE0) &&
97− between x2 0xA0 0xBF &&
98− between x3 0x80 0xBF
99−{-# INLINE validate3_1 #-}
100−
101−validate3_2 x1 x2 x3 = between x1 0xE1 0xEC &&
102− between x2 0x80 0xBF &&
103− between x3 0x80 0xBF
104−{-# INLINE validate3_2 #-}
105−
106−validate3_3 x1 x2 x3 = x1 == 0xED &&
107− between x2 0x80 0x9F &&
108− between x3 0x80 0xBF
109−{-# INLINE validate3_3 #-}
110−
111−validate3_4 x1 x2 x3 = between x1 0xEE 0xEF &&
112− between x2 0x80 0xBF &&
113− between x2 0x80 0xBF
114−{-# INLINE validate3_4 #-}
115−
116−
117−validate4_1 x1 x2 x3 x4 = x1 == 0xF0 &&
118− between x2 0x90 0xBF &&
119− between x3 0x80 0xBF &&
120− between x4 0x80 0xBF
121−{-# INLINE validate4_1 #-}
122−
123−validate4_2 x1 x2 x3 x4 = between x1 0xF1 0xF3 &&
124− between x2 0x80 0xBF &&
125− between x3 0x80 0xBF &&
126− between x4 0x80 0xBF
127−{-# INLINE validate4_2 #-}
128−
129−validate4_3 x1 x2 x3 x4 = x1 == 0xF4 &&
130− between x2 0x80 0x8F &&
131− between x3 0x80 0xBF &&
132− between x4 0x80 0xBF
133−{-# INLINE validate4_3 #-}
116+ where
117+ validate4_1 x1 x2 x3 x4 = x1 == 0xF0 &&
118+ between x2 0x90 0xBF &&
119+ between x3 0x80 0xBF &&
120+ between x4 0x80 0xBF
121+ validate4_2 x1 x2 x3 x4 = between x1 0xF1 0xF3 &&
122+ between x2 0x80 0xBF &&
123+ between x3 0x80 0xBF &&
124+ between x4 0x80 0xBF
125+ validate4_3 x1 x2 x3 x4 = x1 == 0xF4 &&
126+ between x2 0x80 0x8F &&
127+ between x3 0x80 0xBF &&
128+ between x4 0x80 0xBF