Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1356 → Rev 1357

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