aboutsummaryrefslogtreecommitdiffstats
path: root/FuseArchive/ChunkBuffer.py
blob: 575f5aa83fbac9e0c14f0a392bb9e99f6a6deaf9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import logging

# Handle efficient operations on a non-fixed length buffer like appending,
# replacing, reading chunks, etc
class ChunkBuffer:
    def __init__( self, data = '' ):
        logging.debug( "Creating chunkbuffer: %s" % data )
        self.l = len( data )
        self.chunk = [ data ]

    def append( self, s ):
        self.l += len( s )
        self.chunk.append( s )

    # Note: replace doesn't effect length so we don't update it
    def replace( self, buf, start, end ):
        # We make a string of our chunk, then create a new list of the 3
        # strings, the start, new chunk, and remaining chunk
        s = ''.join( self.chunk )
        l = end - start
        self.chunk = [ s[ :start ], buf[ :l ], s[ end: ] ]

    def length( self ):
        return self.l

    def truncate( self, l ):
        s = ''.join( self.chunk )
        self.l = l
        self.chunk = [ s[ :l ] ]

    def _simplify( self ):
        logging.debug( "Simplify!" )
        self.chunk = [ ''.join( self.chunk ) ]

    def string(self):
        logging.debug( "Stringifying: %s" % self.chunk )
        return ''.join( self.chunk )