packages feed

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 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