l.update(d); l.update(o);
l.update(new MatcherEvent(d)); l.update(new MatcherEvent(o));
   public void update(byte b) {      buffer[ndx++] = b;      count++;      if (ndx < config.blockLength) {         // We have not seen a full block since the last match.         return;      } else if (ndx == config.blockLength) {         config.weakSum.check(buffer, 0, config.blockLength);      } else {         config.weakSum.roll(b);      }      Long oldOffset = hashSearch(buffer, ndx - config.blockLength,         config.blockLength);      if (oldOffset != null) {         if (ndx > config.blockLength) {            DataBlock d = new DataBlock(count - ndx, buffer, 0,               ndx - config.blockLength);            Offsets o = new Offsets(oldOffset.longValue(),               count-config.blockLength, config.blockLength);            for (Iterator it = listeners.listIterator(); it.hasNext(); ) {               MatcherListener l = (MatcherListener) it.next();               l.update(d);               l.update(o);            }         } else {            Offsets o = new Offsets(oldOffset.longValue(),               count-config.blockLength, config.blockLength);            for (Iterator it = listeners.listIterator(); it.hasNext(); ) {               MatcherListener l = (MatcherListener) it.next();               l.update(o);            }         }         ndx = 0;      } else if (ndx == buffer.length) {         DataBlock d = new DataBlock(count - ndx, buffer, 0,            buffer.length - (config.blockLength-1));         for (Iterator it = listeners.listIterator(); it.hasNext(); ) {            MatcherListener l = (MatcherListener) it.next();            l.update(d);         }         System.arraycopy(buffer, buffer.length - (config.blockLength-1),            buffer, 0, config.blockLength-1);         ndx = config.blockLength - 1;      }   }