mirror of
https://github.com/Febbweiss/logstash-forwarder-java.git
synced 2026-03-04 22:25:39 +00:00
Copied RandomAccessFile code into the util package because of compiler
version in maven dependencies.
This commit is contained in:
127
src/main/java/info/fetter/logstashforwarder/util/KMPMatch.java
Normal file
127
src/main/java/info/fetter/logstashforwarder/util/KMPMatch.java
Normal file
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
|
||||
*
|
||||
* Portions of this software were developed by the Unidata Program at the
|
||||
* University Corporation for Atmospheric Research.
|
||||
*
|
||||
* Access and use of this software shall impose the following obligations
|
||||
* and understandings on the user. The user is granted the right, without
|
||||
* any fee or cost, to use, copy, modify, alter, enhance and distribute
|
||||
* this software, and any derivative works thereof, and its supporting
|
||||
* documentation for any purpose whatsoever, provided that this entire
|
||||
* notice appears in all copies of the software, derivative works and
|
||||
* supporting documentation. Further, UCAR requests that the user credit
|
||||
* UCAR/Unidata in any publications that result from the use of this
|
||||
* software or in any product that includes this software. The names UCAR
|
||||
* and/or Unidata, however, may not be used in any advertising or publicity
|
||||
* to endorse or promote any products or commercial entity unless specific
|
||||
* written permission is obtained from UCAR/Unidata. The user also
|
||||
* understands that UCAR/Unidata is not obligated to provide the user with
|
||||
* any support, consulting, training or assistance of any kind with regard
|
||||
* to the use, operation and performance of this software nor to provide
|
||||
* the user with any updates, revisions, new versions or "bug fixes."
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
|
||||
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
* WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
package info.fetter.logstashforwarder.util;
|
||||
|
||||
/**
|
||||
* Knuth-Morris-Pratt Algorithm for Pattern Matching.
|
||||
* Immutable
|
||||
*
|
||||
* @author caron
|
||||
* @see <a href="http://www.fmi.uni-sofia.bg/fmi/logic/vboutchkova/sources/KMPMatch_java.html">http://www.fmi.uni-sofia.bg/fmi/logic/vboutchkova/sources/KMPMatch_java.html</a>
|
||||
* @since May 9, 2008
|
||||
*/
|
||||
public class KMPMatch {
|
||||
|
||||
private final byte[] match;
|
||||
private final int[] failure;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param match search for this byte pattern
|
||||
*/
|
||||
public KMPMatch(byte[] match) {
|
||||
this.match = match;
|
||||
failure = computeFailure(match);
|
||||
}
|
||||
|
||||
public int getMatchLength() { return match.length; }
|
||||
|
||||
/**
|
||||
* Finds the first occurrence of match in data.
|
||||
* @param data search in this byte block
|
||||
* @param start start at data[start]
|
||||
* @param max end at data[start+max]
|
||||
* @return index into data[] of first match, else -1 if not found.
|
||||
*/
|
||||
public int indexOf(byte[] data, int start, int max) {
|
||||
int j = 0;
|
||||
if (data.length == 0) return -1;
|
||||
|
||||
for (int i = start; i < start + max; i++) {
|
||||
while (j > 0 && match[j] != data[i])
|
||||
j = failure[j - 1];
|
||||
|
||||
if (match[j] == data[i])
|
||||
j++;
|
||||
|
||||
if (j == match.length)
|
||||
return i - match.length + 1;
|
||||
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finds the first occurrence of match in data.
|
||||
* @param data search in this byte block
|
||||
* @param start start at data[start]
|
||||
* @param max end at data[start+max]
|
||||
* @return index into block of first match, else -1 if not found.
|
||||
*
|
||||
public int scan(InputStream is, int start, int max) {
|
||||
int j = 0;
|
||||
if (data.length == 0) return -1;
|
||||
|
||||
for (int i = start; i < start + max; i++) {
|
||||
while (j > 0 && match[j] != data[i])
|
||||
j = failure[j - 1];
|
||||
|
||||
if (match[j] == data[i])
|
||||
j++;
|
||||
|
||||
if (j == match.length)
|
||||
return i - match.length + 1;
|
||||
|
||||
}
|
||||
return -1;
|
||||
} // */
|
||||
|
||||
|
||||
private int[] computeFailure(byte[] match) {
|
||||
int[] result = new int[match.length];
|
||||
|
||||
int j = 0;
|
||||
for (int i = 1; i < match.length; i++) {
|
||||
while (j > 0 && match[j] != match[i])
|
||||
j = result[j - 1];
|
||||
|
||||
if (match[i] == match[i])
|
||||
j++;
|
||||
|
||||
result[i] = j;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user