aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/xz/dec_delta.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_delta.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_delta.go')
-rw-r--r--internal/xz/dec_delta.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/internal/xz/dec_delta.go b/internal/xz/dec_delta.go
new file mode 100644
index 00000000..19df5908
--- /dev/null
+++ b/internal/xz/dec_delta.go
@@ -0,0 +1,55 @@
+/*
+ * Delta decoder
+ *
+ * Author: Lasse Collin <lasse.collin@tukaani.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
+
+type xzDecDelta struct {
+ delta [256]byte
+ pos byte
+ distance int // in range [1, 256]
+}
+
+/*
+ * Decode raw stream which has a delta filter as the first filter.
+ */
+func xzDecDeltaRun(s *xzDecDelta, b *xzBuf, chain func(*xzBuf) xzRet) xzRet {
+ outStart := b.outPos
+ ret := chain(b)
+ for i := outStart; i < b.outPos; i++ {
+ tmp := b.out[i] + s.delta[byte(s.distance+int(s.pos))]
+ s.delta[s.pos] = tmp
+ b.out[i] = tmp
+ s.pos--
+ }
+ return ret
+}
+
+/*
+ * Allocate memory for a delta decoder. xzDecDeltaReset must be used
+ * before calling xzDecDeltaRun.
+ */
+func xzDecDeltaCreate() *xzDecDelta {
+ return new(xzDecDelta)
+}
+
+/*
+ * Returns xzOK if the given distance is valid. Otherwise
+ * xzOptionsError is returned.
+ */
+func xzDecDeltaReset(s *xzDecDelta, distance int) xzRet {
+ if distance < 1 || distance > 256 {
+ return xzOptionsError
+ }
+ s.delta = [256]byte{}
+ s.pos = 0
+ s.distance = distance
+ return xzOK
+}