diff options
Diffstat (limited to 'libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java')
-rw-r--r-- | libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java | 346 |
1 files changed, 202 insertions, 144 deletions
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java b/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java index 844fada51fc..e42710b5de1 100644 --- a/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java +++ b/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java @@ -42,154 +42,212 @@ import java.io.InputStream; // TODO: move(x) shouldn't rely on calling next() x times -class CharIndexedInputStream implements CharIndexed { - private static final int BUFFER_INCREMENT = 1024; - private static final int UNKNOWN = Integer.MAX_VALUE; // value for end - - private BufferedInputStream br; - - // so that we don't try to reset() right away - private int index = -1; - - private int bufsize = BUFFER_INCREMENT; - - private int end = UNKNOWN; - - private char cached = OUT_OF_BOUNDS; - - // Big enough for a \r\n pair - // lookBehind[0] = most recent - // lookBehind[1] = second most recent - private char[] lookBehind = new char[] { OUT_OF_BOUNDS, OUT_OF_BOUNDS }; - - CharIndexedInputStream(InputStream str, int index) { - if (str instanceof BufferedInputStream) br = (BufferedInputStream) str; - else br = new BufferedInputStream(str,BUFFER_INCREMENT); - next(); - if (index > 0) move(index); - } - - private boolean next() { - if (end == 1) return false; - end--; // closer to end - - try { - if (index != -1) { - br.reset(); - } - int i = br.read(); - br.mark(bufsize); - if (i == -1) { - end = 1; - cached = OUT_OF_BOUNDS; - return false; - } - cached = (char) i; - index = 1; - } catch (IOException e) { - e.printStackTrace(); - cached = OUT_OF_BOUNDS; - return false; +class CharIndexedInputStream implements CharIndexed +{ + private static final int BUFFER_INCREMENT = 1024; + private static final int UNKNOWN = Integer.MAX_VALUE; // value for end + + private BufferedInputStream br; + + // so that we don't try to reset() right away + private int index = -1; + + private int bufsize = BUFFER_INCREMENT; + + private int end = UNKNOWN; + + private char cached = OUT_OF_BOUNDS; + + // Big enough for a \r\n pair + // lookBehind[0] = most recent + // lookBehind[1] = second most recent + private char[] lookBehind = new char[]{ OUT_OF_BOUNDS, OUT_OF_BOUNDS }; + + CharIndexedInputStream (InputStream str, int index) + { + if (str instanceof BufferedInputStream) + br = (BufferedInputStream) str; + else + br = new BufferedInputStream (str, BUFFER_INCREMENT); + next (); + if (index > 0) + move (index); + } + + private boolean next () + { + if (end == 1) + return false; + end--; // closer to end + + try + { + if (index != -1) + { + br.reset (); } - return true; - } - - public char charAt(int index) { - if (index == 0) { - return cached; - } else if (index >= end) { - return OUT_OF_BOUNDS; - } else if (index == -1) { - return lookBehind[0]; - } else if (index == -2) { - return lookBehind[1]; - } else if (index < -2) { - return OUT_OF_BOUNDS; - } else if (index >= bufsize) { - // Allocate more space in the buffer. - try { - while (bufsize <= index) bufsize += BUFFER_INCREMENT; - br.reset(); - br.mark(bufsize); - br.skip(index-1); - } catch (IOException e) { } - } else if (this.index != index) { - try { - br.reset(); - br.skip(index-1); - } catch (IOException e) { } + int i = br.read (); + br.mark (bufsize); + if (i == -1) + { + end = 1; + cached = OUT_OF_BOUNDS; + return false; } - char ch = OUT_OF_BOUNDS; - - try { - int i = br.read(); - this.index = index+1; // this.index is index of next pos relative to charAt(0) - if (i == -1) { - // set flag that next should fail next time? - end = index; - return ch; - } - ch = (char) i; - } catch (IOException ie) { } - - return ch; - } - - public boolean move(int index) { - // move read position [index] clicks from 'charAt(0)' - boolean retval = true; - while (retval && (index-- > 0)) retval = next(); - return retval; - } - - public boolean isValid() { - return (cached != OUT_OF_BOUNDS); - } - - public CharIndexed lookBehind(int index, int length) { - throw new UnsupportedOperationException( - "difficult to look behind for an input stream"); - } - - public int length() { - throw new UnsupportedOperationException( - "difficult to tell the length for an input stream"); - } - - public void setLastMatch(REMatch match) { - throw new UnsupportedOperationException( - "difficult to support setLastMatch for an input stream"); - } - - public REMatch getLastMatch() { - throw new UnsupportedOperationException( - "difficult to support getLastMatch for an input stream"); - } - - public void setHitEnd(REMatch match) { - throw new UnsupportedOperationException( - "difficult to support setHitEnd for an input stream"); - } - - public boolean hitEnd() { - throw new UnsupportedOperationException( - "difficult to support hitEnd for an input stream"); + cached = (char) i; + index = 1; + } catch (IOException e) + { + e.printStackTrace (); + cached = OUT_OF_BOUNDS; + return false; } - - public int getAnchor() { - throw new UnsupportedOperationException( - "difficult to support getAnchor for an input stream"); - } - - public void setAnchor(int anchor) { - throw new UnsupportedOperationException( - "difficult to support setAnchor for an input stream"); + return true; + } + + public char charAt (int index) + { + if (index == 0) + { + return cached; + } + else if (index >= end) + { + return OUT_OF_BOUNDS; + } + else if (index == -1) + { + return lookBehind[0]; + } + else if (index == -2) + { + return lookBehind[1]; + } + else if (index < -2) + { + return OUT_OF_BOUNDS; + } + else if (index >= bufsize) + { + // Allocate more space in the buffer. + try + { + while (bufsize <= index) + bufsize += BUFFER_INCREMENT; + br.reset (); + br.mark (bufsize); + br.skip (index - 1); + } + catch (IOException e) + { + } + } + else if (this.index != index) + { + try + { + br.reset (); + br.skip (index - 1); + } + catch (IOException e) + { + } + } + char ch = OUT_OF_BOUNDS; + + try + { + int i = br.read (); + this.index = index + 1; // this.index is index of next pos relative to charAt(0) + if (i == -1) + { + // set flag that next should fail next time? + end = index; + return ch; + } + ch = (char) i; + } catch (IOException ie) + { } - public boolean move1(int index) { - throw new UnsupportedOperationException( - "difficult to support move1 for an input stream"); - } + return ch; + } + + public boolean move (int index) + { + // move read position [index] clicks from 'charAt(0)' + boolean retval = true; + while (retval && (index-- > 0)) + retval = next (); + return retval; + } + + public boolean isValid () + { + return (cached != OUT_OF_BOUNDS); + } + + public CharIndexed lookBehind (int index, int length) + { + throw new + UnsupportedOperationException + ("difficult to look behind for an input stream"); + } + + public int length () + { + throw new + UnsupportedOperationException + ("difficult to tell the length for an input stream"); + } + + public void setLastMatch (REMatch match) + { + throw new + UnsupportedOperationException + ("difficult to support setLastMatch for an input stream"); + } + + public REMatch getLastMatch () + { + throw new + UnsupportedOperationException + ("difficult to support getLastMatch for an input stream"); + } + + public void setHitEnd (REMatch match) + { + throw new + UnsupportedOperationException + ("difficult to support setHitEnd for an input stream"); + } + + public boolean hitEnd () + { + throw new + UnsupportedOperationException + ("difficult to support hitEnd for an input stream"); + } + + public int getAnchor () + { + throw new + UnsupportedOperationException + ("difficult to support getAnchor for an input stream"); + } + + public void setAnchor (int anchor) + { + throw new + UnsupportedOperationException + ("difficult to support setAnchor for an input stream"); + } + + public boolean move1 (int index) + { + throw new + UnsupportedOperationException + ("difficult to support move1 for an input stream"); + } } - |