Module: Bencode

Defined in:
lib/bencode.rb

Class Method Summary collapse

Class Method Details

.dump(obj) ⇒ Object



154
155
156
# File 'lib/bencode.rb', line 154

def dump(obj)
  obj.bencode
end

.load(str) ⇒ Object

Raises:



158
159
160
161
162
163
164
165
# File 'lib/bencode.rb', line 158

def load(str)
  require 'strscan'

  scanner = StringScanner.new(str)
  obj = parse(scanner)
  raise BdecodeError unless scanner.eos?
  return obj
end

.load_file(path) ⇒ Object



167
168
169
# File 'lib/bencode.rb', line 167

def load_file(path)
  load(File.open(path).read)
end

.parse(scanner) ⇒ Object

:nodoc:



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/bencode.rb', line 171

def parse(scanner) # :nodoc:
  case token = scanner.scan(/[ild]|\d+:|\s/)
  when nil
    raise BdecodeError, scanner.pos
  when "i"
    number = scanner.scan(/0|(?:-?[1-9][0-9]*)/)
    unless number and scanner.scan(/e/)
      raise BdecodeError, scanner.pos
    end
    return number.to_i
  when "l"
    ary = []
    until scanner.peek(1) == "e"
      ary.push(parse(scanner))
    end
    scanner.pos += 1
    return ary
  when "d"
    hsh = {}
    until scanner.peek(1) == "e"
      key, value = parse(scanner), parse(scanner)
      unless key.is_a? String
        raise BdecodeError, "error at #{scanner.pos}: " + 
                            "key must be a string"
      end
      hsh.store(key, value)
    end
    scanner.pos += 1
    return hsh
  when /\d+:/
    length = token.chop.to_i
    str = scanner.peek(length)
    scanner.pos += length
    return str
  when /\s/
    nil
  else
    raise BdecodeError, scanner.pos
  end
end