shithub: furgit

Download patch

ref: 0a8c2632d02d19dc986f34f6ea457e4994977002
parent: 0cf065181404add5d6b1e6fc8bf5e93e761bd590
author: Runxi Yu <me@runxiyu.org>
date: Wed Mar 4 04:55:00 EST 2026

zlib: Split files

--- a/internal/zlib/reader.go
+++ b/internal/zlib/reader.go
@@ -34,7 +34,6 @@
 package zlib
 
 import (
-	"bufio"
 	"encoding/binary"
 	"errors"
 	"hash"
@@ -41,8 +40,6 @@
 	"io"
 	"sync"
 
-	"codeberg.org/lindenii/furgit/internal/adler32"
-
 	"github.com/klauspost/compress/flate"
 )
 
@@ -161,77 +158,6 @@
 	}
 
 	readerPool.Put(z)
-
-	return nil
-}
-
-func (z *reader) Reset(r io.Reader, dict []byte) error {
-	*z = reader{decompressor: z.decompressor}
-	if fr, ok := r.(flate.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 errors.Is(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
-	}
-
-	haveDict := z.scratch[1]&0x20 != 0
-	if haveDict {
-		_, z.err = io.ReadFull(z.r, z.scratch[0:4])
-		if z.err != nil {
-			if errors.Is(z.err, io.EOF) {
-				z.err = io.ErrUnexpectedEOF
-			}
-
-			return z.err
-		}
-
-		checksum := binary.BigEndian.Uint32(z.scratch[:4])
-		if checksum != adler32.Checksum(dict) {
-			z.err = ErrDictionary
-
-			return z.err
-		}
-	}
-
-	if z.decompressor != nil {
-		resetter, ok := z.decompressor.(flate.Resetter)
-		if !ok {
-			panic("zlib: pooled decompressor does not implement flate.Resetter")
-		}
-
-		z.err = resetter.Reset(z.r, dict)
-		if z.err != nil {
-			return z.err
-		}
-
-		z.digest = adler32.New()
-
-		return nil
-	}
-
-	if haveDict {
-		z.decompressor = flate.NewReaderDict(z.r, dict)
-	} else {
-		z.decompressor = flate.NewReader(z.r)
-	}
-
-	z.digest = adler32.New()
 
 	return nil
 }
--- /dev/null
+++ b/internal/zlib/reader_reset.go
@@ -1,0 +1,87 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zlib
+
+import (
+	"bufio"
+	"encoding/binary"
+	"errors"
+	"io"
+
+	"codeberg.org/lindenii/furgit/internal/adler32"
+
+	"github.com/klauspost/compress/flate"
+)
+
+func (z *reader) Reset(r io.Reader, dict []byte) error {
+	*z = reader{decompressor: z.decompressor}
+	if fr, ok := r.(flate.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 errors.Is(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
+	}
+
+	haveDict := z.scratch[1]&0x20 != 0
+	if haveDict {
+		_, z.err = io.ReadFull(z.r, z.scratch[0:4])
+		if z.err != nil {
+			if errors.Is(z.err, io.EOF) {
+				z.err = io.ErrUnexpectedEOF
+			}
+
+			return z.err
+		}
+
+		checksum := binary.BigEndian.Uint32(z.scratch[:4])
+		if checksum != adler32.Checksum(dict) {
+			z.err = ErrDictionary
+
+			return z.err
+		}
+	}
+
+	if z.decompressor != nil {
+		resetter, ok := z.decompressor.(flate.Resetter)
+		if !ok {
+			panic("zlib: pooled decompressor does not implement flate.Resetter")
+		}
+
+		z.err = resetter.Reset(z.r, dict)
+		if z.err != nil {
+			return z.err
+		}
+
+		z.digest = adler32.New()
+
+		return nil
+	}
+
+	if haveDict {
+		z.decompressor = flate.NewReaderDict(z.r, dict)
+	} else {
+		z.decompressor = flate.NewReader(z.r)
+	}
+
+	z.digest = adler32.New()
+
+	return nil
+}
--- a/internal/zlib/writer.go
+++ b/internal/zlib/writer.go
@@ -11,8 +11,6 @@
 	"io"
 	"sync"
 
-	"codeberg.org/lindenii/furgit/internal/adler32"
-
 	"github.com/klauspost/compress/flate"
 )
 
@@ -201,65 +199,6 @@
 	}
 
 	writerPool.Put(z)
-
-	return nil
-}
-
-// writeHeader writes the ZLIB header.
-func (z *Writer) writeHeader() (err error) {
-	z.wroteHeader = true
-	// ZLIB has a two-byte header (as documented in RFC 1950).
-	// The first four bits is the CINFO (compression info), which is 7 for the default deflate window size.
-	// The next four bits is the CM (compression method), which is 8 for deflate.
-	z.scratch[0] = 0x78
-	// The next two bits is the FLEVEL (compression level). The four values are:
-	// 0=fastest, 1=fast, 2=default, 3=best.
-	// The next bit, FDICT, is set if a dictionary is given.
-	// The final five FCHECK bits form a mod-31 checksum.
-	switch z.level {
-	case -2, 0, 1:
-		z.scratch[1] = 0 << 6
-	case 2, 3, 4, 5:
-		z.scratch[1] = 1 << 6
-	case 6, -1:
-		z.scratch[1] = 2 << 6
-	case 7, 8, 9:
-		z.scratch[1] = 3 << 6
-	default:
-		panic("unreachable")
-	}
-
-	if z.dict != nil {
-		z.scratch[1] |= 1 << 5
-	}
-
-	z.scratch[1] += uint8(31 - binary.BigEndian.Uint16(z.scratch[:2])%31) //#nosec G115
-
-	_, err = z.w.Write(z.scratch[0:2])
-	if err != nil {
-		return err
-	}
-
-	if z.dict != nil {
-		// The next four bytes are the Adler-32 checksum of the dictionary.
-		binary.BigEndian.PutUint32(z.scratch[:], adler32.Checksum(z.dict))
-
-		_, err = z.w.Write(z.scratch[0:4])
-		if err != nil {
-			return err
-		}
-	}
-
-	if z.compressor == nil {
-		// Initialize deflater unless the Writer is being reused
-		// after a Reset call.
-		z.compressor, err = flate.NewWriterDict(z.w, z.level, z.dict)
-		if err != nil {
-			return err
-		}
-
-		z.digest = adler32.New()
-	}
 
 	return nil
 }
--- /dev/null
+++ b/internal/zlib/writer_header.go
@@ -1,0 +1,72 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zlib
+
+import (
+	"encoding/binary"
+
+	"codeberg.org/lindenii/furgit/internal/adler32"
+
+	"github.com/klauspost/compress/flate"
+)
+
+// writeHeader writes the ZLIB header.
+func (z *Writer) writeHeader() (err error) {
+	z.wroteHeader = true
+	// ZLIB has a two-byte header (as documented in RFC 1950).
+	// The first four bits is the CINFO (compression info), which is 7 for the default deflate window size.
+	// The next four bits is the CM (compression method), which is 8 for deflate.
+	z.scratch[0] = 0x78
+	// The next two bits is the FLEVEL (compression level). The four values are:
+	// 0=fastest, 1=fast, 2=default, 3=best.
+	// The next bit, FDICT, is set if a dictionary is given.
+	// The final five FCHECK bits form a mod-31 checksum.
+	switch z.level {
+	case -2, 0, 1:
+		z.scratch[1] = 0 << 6
+	case 2, 3, 4, 5:
+		z.scratch[1] = 1 << 6
+	case 6, -1:
+		z.scratch[1] = 2 << 6
+	case 7, 8, 9:
+		z.scratch[1] = 3 << 6
+	default:
+		panic("unreachable")
+	}
+
+	if z.dict != nil {
+		z.scratch[1] |= 1 << 5
+	}
+
+	z.scratch[1] += uint8(31 - binary.BigEndian.Uint16(z.scratch[:2])%31) //#nosec G115
+
+	_, err = z.w.Write(z.scratch[0:2])
+	if err != nil {
+		return err
+	}
+
+	if z.dict != nil {
+		// The next four bytes are the Adler-32 checksum of the dictionary.
+		binary.BigEndian.PutUint32(z.scratch[:], adler32.Checksum(z.dict))
+
+		_, err = z.w.Write(z.scratch[0:4])
+		if err != nil {
+			return err
+		}
+	}
+
+	if z.compressor == nil {
+		// Initialize deflater unless the Writer is being reused
+		// after a Reset call.
+		z.compressor, err = flate.NewWriterDict(z.w, z.level, z.dict)
+		if err != nil {
+			return err
+		}
+
+		z.digest = adler32.New()
+	}
+
+	return nil
+}
--