package org.jbehave.eclipse.util;
import static org.jbehave.eclipse.util.IO.CR;
import static org.jbehave.eclipse.util.IO.LF;
import org.jbehave.eclipse.util.IO.LineSeparator;
public class BidirectionalReader implements BidirectionalStream {
private BidirectionalStream stream;
private int pos;
private boolean eof;
private LineSeparator lineSeparator;
public BidirectionalReader(BidirectionalStream stream) {
super();
this.stream = stream;
this.pos = 0;
}
public boolean eof() {
return eof;
}
public LineSeparator getLineSeparator() {
return lineSeparator;
}
public StringBuilder readLine() {
StringBuilder builder = new StringBuilder (80);
int read;
while((read=read()) != IO.EOF) {
builder.append((char)read);
if(read==LF) {
lineSeparator = LineSeparator.LineFeed;
return builder;
}
else if(read==CR) {
read = read();
if(read==LF) {
lineSeparator = LineSeparator.CRLF;
builder.append((char)read);
}
else{
lineSeparator = LineSeparator.CarriageReturn;
unread();
}
return builder;
}
}
return builder;
}
public int getPosition() {
return pos;
}
public BidirectionalReader backToPosition(int newPos) {
while(pos>newPos)
unread();
return this;
}
public StringBuilder readUntil(int newPos) {
StringBuilder builder = new StringBuilder ();
while(pos<newPos && !eof) {
int c = read();
if(c!=IO.EOF)
builder.append((char)c);
}
return builder;
}
public int peek () {
int read = read();
unread();
return read;
}
public int read() {
if(eof) {
return IO.EOF;
}
int read = stream.read();
if(read==IO.EOF)
eof = true;
else
pos++;
return read;
}
public void unread() {
if(eof)
eof = false;
else
pos--;
stream.unread();
}
}