0,0 → 1,191 |
import java.io.*; |
|
public class XmlParser2 |
{ |
public static void main(String[] args) |
throws Exception |
{ |
if(args.length < 1) { |
System.err.println("Need file name as parameter"); |
return; |
} |
|
FileInputStream in = new FileInputStream(args[0]); |
|
try { |
XmlBuffer buf = new XmlBuffer(in); |
|
for(int i = 0; !buf.isEnd(); ++i) { |
byte c = buf.cur(); |
//System.out.print((char)c); |
buf.toNext(); |
if(i == 8 || i == 40) { |
buf.mark(); |
} |
else if(i == 14 || i == 42) { |
buf.reset(); |
} |
} |
} |
finally { |
in.close(); |
} |
} |
} |
|
class XmlBuffer |
{ |
private InputStream in; |
private byte[][] bufs = new byte[2][10]; |
private int[] lens = new int[bufs.length]; // lengthes of valid data in buffers |
private int bufCur = -1; |
private int bufNext = -1; |
private int bufPrev = -1; |
private int lenCur = 0; // length of valid data in current buffer |
private int pos = 0; // position in buffers, 0 means begin of current one |
private boolean end = false; // no more data in the input stream |
private long offset = 0; // offset in input for begin of current buffer |
|
private long markedOffset = -1; |
private int markedPos = 0; |
|
public XmlBuffer(InputStream in) |
throws IOException |
{ |
this.in = in; |
|
loadNextBuffer(); |
bufCur = bufNext; |
lenCur = lens[bufCur]; |
bufNext = -1; |
} |
|
public byte cur() |
throws IOException |
{ |
if(pos >= lenCur) { |
return at(0); |
} |
|
System.out.println("cur " + offset + "+" + pos + " [" + (char)bufs[bufCur][pos] + "]"); |
return bufs[bufCur][pos]; |
} |
|
public byte at(int n) |
throws IOException |
{ |
int p = pos + n; |
byte[] buf; |
|
if(p >= lenCur) { |
//System.out.println("at p1 " + p + " " + lenCur); |
if(!loadNextBuffer()) return 0; // no more data |
|
p -= lenCur; |
buf = bufs[bufNext]; |
|
if(p > lens[bufNext]) { |
return 0; |
} |
//System.out.println("at p2 " + p + " " + bufNext); |
} |
else { |
//System.out.println("at p3 " + p + " " + lenCur + " " + bufCur); |
buf = bufs[bufCur]; |
} |
|
System.out.println("at " + offset + "+" + pos + "+" + p + " [" + (char)buf[p] + "]"); |
return buf[p]; |
} |
|
public void toNext() |
throws IOException |
{ |
++pos; |
|
if(pos >= lenCur) { |
System.out.println("toNext " + pos + " " + lenCur); |
if(bufNext < 0) { |
if(!loadNextBuffer()) return; |
} |
|
pos -= lenCur; |
offset += lenCur; |
bufPrev = bufCur; |
bufCur = bufNext; |
lenCur = lens[bufCur]; |
bufNext = -1; |
} |
} |
|
public boolean isEnd() |
{ |
return (end && pos >= lenCur); |
} |
|
public void mark() |
{ |
System.out.println("mark " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
markedOffset = offset; |
markedPos = pos; |
} |
|
public void reset() |
throws IOException |
{ |
if(markedOffset < 0) { |
throw new IOException("no mark"); |
} |
|
System.out.println("reset p1 " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
int diff = (int)(offset - markedOffset); |
if(diff > bufs[0].length) { |
throw new IOException("mark too old"); |
} |
else if(diff > 0) { // moved to next buffer after the 'mark' |
bufNext = bufCur; |
bufCur = bufPrev; |
offset = markedOffset; |
} |
// else still the same buffer |
|
pos = markedPos; |
lenCur = lens[bufCur]; |
|
markedOffset = -1; |
System.out.println("reset p2 " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
} |
|
private boolean loadNextBuffer() |
throws IOException |
{ |
System.out.println("loadNextBuffer p1"); |
if(end) return false; |
|
bufNext = (bufCur + 1); |
if(bufNext >= bufs.length) bufNext = 0; |
if(bufNext == bufPrev) bufPrev = -1; |
|
lens[bufNext] = in.read(bufs[bufNext]); |
System.out.println("loadNextBuffer p2 " + bufNext + " " + lens[bufNext]); |
if(lens[bufNext] < 0) { |
end = true; |
|
return false; |
} |
|
System.out.println("loadNextBuffer p3"); |
return true; |
} |
|
public long getPosition() |
{ |
return (offset + pos); |
} |
|
public String toString(long begin, int length) |
{ |
|
} |
} |
|