| 9 | ## LZWDecoder |
| 10 | ## |
| 11 | class LZWDecoder(object): |
| 12 | |
| 13 | debug = 0 |
| 14 | |
| 15 | def __init__(self, fp): |
| 16 | self.fp = fp |
| 17 | self.buff = 0 |
| 18 | self.bpos = 8 |
| 19 | self.nbits = 9 |
| 20 | self.table = None |
| 21 | self.prevbuf = None |
| 22 | return |
| 23 | |
| 24 | def readbits(self, bits): |
| 25 | v = 0 |
| 26 | while 1: |
| 27 | # the number of remaining bits we can get from the current buffer. |
| 28 | r = 8-self.bpos |
| 29 | if bits <= r: |
| 30 | # |-----8-bits-----| |
| 31 | # |-bpos-|-bits-| | |
| 32 | # | |----r----| |
| 33 | v = (v<<bits) | ((self.buff>>(r-bits)) & ((1<<bits)-1)) |
| 34 | self.bpos += bits |
| 35 | break |
| 36 | else: |
| 37 | # |-----8-bits-----| |
| 38 | # |-bpos-|---bits----... |
| 39 | # | |----r----| |
| 40 | v = (v<<r) | (self.buff & ((1<<r)-1)) |
| 41 | bits -= r |
| 42 | x = self.fp.read(1) |
| 43 | if not x: raise EOFError |
| 44 | self.buff = ord(x) |
| 45 | self.bpos = 0 |
| 46 | return v |
| 47 | |
| 48 | def feed(self, code): |
| 49 | x = '' |
| 50 | if code == 256: |
| 51 | self.table = [ chr(c) for c in xrange(256) ] # 0-255 |
| 52 | self.table.append(None) # 256 |
| 53 | self.table.append(None) # 257 |
| 54 | self.prevbuf = '' |
| 55 | self.nbits = 9 |
| 56 | elif code == 257: |
| 57 | pass |
| 58 | elif not self.prevbuf: |
| 59 | x = self.prevbuf = self.table[code] |
| 60 | else: |
| 61 | if code < len(self.table): |
| 62 | x = self.table[code] |
| 63 | self.table.append(self.prevbuf+x[0]) |
| 64 | else: |
| 65 | self.table.append(self.prevbuf+self.prevbuf[0]) |
| 66 | x = self.table[code] |
| 67 | l = len(self.table) |
| 68 | if l == 511: |
no outgoing calls
no test coverage detected
searching dependent graphs…