From: Ramakrishnan Muthukrishnan Date: Wed, 4 Feb 2015 04:25:13 +0000 (+0530) Subject: correctly handle negative/zero integers X-Git-Url: https://git.rkrishnan.org/specifications/%5B/%5D%20/frontends/nxhtml.html?a=commitdiff_plain;h=4a2ee5ec888cb525d9777b391fe54012808d195e;p=functorrent.git correctly handle negative/zero integers --- diff --git a/src/Bencode.hs b/src/Bencode.hs index 87da970..adc6d1a 100644 --- a/src/Bencode.hs +++ b/src/Bencode.hs @@ -32,16 +32,25 @@ bencStr = do _ <- spaces s <- count (read ds) anyChar return (BC.pack s) +-- | parse integers +-- +-- >>> parse bencInt "Bint" (BC.pack "i42e") +-- Right 42 +-- >>> parse bencInt "Bint" (BC.pack "i1e") +-- Right 1 +-- >>> parse bencInt "Bint" (BC.pack "i0e") +-- Right 0 +-- >>> parse bencInt "Bint" (BC.pack "i-1e") +-- Right (-1) bencInt :: ParsecBS.Parser Integer bencInt = do _ <- spaces ds <- between (char 'i') (char 'e') numbers return (read ds) where numbers = do d' <- (char '-' <|> digit) - if d' == '0' + ds' <- many digit + if d' == '0' && ds' /= [] then unexpected "numbers cannot be left-padded with zeros" - else - do ds' <- many1 digit - return (d' : ds') + else return (d' : ds') bencParser :: ParsecBS.Parser BVal bencParser = Bstr <$> bencStr <|>