more accurate positions in CharInput
[sbp.git] / src / edu / berkeley / sbp / chr / CharInput.java
index 2e8e882..8814f79 100644 (file)
@@ -59,17 +59,23 @@ public class CharInput extends Cartesian.Input<Character> {
 
     private final RollbackReader r;
     
-    public CharInput(String s)                { this(new StringReader(s)); }
-    public CharInput(Reader r)                { this(r, null); }
-    public CharInput(Reader r,      String s) { this.r = new RollbackReader(new BufferedReader(r)); }
-    public CharInput(InputStream i)           { this(i, null); }
-    public CharInput(InputStream i, String s) { this(new InputStreamReader(i), s); }
+    public CharInput(Reader r,      String s) {
+        this.name = s;
+        this.r = new RollbackReader(new BufferedReader(r));
+    }
+    public CharInput(String s)                  { this(new StringReader(s)); }
+    public CharInput(Reader r)                  { this(r, null); }
+    public CharInput(InputStream i)             { this(i, null); }
+    public CharInput(InputStream i, String s)   { this(new InputStreamReader(i), s); }
+    public CharInput(File f) throws IOException { this(new FileInputStream(f), f.getName()); }
 
     public CharInput(InputStream i, String s, boolean indent) {
         this(new InputStreamReader(i), s);
         this.indent = indent;
     }
+    public String getName() { return name; }
 
+    private String name;
     boolean cr = false;
     boolean indent = false;
     private int count = 0;
@@ -89,11 +95,6 @@ public class CharInput extends Cartesian.Input<Character> {
         Character ret = __next();
         if (ret==null) return null;
         char c = ret.charValue();
-        if (indent) {
-            if (ret==CharAtom.left)  System.out.print("\033[31m{\033[0m");
-            else if (ret==CharAtom.right) System.out.print("\033[31m}\033[0m");
-            else System.out.print(c+"");
-        }
         return ret;
     }
     public Character __next() throws IOException {
@@ -151,19 +152,19 @@ public class CharInput extends Cartesian.Input<Character> {
         if (i>0) { r.unread(CharAtom.left); redent(i-1); return; }
     }
 
-    public String showRegion(Region<Character> rc) {
+    public String showRegion(Region<Character> rc, int maxLength) {
         if (cache == null) return null;
         Cartesian.Region r = (Cartesian.Region)rc;
-        int start = r.getStart().getScalar()+1;
-        int end = r.getEnd().getScalar()+1;
+        int start = r.getStart().getScalar();
+        int end = r.getEnd().getScalar();
         if (start < 0) start = 0;
         if (end < start) end = start;
         if (end > cache.length()) end = cache.length();
         String ret;
-        if (end-start < 60) ret = cachesubstring(start, end);
-        else ret = cachesubstring(start, start+25) +
+        if (end-start < maxLength) ret = cachesubstring(start, end);
+        else ret = cachesubstring(start, start+(maxLength/2-5)) +
                  "..." +
-                 cachesubstring(end-25, end);
+                 cachesubstring(end-(maxLength/2-5), end);
         return StringUtil.escapify(ret, "\n\r");
     }
 
@@ -175,4 +176,5 @@ public class CharInput extends Cartesian.Input<Character> {
         return cache.substring(start, end);
     }
 
+    public void close() { }
 }