You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.0 KiB
101 lines
2.0 KiB
package lzo
|
|
|
|
func (ctx *compressor) initMatch(s *swd, flags uint32) {
|
|
s.ctx = ctx
|
|
s.init()
|
|
if flags&1 != 0 {
|
|
s.UseBestOff = true
|
|
}
|
|
}
|
|
|
|
func (ctx *compressor) findMatch(s *swd, thislen uint, skip uint) {
|
|
if skip > 0 {
|
|
if thislen < skip {
|
|
panic("assert: findMatch: invalid thislen")
|
|
}
|
|
s.accept(thislen - skip)
|
|
ctx.textsize += thislen - skip + 1
|
|
} else {
|
|
if thislen > 1 {
|
|
panic("assert: findMatch: invalid thislen")
|
|
}
|
|
ctx.textsize += thislen - skip
|
|
}
|
|
|
|
s.MLen = cSWD_THRESHOLD
|
|
s.MOff = 0
|
|
for i := 0; i < len(s.bestPos); i++ {
|
|
s.bestPos[i] = 0
|
|
}
|
|
|
|
s.findbest()
|
|
ctx.mlen = int(s.MLen)
|
|
ctx.moff = int(s.MOff)
|
|
|
|
s.getbyte()
|
|
if s.BChar < 0 {
|
|
ctx.look = 0
|
|
ctx.mlen = 0
|
|
} else {
|
|
ctx.look = s.Look + 1
|
|
}
|
|
|
|
ctx.bp = ctx.ip - int(ctx.look)
|
|
}
|
|
|
|
func (ctx *compressor) betterMatch(s *swd, imlen, imoff int) (mlen int, moff int) {
|
|
mlen, moff = imlen, imoff
|
|
if mlen <= m2_MIN_LEN {
|
|
return
|
|
}
|
|
if moff <= m2_MAX_OFFSET {
|
|
return
|
|
}
|
|
|
|
if moff > m2_MAX_OFFSET && mlen >= m2_MIN_LEN+1 && mlen <= m2_MAX_LEN+1 &&
|
|
s.BestOff[mlen-1] > 0 && s.BestOff[mlen-1] <= m2_MAX_OFFSET {
|
|
mlen -= 1
|
|
moff = int(s.BestOff[mlen])
|
|
return
|
|
}
|
|
|
|
if moff > m3_MAX_OFFSET && mlen >= m4_MAX_LEN+1 && mlen <= m2_MAX_LEN+2 &&
|
|
s.BestOff[mlen-2] > 0 && s.BestOff[mlen-2] <= m2_MAX_OFFSET {
|
|
mlen -= 2
|
|
moff = int(s.BestOff[mlen])
|
|
return
|
|
}
|
|
|
|
if moff > m3_MAX_OFFSET && mlen >= m4_MAX_LEN+1 && mlen <= m3_MAX_LEN+1 &&
|
|
s.BestOff[mlen-1] > 0 && s.BestOff[mlen-1] <= m3_MAX_OFFSET {
|
|
mlen -= 1
|
|
moff = int(s.BestOff[mlen])
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func assertMemcmp(b1, b2 []byte, l int) {
|
|
b1 = b1[:l]
|
|
b2 = b2[:l]
|
|
for i := 0; i < len(b1); i++ {
|
|
if b1[i] != b2[i] {
|
|
panic("assertMemcmp: dosn't match")
|
|
}
|
|
}
|
|
}
|
|
|
|
func (ctx *compressor) assertMatch(s *swd, mlen, moff int) {
|
|
if mlen < 2 {
|
|
panic("assertMatch: invalid mlen")
|
|
}
|
|
if moff <= ctx.bp {
|
|
if ctx.bp-moff+mlen >= ctx.ip {
|
|
panic("assertMatch: invalid bp")
|
|
}
|
|
assertMemcmp(ctx.in[ctx.bp:], ctx.in[ctx.bp-moff:], mlen)
|
|
} else {
|
|
panic("dict should not exit")
|
|
}
|
|
}
|
|
|