Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source
   * Copyright ${year}, Red Hat, Inc. and individual contributors
   * by the @authors tag. See the copyright.txt in the distribution for a
   * full listing of individual contributors.
   *
   * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
   * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 package org.richfaces.request;
 
 
 public class ByteSequenceMatcher {
     public interface BytesHandler {
         void handle(byte[] bytesint lengththrows IOException;
     }
 
     private static final int ZERO_READS_NUMBER = 20;
     private byte[] buffer;
     private int readLength = 0;
     private int zeroReadCounter = ;
     private boolean bufferEOF = false;
     private boolean isEOF = false;
     private boolean isMatched = false;
     private InputStream inputStream;
     private BytesHandler bytesHandler;
 
     public ByteSequenceMatcher(InputStream inputStreamint bufferSize) {
         this. = inputStream;
         this. = new byte[bufferSize];
     }
 
     public BytesHandler getBytesHandler() {
         return ;
     }
 
     public void setBytesHandler(BytesHandler bytesHandler) {
         this. = bytesHandler;
     }
 
     protected void prefillBuffer(int usedLengththrows IOException {
         if (usedLength > ) {
             throw new IllegalArgumentException();
         }
 
         if (usedLength !=  && usedLength != 0) {
             System.arraycopy(usedLength, 0,  - usedLength);
         }
 
          -= usedLength;
 
         while (!) {
             int remaining = . - ;
             if (remaining <= 0) {
                 break;
             }
             int read = .read(remaining);
 
             if (read > 0) {
                  += read;
             } else if (read == 0) {
                 --;
 
                 if ( == 0) {
                     throw new IllegalStateException("Maximum number of zero reads reached");
                 }
             } else if (read < 0) {
                  = true;
             }
         }
     }
 
     private boolean match(int startOffsetbyte[]... sequences) {
         int index = startOffset;
 
         for (byte[] bs : sequences) {
             for (byte b : bs) {
 
                 if (index >= ) {
                     return false;
                 }
 
                 if ([index] != b) {
                     return false;
                 }
                index++;
            }
        }
        return true;
    }
    public void findSequence(int limitbyte[]... sequencesthrows IOException {
         = false;
        int userLimit = limit;
        if (userLimit <= 0) {
            userLimit = .;
        }
        prefillBuffer(0);
        int sequencesLength = 0;
        for (byte[] bs : sequences) {
            sequencesLength += bs.length;
        }
        int i = 0;
        while (! && i <=  - sequencesLength) {
            if (match(isequences)) {
                 = true;
                .handle(i);
                prefillBuffer(i + sequencesLength);
            } else {
                int sequenceLimit =  - sequencesLength + 1;
                int realLimit;
                if (sequenceLimit < userLimit) {
                    realLimit = sequenceLimit;
                } else {
                    realLimit = userLimit;
                }
                if (realLimit > 0 && i == realLimit - 1) {
                    // report limit
                    .handle(realLimit);
                    prefillBuffer(realLimit);
                    i = 0;
                } else {
                    i++;
                }
            }
        }
        flushUnmatchedBytes();
        if (this. == 0) {
            this. = true;
        }
    }
    private void flushUnmatchedBytes() throws IOException {
        if (!) {
            if ( > 0) {
                .handle();
                prefillBuffer();
            }
        }
    }
    public boolean isEOF() {
        return ;
    }
    public boolean isMatched() {
        return ;
    }
    public boolean isMatchedAndNotEOF() {
        return isMatched() && !isEOF();
    }
New to GrepCode? Check out our FAQ X