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.java.util.regex; 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: 57: private RE expr; 58: private String replace; 59: private String buffer; 60: private int bufpos; 61: private int offset; 62: private CharIndexedInputStream stream; 63: 64: /** 65: * Creates an REFilterInputStream. When reading from this stream, 66: * occurrences of patterns matching the supplied regular expression 67: * will be replaced with the supplied replacement text (the 68: * metacharacters $0 through $9 may be used to refer to the full 69: * match or subexpression matches). 70: * 71: * @param stream The InputStream to be filtered. 72: * @param expr The regular expression to search for. 73: * @param replace The text pattern to replace matches with. 74: */ 75: public REFilterInputStream (InputStream stream, RE expr, String replace) 76: { 77: super (stream); 78: this.stream = new CharIndexedInputStream (stream, 0); 79: this.expr = expr; 80: this.replace = replace; 81: } 82: 83: /** 84: * Reads the next byte from the stream per the general contract of 85: * InputStream.read(). Returns -1 on error or end of stream. 86: */ 87: public int read () 88: { 89: // If we have buffered replace data, use it. 90: if ((buffer != null) && (bufpos < buffer.length ())) 91: { 92: return (int) buffer.charAt (bufpos++); 93: } 94: 95: // check if input is at a valid position 96: if (!stream.isValid ()) 97: return -1; 98: 99: REMatch mymatch = new REMatch (expr.getNumSubs (), offset, 0); 100: if (expr.match (stream, mymatch)) 101: { 102: mymatch.end[0] = mymatch.index; 103: mymatch.finish (stream); 104: stream.move (mymatch.toString ().length ()); 105: offset += mymatch.toString ().length (); 106: buffer = mymatch.substituteInto (replace); 107: bufpos = 1; 108: 109: // This is prone to infinite loops if replace string turns out empty. 110: if (buffer.length () > 0) 111: { 112: return buffer.charAt (0); 113: } 114: } 115: char ch = stream.charAt (0); 116: if (ch == CharIndexed.OUT_OF_BOUNDS) 117: return -1; 118: stream.move (1); 119: offset++; 120: return ch; 121: } 122: 123: /** 124: * Returns false. REFilterInputStream does not support mark() and 125: * reset() methods. 126: */ 127: public boolean markSupported () 128: { 129: return false; 130: } 131: 132: /** Reads from the stream into the provided array. */ 133: public int read (byte[]b, int off, int len) 134: { 135: int i; 136: int ok = 0; 137: while (len-- > 0) 138: { 139: i = read (); 140: if (i == -1) 141: return (ok == 0) ? -1 : ok; 142: b[off++] = (byte) i; 143: ok++; 144: } 145: return ok; 146: } 147: 148: /** Reads from the stream into the provided array. */ 149: public int read (byte[]b) 150: { 151: return read (b, 0, b.length); 152: } 153: }