X-Git-Url: http://gitweb.michael.orlitzky.com/?p=hath.git;a=blobdiff_plain;f=src%2FCidr.hs;h=002ec0b849fc08d555a2e6ab221212143c51d160;hp=d41ba11dc2b9eef533701a11c6011144641b6d82;hb=e1d16438b44ecd962565756a828c9ed8014cf894;hpb=909e781852e3566fcaa16e156437ebe5bfc89e02 diff --git a/src/Cidr.hs b/src/Cidr.hs index d41ba11..002ec0b 100644 --- a/src/Cidr.hs +++ b/src/Cidr.hs @@ -1,3 +1,5 @@ +-- | The CIDR modules contains most of the functions used for working +-- with the CIDR type. module Cidr ( Cidr(..), cidr_from_string, @@ -19,6 +21,7 @@ module Cidr ) where import Data.List (nubBy) +import Data.List.Split (splitOneOf) import Data.Maybe (catMaybes, fromJust) import Test.HUnit (assertEqual) @@ -29,7 +32,6 @@ import Test.QuickCheck (Arbitrary(..), Gen, Property, (==>)) import qualified Bit as B import IPv4Address -import ListUtils import Maskable import Maskbits import Octet @@ -55,27 +57,27 @@ instance Eq Cidr where cidr1 == cidr2 = (cidr1 `equivalent` cidr2) --- Two CIDR ranges are equivalent if they have the same network bits --- and the masks are the same. +-- | Two CIDR ranges are equivalent if they have the same network bits +-- and the masks are the same. equivalent :: Cidr -> Cidr -> Bool equivalent (Cidr addr1 mbits1) (Cidr addr2 mbits2) = (mbits1 == mbits2) && ((apply_mask addr1 mbits1 B.Zero) == (apply_mask addr2 mbits2 B.Zero)) --- Returns the mask portion of a CIDR address. That is, everything --- after the trailing slash. +-- | Returns the mask portion of a CIDR address. That is, everything +-- after the trailing slash. maskbits_from_cidr_string :: String -> Maybe Maskbits maskbits_from_cidr_string s | length partlist == 2 = maskbits_from_string (partlist !! 1) | otherwise = Nothing where - partlist = (splitWith (`elem` "/") s) + partlist = splitOneOf "/" s -- | Takes an IP address String in CIDR notation, and returns a list -- of its octets (as Ints). octets_from_cidr_string :: String -> [Octet] octets_from_cidr_string s = - catMaybes $ map octet_from_string (take 4 (splitWith (`elem` "./") s)) + catMaybes $ map octet_from_string (take 4 (splitOneOf "./" s)) -- | Return Nothing if we can't parse both maskbits and octets from @@ -92,35 +94,53 @@ cidr_from_string s = +-- | Given a CIDR, return the minimum valid IPv4 address contained +-- within it. min_host :: Cidr -> IPv4Address min_host (Cidr addr mask) = apply_mask addr mask B.Zero - +-- | Given a CIDR, return the maximum valid IPv4 address contained +-- within it. max_host :: Cidr -> IPv4Address max_host (Cidr addr mask) = apply_mask addr mask B.One - +-- | Given a CIDR, return the first octet of the minimum valid IPv4 +-- address contained within it. min_octet1 :: Cidr -> Octet min_octet1 cidr = octet1 (min_host cidr) +-- | Given a CIDR, return the second octet of the minimum valid IPv4 +-- address contained within it. min_octet2 :: Cidr -> Octet min_octet2 cidr = octet2 (min_host cidr) +-- | Given a CIDR, return the third octet of the minimum valid IPv4 +-- address contained within it. min_octet3 :: Cidr -> Octet min_octet3 cidr = octet3 (min_host cidr) +-- | Given a CIDR, return the fourth octet of the minimum valid IPv4 +-- address contained within it. min_octet4 :: Cidr -> Octet min_octet4 cidr = octet4 (min_host cidr) +-- | Given a CIDR, return the first octet of the maximum valid IPv4 +-- address contained within it. max_octet1 :: Cidr -> Octet max_octet1 cidr = octet1 (max_host cidr) +-- | Given a CIDR, return the second octet of the maximum valid IPv4 +-- address contained within it. max_octet2 :: Cidr -> Octet max_octet2 cidr = octet2 (max_host cidr) +-- | Given a CIDR, return the third octet of the maximum valid IPv4 +-- address contained within it. max_octet3 :: Cidr -> Octet max_octet3 cidr = octet3 (max_host cidr) +-- | Given a CIDR, return the fourth octet of the maximum valid IPv4 +-- address contained within it. max_octet4 :: Cidr -> Octet max_octet4 cidr = octet4 (max_host cidr) @@ -167,6 +187,7 @@ contains (Cidr addr1 mbits1) (Cidr addr2 mbits2) addr2masked = apply_mask addr2 mbits1 B.Zero +-- | Contains but is not equal to. contains_proper :: Cidr -> Cidr -> Bool contains_proper cidr1 cidr2 = (cidr1 `contains` cidr2) && (not (cidr2 `contains` cidr1))