github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/internal/zstd/zstd.go (about) 1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package zstd provides a decompressor for zstd streams, 6 // described in RFC 8878. It does not support dictionaries. 7 package zstd 8 9 import ( 10 "github.com/shogo82148/std/io" 11 ) 12 13 // Reader implements [io.Reader] to read a zstd compressed stream. 14 type Reader struct { 15 // The underlying Reader. 16 r io.Reader 17 18 // Whether we have read the frame header. 19 // This is of interest when buffer is empty. 20 // If true we expect to see a new block. 21 sawFrameHeader bool 22 23 // Whether the current frame expects a checksum. 24 hasChecksum bool 25 26 // Whether we have read at least one frame. 27 readOneFrame bool 28 29 // True if the frame size is not known. 30 frameSizeUnknown bool 31 32 // The number of uncompressed bytes remaining in the current frame. 33 // If frameSizeUnknown is true, this is not valid. 34 remainingFrameSize uint64 35 36 // The number of bytes read from r up to the start of the current 37 // block, for error reporting. 38 blockOffset int64 39 40 // Buffered decompressed data. 41 buffer []byte 42 // Current read offset in buffer. 43 off int 44 45 // The current repeated offsets. 46 repeatedOffset1 uint32 47 repeatedOffset2 uint32 48 repeatedOffset3 uint32 49 50 // The current Huffman tree used for compressing literals. 51 huffmanTable []uint16 52 huffmanTableBits int 53 54 // The window for back references. 55 window window 56 57 // A buffer available to hold a compressed block. 58 compressedBuf []byte 59 60 // A buffer for literals. 61 literals []byte 62 63 // Sequence decode FSE tables. 64 seqTables [3][]fseBaselineEntry 65 seqTableBits [3]uint8 66 67 // Buffers for sequence decode FSE tables. 68 seqTableBuffers [3][]fseBaselineEntry 69 70 // Scratch space used for small reads, to avoid allocation. 71 scratch [16]byte 72 73 // A scratch table for reading an FSE. Only temporarily valid. 74 fseScratch []fseEntry 75 76 // For checksum computation. 77 checksum xxhash64 78 } 79 80 // NewReader creates a new Reader that decompresses data from the given reader. 81 func NewReader(input io.Reader) *Reader 82 83 // Reset discards the current state and starts reading a new stream from r. 84 // This permits reusing a Reader rather than allocating a new one. 85 func (r *Reader) Reset(input io.Reader) 86 87 // Read implements [io.Reader]. 88 func (r *Reader) Read(p []byte) (int, error) 89 90 // ReadByte implements [io.ByteReader]. 91 func (r *Reader) ReadByte() (byte, error)