aboutsummaryrefslogtreecommitdiff
path: root/internal/flatex/decompress.go
blob: 065e23f33c42b9c8330ef6e79f8a8a2d078cd268 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package flatex

import (
	"io"

	"codeberg.org/lindenii/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()
		}
	}
}