+package org.ibex.util;
+import java.io.*;
+
+public class LineReader {
+
+ private static int MAXBUF = 1024 * 16;
+ char[] buf = new char[MAXBUF];
+ int buflen = 0;
+ Reader r;
+ Vec pushback = new Vec();
+
+ public LineReader(Reader r) { this.r = r; }
+
+ public void pushback(String s) { pushback.push(s); }
+
+ public String readLine() throws IOException {
+ while(true) {
+ if (pushback.size() > 0) return (String)pushback.pop();
+ for(int i=0; i<buflen; i++) {
+ if (buf[i] == '\n') {
+ String ret;
+ if (buf[i-1] == '\r') ret = new String(buf, 0, i-1);
+ else ret = new String(buf, 0, i);
+ System.arraycopy(buf, i+1, buf, 0, buflen - (i+1));
+ buflen -= i;
+ return ret;
+ }
+ }
+ int numread = r.read(buf, buflen, MAXBUF - buflen);
+ if (numread == 0) {
+ if (buflen == 0) return null;
+ String ret = new String(buf, 0, buflen);
+ buflen = 0;
+ return ret;
+ }
+ }
+ }
+}