aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/xz/dec_xz.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-07-25 14:03:03 +0900
committerOphestra <cat@gensokyo.uk>2026-07-25 14:03:34 +0900
commite5abf51296fa1405c4a6314eafc1b97d247c5b60 (patch)
tree8e54f3a684dd0b875756b3a4eca13cd79ab695f1 /internal/xz/dec_xz.go
parente26914cd6f86341daff4c3d7282d9a8cf8e4611a (diff)
internal/pkg: decompress xz streams
This uses a port of the public domain xz implementation. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/xz/dec_xz.go')
-rw-r--r--internal/xz/dec_xz.go124
1 files changed, 124 insertions, 0 deletions
diff --git a/internal/xz/dec_xz.go b/internal/xz/dec_xz.go
new file mode 100644
index 00000000..1b18a838
--- /dev/null
+++ b/internal/xz/dec_xz.go
@@ -0,0 +1,124 @@
+/*
+ * XZ decompressor
+ *
+ * Authors: Lasse Collin <lasse.collin@tukaani.org>
+ * Igor Pavlov <http://7-zip.org/>
+ *
+ * Translation to Go: Michael Cross <https://github.com/xi2>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+package xz
+
+/* from linux/include/linux/xz.h **************************************/
+
+/**
+ * xzRet - Return codes
+ * @xzOK: Everything is OK so far. More input or more
+ * output space is required to continue.
+ * @xzStreamEnd: Operation finished successfully.
+ * @xzUnSupportedCheck: Integrity check type is not supported. Decoding
+ * is still possible by simply calling xzDecRun
+ * again.
+ * @xzMemlimitError: A bigger LZMA2 dictionary would be needed than
+ * allowed by the dictMax argument given to
+ * xzDecInit.
+ * @xzFormatError: File format was not recognized (wrong magic
+ * bytes).
+ * @xzOptionsError: This implementation doesn't support the requested
+ * compression options. In the decoder this means
+ * that the header CRC32 matches, but the header
+ * itself specifies something that we don't support.
+ * @xzDataError: Compressed data is corrupt.
+ * @xzBufError: Cannot make any progress.
+ *
+ * xzBufError is returned when two consecutive calls to XZ code cannot
+ * consume any input and cannot produce any new output. This happens
+ * when there is no new input available, or the output buffer is full
+ * while at least one output byte is still pending. Assuming your code
+ * is not buggy, you can get this error only when decoding a
+ * compressed stream that is truncated or otherwise corrupt.
+ */
+type xzRet int
+
+const (
+ xzOK xzRet = iota
+ xzStreamEnd
+ xzUnsupportedCheck
+ xzMemlimitError
+ xzFormatError
+ xzOptionsError
+ xzDataError
+ xzBufError
+)
+
+/**
+ * xzBuf - Passing input and output buffers to XZ code
+ * @in: Input buffer.
+ * @inPos: Current position in the input buffer. This must not exceed
+ * input buffer size.
+ * @out: Output buffer.
+ * @outPos: Current position in the output buffer. This must not exceed
+ * output buffer size.
+ *
+ * Only the contents of the output buffer from out[outPos] onward, and
+ * the variables inPos and outPos are modified by the XZ code.
+ */
+type xzBuf struct {
+ in []byte
+ inPos int
+ out []byte
+ outPos int
+}
+
+/* All XZ filter IDs */
+type xzFilterID int64
+
+const (
+ idDelta xzFilterID = 0x03
+ idBCJX86 xzFilterID = 0x04
+ idBCJPowerPC xzFilterID = 0x05
+ idBCJIA64 xzFilterID = 0x06
+ idBCJARM xzFilterID = 0x07
+ idBCJARMThumb xzFilterID = 0x08
+ idBCJSPARC xzFilterID = 0x09
+ idLZMA2 xzFilterID = 0x21
+)
+
+// CheckID is the type of the data integrity check in an XZ stream
+// calculated from the uncompressed data.
+type CheckID int
+
+func (id CheckID) String() string {
+ switch id {
+ case CheckNone:
+ return "None"
+ case CheckCRC32:
+ return "CRC32"
+ case CheckCRC64:
+ return "CRC64"
+ case CheckSHA256:
+ return "SHA256"
+ default:
+ return "Unknown"
+ }
+}
+
+const (
+ CheckNone CheckID = 0x00
+ CheckCRC32 CheckID = 0x01
+ CheckCRC64 CheckID = 0x04
+ CheckSHA256 CheckID = 0x0A
+ checkMax CheckID = 0x0F
+ checkUnset CheckID = -1
+)
+
+// An XZ stream contains a stream header which holds information about
+// the stream. That information is exposed as fields of the
+// Reader. Currently it contains only the stream's data integrity
+// check type.
+type Header struct {
+ CheckType CheckID // type of the stream's data integrity check
+}