X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FIPv4Address.hs;h=037698a0eafc8c9ba88b95c08f669a045d38fa91;hb=3e3eff58c713987a442b418a3db01335307ac079;hp=fed567e8eb128d3429b491ca957fab366dee032b;hpb=64dfebebdecd1119ab8345a6de34597f6a878a98;p=hath.git diff --git a/src/IPv4Address.hs b/src/IPv4Address.hs index fed567e..037698a 100644 --- a/src/IPv4Address.hs +++ b/src/IPv4Address.hs @@ -1,73 +1,44 @@ -module IPv4Address ( - IPv4Address, - ipv4address_from_string, - min_octet1, - min_octet2, - min_octet3, - min_octet4, +module IPv4Address +( ipv4address_from_octets, + IPv4Address(None), max_octet1, max_octet2, max_octet3, - max_octet4 -) where + max_octet4, + min_octet1, + min_octet2, + min_octet3, + min_octet4 +) + where import Bit +import Maskbits import Octet -type Maskbits = Int - -data IPv4Address = IPv4Address { octet1 :: Octet, - octet2 :: Octet, - octet3 :: Octet, - octet4 :: Octet } +data IPv4Address = None | IPv4Address { octet1 :: Octet, + octet2 :: Octet, + octet3 :: Octet, + octet4 :: Octet } deriving (Eq, Show) -default_ipv4address :: IPv4Address -default_ipv4address = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet) - - -ipv4address_from_string :: String -> IPv4Address -ipv4address_from_string s - | length s < 32 = default_ipv4address - | otherwise = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 a8) (Octet a9 a10 a11 a12 a13 a14 a15 a16)(Octet a17 a18 a19 a20 a21 a22 a23 a24) (Octet a25 a26 a27 a28 a29 a30 a31 a32) - where - a1 = bit_from_char (s !! 0) - a2 = bit_from_char (s !! 1) - a3 = bit_from_char (s !! 2) - a4 = bit_from_char (s !! 3) - a5 = bit_from_char (s !! 4) - a6 = bit_from_char (s !! 5) - a7 = bit_from_char (s !! 6) - a8 = bit_from_char (s !! 7) - a9 = bit_from_char (s !! 8) - a10 = bit_from_char (s !! 9) - a11 = bit_from_char (s !! 10) - a12 = bit_from_char (s !! 11) - a13 = bit_from_char (s !! 12) - a14 = bit_from_char (s !! 13) - a15 = bit_from_char (s !! 14) - a16 = bit_from_char (s !! 15) - a17 = bit_from_char (s !! 16) - a18 = bit_from_char (s !! 17) - a19 = bit_from_char (s !! 18) - a20 = bit_from_char (s !! 19) - a21 = bit_from_char (s !! 20) - a22 = bit_from_char (s !! 21) - a23 = bit_from_char (s !! 22) - a24 = bit_from_char (s !! 23) - a25 = bit_from_char (s !! 24) - a26 = bit_from_char (s !! 25) - a27 = bit_from_char (s !! 26) - a28 = bit_from_char (s !! 27) - a29 = bit_from_char (s !! 28) - a30 = bit_from_char (s !! 29) - a31 = bit_from_char (s !! 30) - a32 = bit_from_char (s !! 31) +-- We don't export our constructor so this function is the only +-- way to construct an address from octets. As a result, we can +-- return IPv4Address.None in response to being passed one of more +-- Octet.None octets. +ipv4address_from_octets :: Octet -> Octet -> Octet -> Octet -> IPv4Address +ipv4address_from_octets oct1 oct2 oct3 oct4 + | or [oct1 == Octet.None, + oct2 == Octet.None, + oct3 == Octet.None, + oct4 == Octet.None] = IPv4Address.None + | otherwise = IPv4Address oct1 oct2 oct3 oct4 min_address :: IPv4Address -> Maskbits -> IPv4Address -min_address addr mask +min_address _ Maskbits.None = IPv4Address.None +min_address addr (Maskbits mask) | mask == 32 = IPv4Address oct1 oct2 oct3 oct4 | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 Zero) | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 Zero Zero) @@ -139,7 +110,8 @@ min_address addr mask max_address :: IPv4Address -> Maskbits -> IPv4Address -max_address addr mask +max_address _ Maskbits.None = IPv4Address.None +max_address addr (Maskbits mask) | mask == 32 = IPv4Address oct1 oct2 oct3 oct4 | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 One) | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 One One)