view lib/python/unpackz.py @ 242:e117424e244a

cleaned up indentation to 2 spaces throughout
author Henry S. Thompson <ht@inf.ed.ac.uk>
date Wed, 02 Oct 2024 11:09:58 +0100
parents 96021cfee209
children
line wrap: on
line source

#!/usr/bin/env python3
'''See https://stackoverflow.com/a/37042747/2595465
Usage: unpackz.py [-o response-out-file][-b buffer-size]
'''
import sys
import isal.isal_zlib
offset = 0
obuf_len = 0
nbuf = lastbuf = False
BUFSIZE = 1048576
outfile = None
if sys.argv[1] == '-o':
  sys.argv.pop(1)
  if len(sys.argv)>=3:
    outfile = open(sys.argv.pop(1),'wb')
  else:
    print('need an outfile', file=sys.stderr)
    exit(1)
if sys.argv[1] == '-b':
  sys.argv.pop(1)
  if len(sys.argv)==3:
    BUFSIZE = int(sys.argv.pop(1))
  else:
    print('need a buffer length', file=sys.stderr)
    exit(2)

with open(sys.argv[1],'rb') as f:
  z = isal.isal_zlib.decompressobj(31)
  count = 0
  while True:
    if z.unused_data == b"": 
        #print('n', obuf_len, file=sys.stderr)
      if lastbuf:  # buf == b"":
        if outfile is None:
          print(obuf_len, offset)
        else:
          outfile.write(b'\000%d\000%d\000'%(obuf_len, offset))
        if count!=0:
          print("Unused data: count=%s offset=%s ?"%(count, offset),
                file=sys.stderr)
        break
      if nbuf:
        obuf_len += BUFSIZE # still no EOS after a full buffer processed
      buf = f.read(BUFSIZE)
      nbuf = True
      lastbuf = ((truesize:=len(buf)) < BUFSIZE) # will only succeed if now at EOF
    else:
      buf_len = len(buf)
      #print('b', obuf_len, buf_len, len(z.unused_data), len(buf)-len(z.unused_data),
      #      nbuf, lastbuf, file=sys.stderr)
      count = (obuf_len if (buf_len == truesize) else 0) + \
              (len(buf)-len(z.unused_data))
      if outfile is None:
        print(count, offset)
      else:
        outfile.write(b'\000%d\000%d\000'%(count, offset))
      #if (offset == 1352249):
      #  breakpoint()
      offset += count
      count = 0
      buf = z.unused_data
      obuf_len = len(buf)
      nbuf = False
      z = isal.isal_zlib.decompressobj(31)
    got = z.decompress(buf)
    if outfile is not None:
      outfile.write(got)
if outfile is not None:
  outfile.close()