-//
-// 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 javajs.util.SB());
-
- 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 javajs.util.SB());
- wrap = new PartialBuffer(rb.sb);
- moreToRead = true;
- }
-
- void readData() throws IOException
- {
- int c;
- int n = 0;
- while ((c = r.read()) != -1)
- {
- rb.sb.appendC((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((javajs.util.SB) 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.sb.length())
- {
- rb.epos++;
- }
- else
- {
- break;
- }
- }
- }
- }
-
- public int read() throws IOException
- {
- if (rb.pos >= 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 < end; i++)
- {
- c = read();
- if (c < 0)
- {
- if (i == off)
- {
- return -1;
- }
- return i - off;
- }
- buf[i] = (char) c;
- }
- return len;
- }
-
- public void close() throws IOException
- {
- r.close();
- }
-
- public boolean markSupported()
- {
- return false;
- }
-
- /**
- * Get the size of the working buffer. The current buffer may be larger if the
- * pattern demands it.
- */
- public int getBufferSize()
- {
- return nmax;
- }
-
- /**
- * Set the size of the working buffer. The current buffer may be larger if the
- * pattern demands it.
- */
- public void setBufferSize(int n)
- {
- nmax = n;
- }
-
- int max_lines = 2;
-
- /**
- * This function no longer serves any purpose.
- *
- * @deprecated
- */
- public int getMaxLines()
- {
- return max_lines;
- }
-
- /**
- * This function no longer serves any purpose.
- *
- * @deprecated
- */
- public void setMaxLines(int ml)
- {
- max_lines = ml;
- }
-
- char EOLchar = '\n';
-
- /**
- * This function no longer serves any purpose.
- *
- * @deprecated
- */
- public char getEOLchar()
- {
- return EOLchar;
- }
-
- /**
- * This function no longer serves any purpose.
- *
- * @deprecated
- */
- public void setEOLchar(char c)
- {
- EOLchar = c;
- }
-
- public long skip(long d) throws IOException
- {
- // This is probably inefficient, I just did it
- // this way to avoid possible bugs.
- long n = 0;
- while (n < d && read() != -1)
- {
- n++;
- }
- return n;
- }
-
- /*
- * static void test(String re,String inp,int n) throws Exception { Reader r =
- * new StringReader(inp); r = new BufferedReader(r); Regex rex =
- * Regex.perlCode(re); String res1 = rex.replaceAll(inp); int c = -1;
- * javajs.util.SB sb = new javajs.util.SB(); RegexReader rr = new
- * RegexReader(rex,r); rr.setBufferSize(n); while( (c = rr.read()) != -1)
- * sb.append((char)c); String res2 = sb.toString(); if(!res1.equals(res2)) {
- * System.out.println("nmax="+n); System.out.println("re="+re);
- * System.out.println("inp="+inp); System.out.println("res1="+res1);
- * System.out.println("res2="+res2); System.exit(255); } } public static void
- * main(String[] args) throws Exception { for(int n=6;n<15;n++) {
- * test("s/x/y/","-----x123456789",n); test("s/x/y/","x123456789",n);
- * test("s/x/y/","-----x",n);
- * test("s/x.*?x/y/",".xx..x..x...x...x....x....x",n);
- * test("s/x.*x/[$&]/","--x........x--xx",n);
- * test("s/x.*x/[$&]/","--x........x------",n);
- * test("s/.$/a/m","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbbbbbbbbbbbb",n);
- * test("s/.$/a/","123",n);
- * test("s/.$/a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);
- * test("s/^./a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);
- * test("s/$/a/","bbb",n); test("s/^/a/","bbb",n); test("s/^/a/","",n);
- * test("s{.*}{N}","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",n);
- * test("s/.{0,7}/y/","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",n);
- * test("s/x/$&/","xxx",n); } System.out.println("Success!!!"); }
- */
-}
+//\r
+// This software is now distributed according to\r
+// the Lesser Gnu Public License. Please see\r
+// http://www.gnu.org/copyleft/lesser.txt for\r
+// the details.\r
+// -- Happy Computing!\r
+//\r
+package com.stevesoft.pat;\r
+\r
+import java.io.*;\r
+\r
+import com.stevesoft.pat.wrap.*;\r
+\r
+/**\r
+ * This class allows you to replace the text in strings as you read them in. Be\r
+ * careful what you do with this freedom... using Regex.perlCode("s{.*}{x}s") as\r
+ * your pattern will result in loading the entire contents of the Reader into\r
+ * memory.\r
+ */\r
+public class RegexReader extends Reader\r
+{\r
+ RBuffer rb = new RBuffer(new javajs.util.SB());\r
+\r
+ PartialBuffer wrap = new PartialBuffer(rb.sb);\r
+\r
+ boolean moreToRead = true;\r
+\r
+ Reader r;\r
+\r
+ Replacer rp;\r
+\r
+ // the buffer size\r
+ int nmax = 2 * 1024;\r
+\r
+ public RegexReader(Regex rex, Reader r)\r
+ {\r
+ this.r = r;\r
+ rp = rex.getReplacer();\r
+ }\r
+\r
+ public RegexReader(Transformer tex, Reader r)\r
+ {\r
+ this.r = r;\r
+ rp = tex.getReplacer();\r
+ }\r
+\r
+ public void reset() throws IOException\r
+ {\r
+ r.reset();\r
+ rb = new RBuffer(new javajs.util.SB());\r
+ wrap = new PartialBuffer(rb.sb);\r
+ moreToRead = true;\r
+ }\r
+\r
+ void readData() throws IOException\r
+ {\r
+ int c;\r
+ int n = 0;\r
+ while ((c = r.read()) != -1)\r
+ {\r
+ rb.sb.appendC((char) c);\r
+ if (n++ > nmax)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ if (c == -1 && n == 0)\r
+ {\r
+ moreToRead = false;\r
+ wrap.allowOverRun = false;\r
+ }\r
+ }\r
+\r
+ void getMoreData() throws IOException\r
+ {\r
+ while (rb.pos >= rb.epos)\r
+ {\r
+ wrap.overRun = false;\r
+ if (rb.next != null)\r
+ {\r
+ rb = rb.next;\r
+ }\r
+ else if (rb.done)\r
+ {\r
+ break;\r
+ }\r
+ else if (rb.epos >= rb.sb.length() && rb.epos > nmax)\r
+ {\r
+ rb.pos = 1;\r
+ rb.epos = 1;\r
+ rb.sb.setLength(1);\r
+ readData();\r
+ }\r
+ else if (rb.epos >= rb.sb.length() && moreToRead)\r
+ {\r
+ readData();\r
+ }\r
+ else if (rp.getRegex().matchAt(wrap, rb.epos))\r
+ {\r
+ if (wrap.overRun)\r
+ {\r
+ readData();\r
+ }\r
+ else\r
+ {\r
+ StringBufferWrap sbw = new StringBufferWrap();\r
+ StringBufferLike sbl = new StringBufferLike(sbw);\r
+ /*\r
+ * ReplaceRule rr = rex.getReplaceRule(); while(rr != null) {\r
+ * rr.apply(sbl,rex); rr = rr.next; }\r
+ */\r
+ Regex rex = rp.getRegex();\r
+ int npos = rex.matchedTo();\r
+ rp.setBuffer(sbl);\r
+ rp.setSource(wrap);\r
+ rp.setPos(npos);\r
+ rp.apply(rex, rex.getReplaceRule());\r
+ int opos = rb.epos;\r
+ RBuffer rb2 = new RBuffer((javajs.util.SB) sbw.unwrap());\r
+ rb2.epos = rb2.sb.length();\r
+ RBuffer rb3 = new RBuffer(rb.sb);\r
+\r
+ rb.next = rb2;\r
+ rb2.next = rb3;\r
+\r
+ if (npos == opos)\r
+ {\r
+ rb3.epos = npos + 1;\r
+ if (rb3.epos > rb3.sb.length())\r
+ {\r
+ if (rb.pos >= rb.epos)\r
+ {\r
+ rb = rb.next;\r
+ }\r
+ rb3.pos = rb3.epos = 0;\r
+ rb3.done = true;\r
+ // break;\r
+ }\r
+ rb3.pos = npos;\r
+ }\r
+ else\r
+ {\r
+ rb3.pos = rb3.epos = npos;\r
+ }\r
+\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (wrap.overRun)\r
+ {\r
+ readData();\r
+ }\r
+ else if (rb.epos < rb.sb.length())\r
+ {\r
+ rb.epos++;\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ public int read() throws IOException\r
+ {\r
+ if (rb.pos >= rb.epos)\r
+ {\r
+ getMoreData();\r
+ if (rb.pos >= rb.epos)\r
+ {\r
+ return -1;\r
+ }\r
+ }\r
+ // System.out.println(rb);\r
+ return rb.sb.charAt(rb.pos++);\r
+ }\r
+\r
+ public int read(char[] buf, int off, int len) throws IOException\r
+ {\r
+ int c = -1;\r
+ int end = off + len;\r
+ for (int i = off; i < end; i++)\r
+ {\r
+ c = read();\r
+ if (c < 0)\r
+ {\r
+ if (i == off)\r
+ {\r
+ return -1;\r
+ }\r
+ return i - off;\r
+ }\r
+ buf[i] = (char) c;\r
+ }\r
+ return len;\r
+ }\r
+\r
+ public void close() throws IOException\r
+ {\r
+ r.close();\r
+ }\r
+\r
+ public boolean markSupported()\r
+ {\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ * Get the size of the working buffer. The current buffer may be larger if the\r
+ * pattern demands it.\r
+ */\r
+ public int getBufferSize()\r
+ {\r
+ return nmax;\r
+ }\r
+\r
+ /**\r
+ * Set the size of the working buffer. The current buffer may be larger if the\r
+ * pattern demands it.\r
+ */\r
+ public void setBufferSize(int n)\r
+ {\r
+ nmax = n;\r
+ }\r
+\r
+ int max_lines = 2;\r
+\r
+ /**\r
+ * This function no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ public int getMaxLines()\r
+ {\r
+ return max_lines;\r
+ }\r
+\r
+ /**\r
+ * This function no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ public void setMaxLines(int ml)\r
+ {\r
+ max_lines = ml;\r
+ }\r
+\r
+ char EOLchar = '\n';\r
+\r
+ /**\r
+ * This function no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ public char getEOLchar()\r
+ {\r
+ return EOLchar;\r
+ }\r
+\r
+ /**\r
+ * This function no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ public void setEOLchar(char c)\r
+ {\r
+ EOLchar = c;\r
+ }\r
+\r
+ public long skip(long d) throws IOException\r
+ {\r
+ // This is probably inefficient, I just did it\r
+ // this way to avoid possible bugs.\r
+ long n = 0;\r
+ while (n < d && read() != -1)\r
+ {\r
+ n++;\r
+ }\r
+ return n;\r
+ }\r
+\r
+ /*\r
+ * static void test(String re,String inp,int n) throws Exception { Reader r =\r
+ * new StringReader(inp); r = new BufferedReader(r); Regex rex =\r
+ * Regex.perlCode(re); String res1 = rex.replaceAll(inp); int c = -1;\r
+ * javajs.util.SB sb = new javajs.util.SB(); RegexReader rr = new\r
+ * RegexReader(rex,r); rr.setBufferSize(n); while( (c = rr.read()) != -1)\r
+ * sb.append((char)c); String res2 = sb.toString(); if(!res1.equals(res2)) {\r
+ * System.out.println("nmax="+n); System.out.println("re="+re);\r
+ * System.out.println("inp="+inp); System.out.println("res1="+res1);\r
+ * System.out.println("res2="+res2); System.exit(255); } } public static void\r
+ * main(String[] args) throws Exception { for(int n=6;n<15;n++) {\r
+ * test("s/x/y/","-----x123456789",n); test("s/x/y/","x123456789",n);\r
+ * test("s/x/y/","-----x",n);\r
+ * test("s/x.*?x/y/",".xx..x..x...x...x....x....x",n);\r
+ * test("s/x.*x/[$&]/","--x........x--xx",n);\r
+ * test("s/x.*x/[$&]/","--x........x------",n);\r
+ * test("s/.$/a/m","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbbbbbbbbbbbb",n);\r
+ * test("s/.$/a/","123",n);\r
+ * test("s/.$/a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);\r
+ * test("s/^./a/","bb\nbbb\nbbbb\nbbbbb\nbbbbbb\nbb",n);\r
+ * test("s/$/a/","bbb",n); test("s/^/a/","bbb",n); test("s/^/a/","",n);\r
+ * test("s{.*}{N}","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",n);\r
+ * test("s/.{0,7}/y/","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",n);\r
+ * test("s/x/$&/","xxx",n); } System.out.println("Success!!!"); }\r
+ */\r
+}\r