purebred-email-0.1.0.0: src/Data/MIME/Internal.hs
{-# LANGUAGE OverloadedStrings #-}
module Data.MIME.Internal
(
hexEncode
, parseHex
) where
import Data.Bits ((.&.), shiftR)
import Data.Word (Word8)
import qualified Data.ByteString as B
{-
(1) An "=" followed by two hexadecimal digits, one or both
of which are lowercase letters in "abcdef", is formally
illegal. A robust implementation might choose to
recognize them as the corresponding uppercase letters.
-}
parseHex :: Word8 -> Maybe Word8
parseHex c = do
let
-- to upper
c' = if c >= 0x61 && c <= 0x7a then c - 0x20 else c
fromIntegral <$> B.findIndex (== c') hexAlphabet
hexAlphabet :: B.ByteString
hexAlphabet = "0123456789ABCDEF"
hexEncode :: Word8 -> (Word8, Word8)
hexEncode c =
let
lkup i = B.index hexAlphabet (fromIntegral i)
in
( lkup (c `shiftR` 4)
, lkup (c .&. 0x0f)
)