codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
def parse_payload(data): assert data, "Invalid data to parse, it's empty." length, extra = data.split(':', 1) length = int(length) payload, extra = extra[:length], extra[length:] assert extra, "No payload type: %r, %r" % (payload, extra) payload_type, remain = extra[0], extra[1:] assert len(payload) == length, "Data is wrong length %d vs %d" % (length, len(payload)) return payload, payload_type, remain def parse_list(data): if len(data) == 0: return [] result = [] value, extra = parse_tnetstring(data) result.append(value) while extra: value, extra = parse_tnetstring(extra) result.append(value) return result def parse_pair(data): key, extra = parse_tnetstring(data) assert extra, "Unbalanced dictionary store." value, extra = parse_tnetstring(extra) assert value, "Got an invalid value, null not allowed." return key, value, extra def parse_dict(data): if len(data) == 0: return {} key, value, extra = parse_pair(data) result = {key: value} while extra: key, value, extra = parse_pair(extra) result[key] = value return result def parse_tnetstring(data): payload, payload_type, remain = parse_payload(data) if payload_type == '#': value = int(payload) elif payload_type == '"': value = payload elif payload_type == '}': value = parse_dict(payload) elif payload_type == ']': value = parse_list(payload) else: assert False, "Invalid payload type: %r" % payload_type return value, remain TESTS = { '0:}': {}, '0:]': [], '34:5:hello"22:11:12345678901#4:this"]}': {'hello': [12345678901, 'this']}, '5:12345#': 12345, '12:this is cool"': "this is cool", '0:"': "", '24:5:12345#5:67890#5:xxxxx"]': [12345, 67890, 'xxxxx'], } for data, expect in TESTS.items(): payload, remain = parse_tnetstring(data) assert not remain, "Had trailing junk: %r" % remain assert payload != None, "Didn't get a payload." print "EXPECT", repr(expect), "GOT", repr(payload)
Private
[
?
]
Run code
Submit