/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.core;
import java.io.IOException;
import java.io.Reader;
import com.aptana.shared_core.string.FastStringBuffer;
/**
* A fast reader that'll read into a FastStringBuffer.
*/
public class FastBufferedReader {
public final static int DEFAULT_BUFFER_SIZE = 16 * 1024;
protected int availableSize;
protected final char buf[];
protected int pos;
protected Reader r;
public final FastStringBuffer stringBuf;
public FastBufferedReader(final Reader r) {
this(r, DEFAULT_BUFFER_SIZE);
}
public FastBufferedReader(final Reader r, final int bufSize) {
this.r = r;
buf = new char[bufSize];
stringBuf = new FastStringBuffer(1024);
}
public void close() throws IOException {
if (r == null)
return;
r.close();
r = null;
}
/**
* Fills the buffer with the line. Returns null if there was nothing to read, otherwise, returns the internal
* buffer properly filled. Note that the same buffer will be used on a subsequent call.
*/
public FastStringBuffer readLine() throws IOException {
char c = 0;
int i;
stringBuf.clear();
if (availableSize == 0) {
availableSize = r.read(buf);
//If we had nothing more to read, return null.
if (availableSize <= 0) {
availableSize = 0;
return null;
}
pos = 0;
}
while (true) {
i = 0;
while (i < availableSize && (c = buf[pos + i]) != '\n' && c != '\r') {
i++;
}
stringBuf.append(buf, pos, i);
pos += i;
availableSize -= i;
if (availableSize > 0) {
if (c == '\n') {
pos++;
availableSize--;
} else { // found \r
if (availableSize > 1) {
if (buf[pos + 1] == '\n') {
pos += 2;
availableSize -= 2;
} else {
pos++;
availableSize--;
}
} else {
pos = 0;
availableSize = r.read(buf);
if (availableSize <= 0)
availableSize = 0;
else if (buf[0] == '\n') {
pos++;
availableSize--;
}
}
}
return stringBuf;
} else {
pos = 0;
availableSize = r.read(buf);
if (availableSize <= 0) {
availableSize = 0;
return stringBuf;
}
}
}
}
}