diff options
| author | 2025-11-25 08:00:00 +0800 | |
|---|---|---|
| committer | 2025-11-25 08:00:00 +0800 | |
| commit | abaa7e2ba40b08b54a043762e98ce1e2f9418cd9 (patch) | |
| tree | f155a581b502aca012ef57cdb91a4845f46c2916 /internal | |
| parent | README: Remove internal todo list and put it in a separate file (diff) | |
| signature | No signature | |
zlibx: Remove unused cruft
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/zlibx/reader.go | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/internal/zlibx/reader.go b/internal/zlibx/reader.go index 6e3a53ea..161e3458 100644 --- a/internal/zlibx/reader.go +++ b/internal/zlibx/reader.go @@ -36,15 +36,7 @@ and to read that data back: package zlibx import ( - "bufio" - "encoding/binary" "errors" - "hash" - "io" - "sync" - - "git.sr.ht/~runxiyu/furgit/internal/adler32" - "git.sr.ht/~runxiyu/furgit/internal/flatex" ) const ( @@ -58,120 +50,3 @@ var ( // ErrHeader is returned when reading ZLIB data that has an invalid header. ErrHeader = errors.New("zlib: invalid header") ) - -var pool = sync.Pool{ - New: func() any { - r := new(reader) - return r - }, -} - -type reader struct { - r flatex.Reader - decompressor io.ReadCloser - digest hash.Hash32 - err error - scratch [4]byte -} - -// NewReader creates a new ReadCloser. -// Reads from the returned ReadCloser read and decompress data from r. -// If r does not implement [io.ByteReader], the decompressor may read more -// data than necessary from r. -// It is the caller's responsibility to call Close on the ReadCloser when done. -func NewReader(r io.Reader) (io.ReadCloser, error) { - v := pool.Get() - z, ok := v.(*reader) - if !ok { - panic("zlib: pool returned unexpected type") - } - err := z.Reset(r) - if err != nil { - return nil, err - } - return z, nil -} - -func (z *reader) Read(p []byte) (int, error) { - if z.err != nil { - return 0, z.err - } - - var n int - n, z.err = z.decompressor.Read(p) - z.digest.Write(p[0:n]) - if z.err != io.EOF { - // In the normal case we return here. - return n, z.err - } - - // Finished file; check checksum. - if _, err := io.ReadFull(z.r, z.scratch[0:4]); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - z.err = err - return n, z.err - } - // ZLIB (RFC 1950) is big-endian, unlike GZIP (RFC 1952). - checksum := binary.BigEndian.Uint32(z.scratch[:4]) - if checksum != z.digest.Sum32() { - z.err = ErrChecksum - return n, z.err - } - return n, io.EOF -} - -// Calling Close does not close the wrapped [io.Reader] originally passed to [NewReader]. -// In order for the ZLIB checksum to be verified, the reader must be -// fully consumed until the [io.EOF]. -func (z *reader) Close() error { - if z.err != nil && z.err != io.EOF { - return z.err - } - z.err = z.decompressor.Close() - if z.err != nil { - return z.err - } - - pool.Put(z) - return nil -} - -func (z *reader) Reset(r io.Reader) error { - *z = reader{decompressor: z.decompressor} - if fr, ok := r.(flatex.Reader); ok { - z.r = fr - } else { - z.r = bufio.NewReader(r) - } - - // Read the header (RFC 1950 section 2.2.). - _, z.err = io.ReadFull(z.r, z.scratch[0:2]) - if z.err != nil { - if z.err == io.EOF { - z.err = io.ErrUnexpectedEOF - } - return z.err - } - h := binary.BigEndian.Uint16(z.scratch[:2]) - if (z.scratch[0]&0x0f != zlibDeflate) || (z.scratch[0]>>4 > zlibMaxWindow) || (h%31 != 0) { - z.err = ErrHeader - return z.err - } - if z.scratch[1]&0x20 != 0 { - z.err = ErrHeader - return z.err - } - - if z.decompressor == nil { - z.decompressor = flatex.NewReader(z.r) - } else { - z.err = z.decompressor.(flatex.Resetter).Reset(z.r) - if z.err != nil { - return z.err - } - } - z.digest = adler32.New() - return nil -} |
