mattermost-community-enterp.../vendor/github.com/nwaples/rardecode/v2/decode20_lz.go
Claude ec1f89217a Merge: Complete Mattermost Server with Community Enterprise
Full Mattermost server source with integrated Community Enterprise features.
Includes vendor directory for offline/air-gapped builds.

Structure:
- enterprise-impl/: Enterprise feature implementations
- enterprise-community/: Init files that register implementations
- enterprise/: Bridge imports (community_imports.go)
- vendor/: All dependencies for offline builds

Build (online):
  go build ./cmd/mattermost

Build (offline/air-gapped):
  go build -mod=vendor ./cmd/mattermost

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 23:59:07 +09:00

151 lines
2.8 KiB
Go

package rardecode
const (
main20Size = 298
offset20Size = 48
length20Size = 28
)
type lz20Decoder struct {
length int // previous length
offset [4]int // history of previous offsets
mainDecoder huffmanDecoder
offsetDecoder huffmanDecoder
lengthDecoder huffmanDecoder
br *rarBitReader
}
func (d *lz20Decoder) init(br *rarBitReader, table []byte) error {
d.br = br
table = table[:main20Size+offset20Size+length20Size]
if err := readCodeLengthTable20(br, table); err != nil {
return err
}
d.mainDecoder.init(table[:main20Size])
table = table[main20Size:]
d.offsetDecoder.init(table[:offset20Size])
table = table[offset20Size:]
d.lengthDecoder.init(table)
return nil
}
func (d *lz20Decoder) decodeOffset(i int) error {
d.length = lengthBase[i] + 3
bits := lengthExtraBits[i]
if bits > 0 {
n, err := d.br.readBits(bits)
if err != nil {
return err
}
d.length += n
}
var err error
i, err = d.offsetDecoder.readSym(d.br)
if err != nil {
return err
}
offset := offsetBase[i] + 1
bits = offsetExtraBits[i]
if bits > 0 {
n, err := d.br.readBits(bits)
if err != nil {
return err
}
offset += n
}
if offset >= 0x2000 {
d.length++
if offset >= 0x40000 {
d.length++
}
}
copy(d.offset[1:], d.offset[:])
d.offset[0] = offset
return nil
}
func (d *lz20Decoder) decodeLength(i int) error {
offset := d.offset[i]
copy(d.offset[1:], d.offset[:])
d.offset[0] = offset
i, err := d.lengthDecoder.readSym(d.br)
if err != nil {
return err
}
d.length = lengthBase[i] + 2
bits := lengthExtraBits[i]
if bits > 0 {
var n int
n, err = d.br.readBits(bits)
if err != nil {
return err
}
d.length += n
}
if offset >= 0x101 {
d.length++
if offset >= 0x2000 {
d.length++
if offset >= 0x40000 {
d.length++
}
}
}
return nil
}
func (d *lz20Decoder) decodeShortOffset(i int) error {
copy(d.offset[1:], d.offset[:])
offset := shortOffsetBase[i] + 1
bits := shortOffsetExtraBits[i]
if bits > 0 {
n, err := d.br.readBits(bits)
if err != nil {
return err
}
offset += n
}
d.offset[0] = offset
d.length = 2
return nil
}
func (d *lz20Decoder) fill(dr *decodeReader, size int64) (int64, error) {
var n int64
for n < size && dr.notFull() {
sym, err := d.mainDecoder.readSym(d.br)
if err != nil {
return n, err
}
switch {
case sym < 256: // literal
dr.writeByte(byte(sym))
n++
continue
case sym > 269:
err = d.decodeOffset(sym - 270)
case sym == 269:
return n, errEndOfBlock
case sym == 256: // use previous offset and length
copy(d.offset[1:], d.offset[:])
case sym < 261:
err = d.decodeLength(sym - 257)
default:
err = d.decodeShortOffset(sym - 261)
}
if err != nil {
return n, err
}
dr.copyBytes(d.length, d.offset[0])
n += int64(d.length)
}
return n, nil
}