// stepByte steps runq to nextq consuming c and then expanding according to flag. // It returns true if a match ends immediately before c. // c is either an input byte or endText. func (m *matcher) stepByte(runq, nextq *sparse.Set, c int, flag syntax.EmptyOp) (match bool) { nextq.Reset() m.addq(nextq, uint32(m.prog.Start), flag) for _, id := range runq.Dense() { i := &m.prog.Inst[id] switch i.Op { default: continue case syntax.InstMatch: match = true continue case instByteRange: if c == endText { break } lo := int((i.Arg >> 8) & 0xFF) hi := int(i.Arg & 0xFF) ch := c if i.Arg&argFold != 0 && 'a' <= ch && ch <= 'z' { ch += 'A' - 'a' } if lo <= ch && ch <= hi { m.addq(nextq, i.Out, flag) } } } return }
// stepEmpty steps runq to nextq expanding according to flag. func (m *matcher) stepEmpty(runq, nextq *sparse.Set, flag syntax.EmptyOp) { nextq.Reset() for _, id := range runq.Dense() { m.addq(nextq, id, flag) } }