in benchmarks/benchmarks/pyflate.py [0:0]
def gzip_main(field): # noqa: C901
b = Bitfield(field)
method = b.readbits(8)
if method != 8:
raise Exception("Unknown (not type eight DEFLATE) compression method")
# Use flags, drop modification time, extra flags and OS creator type.
flags = b.readbits(8)
b.readbits(32) # mtime
b.readbits(8) # extra_flags
b.readbits(8) # os_type
if flags & 0x04: # structured GZ_FEXTRA miscellaneous data
xlen = b.readbits(16)
b.dropbytes(xlen)
while flags & 0x08: # original GZ_FNAME filename
if not b.readbits(8):
break
while flags & 0x10: # human readable GZ_FCOMMENT
if not b.readbits(8):
break
if flags & 0x02: # header-only GZ_FHCRC checksum
b.readbits(16)
out = []
while True:
lastbit = b.readbits(1)
blocktype = b.readbits(2)
if blocktype == 0:
b.align()
length = b.readbits(16)
if length & b.readbits(16):
raise Exception("stored block lengths do not match each other")
for _i in range(length):
out.append(int2byte(b.readbits(8)))
elif blocktype == 1 or blocktype == 2: # Huffman
main_literals, main_distances = None, None
if blocktype == 1: # Static Huffman
static_huffman_bootstrap = [
(0, 8),
(144, 9),
(256, 7),
(280, 8),
(288, -1),
]
static_huffman_lengths_bootstrap = [(0, 5), (32, -1)]
main_literals = HuffmanTable(static_huffman_bootstrap)
main_distances = HuffmanTable(static_huffman_lengths_bootstrap)
elif blocktype == 2: # Dynamic Huffman
literals = b.readbits(5) + 257
distances = b.readbits(5) + 1
code_lengths_length = b.readbits(4) + 4
lengths = [0] * 19
for i in range(code_lengths_length):
lengths[code_length_orders(i)] = b.readbits(3)
dynamic_codes = OrderedHuffmanTable(lengths)
dynamic_codes.populate_huffman_symbols()
dynamic_codes.min_max_bits()
# Decode the code_lengths for both tables at once,
# then split the list later
code_lengths = []
n = 0
while n < (literals + distances):
r = dynamic_codes.find_next_symbol(b)
if 0 <= r <= 15: # literal bitlength for this code
count = 1
what = r
elif r == 16: # repeat last code
count = 3 + b.readbits(2)
# Is this supposed to default to '0' if in the zeroth
# position?
what = code_lengths[-1]
elif r == 17: # repeat zero
count = 3 + b.readbits(3)
what = 0
elif r == 18: # repeat zero lots
count = 11 + b.readbits(7)
what = 0
else:
raise Exception(
"next code length is outside of the range 0 <= r <= 18"
)
code_lengths += [what] * count
n += count
main_literals = OrderedHuffmanTable(code_lengths[:literals])
main_distances = OrderedHuffmanTable(code_lengths[literals:])
# Common path for both Static and Dynamic Huffman decode now
main_literals.populate_huffman_symbols()
main_distances.populate_huffman_symbols()
main_literals.min_max_bits()
main_distances.min_max_bits()
literal_count = 0
while True:
r = main_literals.find_next_symbol(b)
if 0 <= r <= 255:
literal_count += 1
out.append(int2byte(r))
elif r == 256:
if literal_count > 0:
literal_count = 0
break
elif 257 <= r <= 285: # dictionary lookup
if literal_count > 0:
literal_count = 0
length_extra = b.readbits(extra_length_bits(r))
length = length_base(r) + length_extra
r1 = main_distances.find_next_symbol(b)
if 0 <= r1 <= 29:
distance = distance_base(r1) + b.readbits(
extra_distance_bits(r1)
)
while length > distance:
out += out[-distance:]
length -= distance
if length == distance:
out += out[-distance:]
else:
out += out[-distance : length - distance]
elif 30 <= r1 <= 31:
raise Exception(
"illegal unused distance symbol " "in use @%r" % b.tell()
)
elif 286 <= r <= 287:
raise Exception(
"illegal unused literal/length symbol " "in use @%r" % b.tell()
)
elif blocktype == 3:
raise Exception("illegal unused blocktype in use @%r" % b.tell())
if lastbit:
break
b.align()
b.readbits(32) # crc
b.readbits(32) # final_length
return "".join(out)