diff options
| author | 2025-11-25 08:00:00 +0800 | |
|---|---|---|
| committer | 2025-11-25 08:00:00 +0800 | |
| commit | 94a6325ee646be4a06ca0646fcd797b2a9c74581 (patch) | |
| tree | 1b9dd5018a7c5871e9f8204b7b6899006ce1d4c7 /internal/flatex/decompress.go | |
| parent | flatex: Remove unused cruft (diff) | |
| signature | No signature | |
flatex: Restructure a little
Diffstat (limited to 'internal/flatex/decompress.go')
| -rw-r--r-- | internal/flatex/decompress.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/internal/flatex/decompress.go b/internal/flatex/decompress.go new file mode 100644 index 00000000..641b6e7a --- /dev/null +++ b/internal/flatex/decompress.go @@ -0,0 +1,38 @@ +package flatex + +import ( + "io" + + "git.sr.ht/~runxiyu/furgit/internal/bufpool" +) + +func DecompressSized(src []byte, sizeHint int) (bufpool.Buffer, int, error) { + d := sliceInflaterPool.Get().(*sliceInflater) + defer sliceInflaterPool.Put(d) + + if err := d.reset(src); err != nil { + return bufpool.Buffer{}, 0, err + } + + out := bufpool.Borrow(sizeHint) + out.Resize(0) + + for { + if len(d.toRead) > 0 { + out.Append(d.toRead) + d.toRead = nil + continue + } + if d.err != nil { + if d.err == io.EOF { + return out, d.pos, nil + } + out.Release() + return bufpool.Buffer{}, 0, d.err + } + d.step(d) + if d.err != nil && len(d.toRead) == 0 { + d.toRead = d.window.readFlush() + } + } +} |
