module Data.MAC where
import Numeric
import Data.Word
import Data.List
import Data.Bits
import Foreign.Ptr
import Foreign.Storable
import Data.Binary
import Data.Binary.Put
import Data.Binary.Get
import Text.Printf
import Text.Read
import qualified Text.Read.Lex as Rex
import qualified Text.ParserCombinators.ReadPrec as Rex
import qualified Text.ParserCombinators.ReadP as Rex
data MAC = MAC
{-# UNPACK #-} !Word8
{-# UNPACK #-} !Word8
{-# UNPACK #-} !Word8
{-# UNPACK #-} !Word8
{-# UNPACK #-} !Word8
{-# UNPACK #-} !Word8
deriving (MAC -> MAC -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MAC -> MAC -> Bool
$c/= :: MAC -> MAC -> Bool
== :: MAC -> MAC -> Bool
$c== :: MAC -> MAC -> Bool
Eq, Eq MAC
MAC -> MAC -> Bool
MAC -> MAC -> Ordering
MAC -> MAC -> MAC
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MAC -> MAC -> MAC
$cmin :: MAC -> MAC -> MAC
max :: MAC -> MAC -> MAC
$cmax :: MAC -> MAC -> MAC
>= :: MAC -> MAC -> Bool
$c>= :: MAC -> MAC -> Bool
> :: MAC -> MAC -> Bool
$c> :: MAC -> MAC -> Bool
<= :: MAC -> MAC -> Bool
$c<= :: MAC -> MAC -> Bool
< :: MAC -> MAC -> Bool
$c< :: MAC -> MAC -> Bool
compare :: MAC -> MAC -> Ordering
$ccompare :: MAC -> MAC -> Ordering
Ord, MAC
forall a. a -> a -> Bounded a
maxBound :: MAC
$cmaxBound :: MAC
minBound :: MAC
$cminBound :: MAC
Bounded)
instance Show MAC where
show :: MAC -> String
show (MAC Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f)
= forall r. PrintfType r => String -> r
printf String
"%02x:%02x:%02x:%02x:%02x:%02x" Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f
instance Read MAC where
readPrec :: ReadPrec MAC
readPrec = forall a. ReadP a -> ReadPrec a
Rex.lift forall a b. (a -> b) -> a -> b
$ do
Word8
a <- forall a. (Eq a, Num a) => ReadP a
Rex.readHexP
[Word8
b, Word8
c, Word8
d, Word8
e, Word8
f] <- forall a. ReadP a -> ReadP [a]
Rex.many forall a b. (a -> b) -> a -> b
$ Char -> ReadP Char
Rex.char Char
':' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. (Eq a, Num a) => ReadP a
Rex.readHexP
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> MAC
MAC Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f
instance Binary MAC where
put :: MAC -> Put
put (MAC Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f) = do
Word8 -> Put
putWord8 Word8
a
Word8 -> Put
putWord8 Word8
b
Word8 -> Put
putWord8 Word8
c
Word8 -> Put
putWord8 Word8
d
Word8 -> Put
putWord8 Word8
e
Word8 -> Put
putWord8 Word8
f
get :: Get MAC
get = do
Word8
a <- Get Word8
getWord8
Word8
b <- Get Word8
getWord8
Word8
c <- Get Word8
getWord8
Word8
d <- Get Word8
getWord8
Word8
e <- Get Word8
getWord8
Word8
f <- Get Word8
getWord8
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> MAC
MAC Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f
instance Storable MAC where
sizeOf :: MAC -> Int
sizeOf MAC
_ = Int
6
alignment :: MAC -> Int
alignment MAC
_ = Int
1
peek :: Ptr MAC -> IO MAC
peek Ptr MAC
p = do
Word8
a <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a b. Ptr a -> Ptr b
castPtr Ptr MAC
p
Word8
b <- forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr MAC
p Int
1
Word8
c <- forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr MAC
p Int
2
Word8
d <- forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr MAC
p Int
3
Word8
e <- forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr MAC
p Int
4
Word8
f <- forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr MAC
p Int
5
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> MAC
MAC Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f
poke :: Ptr MAC -> MAC -> IO ()
poke Ptr MAC
p (MAC Word8
a Word8
b Word8
c Word8
d Word8
e Word8
f) = do
forall a. Storable a => Ptr a -> a -> IO ()
poke (forall a b. Ptr a -> Ptr b
castPtr Ptr MAC
p) Word8
a
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr MAC
p Int
1 Word8
b
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr MAC
p Int
2 Word8
c
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr MAC
p Int
3 Word8
d
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr MAC
p Int
4 Word8
e
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr MAC
p Int
5 Word8
f