1 19 20 package gnu.regexp; 21 import java.io.InputStream ; 22 import java.io.BufferedInputStream ; 23 import java.io.IOException ; 24 25 27 class CharIndexedInputStream implements CharIndexed { 28 private static final int BUFFER_INCREMENT = 1024; 29 private static final int UNKNOWN = Integer.MAX_VALUE; 31 private BufferedInputStream br; 32 33 private int index = -1; 35 36 private int bufsize = BUFFER_INCREMENT; 37 38 private int end = UNKNOWN; 39 40 private char cached = OUT_OF_BOUNDS; 41 42 private char[] lookBehind = new char[] { OUT_OF_BOUNDS, OUT_OF_BOUNDS }; 46 47 CharIndexedInputStream(InputStream str, int index) { 48 if (str instanceof BufferedInputStream ) br = (BufferedInputStream ) str; 49 else br = new BufferedInputStream (str,BUFFER_INCREMENT); 50 next(); 51 if (index > 0) move(index); 52 } 53 54 private boolean next() { 55 if (end == 1) return false; 56 end--; 58 try { 59 if (index != -1) { 60 br.reset(); 61 } 62 int i = br.read(); 63 br.mark(bufsize); 64 if (i == -1) { 65 end = 1; 66 cached = OUT_OF_BOUNDS; 67 return false; 68 } 69 cached = (char) i; 70 index = 1; 71 } catch (IOException e) { 72 e.printStackTrace(); 73 cached = OUT_OF_BOUNDS; 74 return false; 75 } 76 return true; 77 } 78 79 public char charAt(int index) { 80 if (index == 0) { 81 return cached; 82 } else if (index >= end) { 83 return OUT_OF_BOUNDS; 84 } else if (index == -1) { 85 return lookBehind[0]; 86 } else if (index == -2) { 87 return lookBehind[1]; 88 } else if (index < -2) { 89 return OUT_OF_BOUNDS; 90 } else if (index >= bufsize) { 91 try { 93 while (bufsize <= index) bufsize += BUFFER_INCREMENT; 94 br.reset(); 95 br.mark(bufsize); 96 br.skip(index-1); 97 } catch (IOException e) { } 98 } else if (this.index != index) { 99 try { 100 br.reset(); 101 br.skip(index-1); 102 } catch (IOException e) { } 103 } 104 char ch = OUT_OF_BOUNDS; 105 106 try { 107 int i = br.read(); 108 this.index = index+1; if (i == -1) { 110 end = index; 112 return ch; 113 } 114 ch = (char) i; 115 } catch (IOException ie) { } 116 117 return ch; 118 } 119 120 public boolean move(int index) { 121 boolean retval = true; 123 while (retval && (index-- > 0)) retval = next(); 124 return retval; 125 } 126 127 public boolean isValid() { 128 return (cached != OUT_OF_BOUNDS); 129 } 130 } 131 132 | Popular Tags |