package com.jediterm.terminal;
import java.io.IOException;
/**
* Takes data from underlying char array.
*
* @author traff
*/
public class ArrayTerminalDataStream implements TerminalDataStream {
protected char[] myBuf;
protected int myOffset;
protected int myLength;
public ArrayTerminalDataStream(char[] buf, int offset, int length) {
myBuf = buf;
myOffset = offset;
myLength = length;
}
public ArrayTerminalDataStream(char[] buf) {
this(buf, 0, buf.length);
}
public char getChar() throws IOException {
if (myLength == 0) {
throw new EOF();
}
myLength--;
return myBuf[myOffset++];
}
public void pushChar(final char c) throws EOF {
if (myOffset == 0) {
// Pushed back too many... shift it up to the end.
char[] newBuf;
if (myBuf.length - myLength == 0) {
newBuf = new char[myBuf.length + 1];
}
else {
newBuf = myBuf;
}
myOffset = newBuf.length - myLength;
System.arraycopy(myBuf, 0, newBuf, myOffset, myLength);
myBuf = newBuf;
}
myLength++;
myBuf[--myOffset] = c;
}
public String readNonControlCharacters(int maxChars) throws IOException {
String nonControlCharacters = CharacterUtils.getNonControlCharacters(maxChars, myBuf, myOffset, myLength);
myOffset += nonControlCharacters.length();
myLength -= nonControlCharacters.length();
return nonControlCharacters;
}
public void pushBackBuffer(final char[] bytes, final int length) throws EOF {
for (int i = length - 1; i >= 0; i--) {
pushChar(bytes[i]);
}
}
}