MCPcopy Index your code
hub / github.com/clips/pattern / LZWDecoder

Class LZWDecoder

pattern/web/pdf/lzw.py:11–88  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

9## LZWDecoder
10##
11class 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:

Callers 1

lzwdecodeFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…