initial parser for integers
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Wed, 4 Feb 2015 03:51:22 +0000 (09:21 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Wed, 4 Feb 2015 03:51:22 +0000 (09:21 +0530)
src/Bencode.hs

index d6b5740d29738c0555d1084a352cf18a9f916ffb..87da970bed0c046c90de89540dabcb3cd7692d8d 100644 (file)
@@ -5,7 +5,6 @@ import qualified Data.ByteString.Char8 as BC
 import qualified Data.Map as M
 import qualified Text.Parsec.ByteString as ParsecBS
 import Text.ParserCombinators.Parsec
-import Text.ParserCombinators.Parsec.Char
 import Control.Applicative ((<*))
 import Data.Functor
 
@@ -35,12 +34,14 @@ bencStr = do _ <- spaces
 
 bencInt :: ParsecBS.Parser Integer
 bencInt = do _ <- spaces
-             ds <- between (char 'i') (char 'e') numbers1
+             ds <- between (char 'i') (char 'e') numbers
              return (read ds)
-               where numbers = do sign <- option ' ' (try (char '-'))
-                                  ds' <- many1 digit
-                                  return (sign : ds')
-                     numbers1 = many1 anyChar
+               where numbers = do d' <- (char '-' <|> digit)
+                                  if d' == '0'
+                                    then unexpected "numbers cannot be left-padded with zeros"
+                                    else
+                                      do ds' <- many1 digit
+                                         return (d' : ds')
 
 bencParser :: ParsecBS.Parser BVal
 bencParser = Bstr <$> bencStr <|>