10,26 → 10,38 |
return; |
} |
|
long startTime = System.nanoTime(); |
|
FileInputStream in = new FileInputStream(args[0]); |
|
try { |
XmlBuffer buf = new XmlBuffer(in); |
|
long pos = -1; |
|
for(int i = 0; !buf.isEnd(); ++i) { |
byte c = buf.cur(); |
//System.out.print((char)c); |
buf.toNext(); |
if(i == 8 || i == 40) { |
/*if(i == 8 || i == 40) { |
buf.mark(); |
} |
else if(i == 14 || i == 42) { |
buf.reset(); |
} |
|
if(i % 7 == 0) { |
if(pos >= 0) { |
System.out.print(buf.toString(pos, (int)(buf.getPosition() - pos))); |
} |
pos = buf.getPosition(); |
}*/ |
} |
} |
finally { |
in.close(); |
} |
|
System.out.println("Elapsed: " + (System.nanoTime() - startTime) / 1000000 + "ms"); |
} |
} |
|
36,7 → 48,9 |
class XmlBuffer |
{ |
private InputStream in; |
private byte[][] bufs = new byte[2][10]; |
private String charsetName = "UTF-8"; |
|
private byte[][] bufs = new byte[2][4096]; |
private int[] lens = new int[bufs.length]; // lengthes of valid data in buffers |
private int bufCur = -1; |
private int bufNext = -1; |
60,6 → 74,16 |
bufNext = -1; |
} |
|
public String getCharsetName() |
{ |
return charsetName; |
} |
|
public void setCharsetName(String charsetName) |
{ |
this.charsetName = charsetName; |
} |
|
public byte cur() |
throws IOException |
{ |
67,7 → 91,7 |
return at(0); |
} |
|
System.out.println("cur " + offset + "+" + pos + " [" + (char)bufs[bufCur][pos] + "]"); |
//System.out.println("cur " + offset + "+" + pos + " [" + (char)bufs[bufCur][pos] + "]"); |
return bufs[bufCur][pos]; |
} |
|
94,7 → 118,7 |
buf = bufs[bufCur]; |
} |
|
System.out.println("at " + offset + "+" + pos + "+" + p + " [" + (char)buf[p] + "]"); |
//System.out.println("at " + offset + "+" + pos + "+" + p + " [" + (char)buf[p] + "]"); |
return buf[p]; |
} |
|
104,7 → 128,7 |
++pos; |
|
if(pos >= lenCur) { |
System.out.println("toNext " + pos + " " + lenCur); |
//System.out.println("toNext " + pos + " " + lenCur); |
if(bufNext < 0) { |
if(!loadNextBuffer()) return; |
} |
125,7 → 149,7 |
|
public void mark() |
{ |
System.out.println("mark " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
//System.out.println("mark " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
markedOffset = offset; |
markedPos = pos; |
} |
137,12 → 161,13 |
throw new IOException("no mark"); |
} |
|
System.out.println("reset p1 " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
//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' |
if(diff > 0) { // moved to next buffer after the 'mark' |
if(bufPrev < 0 || diff > lens[bufPrev]) { |
throw new IOException("mark too old"); |
} |
|
bufNext = bufCur; |
bufCur = bufPrev; |
offset = markedOffset; |
153,13 → 178,13 |
lenCur = lens[bufCur]; |
|
markedOffset = -1; |
System.out.println("reset p2 " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
//System.out.println("reset p2 " + offset + "+" + pos + " " + bufPrev + " " + bufCur + " " + bufNext); |
} |
|
private boolean loadNextBuffer() |
throws IOException |
{ |
System.out.println("loadNextBuffer p1"); |
//System.out.println("loadNextBuffer p1"); |
if(end) return false; |
|
bufNext = (bufCur + 1); |
167,7 → 192,7 |
if(bufNext == bufPrev) bufPrev = -1; |
|
lens[bufNext] = in.read(bufs[bufNext]); |
System.out.println("loadNextBuffer p2 " + bufNext + " " + lens[bufNext]); |
//System.out.println("loadNextBuffer p2 " + bufNext + " " + lens[bufNext]); |
if(lens[bufNext] < 0) { |
end = true; |
|
174,7 → 199,7 |
return false; |
} |
|
System.out.println("loadNextBuffer p3"); |
//System.out.println("loadNextBuffer p3"); |
return true; |
} |
|
183,9 → 208,65 |
return (offset + pos); |
} |
|
private class BufferPositon |
{ |
public int p; |
public int bufNumber; |
} |
|
private BufferPositon findPositionInBuffers(long pos) |
throws IOException |
{ |
BufferPositon res = new BufferPositon(); |
|
res.p = (int)(pos - offset); |
|
if(res.p >= lens[bufCur]) { // next buffer |
res.p -= lens[bufCur]; |
res.bufNumber = bufNext; |
} |
else if(res.p >= 0) { // current buffer |
res.bufNumber = bufCur; |
} |
else { // previous buffer |
if(bufPrev >= 0) res.p += lens[bufPrev]; |
res.bufNumber = bufPrev; |
} |
|
if(res.bufNumber < 0 || res.p < 0 || res.p >= lens[res.bufNumber]) { |
throw new IOException("position not found in buffers"); |
} |
|
return res; |
} |
|
public String toString(long begin, int length) |
throws IOException |
{ |
BufferPositon pos = findPositionInBuffers(begin); |
|
int l = lens[pos.bufNumber] - pos.p; |
if(length <= l) { |
return new String(bufs[pos.bufNumber], pos.p, length, charsetName); |
} |
else { |
return new String(bufs[pos.bufNumber], pos.p, l, charsetName) |
+ toString(begin + l, length - l); |
} |
} |
|
public void copy(long begin, int length, byte[] buf, int bufBegin) |
throws IOException |
{ |
BufferPositon pos = findPositionInBuffers(begin); |
|
int l = lens[pos.bufNumber] - pos.p; |
if(length <= l) { |
System.arraycopy(bufs[pos.bufNumber], pos.p, buf, bufBegin, length); |
} |
else { |
System.arraycopy(bufs[pos.bufNumber], pos.p, buf, bufBegin, l); |
copy(begin + l, length - l, buf, bufBegin + l); |
} |
} |
} |
|