bencode 0.2 → 0.3
raw patch · 3 files changed
+48/−29 lines, 3 filesdep +bytestringdep +containersdep ~base
Dependencies added: bytestring, containers
Dependency ranges changed: base
Files
- bencode.cabal +13/−12
- src/Data/BEncode.hs +22/−5
- src/Data/BEncode/Lexer.hs +13/−12
bencode.cabal view
@@ -1,15 +1,16 @@-Name: bencode-Version: 0.2-Maintainer: Lemmih (lemmih@gmail.com)-Author: Lemmih (lemmih@gmail.com), Jesper Louis Andersen-Copyright: 2005-2007, Lemmih-License-File: LICENSE-License: BSD3-Build-Depends: base, parsec, binary-Category: Text-Synopsis: Parser and printer for bencoded data.-Tested-with: GHC ==6.6-Extensions: PatternGuards+Name: bencode+Version: 0.3+Maintainer: Lemmih (lemmih@gmail.com)+Author: Lemmih (lemmih@gmail.com), Jesper Louis Andersen+Copyright: 2005-2007, Lemmih+License-File: LICENSE+License: BSD3+Build-Depends: base, parsec, bytestring, containers, binary+Build-Type: Simple+Category: Text+Synopsis: Parser and printer for bencoded data.+Tested-with: GHC ==6.8.1+Extensions: PatternGuards Exposed-Modules: Data.BEncode Data.BEncode.Lexer
src/Data/BEncode.hs view
@@ -36,14 +36,16 @@ -- * Data types BEncode(..), -- * Functions- bRead, - bShow, + bRead,+ bShow,+ bPack ) where import qualified Data.Map as Map import Data.Map (Map) import Text.ParserCombinators.Parsec+import qualified Data.ByteString.Lazy.Char8 as L import qualified Data.ByteString.Char8 as BS import Data.ByteString (ByteString) import Data.Binary@@ -63,9 +65,9 @@ deriving (Eq, Ord, Show) instance Binary BEncode where- put e = put (BS.pack $ bShow e "")+ put e = put (BS.concat $ L.toChunks $ bPack e) get = do s <- get- case bRead s of+ case bRead (L.fromChunks [s]) of Just e -> return e Nothing -> fail "Failed to parse BEncoded data" @@ -120,7 +122,7 @@ {- | bRead is a conversion routine. It assumes a B-coded string as input and attempts a parse of it into a BEncode data type -}-bRead :: ByteString -> Maybe BEncode+bRead :: L.ByteString -> Maybe BEncode bRead str = case parse bParse "" (lexer str) of Left _err -> Nothing Right b -> Just b@@ -141,3 +143,18 @@ BString s -> sString (BS.unpack s) (BS.length s) BList bl -> sc 'l' . sList bl . sc 'e' BDict bd -> sc 'd' . sDict bd . sc 'e'++bPack :: BEncode -> L.ByteString+bPack be = L.fromChunks (bPack' be [])+ where intTag = BS.pack "i"+ colonTag = BS.pack ":"+ endTag = BS.pack "e"+ listTag = BS.pack "l"+ dictTag = BS.pack "d"+ sString s r = BS.pack (show (BS.length s)) : colonTag : s : r+ bPack' (BInt i) r = intTag : BS.pack (show i) : endTag : r+ bPack' (BString s) r = sString s r+ bPack' (BList bl) r = listTag : foldr bPack' (endTag : r) bl+ bPack' (BDict bd) r = dictTag : foldr (\(k,v) -> sString (BS.pack k) . bPack' v) (endTag : r) (Map.toAscList bd)++--check be = bShow be "" == L.unpack (bPack be)
src/Data/BEncode/Lexer.hs view
@@ -2,6 +2,7 @@ import Data.Char +import qualified Data.ByteString.Lazy.Char8 as L import qualified Data.ByteString.Char8 as BS import Data.ByteString (ByteString) @@ -15,27 +16,27 @@ deriving (Show,Eq) -lexer :: ByteString -> [Token]-lexer fs | BS.null fs = []+lexer :: L.ByteString -> [Token]+lexer fs | L.null fs = [] lexer fs = case ch of 'd' -> TDict : lexer rest 'l' -> TList : lexer rest 'i' -> TInt : lexer rest 'e' -> TEnd : lexer rest- '-' -> let (digits,rest') = BS.span isDigit rest- number = read (BS.unpack digits)+ '-' -> let (digits,rest') = L.span isDigit rest+ number = read (L.unpack digits) in TNumber (-number) : lexer rest' _ | isDigit ch- -> let (digits,rest') = BS.span isDigit fs- number = read (BS.unpack digits)- in if BS.null rest'+ -> let (digits,rest') = L.span isDigit fs+ number = read (L.unpack digits)+ in if L.null rest' then [TNumber number]- else case BS.head rest' of- ':' -> let (str, rest'') = BS.splitAt number (BS.tail rest')- in TString str : lexer rest''+ else case L.head rest' of+ ':' -> let (str, rest'') = L.splitAt (fromIntegral number) (L.tail rest')+ in TString (BS.concat $ L.toChunks str) : lexer rest'' _ -> TNumber number : lexer rest' | otherwise -> error "Lexer error."- where ch = BS.head fs- rest = BS.tail fs+ where ch = L.head fs+ rest = L.tail fs