You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
1.9 KiB
101 lines
1.9 KiB
package acr.browser.lightning; |
|
|
|
import java.io.FilterInputStream; |
|
import java.io.IOException; |
|
import java.io.InputStream; |
|
import java.util.Deque; |
|
import java.util.Iterator; |
|
import java.util.LinkedList; |
|
|
|
public class ReplacingInputStream extends FilterInputStream { |
|
|
|
Deque<Integer> inQueue = new LinkedList<Integer>(); |
|
|
|
Deque<Integer> outQueue = new LinkedList<Integer>(); |
|
|
|
final byte[] search, replacement; |
|
|
|
protected ReplacingInputStream(InputStream in, byte[] search, byte[] replacement) { |
|
super(in); |
|
this.search = search; |
|
this.replacement = replacement; |
|
} |
|
|
|
private boolean isMatchFound() { |
|
Iterator<Integer> inIter = inQueue.iterator(); |
|
for (int i = 0; i < search.length; i++) { |
|
if (!inIter.hasNext() || search[i] != inIter.next()) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
private void readAhead() throws IOException { |
|
// Work up some look-ahead. |
|
while (inQueue.size() < search.length) { |
|
int next = super.read(); |
|
inQueue.offer(next); |
|
if (next == -1) { |
|
break; |
|
} |
|
} |
|
} |
|
|
|
@Override |
|
public int read() throws IOException { |
|
|
|
// Next byte already determined. |
|
if (outQueue.isEmpty()) { |
|
|
|
readAhead(); |
|
|
|
if (isMatchFound()) { |
|
for (int i = 0; i < search.length; i++) { |
|
inQueue.remove(); |
|
} |
|
|
|
for (byte b : replacement) { |
|
outQueue.offer((int) b); |
|
} |
|
} else { |
|
outQueue.add(inQueue.remove()); |
|
} |
|
} |
|
|
|
return outQueue.remove(); |
|
} |
|
|
|
/** |
|
* Returns false. REFilterInputStream does not support mark() and reset() |
|
* methods. |
|
*/ |
|
@Override |
|
public boolean markSupported() { |
|
return false; |
|
} |
|
|
|
/** |
|
* Reads from the stream into the provided array. |
|
*/ |
|
@Override |
|
public int read(byte[] b, int off, int len) throws IOException { |
|
int i; |
|
int ok = 0; |
|
while (len-- > 0) { |
|
i = read(); |
|
if (i == -1) { |
|
return (ok == 0) ? -1 : ok; |
|
} |
|
b[off++] = (byte) i; |
|
ok++; |
|
} |
|
return ok; |
|
} |
|
|
|
@Override |
|
public int read(byte[] buffer) throws IOException { |
|
|
|
return read(buffer, 0, buffer.length); |
|
} |
|
}
|
|
|