// // 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.*; /** This class allows you to replace the text in strings as you read them in. Be careful what you do with this freedom... using Regex.perlCode("s{.*}{x}s") as your pattern will result in loading the entire contents of the Reader into memory. */ public class RegexReader extends Reader { RBuffer rb = new RBuffer(new StringBuffer()); PartialBuffer wrap = new PartialBuffer(rb.sb); boolean moreToRead = true; Reader r; Replacer rp; // the buffer size int nmax = 2*1024; public RegexReader(Regex rex,Reader r) { this.r = r; rp = rex.getReplacer(); } public RegexReader(Transformer tex,Reader r) { this.r = r; rp = tex.getReplacer(); } public void reset() throws IOException { r.reset(); rb = new RBuffer(new StringBuffer()); wrap = new PartialBuffer(rb.sb); moreToRead = true; } void readData() throws IOException { int c; int n = 0; while( (c = r.read()) != -1) { rb.sb.append((char)c); if(n++ > nmax) break; } if(c == -1 && n == 0) { moreToRead = false; wrap.allowOverRun = false; } } void getMoreData() throws IOException { while(rb.pos >= rb.epos) { wrap.overRun = false; if(rb.next != null) { rb = rb.next; } else if(rb.done) { break; } else if(rb.epos >= rb.sb.length() && rb.epos > nmax) { rb.pos = 1; rb.epos = 1; rb.sb.setLength(1); readData(); } else if(rb.epos >= rb.sb.length() && moreToRead) { readData(); } else if(rp.getRegex().matchAt(wrap,rb.epos)) { if(wrap.overRun) { readData(); } else { StringBufferWrap sbw = new StringBufferWrap(); StringBufferLike sbl = new StringBufferLike(sbw); /* ReplaceRule rr = rex.getReplaceRule(); while(rr != null) { rr.apply(sbl,rex); rr = rr.next; } */ Regex rex = rp.getRegex(); int npos = rex.matchedTo(); rp.setBuffer(sbl); rp.setSource(wrap); rp.setPos(npos); rp.apply(rex,rex.getReplaceRule()); int opos = rb.epos; RBuffer rb2 = new RBuffer((StringBuffer)sbw.unwrap()); rb2.epos = rb2.sb.length(); RBuffer rb3 = new RBuffer(rb.sb); rb.next = rb2; rb2.next = rb3; if(npos == opos) { rb3.epos = npos+1; if(rb3.epos > rb3.sb.length()) { if(rb.pos >= rb.epos) rb = rb.next; rb3.pos = rb3.epos = 0; rb3.done = true; //break; } rb3.pos = npos; } else { rb3.pos = rb3.epos = npos; } } } else { if(wrap.overRun) { readData(); } else if(rb.epos= rb.epos) { getMoreData(); if(rb.pos >= rb.epos) return -1; } //System.out.println(rb); return rb.sb.charAt(rb.pos++); } public int read(char[] buf,int off,int len) throws IOException { int c = -1; int end = off+len; for(int i=off;i