@@ -30,24 +30,30 @@ import qualified Data.Bits
30
30
31
31
-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
32
32
utf8Encode :: Char -> [Word8 ]
33
- utf8Encode = map fromIntegral . go . ord
33
+ utf8Encode = uncurry (:) . utf8Encode'
34
+
35
+ utf8Encode' :: Char -> (Word8 , [Word8 ])
36
+ utf8Encode' c = case go (ord c) of
37
+ (x, xs) -> (fromIntegral x, map fromIntegral xs)
34
38
where
35
39
go oc
36
- | oc <= 0x7f = [oc]
40
+ | oc <= 0x7f = ( oc
41
+ , [
42
+ ])
37
43
38
- | oc <= 0x7ff = [ 0xc0 + (oc `Data.Bits.shiftR` 6 )
39
- , 0x80 + oc Data.Bits. .&. 0x3f
40
- ]
44
+ | oc <= 0x7ff = ( 0xc0 + (oc `Data.Bits.shiftR` 6 )
45
+ , [ 0x80 + oc Data.Bits. .&. 0x3f
46
+ ])
41
47
42
- | oc <= 0xffff = [ 0xe0 + (oc `Data.Bits.shiftR` 12 )
43
- , 0x80 + ((oc `Data.Bits.shiftR` 6 ) Data.Bits. .&. 0x3f )
48
+ | oc <= 0xffff = ( 0xe0 + (oc `Data.Bits.shiftR` 12 )
49
+ , [ 0x80 + ((oc `Data.Bits.shiftR` 6 ) Data.Bits. .&. 0x3f )
44
50
, 0x80 + oc Data.Bits. .&. 0x3f
45
- ]
46
- | otherwise = [ 0xf0 + (oc `Data.Bits.shiftR` 18 )
47
- , 0x80 + ((oc `Data.Bits.shiftR` 12 ) Data.Bits. .&. 0x3f )
51
+ ])
52
+ | otherwise = ( 0xf0 + (oc `Data.Bits.shiftR` 18 )
53
+ , [ 0x80 + ((oc `Data.Bits.shiftR` 12 ) Data.Bits. .&. 0x3f )
48
54
, 0x80 + ((oc `Data.Bits.shiftR` 6 ) Data.Bits. .&. 0x3f )
49
55
, 0x80 + oc Data.Bits. .&. 0x3f
50
- ]
56
+ ])
51
57
52
58
#endif
53
59
@@ -72,8 +78,8 @@ alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)
72
78
alexGetByte (p,c,(b: bs),s) = Just (b,(p,c,bs,s))
73
79
alexGetByte (_,_,[] ,[] ) = Nothing
74
80
alexGetByte (p,_,[] ,(c: s)) = let p' = alexMove p c
75
- (b : bs) = utf8Encode c
76
- in p' `seq` Just (b, (p', c, bs, s))
81
+ in case utf8Encode' c of
82
+ (b, bs) -> p' `seq` Just (b, (p', c, bs, s))
77
83
#endif
78
84
79
85
#if defined(ALEX_POSN_BYTESTRING) || defined(ALEX_MONAD_BYTESTRING)
@@ -334,9 +340,8 @@ alexScanTokens str = go ('\n',[],str)
334
340
alexGetByte :: AlexInput -> Maybe (Byte ,AlexInput )
335
341
alexGetByte (c,(b: bs),s) = Just (b,(c,bs,s))
336
342
alexGetByte (_,[] ,[] ) = Nothing
337
- alexGetByte (_,[] ,(c: s)) = case utf8Encode c of
338
- (b: bs) -> Just (b, (c, bs, s))
339
- [] -> Nothing
343
+ alexGetByte (_,[] ,(c: s)) = case utf8Encode' c of
344
+ (b, bs) -> Just (b, (c, bs, s))
340
345
#endif
341
346
342
347
0 commit comments