rws-0.1.1.2: src/Util.hs
{-# LANGUAGE CPP #-}
module Util where
import Data.Word
import Data.Bits
import Packet
import Text.ParserCombinators.Parsec
import Lexer
csumAdd :: [Word8] -> Word32 -> Word32
csumAdd [] s = s
csumAdd [a] s = s + fromIntegral a
csumAdd (a:b:as) s =
let s' = s + shiftL (fromIntegral b) 8 + fromIntegral a in
csumAdd as s'
csumFin :: Word32 -> Word16
csumFin s =
let s' = shiftR s 16 + (.&.) s 0xffff in
let s'' = fromIntegral (complement $ shiftR s' 16 + s') in
shiftL s'' 8 .|. shiftR s'' 8
parseBoolAttribute :: String -> Parser Bool
parseBoolAttribute s = do
symbol s
symbol "="
do { symbol "true"; return True} <|> do { symbol "false"; return False}
parseIntAttribute :: Num b => String -> Parser b
parseIntAttribute s = do
symbol s
symbol "="
a <- integer
whiteSpace
return (fromIntegral a)
ipv4AddressDecl :: Parser Word32
ipv4AddressDecl = do
a0 <- integer
char '.'
a1 <- integer
char '.'
a2 <- integer
char '.'
a3 <- integer
let a = a0 `shiftL` 24 .|. a1 `shiftL` 16 .|. a2 `shiftL` 8 .|. a3
return (fromIntegral a)
parseIPv4Address :: String -> Parser Word32
parseIPv4Address s = do
symbol s
symbol "="
a <- ipv4AddressDecl
whiteSpace
return a
showIPv4Address :: Word32 -> String
showIPv4Address ip =
let a0 = ip `shiftR` 24 in
let a1 = ip `shiftR` 16 .&. 0xff in
let a2 = ip `shiftR` 8 .&. 0xff in
let a3 = ip .&. 0xff in
show a0 ++ "." ++ show a1 ++ "." ++ show a2 ++ "." ++ show a3
parsePacketList :: Parser Packet -> Parser [Packet]
parsePacketList f = do
whiteSpace
char '{'
pls <- commaSep f
char '}'
whiteSpace
return pls
parsePayload :: Parser Packet -> Parser [Packet]
parsePayload f =
try (parsePacketList f) <|> do { p <- f; return [p]}
#ifdef HRWS_TEST
dummyParsePacket :: (Parser Packet -> Parser Packet) -> Parser Packet
dummyParsePacket f= do
char '('
p <- f (dummyParsePacket f)
char ')'
return p
showBool :: Bool -> String
showBool True = "true"
showBool False = "false"
#endif