X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fcom%2Fstevesoft%2Fpat%2FRegexReader.java;fp=src%2Fcom%2Fstevesoft%2Fpat%2FRegexReader.java;h=6475dfecdef71cbb7d4a28909e83daad19ac1b61;hb=7bc226b58110fa26d9dbd3f0c78095d06909ffc3;hp=0ff33e395245327d936be4591fb310d575ce0837;hpb=dd74fc4938723fe5ec48d4e5fdcfbe58ac42a48d;p=jalview.git diff --git a/src/com/stevesoft/pat/RegexReader.java b/src/com/stevesoft/pat/RegexReader.java index 0ff33e3..6475dfe 100755 --- a/src/com/stevesoft/pat/RegexReader.java +++ b/src/com/stevesoft/pat/RegexReader.java @@ -8,6 +8,7 @@ package com.stevesoft.pat; import java.io.*; + import com.stevesoft.pat.wrap.*; /** This class allows you to replace the text in strings @@ -15,8 +16,10 @@ import com.stevesoft.pat.wrap.*; 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 { + */ +public class RegexReader + extends Reader +{ RBuffer rb = new RBuffer(new StringBuffer()); PartialBuffer wrap = new PartialBuffer(rb.sb); boolean moreToRead = true; @@ -24,185 +27,259 @@ public class RegexReader extends Reader { Replacer rp; // the buffer size - int nmax = 2*1024; + int nmax = 2 * 1024; - public RegexReader(Regex rex,Reader r) { + public RegexReader(Regex rex, Reader r) + { this.r = r; rp = rex.getReplacer(); } - public RegexReader(Transformer tex,Reader r) { + + public RegexReader(Transformer tex, Reader r) + { this.r = r; rp = tex.getReplacer(); } - public void reset() throws IOException { + + public void reset() + throws IOException + { r.reset(); rb = new RBuffer(new StringBuffer()); wrap = new PartialBuffer(rb.sb); moreToRead = true; } - void readData() throws IOException { + + void readData() + throws IOException + { int c; int n = 0; - while( (c = r.read()) != -1) { - rb.sb.append((char)c); - if(n++ > nmax) + while ( (c = r.read()) != -1) + { + rb.sb.append( (char) c); + if (n++ > nmax) + { break; + } } - if(c == -1 && n == 0) { + if (c == -1 && n == 0) + { moreToRead = false; wrap.allowOverRun = false; } } - void getMoreData() throws IOException { - while(rb.pos >= rb.epos) { + + void getMoreData() + throws IOException + { + while (rb.pos >= rb.epos) + { wrap.overRun = false; - if(rb.next != null) { - rb = rb.next; - } else if(rb.done) { + 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) { + } + 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; - } + } + 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 + { + rb3.pos = rb3.epos = npos; + } } - } else { - if(wrap.overRun) { - readData(); - } else if(rb.epos= rb.epos) { + + public int read() + throws IOException + { + if (rb.pos >= rb.epos) + { getMoreData(); - if(rb.pos >= rb.epos) + 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 + + public int read(char[] buf, int off, int len) + throws IOException { int c = -1; - int end = off+len; - for(int i=off;i