]> git.rkrishnan.org Git - functorrent.git/commitdiff
WIP: just experimenting
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Wed, 4 Feb 2015 01:47:32 +0000 (07:17 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Wed, 4 Feb 2015 01:47:32 +0000 (07:17 +0530)
src/Bencode.hs

index 951f4f1aa745a5a6e6e98eec20dfa1a53c215784..d6b5740d29738c0555d1084a352cf18a9f916ffb 100644 (file)
@@ -5,6 +5,7 @@ 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
 
@@ -25,14 +26,25 @@ data BVal =
 -- Right ""
 -- >>> parse bencStr "Bstr" (BC.pack "0:hello")
 -- Right ""
+--
 bencStr :: ParsecBS.Parser BC.ByteString
 bencStr = do _ <- spaces
              ds <- many1 digit <* char ':'
              s <- count (read ds) anyChar
              return (BC.pack s)
 
+bencInt :: ParsecBS.Parser Integer
+bencInt = do _ <- spaces
+             ds <- between (char 'i') (char 'e') numbers1
+             return (read ds)
+               where numbers = do sign <- option ' ' (try (char '-'))
+                                  ds' <- many1 digit
+                                  return (sign : ds')
+                     numbers1 = many1 anyChar
+
 bencParser :: ParsecBS.Parser BVal
-bencParser = Bstr <$> bencStr
+bencParser = Bstr <$> bencStr <|>
+             Bint <$> bencInt
 
 decode :: BC.ByteString -> Either ParseError BVal
 decode = parse bencParser "BVal"