doc.txt

bencode.scm: BitTorrent Bencode Decoding in Scheme

bencode.scm: BitTorrent Bencode Decoding in Scheme
**************************************************

Version 0.1, 2005-04-17, `http://www.neilvandyke.org/bencode-scm/'

by Neil W. Van Dyke <neil@neilvandyke.org>

     Copyright (C) 2005 Neil W. Van Dyke.  This program is Free
     Software; you can redistribute it and/or modify it under the terms
     of the GNU Lesser General Public License as published by the Free
     Software Foundation; either version 2.1 of the License, or (at
     your option) any later version.  This program is distributed in
     the hope that it will be useful, but without any warranty; without
     even the implied warranty of merchantability or fitness for a
     particular purpose.  See `http://www.gnu.org/copyleft/lesser.html'
     for details.  For other license options and consulting, contact
     the author.

Introduction
************

`bencode.scm' parses the "bencoding" format of the BitTorrent network
protocol into basic Scheme data types (and currently PLT-specific byte
strings).  This is useful for inspecting `.torrent' files, and might
later be used in the implementation of a BitTorrent client or protocol
analyzer.

   The format interpretation is based on the undated BitTorrent
protocol documentation Web page
(http://www.bittorrent.com/protocol.html) as viewed on 2005-04-17.  The
mapping from those bencoding types to Scheme types is:

"String"
     PLT byte string.

"Integer"
     Scheme integer.

"List"
     Scheme list.

"Dictionary"
     Scheme list with the symbol `dictionary' as its head, and an
     association list as its tail.


For example, a parse of a certain real-world `.torrent' file:

     (unbencode (open-input-file "debian.torrent")))
     =>
     ((dictionary
       (#"announce"      . #"http://cdimage.debian.org:6969/announce")
       (#"comment"       . #"Debian CD from cdimage.debian.org")
       (#"creation date" . 1105009474)
       (#"info"
        dictionary
        (#"length"       . 600158208)
        (#"name"         . #"debian-30r4-i386-binary-1.iso")
        (#"piece length" . 524288)
        (#"pieces"       . [...large byte string...]))))

   `bencode.scm' is currently specific to PLT 299/3xx, due to the need
for byte I/O and some representation for byte sequences.  Otherwise, the
code has been written to require only R5RS, SRFI-6, and SRFI-23.

API
***

> (unbencode-single port)
     Parses a single bencoding object (and any child objects, in the
     case of a list or dictionary) from input port PORT and yields the
     Scheme representation.

> (unbencode port)
     Yields a list of the Scheme representations of all bencoding
     objects parsed from input port PORT.

Tests
*****

The `bencode.scm' test suite can be enabled by editing the source code
file and loading Testeez (http://www.neilvandyke.org/testeez/).

History
*******

Version 0.1 -- 2005-04-17
     Initial release.