Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1357 → Rev 1358

/xmlparser_java/branches/003_cycle_buffer/XmlParser2.java
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);
}
}
}