2 // This software is now distributed according to
\r
3 // the Lesser Gnu Public License. Please see
\r
4 // http://www.gnu.org/copyleft/lesser.txt for
\r
6 // -- Happy Computing!
\r
8 package com.stevesoft.pat;
\r
12 import com.stevesoft.pat.wrap.*;
\r
15 * This class allows you to replace the text in strings as you read them in. Be
\r
16 * careful what you do with this freedom... using Regex.perlCode("s{.*}{x}s") as
\r
17 * your pattern will result in loading the entire contents of the Reader into
\r
20 public class RegexReader extends Reader
\r
22 RBuffer rb = new RBuffer(new javajs.util.SB());
\r
24 PartialBuffer wrap = new PartialBuffer(rb.sb);
\r
26 boolean moreToRead = true;
\r
33 int nmax = 2 * 1024;
\r
35 public RegexReader(Regex rex, Reader r)
\r
38 rp = rex.getReplacer();
\r
41 public RegexReader(Transformer tex, Reader r)
\r
44 rp = tex.getReplacer();
\r
47 public void reset() throws IOException
\r
50 rb = new RBuffer(new javajs.util.SB());
\r
51 wrap = new PartialBuffer(rb.sb);
\r
55 void readData() throws IOException
\r
59 while ((c = r.read()) != -1)
\r
61 rb.sb.appendC((char) c);
\r
67 if (c == -1 && n == 0)
\r
70 wrap.allowOverRun = false;
\r
74 void getMoreData() throws IOException
\r
76 while (rb.pos >= rb.epos)
\r
78 wrap.overRun = false;
\r
79 if (rb.next != null)
\r
87 else if (rb.epos >= rb.sb.length() && rb.epos > nmax)
\r
94 else if (rb.epos >= rb.sb.length() && moreToRead)
\r
98 else if (rp.getRegex().matchAt(wrap, rb.epos))
\r
106 StringBufferWrap sbw = new StringBufferWrap();
\r
107 StringBufferLike sbl = new StringBufferLike(sbw);
\r
109 * ReplaceRule rr = rex.getReplaceRule(); while(rr != null) {
\r
110 * rr.apply(sbl,rex); rr = rr.next; }
\r
112 Regex rex = rp.getRegex();
\r
113 int npos = rex.matchedTo();
\r
115 rp.setSource(wrap);
\r
117 rp.apply(rex, rex.getReplaceRule());
\r
118 int opos = rb.epos;
\r
119 RBuffer rb2 = new RBuffer((javajs.util.SB) sbw.unwrap());
\r
120 rb2.epos = rb2.sb.length();
\r
121 RBuffer rb3 = new RBuffer(rb.sb);
\r
128 rb3.epos = npos + 1;
\r
129 if (rb3.epos > rb3.sb.length())
\r
131 if (rb.pos >= rb.epos)
\r
135 rb3.pos = rb3.epos = 0;
\r
143 rb3.pos = rb3.epos = npos;
\r
154 else if (rb.epos < rb.sb.length())
\r
166 public int read() throws IOException
\r
168 if (rb.pos >= rb.epos)
\r
171 if (rb.pos >= rb.epos)
\r
176 // System.out.println(rb);
\r
177 return rb.sb.charAt(rb.pos++);
\r
180 public int read(char[] buf, int off, int len) throws IOException
\r
183 int end = off + len;
\r
184 for (int i = off; i < end; i++)
\r
200 public void close() throws IOException
\r
205 public boolean markSupported()
\r
211 * Get the size of the working buffer. The current buffer may be larger if the
\r
212 * pattern demands it.
\r
214 public int getBufferSize()
\r
220 * Set the size of the working buffer. The current buffer may be larger if the
\r
221 * pattern demands it.
\r
223 public void setBufferSize(int n)
\r
231 * This function no longer serves any purpose.
\r
235 public int getMaxLines()
\r
241 * This function no longer serves any purpose.
\r
245 public void setMaxLines(int ml)
\r
250 char EOLchar = '\n';
\r
253 * This function no longer serves any purpose.
\r
257 public char getEOLchar()
\r
263 * This function no longer serves any purpose.
\r
267 public void setEOLchar(char c)
\r
272 public long skip(long d) throws IOException
\r
274 // This is probably inefficient, I just did it
\r
275 // this way to avoid possible bugs.
\r
277 while (n < d && read() != -1)
\r
285 * static void test(String re,String inp,int n) throws Exception { Reader r =
\r
286 * new StringReader(inp); r = new BufferedReader(r); Regex rex =
\r
287 * Regex.perlCode(re); String res1 = rex.replaceAll(inp); int c = -1;
\r
288 * javajs.util.SB sb = new javajs.util.SB(); RegexReader rr = new
\r
289 * RegexReader(rex,r); rr.setBufferSize(n); while( (c = rr.read()) != -1)
\r
290 * sb.append((char)c); String res2 = sb.toString(); if(!res1.equals(res2)) {
\r
291 * System.out.println("nmax="+n); System.out.println("re="+re);
\r
292 * System.out.println("inp="+inp); System.out.println("res1="+res1);
\r
293 * System.out.println("res2="+res2); System.exit(255); } } public static void
\r
294 * main(String[] args) throws Exception { for(int n=6;n<15;n++) {
\r
295 * test("s/x/y/","-----x123456789",n); test("s/x/y/","x123456789",n);
\r
296 * test("s/x/y/","-----x",n);
\r
297 * test("s/x.*?x/y/",".xx..x..x...x...x....x....x",n);
\r
298 * test("s/x.*x/[$&]/","--x........x--xx",n);
\r
299 * test("s/x.*x/[$&]/","--x........x------",n);
\r
300 * test("s/.$/a/m","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbbbbbbbbbbbb",n);
\r
301 * test("s/.$/a/","123",n);
\r
302 * test("s/.$/a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);
\r
303 * test("s/^./a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);
\r
304 * test("s/$/a/","bbb",n); test("s/^/a/","bbb",n); test("s/^/a/","",n);
\r
305 * test("s{.*}{N}","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",n);
\r
306 * test("s/.{0,7}/y/","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",n);
\r
307 * test("s/x/$&/","xxx",n); } System.out.println("Success!!!"); }
\r