forked from Shiloh/githaven
12a1f914f4
* update github.com/alecthomas/chroma v0.8.0 -> v0.8.1 * github.com/blevesearch/bleve v1.0.10 -> v1.0.12 * editorconfig-core-go v2.1.1 -> v2.3.7 * github.com/gliderlabs/ssh v0.2.2 -> v0.3.1 * migrate editorconfig.ParseBytes to Parse * github.com/shurcooL/vfsgen to 0d455de96546 * github.com/go-git/go-git/v5 v5.1.0 -> v5.2.0 * github.com/google/uuid v1.1.1 -> v1.1.2 * github.com/huandu/xstrings v1.3.0 -> v1.3.2 * github.com/klauspost/compress v1.10.11 -> v1.11.1 * github.com/markbates/goth v1.61.2 -> v1.65.0 * github.com/mattn/go-sqlite3 v1.14.0 -> v1.14.4 * github.com/mholt/archiver v3.3.0 -> v3.3.2 * github.com/microcosm-cc/bluemonday 4f7140c49acb -> v1.0.4 * github.com/minio/minio-go v7.0.4 -> v7.0.5 * github.com/olivere/elastic v7.0.9 -> v7.0.20 * github.com/urfave/cli v1.20.0 -> v1.22.4 * github.com/prometheus/client_golang v1.1.0 -> v1.8.0 * github.com/xanzy/go-gitlab v0.37.0 -> v0.38.1 * mvdan.cc/xurls v2.1.0 -> v2.2.0 Co-authored-by: Lauris BH <lauris@nix.lv>
119 lines
3.2 KiB
Go
Vendored
119 lines
3.2 KiB
Go
Vendored
package brotli
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
const (
|
|
BestSpeed = 0
|
|
BestCompression = 11
|
|
DefaultCompression = 6
|
|
)
|
|
|
|
// WriterOptions configures Writer.
|
|
type WriterOptions struct {
|
|
// Quality controls the compression-speed vs compression-density trade-offs.
|
|
// The higher the quality, the slower the compression. Range is 0 to 11.
|
|
Quality int
|
|
// LGWin is the base 2 logarithm of the sliding window size.
|
|
// Range is 10 to 24. 0 indicates automatic configuration based on Quality.
|
|
LGWin int
|
|
}
|
|
|
|
var (
|
|
errEncode = errors.New("brotli: encode error")
|
|
errWriterClosed = errors.New("brotli: Writer is closed")
|
|
)
|
|
|
|
// Writes to the returned writer are compressed and written to dst.
|
|
// It is the caller's responsibility to call Close on the Writer when done.
|
|
// Writes may be buffered and not flushed until Close.
|
|
func NewWriter(dst io.Writer) *Writer {
|
|
return NewWriterLevel(dst, DefaultCompression)
|
|
}
|
|
|
|
// NewWriterLevel is like NewWriter but specifies the compression level instead
|
|
// of assuming DefaultCompression.
|
|
// The compression level can be DefaultCompression or any integer value between
|
|
// BestSpeed and BestCompression inclusive.
|
|
func NewWriterLevel(dst io.Writer, level int) *Writer {
|
|
return NewWriterOptions(dst, WriterOptions{
|
|
Quality: level,
|
|
})
|
|
}
|
|
|
|
// NewWriterOptions is like NewWriter but specifies WriterOptions
|
|
func NewWriterOptions(dst io.Writer, options WriterOptions) *Writer {
|
|
w := new(Writer)
|
|
w.options = options
|
|
w.Reset(dst)
|
|
return w
|
|
}
|
|
|
|
// Reset discards the Writer's state and makes it equivalent to the result of
|
|
// its original state from NewWriter or NewWriterLevel, but writing to dst
|
|
// instead. This permits reusing a Writer rather than allocating a new one.
|
|
func (w *Writer) Reset(dst io.Writer) {
|
|
encoderInitState(w)
|
|
w.params.quality = w.options.Quality
|
|
if w.options.LGWin > 0 {
|
|
w.params.lgwin = uint(w.options.LGWin)
|
|
}
|
|
w.dst = dst
|
|
}
|
|
|
|
func (w *Writer) writeChunk(p []byte, op int) (n int, err error) {
|
|
if w.dst == nil {
|
|
return 0, errWriterClosed
|
|
}
|
|
if w.err != nil {
|
|
return 0, w.err
|
|
}
|
|
|
|
for {
|
|
availableIn := uint(len(p))
|
|
nextIn := p
|
|
success := encoderCompressStream(w, op, &availableIn, &nextIn)
|
|
bytesConsumed := len(p) - int(availableIn)
|
|
p = p[bytesConsumed:]
|
|
n += bytesConsumed
|
|
if !success {
|
|
return n, errEncode
|
|
}
|
|
|
|
if len(p) == 0 || w.err != nil {
|
|
return n, w.err
|
|
}
|
|
}
|
|
}
|
|
|
|
// Flush outputs encoded data for all input provided to Write. The resulting
|
|
// output can be decoded to match all input before Flush, but the stream is
|
|
// not yet complete until after Close.
|
|
// Flush has a negative impact on compression.
|
|
func (w *Writer) Flush() error {
|
|
_, err := w.writeChunk(nil, operationFlush)
|
|
return err
|
|
}
|
|
|
|
// Close flushes remaining data to the decorated writer.
|
|
func (w *Writer) Close() error {
|
|
// If stream is already closed, it is reported by `writeChunk`.
|
|
_, err := w.writeChunk(nil, operationFinish)
|
|
w.dst = nil
|
|
return err
|
|
}
|
|
|
|
// Write implements io.Writer. Flush or Close must be called to ensure that the
|
|
// encoded bytes are actually flushed to the underlying Writer.
|
|
func (w *Writer) Write(p []byte) (n int, err error) {
|
|
return w.writeChunk(p, operationProcess)
|
|
}
|
|
|
|
type nopCloser struct {
|
|
io.Writer
|
|
}
|
|
|
|
func (nopCloser) Close() error { return nil }
|