// // This software is now distributed according to // the Lesser Gnu Public License. Please see // http://www.gnu.org/copyleft/lesser.txt for // the details. // -- Happy Computing! // package com.stevesoft.pat; import java.io.*; import com.stevesoft.pat.wrap.*; /** A basic extension of FilterWriter that uses Transformer to make replacements in data as it is written out. It attempts to transform a string whenever the End-of-Line (EOL) character is written (which is, by default, the carriage return '\n'). Only the transformed portion of the line is written out, allowing the RegexWriter to wait until a complete pattern is present before attempting to write out info. Until a pattern completes, data is stored in a StringBuffer -- which can be accessed through the length() and charAt() methods of this class.
Note a subtlety here -- while a Transformer normally matches at higher priority against the pattern added to it first, this will not necessarily be true when a multi-line match is in progress because one of the complete multi-line patterns may not be completely loaded in RegexWriter's buffer. For this reason, the Transformer class is equipped with a way to add a pattern and replacement rule in three pieces -- a beginning (once this matches, nothing else in the Transformer can match until the whole pattern matches), an ending (the whole pattern is a String formed by adding the beginning and ending), and a ReplaceRule.
An illustration of this is given in the this
example.
*/
public class RegexWriter extends Writer {
Replacer repr;
Writer w;
WriterWrap ww;
StringBuffer sb = new StringBuffer();
PartialBuffer wrap = new PartialBuffer(sb);
int pos, epos;
int interval = 128;
int bufferSize = 2*1024;
public RegexWriter(Transformer t,Writer w) {
this.w = w;
ww = new WriterWrap(w);
repr = t.getReplacer();
repr.setBuffer(new StringBufferLike(ww));
repr.setSource(wrap);
}
public RegexWriter(Regex r,Writer w) {
this.w = w;
ww = new WriterWrap(w);
repr = r.getReplacer();
repr.setBuffer(new StringBufferLike(ww));
repr.setSource(wrap);
}
char EOLchar = '\n';
/** This method no longer serves any purpose.
@deprecated
*/
public char getEOLchar() {
return EOLchar;
}
/** This method no longer serves any purpose.
@deprecated
*/
public void setEOLchar(char c) {
EOLchar = c;
}
int max_lines=2;
/** This method no longer serves any purpose.
@deprecated
*/
public int getMaxLines() { return max_lines; }
/** This method no longer serves any purpose.
@deprecated
*/
public void setMaxLines(int ml) { max_lines = ml; }
void write() throws IOException {
Regex rex = repr.getRegex();
int eposOld = epos;
if(rex.matchAt(wrap,epos) && !wrap.overRun) {
while(pos < epos)
w.write(sb.charAt(pos++));
int to = rex.matchedTo();
repr.setPos(to);
repr.apply(rex,rex.getReplaceRule());
epos = pos = to;
if(epos == eposOld && epos < sb.length())
epos++;
} else if(!wrap.overRun && epos < sb.length()) {
epos++;
}
while(pos < epos)
w.write(sb.charAt(pos++));
if(epos == sb.length()) {
sb.setLength(1);
pos = epos = 1;
} else if(pos > bufferSize) {
for(int i=bufferSize;i