X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=eff_bdecode.py;h=2f8fc5eb1d3caa9f3d384cbcfe9f455d7bb90950;hb=HEAD;hp=5f5b93b38c1b3b89e06ecc3fd0c0c64f9569da03;hpb=a9d5c6ff137cc72e2887dd193c9865e3bb9c4f94;p=extfs.d.git diff --git a/eff_bdecode.py b/eff_bdecode.py index 5f5b93b..2f8fc5e 100644 --- a/eff_bdecode.py +++ b/eff_bdecode.py @@ -23,9 +23,11 @@ # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. +from functools import partial import re -def tokenize(text, match=re.compile("([idel])|(\d+):|(-?\d+)").match): + +def tokenize(text, match=re.compile(b"([idel])|(\\d+):|(-?\\d+)").match): i = 0 while i < len(text): m = match(text, i) @@ -36,35 +38,40 @@ def tokenize(text, match=re.compile("([idel])|(\d+):|(-?\d+)").match): yield text[i:i+int(s)] i = i + int(s) else: - yield s + yield s.decode('ascii') + -def decode_item(next, token): +def decode_item(next_, token): if token == "i": # integer: "i" value "e" - data = int(next()) - if next() != "e": + data = int(next_()) + if next_() != "e": raise ValueError elif token == "s": # string: "s" value (virtual tokens) - data = next() + data = next_() elif token == "l" or token == "d": # container: "l" (or "d") values "e" data = [] - tok = next() + tok = next_() while tok != "e": - data.append(decode_item(next, tok)) - tok = next() + data.append(decode_item(next_, tok)) + try: + tok = next_() + except StopIteration: + break if token == "d": data = dict(zip(data[0::2], data[1::2])) else: raise ValueError return data + def decode(text): try: src = tokenize(text) - data = decode_item(src.next, src.next()) - for token in src: # look for more tokens + data = decode_item(partial(next, src), next(src)) + for token in src: # look for more tokens raise SyntaxError("trailing junk") except (AttributeError, ValueError, StopIteration): raise SyntaxError("syntax error")