Factor common code
authoriavor.diatchki <iavor.diatchki@gmail.com>
Mon, 25 Feb 2008 17:17:57 +0000 (09:17 -0800)
committeriavor.diatchki <iavor.diatchki@gmail.com>
Mon, 25 Feb 2008 17:17:57 +0000 (09:17 -0800)
darcs-hash:20080225171757-5035a-64f96abaf2b8a7a5d89aea9358038fdf4e9e5c17.gz

Data/ByteString/UTF8.hs

index 4d3ba6d..4c08227 100644 (file)
@@ -67,10 +67,13 @@ decode bs = do (c,cs) <- B.uncons bs
   bytes2 c cs =
     case B.uncons cs of
       Just (r,_) | r .&. 0xc0 == 0x80 ->
-        let d = shiftL (mask c 0x0f) 6 .|. fromEnum (r .&. 0x3f)
+        let d = combine (mask c 0x0f) r
         in if d >= 0x80 then (toEnum d, 2) else (replacement_char, 2)
       _ -> (replacement_char, 1)
 
+  combine :: Int -> Word8 -> Int
+  combine acc r = shiftL acc 6 .|. fromEnum (r .&. 0x3f)
+
   multi_byte :: Int -> Int -> Int -> B.ByteString -> Int -> (Char,Int)
   multi_byte overlong 0 m _ acc
     | overlong <= acc && acc <= 0x10ffff &&
@@ -82,7 +85,7 @@ decode bs = do (c,cs) <- B.uncons bs
     case B.uncons rs of
       Just (r,rs1)
         | r .&. 0xc0 == 0x80 -> multi_byte overlong (n-1) (m+1) rs1
-                              $ shiftL acc 6 .|. fromEnum (r .&. 0x3f)
+                              $ combine acc r
 
         | otherwise -> (replacement_char,m)
       Nothing -> (replacement_char,m)