added LineReader
authoradam <adam@megacz.com>
Sat, 8 May 2004 00:28:44 +0000 (00:28 +0000)
committeradam <adam@megacz.com>
Sat, 8 May 2004 00:28:44 +0000 (00:28 +0000)
darcs-hash:20040508002844-5007d-a7ab725c97b5f76300e15c76186abeb18b2d2dbb.gz

src/org/ibex/util/LineReader.java [new file with mode: 0644]

diff --git a/src/org/ibex/util/LineReader.java b/src/org/ibex/util/LineReader.java
new file mode 100644 (file)
index 0000000..88b785d
--- /dev/null
@@ -0,0 +1,38 @@
+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;
+            }
+        }
+    }
+}