blob: 6252b46ae6fd3f27a1e63fcacfe86f0f6cecc272 [file] [log] [blame]
Scott Bakered4efab2020-01-13 19:12:25 -08001// Package zstd provides decompression of zstandard files.
2//
3// For advanced usage and examples, go to the README: https://github.com/klauspost/compress/tree/master/zstd#zstd
4package zstd
5
6import (
David K. Bainbridgebd6b2882021-08-26 13:31:02 +00007 "bytes"
Scott Bakered4efab2020-01-13 19:12:25 -08008 "errors"
9 "log"
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000010 "math"
balaji.nagarajan8a2a7ee2026-06-19 22:31:13 +053011
12 "github.com/klauspost/compress/internal/le"
Scott Bakered4efab2020-01-13 19:12:25 -080013)
14
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000015// enable debug printing
Scott Bakered4efab2020-01-13 19:12:25 -080016const debug = false
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000017
Akash Reddy Kankanalac0014632025-05-21 17:12:20 +053018// enable encoding debug printing
19const debugEncoder = debug
20
21// enable decoding debug printing
22const debugDecoder = debug
23
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000024// Enable extra assertions.
25const debugAsserts = debug || false
26
27// print sequence details
Scott Bakered4efab2020-01-13 19:12:25 -080028const debugSequences = false
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000029
30// print detailed matching information
Scott Bakered4efab2020-01-13 19:12:25 -080031const debugMatches = false
32
33// force encoder to use predefined tables.
34const forcePreDef = false
35
36// zstdMinMatch is the minimum zstd match length.
37const zstdMinMatch = 3
38
Akash Reddy Kankanalac0014632025-05-21 17:12:20 +053039// fcsUnknown is used for unknown frame content size.
40const fcsUnknown = math.MaxUint64
41
Scott Bakered4efab2020-01-13 19:12:25 -080042var (
43 // ErrReservedBlockType is returned when a reserved block type is found.
44 // Typically this indicates wrong or corrupted input.
45 ErrReservedBlockType = errors.New("invalid input: reserved block type encountered")
46
47 // ErrCompressedSizeTooBig is returned when a block is bigger than allowed.
48 // Typically this indicates wrong or corrupted input.
49 ErrCompressedSizeTooBig = errors.New("invalid input: compressed size too big")
50
51 // ErrBlockTooSmall is returned when a block is too small to be decoded.
52 // Typically returned on invalid input.
53 ErrBlockTooSmall = errors.New("block too small")
54
Akash Reddy Kankanalac0014632025-05-21 17:12:20 +053055 // ErrUnexpectedBlockSize is returned when a block has unexpected size.
56 // Typically returned on invalid input.
57 ErrUnexpectedBlockSize = errors.New("unexpected block size")
58
Scott Bakered4efab2020-01-13 19:12:25 -080059 // ErrMagicMismatch is returned when a "magic" number isn't what is expected.
60 // Typically this indicates wrong or corrupted input.
61 ErrMagicMismatch = errors.New("invalid input: magic number mismatch")
62
63 // ErrWindowSizeExceeded is returned when a reference exceeds the valid window size.
64 // Typically this indicates wrong or corrupted input.
65 ErrWindowSizeExceeded = errors.New("window size exceeded")
66
67 // ErrWindowSizeTooSmall is returned when no window size is specified.
68 // Typically this indicates wrong or corrupted input.
69 ErrWindowSizeTooSmall = errors.New("invalid input: window size was too small")
70
71 // ErrDecoderSizeExceeded is returned if decompressed size exceeds the configured limit.
72 ErrDecoderSizeExceeded = errors.New("decompressed size exceeds configured limit")
73
74 // ErrUnknownDictionary is returned if the dictionary ID is unknown.
Scott Bakered4efab2020-01-13 19:12:25 -080075 ErrUnknownDictionary = errors.New("unknown dictionary")
76
77 // ErrFrameSizeExceeded is returned if the stated frame size is exceeded.
78 // This is only returned if SingleSegment is specified on the frame.
79 ErrFrameSizeExceeded = errors.New("frame size exceeded")
80
Akash Reddy Kankanalac0014632025-05-21 17:12:20 +053081 // ErrFrameSizeMismatch is returned if the stated frame size does not match the expected size.
82 // This is only returned if SingleSegment is specified on the frame.
83 ErrFrameSizeMismatch = errors.New("frame size does not match size on stream")
84
Scott Bakered4efab2020-01-13 19:12:25 -080085 // ErrCRCMismatch is returned if CRC mismatches.
86 ErrCRCMismatch = errors.New("CRC check failed")
87
88 // ErrDecoderClosed will be returned if the Decoder was used after
89 // Close has been called.
90 ErrDecoderClosed = errors.New("decoder used after Close")
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000091
balaji.nagarajan8a2a7ee2026-06-19 22:31:13 +053092 // ErrEncoderClosed will be returned if the Encoder was used after
93 // Close has been called.
94 ErrEncoderClosed = errors.New("encoder used after Close")
95
David K. Bainbridgebd6b2882021-08-26 13:31:02 +000096 // ErrDecoderNilInput is returned when a nil Reader was provided
97 // and an operation other than Reset/DecodeAll/Close was attempted.
98 ErrDecoderNilInput = errors.New("nil input provided as reader")
Scott Bakered4efab2020-01-13 19:12:25 -080099)
100
101func println(a ...interface{}) {
Akash Reddy Kankanalac0014632025-05-21 17:12:20 +0530102 if debug || debugDecoder || debugEncoder {
Scott Bakered4efab2020-01-13 19:12:25 -0800103 log.Println(a...)
104 }
105}
106
107func printf(format string, a ...interface{}) {
Akash Reddy Kankanalac0014632025-05-21 17:12:20 +0530108 if debug || debugDecoder || debugEncoder {
Scott Bakered4efab2020-01-13 19:12:25 -0800109 log.Printf(format, a...)
110 }
111}
112
Scott Bakered4efab2020-01-13 19:12:25 -0800113func load3232(b []byte, i int32) uint32 {
balaji.nagarajan8a2a7ee2026-06-19 22:31:13 +0530114 return le.Load32(b, i)
Scott Bakered4efab2020-01-13 19:12:25 -0800115}
116
117func load6432(b []byte, i int32) uint64 {
balaji.nagarajan8a2a7ee2026-06-19 22:31:13 +0530118 return le.Load64(b, i)
Scott Bakered4efab2020-01-13 19:12:25 -0800119}
David K. Bainbridgebd6b2882021-08-26 13:31:02 +0000120
121type byter interface {
122 Bytes() []byte
123 Len() int
124}
125
126var _ byter = &bytes.Buffer{}