2 * gnu/regexp/CharIndexedReader.java
3 * Copyright (C) 1998-2001 Wes Biggs
5 * This library is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published
7 * by the Free Software Foundation; either version 2.1 of the License, or
8 * (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 import java.io.InputStream;
22 import java.io.BufferedInputStream;
23 import java.io.IOException;
25 // TODO: move(x) shouldn't rely on calling next() x times
27 class CharIndexedInputStream implements CharIndexed {
28 private static final int BUFFER_INCREMENT = 1024;
29 private static final int UNKNOWN = Integer.MAX_VALUE; // value for end
31 private BufferedInputStream br;
33 // so that we don't try to reset() right away
34 private int index = -1;
36 private int bufsize = BUFFER_INCREMENT;
38 private int end = UNKNOWN;
40 private char cached = OUT_OF_BOUNDS;
42 // Big enough for a \r\n pair
43 // lookBehind[0] = most recent
44 // lookBehind[1] = second most recent
45 private char[] lookBehind = new char[] { OUT_OF_BOUNDS, OUT_OF_BOUNDS };
47 CharIndexedInputStream(InputStream str, int index) {
48 if (str instanceof BufferedInputStream) br = (BufferedInputStream) str;
49 else br = new BufferedInputStream(str,BUFFER_INCREMENT);
51 if (index > 0) move(index);
54 private boolean next() {
55 if (end == 1) return false;
56 end--; // closer to end
66 cached = OUT_OF_BOUNDS;
71 } catch (IOException e) {
73 cached = OUT_OF_BOUNDS;
79 public char charAt(int index) {
82 } else if (index >= end) {
84 } else if (index == -1) {
86 } else if (index == -2) {
88 } else if (index < -2) {
90 } else if (index >= bufsize) {
91 // Allocate more space in the buffer.
93 while (bufsize <= index) bufsize += BUFFER_INCREMENT;
97 } catch (IOException e) { }
98 } else if (this.index != index) {
102 } catch (IOException e) { }
104 char ch = OUT_OF_BOUNDS;
108 this.index = index+1; // this.index is index of next pos relative to charAt(0)
110 // set flag that next should fail next time?
115 } catch (IOException ie) { }
120 public boolean move(int index) {
121 // move read position [index] clicks from 'charAt(0)'
122 boolean retval = true;
123 while (retval && (index-- > 0)) retval = next();
127 public boolean isValid() {
128 return (cached != OUT_OF_BOUNDS);