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

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")
}
}