view lib/python/unpackz.py @ 240:51bd09d4289e

eof pblms fixed, seems to work
author Henry S. Thompson <ht@inf.ed.ac.uk>
date Tue, 01 Oct 2024 15:59:26 +0100
parents 992f59d21832
children 96021cfee209
line wrap: on
line source

#!/usr/bin/env python3
'''See https://stackoverflow.com/a/37042747/2595465'''
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)
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()