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))