2
Ring buffer
Maurizio Porrato edited this page 2018-12-03 10:57:38 +00:00
from cStringIO import StringIO
def collect(f, bufsize=6):
ring = [None,]*bufsize
ring_pos = 0
shift = bufsize
while True:
c = f.read(1)
if c == '':
return
ring[ring_pos] = c
ring_pos = (ring_pos + 1) % bufsize
oc = ord(c)
if (c != '\r') and (c != '\n') and ((oc & 0xf0) != 0x30):
shift = bufsize
elif shift > 0:
shift -= 1
# print ring, ring_pos, shift
if c == '\r' and shift != 1:
shift = bufsize
if c == '\n':
if shift == 0:
yield ''.join(ring[ring_pos:]+ring[:ring_pos])
ring_pos = 0
shift = bufsize
if __name__ == '__main__':
s=StringIO('1234\r\npippo9876\r\n00blah11\r\n4567\r\n')
print list(collect(s))