diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-07-25 14:03:03 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-07-25 14:03:34 +0900 |
| commit | e5abf51296fa1405c4a6314eafc1b97d247c5b60 (patch) | |
| tree | 8e54f3a684dd0b875756b3a4eca13cd79ab695f1 /internal/xz/dec_delta.go | |
| parent | e26914cd6f86341daff4c3d7282d9a8cf8e4611a (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.go | 55 |
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 +} |
