import java.io.IOException;
import java.io.InputStream;
public class CharTerminatedInputStream extends InputStream {
private InputStream in;
private int match[];
private int buffer[];
private int pos = 0;
private boolean endFound = false;
public CharTerminatedInputStream(InputStream in, byte[] terminator) {
if (terminator == null) {
throw new IllegalArgumentException("The terminating character array cannot be null.");
}
if (terminator.length == 0) {
throw new IllegalArgumentException("The terminating character array cannot be of zero length.");
}
match = new int[terminator.length];
buffer = new int[terminator.length];
for (int i = 0; i < terminator.length; i++) {
match[i] = (int) terminator[i];
buffer[i] = (int) terminator[i];
}
this.in = in;
}
public synchronized void reset() {
endFound = false;
pos = 0;
}
public int read() throws IOException {
if (endFound) {
return -1;
}
if (pos == 0) {
int b = in.read();
if (b == -1) {
endFound = true;
return -1;
}
if (b != match[0]) {
return b;
}
buffer[0] = b;
pos++;
} else {
if (buffer[0] != match[0]) {
return topChar();
}
}
for (int i = 0; i < match.length; i++) {
if (i >= pos) {
int b = in.read();
if (b == -1) {
return topChar();
}
buffer[pos] = b;
pos++;
}
if (buffer[i] != match[i]) {
return topChar();
}
}
endFound = true;
return -1;
}
private int topChar() {
int b = buffer[0];
if (pos > 1) {
System.arraycopy(buffer, 1, buffer, 0, pos - 1);
}
pos--;
return b;
}
}