Skip to content

Instantly share code, notes, and snippets.

@angri
Created June 13, 2012 08:41
Show Gist options
  • Save angri/2922826 to your computer and use it in GitHub Desktop.
Save angri/2922826 to your computer and use it in GitHub Desktop.
class Reader(object):
def __init__(self):
self.buf = []
self.result = []
self._mode = 'keyvalue'
self._resdict = {}
self._datasize = 0
self._databuf = []
self._datakey = None
def read(self, data):
self.buf.append(data)
if '\n' in data:
data = ''.join(self.buf)
lines = data.split('\n')
lastline = lines.pop(-1)
if lastline != '':
self.buf = [lastline]
self._parse(data)
def _parse(self, lines):
if self._mode == 'keyvalue':
while lines:
line = lines.pop(0)
key, value = line.split(': ', 1)
if key.endswith('Size'):
self._datasize = int(value)
self._mode = 'data'
self._datakey = key[:-len('Size')]
return self._parse(lines)
else:
self._resdict[key] = value
elif self._mode == 'data':
while lines:
line = lines.pop(0)
self._databuf.append(line)
if len(line) >= self._datasize:
data = '\n'.join(self._databuf)
self._resdict[self._datakey] = data
if self._datakey == 'Data':
self.result.append(self._resdict)
self._resdict = {}
self._mode = 'keyvalue'
return self._parse(lines)
else:
self._datasize -= len(line) + 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment