
Am Freitag 30 April 2010 01:27:54 schrieb Daniel Fischer:
---------------------------------------------------------------------- {-# LANGUAGE BangPatterns #-}
import qualified Data.ByteString.Lazy as L import qualified Data.ByteString as S import Data.ByteString.Unsafe (unsafeAt)
Oops, import Data.ByteString.Unsafe (unsafeIndex)
escape :: Word8 -> Word8 escape = (+150)
normal :: Word8 -> Word8 normal = (+214)
decodeW :: L.ByteString -> [Word8] decodeW = dec False . L.toChunks where dec _ [] = [] dec esc (str:more) = go esc 0 where !len = S.length str {-# INLINE charAt #-} charAt :: Int -> Word8 charAt i = unsafeAt str i
charAt i = unsafeIndex str i
go !b !i | i == len = dec b more | b = escape (charAt i) : go False (i+1) | otherwise = case charAt i of 61 -> go True (i+1) c -> normal c : go False (i+1)
word8ToChar :: Word8 -> Char word8ToChar = toEnum . fromIntegral
decodeC :: L.ByteString -> String decodeC = map word8ToChar . decodeW
decodeBS :: L.ByteString -> L.ByteString decodeBS = L.pack . decodeW ----------------------------------------------------------------------