Frames | No Frames |
1: /* gnu/regexp/REFilterInputStream.java 2: Copyright (C) 1998-2001, 2004 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package gnu.regexp; 40: import java.io.FilterInputStream; 41: import java.io.InputStream; 42: 43: /** 44: * Replaces instances of a given RE found within an InputStream 45: * with replacement text. The replacements are interpolated into the 46: * stream when a match is found. 47: * 48: * @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A> 49: * @deprecated This class cannot properly handle all character 50: * encodings. For proper handling, use the REFilterReader 51: * class instead. 52: */ 53: 54: public class REFilterInputStream extends FilterInputStream { 55: 56: private RE expr; 57: private String replace; 58: private String buffer; 59: private int bufpos; 60: private int offset; 61: private CharIndexedInputStream stream; 62: 63: /** 64: * Creates an REFilterInputStream. When reading from this stream, 65: * occurrences of patterns matching the supplied regular expression 66: * will be replaced with the supplied replacement text (the 67: * metacharacters $0 through $9 may be used to refer to the full 68: * match or subexpression matches). 69: * 70: * @param stream The InputStream to be filtered. 71: * @param expr The regular expression to search for. 72: * @param replace The text pattern to replace matches with. 73: */ 74: public REFilterInputStream(InputStream stream, RE expr, String replace) { 75: super(stream); 76: this.stream = new CharIndexedInputStream(stream,0); 77: this.expr = expr; 78: this.replace = replace; 79: } 80: 81: /** 82: * Reads the next byte from the stream per the general contract of 83: * InputStream.read(). Returns -1 on error or end of stream. 84: */ 85: public int read() { 86: // If we have buffered replace data, use it. 87: if ((buffer != null) && (bufpos < buffer.length())) { 88: return (int) buffer.charAt(bufpos++); 89: } 90: 91: // check if input is at a valid position 92: if (!stream.isValid()) return -1; 93: 94: REMatch mymatch = new REMatch(expr.getNumSubs(),offset,0); 95: if (expr.match(stream, mymatch)) { 96: mymatch.end[0] = mymatch.index; 97: mymatch.finish(stream); 98: stream.move(mymatch.toString().length()); 99: offset += mymatch.toString().length(); 100: buffer = mymatch.substituteInto(replace); 101: bufpos = 1; 102: 103: // This is prone to infinite loops if replace string turns out empty. 104: if (buffer.length() > 0) { 105: return buffer.charAt(0); 106: } 107: } 108: char ch = stream.charAt(0); 109: if (ch == CharIndexed.OUT_OF_BOUNDS) return -1; 110: stream.move(1); 111: offset++; 112: return ch; 113: } 114: 115: /** 116: * Returns false. REFilterInputStream does not support mark() and 117: * reset() methods. 118: */ 119: public boolean markSupported() { 120: return false; 121: } 122: 123: /** Reads from the stream into the provided array. */ 124: public int read(byte[] b, int off, int len) { 125: int i; 126: int ok = 0; 127: while (len-- > 0) { 128: i = read(); 129: if (i == -1) return (ok == 0) ? -1 : ok; 130: b[off++] = (byte) i; 131: ok++; 132: } 133: return ok; 134: } 135: 136: /** Reads from the stream into the provided array. */ 137: public int read(byte[] b) { 138: return read(b,0,b.length); 139: } 140: }