package flate
const (
l3TableBits = 16
l3TableSize = 1 << l3TableBits
)
type fastEncL3 struct {
fastGen
table [l3TableSize]tableEntryPrev
}
func ( *fastEncL3) ( *tokens, []byte) {
const (
= 12 - 1
= 1 + 1 +
= 5
)
for .cur >= bufferReset {
if len(.hist) == 0 {
clear(.table[:])
.cur = maxMatchOffset
break
}
:= .cur + int32(len(.hist)) - maxMatchOffset
for := range .table[:] {
:= .table[]
if .cur.offset <= {
.cur.offset = 0
} else {
.cur.offset = .cur.offset - .cur + maxMatchOffset
}
if .prev.offset <= {
.prev.offset = 0
} else {
.prev.offset = .prev.offset - .cur + maxMatchOffset
}
.table[] =
}
.cur = maxMatchOffset
}
:= .addBlock()
if len() < {
.n = uint16(len())
return
}
= .hist
:=
:= int32(len() - )
:= loadLE64(, )
for {
const = 7
:=
var tableEntry
for {
:= hashLen(, l3TableBits, )
=
= + 1 + (-)>>
if > {
goto
}
:= .table[]
:= loadLE64(, )
:= .cur + - (maxMatchOffset - 4)
.table[] = tableEntryPrev{prev: .cur, cur: tableEntry{offset: + .cur}}
= .cur
if .offset < {
=
continue
}
if uint32() == loadLE32(, .offset-.cur) {
if .prev.offset < || uint32() != loadLE32(, .prev.offset-.cur) {
break
}
:= - (.offset - .cur)
:= - (.prev.offset - .cur)
, := matchLen([+4:], [-+4:]), matchLen([+4:], [-+4:])
if > {
= .prev
}
break
} else {
= .prev
if .offset > && uint32() == loadLE32(, .offset-.cur) {
break
}
}
=
}
for {
:= .offset - .cur
:= .matchLenLong(int(+4), int(+4), ) + 4
for > 0 && > && [-1] == [-1] {
--
--
++
}
if < {
for , := range [:] {
.tokens[.n] = token()
.litHist[]++
.n++
}
}
.AddMatchLong(, uint32(--baseMatchOffset))
+=
=
if >= {
= + 1
}
if >= {
+=
if int(+8) < len() && > 0 {
= loadLE64(, )
:= hashLen(, l3TableBits, )
.table[] = tableEntryPrev{
prev: .table[].cur,
cur: tableEntry{offset: .cur + },
}
}
goto
}
for := - + 2; < -5; += 6 {
:= hashLen(loadLE64(, ), l3TableBits, )
.table[] = tableEntryPrev{
prev: .table[].cur,
cur: tableEntry{offset: .cur + }}
}
:= loadLE64(, -2)
:= hashLen(, l3TableBits, )
.table[] = tableEntryPrev{
prev: .table[].cur,
cur: tableEntry{offset: .cur + - 2},
}
>>= 8
= hashLen(, l3TableBits, )
.table[] = tableEntryPrev{
prev: .table[].cur,
cur: tableEntry{offset: .cur + - 1},
}
>>= 8
:= hashLen(, l3TableBits, )
:= .table[]
=
.table[] = tableEntryPrev{
prev: .cur,
cur: tableEntry{offset: + .cur},
}
= .cur
:= .cur + - (maxMatchOffset - 4)
if .offset > {
if uint32() == loadLE32(, .offset-.cur) {
continue
}
= .prev
if .offset > && uint32() == loadLE32(, .offset-.cur) {
continue
}
}
= >> 8
++
break
}
}
:
if int() < len() {
if .n == 0 {
return
}
emitLiterals(, [:])
}
}