@@ -5808,88 +5808,131 @@ def CheckCompressionTypeFromBytes(instring, formatspecs=__file_format_multi_dict
58085808 return CheckCompressionType(instringsfile, formatspecs, filestart, closefp)
58095809
58105810
5811- def UncompressFileAlt(fp, formatspecs=__file_format_multi_dict__, filestart=0):
5812- if(not hasattr(fp, "read")):
5811+ def UncompressFileAlt(fp, formatspecs=__file_format_multi_dict__, filestart=0,
5812+ use_mmap=False):
5813+ """
5814+ Accepts an already-open *bytes* file-like (fp). Detects compression and
5815+ returns a FileLikeAdapter opened for 'rb'. If the stream is uncompressed
5816+ and backed by a real file, you can enable mmap via use_mmap=True.
5817+ """
5818+ if not hasattr(fp, "read"):
58135819 return False
5820+
5821+ # Detect format on the fileobj at filestart
58145822 compresscheck = CheckCompressionType(fp, formatspecs, filestart, False)
5815- if( IsNestedDict(formatspecs) and compresscheck in formatspecs) :
5823+ if IsNestedDict(formatspecs) and compresscheck in formatspecs:
58165824 formatspecs = formatspecs[compresscheck]
5817- if(compresscheck == "gzip" and compresscheck in compressionsupport):
5825+
5826+ # Build the appropriate decompressor stream (or pass-through)
5827+ if (compresscheck == "gzip" and compresscheck in compressionsupport):
58185828 fp = gzip.GzipFile(fileobj=fp, mode="rb")
5819- elif(compresscheck == "bzip2" and compresscheck in compressionsupport):
5829+ elif (compresscheck == "bzip2" and compresscheck in compressionsupport):
58205830 fp = bz2.BZ2File(fp)
5821- elif(compresscheck == "zstd" and compresscheck in compressionsupport):
5831+ elif (compresscheck == "zstd" and compresscheck in compressionsupport):
58225832 if 'zstandard' in sys.modules:
58235833 fp = ZstdFile(fileobj=fp, mode="rb")
58245834 elif 'pyzstd' in sys.modules:
58255835 fp = pyzstd.zstdfile.ZstdFile(fileobj=fp, mode="rb")
58265836 else:
5827- return Flase
5828- elif(compresscheck == "lz4" and compresscheck in compressionsupport):
5837+ return False
5838+ elif (compresscheck == "lz4" and compresscheck in compressionsupport):
58295839 fp = lz4.frame.LZ4FrameFile(fp, mode='rb')
5830- elif((compresscheck == "lzo" or compresscheck == "lzop") and compresscheck in compressionsupport):
5840+ elif ((compresscheck == "lzo" or compresscheck == "lzop") and compresscheck in compressionsupport):
58315841 fp = LzopFile(fileobj=fp, mode="rb")
5832- elif((compresscheck == "lzma" or compresscheck == "xz") and compresscheck in compressionsupport):
5842+ elif ((compresscheck == "lzma" or compresscheck == "xz") and compresscheck in compressionsupport):
58335843 fp = lzma.LZMAFile(fp)
5834- elif(compresscheck == "zlib" and compresscheck in compressionsupport):
5844+ elif (compresscheck == "zlib" and compresscheck in compressionsupport):
58355845 fp = ZlibFile(fileobj=fp, mode="rb")
5836- elif(compresscheck == formatspecs['format_magic']):
5837- fp = fp
5838- elif(not compresscheck):
5846+ else:
5847+ # Either magic matched your format OR no compression detected:
5848+ # pass-through original fp.
5849+ fp.seek(filestart, 0)
5850+
5851+ # Wrap in FileLikeAdapter; optionally mmap only if uncompressed + real file
5852+ mm = None
5853+ if use_mmap and compresscheck in (None, formatspecs.get('format_magic', None)):
5854+ base = _extract_base_fp(fp)
58395855 try:
5840- fp = lz4.frame.LZ4FrameFile(fp, mode='rb')
5841- except lzma.LZMAError:
5842- return False
5843- if(compresscheck != formatspecs['format_magic']):
5844- fp.close()
5845- return fp
5856+ if base is not None:
5857+ # Map whole file for read-only; keep base open via adapter
5858+ mm = mmap.mmap(base.fileno(), 0, access=mmap.ACCESS_READ)
5859+ except Exception:
5860+ mm = None # silently fall back to streaming
58465861
5862+ # Always position at start of logical stream
5863+ try:
5864+ fp.seek(0, 0)
5865+ except Exception:
5866+ pass
5867+
5868+ return FileLikeAdapter(fp, mode="rb", mm=mm)
58475869
5848- def UncompressFile(infile, formatspecs=__file_format_multi_dict__, mode="rb", filestart=0):
5870+ def UncompressFile(infile, formatspecs=__file_format_multi_dict__, mode="rb",
5871+ filestart=0, use_mmap=False):
5872+ """
5873+ Opens a path, detects compression by header, and returns a FileLikeAdapter.
5874+ If uncompressed and use_mmap=True, returns an mmap-backed reader.
5875+ """
58495876 compresscheck = CheckCompressionType(infile, formatspecs, filestart, False)
5850- if( IsNestedDict(formatspecs) and compresscheck in formatspecs) :
5877+ if IsNestedDict(formatspecs) and compresscheck in formatspecs:
58515878 formatspecs = formatspecs[compresscheck]
5852- if(sys.version_info[0] == 2 and compresscheck):
5853- if(mode == "rt"):
5854- mode = "r"
5855- elif(mode == "wt"):
5856- mode = "w"
5879+
5880+ # Python 2 text-mode fixups if needed (though you're bytes-only)
5881+ if sys.version_info[0] == 2 and compresscheck:
5882+ if mode == "rt": mode = "r"
5883+ elif mode == "wt": mode = "w"
5884+
58575885 try:
5858- if(compresscheck == "gzip" and compresscheck in compressionsupport):
5859- if sys.version_info[0] == 2:
5860- filefp = GzipFile(infile, mode=mode)
5861- else:
5862- filefp = gzip.open(infile, mode)
5863- elif(compresscheck == "bzip2" and compresscheck in compressionsupport):
5864- filefp = bz2.open(infile, mode)
5865- elif(compresscheck == "zstd" and compresscheck in compressionsupport):
5886+ # Compressed branches
5887+ if (compresscheck == "gzip" and "gzip" in compressionsupport):
5888+ fp = GzipFile(infile, mode=mode) if sys.version_info[0] == 2 else gzip.open(infile, mode)
5889+ elif (compresscheck == "bzip2" and "bzip2" in compressionsupport):
5890+ fp = bz2.open(infile, mode)
5891+ elif (compresscheck == "zstd" and "zstandard" in compressionsupport):
58665892 if 'zstandard' in sys.modules:
5867- filefp = ZstdFile(infile, mode=mode)
5893+ fp = ZstdFile(infile, mode=mode)
58685894 elif 'pyzstd' in sys.modules:
5869- filefp = pyzstd.zstdfile.ZstdFile(infile, mode=mode)
5895+ fp = pyzstd.zstdfile.ZstdFile(infile, mode=mode)
58705896 else:
5871- return Flase
5872- elif(compresscheck == "lz4" and compresscheck in compressionsupport):
5873- filefp = lz4.frame.open(infile, mode)
5874- elif((compresscheck == "lzo" or compresscheck == "lzop") and compresscheck in compressionsupport):
5875- filefp = LzopFile(infile, mode=mode)
5876- elif((compresscheck == "lzma" or compresscheck == "xz") and compresscheck in compressionsupport):
5877- filefp = lzma.open(infile, mode)
5878- elif(compresscheck == "zlib" and compresscheck in compressionsupport):
5879- filefp = ZlibFile(infile, mode=mode)
5880- elif(compresscheck == formatspecs['format_magic']):
5881- filefp = open(infile, mode)
5882- elif(not compresscheck):
5883- filefp = open(infile, mode)
5884- else:
5885- filefp = open(infile, mode)
5897+ return False
5898+ elif (compresscheck == "lz4" and "lz4" in compressionsupport):
5899+ fp = lz4.frame.open(infile, mode)
5900+ elif ((compresscheck == "lzo" or compresscheck == "lzop") and "lzop" in compressionsupport):
5901+ fp = LzopFile(infile, mode=mode)
5902+ elif ((compresscheck == "lzma" or compresscheck == "xz") and "xz" in compressionsupport):
5903+ fp = lzma.open(infile, mode)
5904+ elif (compresscheck == "zlib" and "zlib" in compressionsupport):
5905+ fp = ZlibFile(infile, mode=mode)
5906+
5907+ # Uncompressed (or unknown): open plain file
5908+ else:
5909+ fp = open(infile, mode)
5910+
58865911 except FileNotFoundError:
58875912 return False
5913+
5914+ # For uncompressed: optional mmap
5915+ mm = None
5916+ if use_mmap and (compresscheck is None or compresscheck == formatspecs.get('format_magic', None)):
5917+ try:
5918+ base = _extract_base_fp(fp)
5919+ if base is not None:
5920+ mm = mmap.mmap(base.fileno(), 0, access=mmap.ACCESS_READ if "r" in mode else mmap.ACCESS_WRITE)
5921+ except Exception:
5922+ mm = None # fallback to normal file stream
5923+
5924+ # Position to filestart if caller requested it (mainly for fileobj-based headers)
58885925 try:
5889- filefp.write_through = True
5890- except AttributeError :
5926+ fp.seek(0 if compresscheck else filestart, 0)
5927+ except Exception :
58915928 pass
5892- return filefp
5929+
5930+ out = FileLikeAdapter(fp, mode="rb" if "r" in mode else "wb", mm=mm)
5931+ try:
5932+ out.write_through = True
5933+ except Exception:
5934+ pass
5935+ return out
58935936
58945937
58955938def UncompressString(infile, formatspecs=__file_format_multi_dict__, filestart=0):
0 commit comments