package com.stevesoft.pat;\r
\r
import java.io.*;\r
+\r
import com.stevesoft.pat.wrap.*;\r
\r
/** A basic extension of FilterWriter that uses Transformer\r
An illustration of this is given in the this\r
<a href="../test/trans.java">example.</a>\r
*/\r
-public class RegexWriter extends Writer {\r
- Replacer repr;\r
- Writer w;\r
- WriterWrap ww;\r
- StringBuffer sb = new StringBuffer();\r
- PartialBuffer wrap = new PartialBuffer(sb);\r
- int pos, epos;\r
- int interval = 128;\r
- int bufferSize = 2*1024;\r
-\r
- public RegexWriter(Transformer t,Writer w) {\r
- this.w = w;\r
- ww = new WriterWrap(w);\r
- repr = t.getReplacer();\r
- repr.setBuffer(new StringBufferLike(ww));\r
- repr.setSource(wrap);\r
- }\r
- public RegexWriter(Regex r,Writer w) {\r
- this.w = w;\r
- ww = new WriterWrap(w);\r
- repr = r.getReplacer();\r
- repr.setBuffer(new StringBufferLike(ww));\r
- repr.setSource(wrap);\r
- }\r
+public class RegexWriter\r
+ extends Writer\r
+{\r
+ Replacer repr;\r
+ Writer w;\r
+ WriterWrap ww;\r
+ StringBuffer sb = new StringBuffer();\r
+ PartialBuffer wrap = new PartialBuffer(sb);\r
+ int pos, epos;\r
+ int interval = 128;\r
+ int bufferSize = 2 * 1024;\r
\r
- char EOLchar = '\n';\r
- /** This method no longer serves any purpose.\r
- @deprecated\r
- */\r
- public char getEOLchar() {\r
- return EOLchar;\r
- }\r
- /** This method no longer serves any purpose.\r
- @deprecated\r
- */\r
- public void setEOLchar(char c) {\r
- EOLchar = c;\r
- }\r
+ public RegexWriter(Transformer t, Writer w)\r
+ {\r
+ this.w = w;\r
+ ww = new WriterWrap(w);\r
+ repr = t.getReplacer();\r
+ repr.setBuffer(new StringBufferLike(ww));\r
+ repr.setSource(wrap);\r
+ }\r
+\r
+ public RegexWriter(Regex r, Writer w)\r
+ {\r
+ this.w = w;\r
+ ww = new WriterWrap(w);\r
+ repr = r.getReplacer();\r
+ repr.setBuffer(new StringBufferLike(ww));\r
+ repr.setSource(wrap);\r
+ }\r
+\r
+ char EOLchar = '\n';\r
+ /** This method no longer serves any purpose.\r
+ @deprecated\r
+ */\r
+ public char getEOLchar()\r
+ {\r
+ return EOLchar;\r
+ }\r
\r
- int max_lines=2;\r
- /** This method no longer serves any purpose.\r
- @deprecated\r
- */\r
- public int getMaxLines() { return max_lines; }\r
- /** This method no longer serves any purpose.\r
- @deprecated\r
- */\r
- public void setMaxLines(int ml) { max_lines = ml; }\r
-\r
- void write() throws IOException {\r
- Regex rex = repr.getRegex();\r
- int eposOld = epos;\r
- if(rex.matchAt(wrap,epos) && !wrap.overRun) {\r
- while(pos < epos)\r
- w.write(sb.charAt(pos++));\r
- int to = rex.matchedTo();\r
- repr.setPos(to);\r
- repr.apply(rex,rex.getReplaceRule());\r
- epos = pos = to;\r
- if(epos == eposOld && epos < sb.length())\r
- epos++;\r
- } else if(!wrap.overRun && epos < sb.length()) {\r
+ /** This method no longer serves any purpose.\r
+ @deprecated\r
+ */\r
+ public void setEOLchar(char c)\r
+ {\r
+ EOLchar = c;\r
+ }\r
+\r
+ int max_lines = 2;\r
+ /** This method no longer serves any purpose.\r
+ @deprecated\r
+ */\r
+ public int getMaxLines()\r
+ {\r
+ return max_lines;\r
+ }\r
+\r
+ /** This method no longer serves any purpose.\r
+ @deprecated\r
+ */\r
+ public void setMaxLines(int ml)\r
+ {\r
+ max_lines = ml;\r
+ }\r
+\r
+ void write()\r
+ throws IOException\r
+ {\r
+ Regex rex = repr.getRegex();\r
+ int eposOld = epos;\r
+ if (rex.matchAt(wrap, epos) && !wrap.overRun)\r
+ {\r
+ while (pos < epos)\r
+ {\r
+ w.write(sb.charAt(pos++));\r
+ }\r
+ int to = rex.matchedTo();\r
+ repr.setPos(to);\r
+ repr.apply(rex, rex.getReplaceRule());\r
+ epos = pos = to;\r
+ if (epos == eposOld && epos < sb.length())\r
+ {\r
epos++;\r
}\r
- while(pos < epos)\r
- w.write(sb.charAt(pos++));\r
- if(epos == sb.length()) {\r
- sb.setLength(1);\r
- pos = epos = 1;\r
- } else if(pos > bufferSize) {\r
- for(int i=bufferSize;i<sb.length();i++)\r
- sb.setCharAt(i-bufferSize,sb.charAt(i));\r
- pos -= bufferSize;\r
- epos -= bufferSize;\r
- sb.setLength(sb.length()-bufferSize);\r
+ }\r
+ else if (!wrap.overRun && epos < sb.length())\r
+ {\r
+ epos++;\r
+ }\r
+ while (pos < epos)\r
+ {\r
+ w.write(sb.charAt(pos++));\r
+ }\r
+ if (epos == sb.length())\r
+ {\r
+ sb.setLength(1);\r
+ pos = epos = 1;\r
+ }\r
+ else if (pos > bufferSize)\r
+ {\r
+ for (int i = bufferSize; i < sb.length(); i++)\r
+ {\r
+ sb.setCharAt(i - bufferSize, sb.charAt(i));\r
}\r
+ pos -= bufferSize;\r
+ epos -= bufferSize;\r
+ sb.setLength(sb.length() - bufferSize);\r
}\r
+ }\r
\r
- public void write(char[] ca,int b,int n) throws IOException {\r
- int m = b+n;\r
- for(int i=b;i<m;i++) {\r
- sb.append(ca[i]);\r
- if(sb.length() % interval == interval - 1) {\r
- wrap.overRun = false;\r
- while(epos+interval < sb.length() && !wrap.overRun) {\r
- write();\r
- }\r
+ public void write(char[] ca, int b, int n)\r
+ throws IOException\r
+ {\r
+ int m = b + n;\r
+ for (int i = b; i < m; i++)\r
+ {\r
+ sb.append(ca[i]);\r
+ if (sb.length() % interval == interval - 1)\r
+ {\r
+ wrap.overRun = false;\r
+ while (epos + interval < sb.length() && !wrap.overRun)\r
+ {\r
+ write();\r
}\r
}\r
}\r
+ }\r
\r
- public void flush() throws IOException {\r
- }\r
+ public void flush()\r
+ throws IOException\r
+ {\r
+ }\r
\r
- public void close() throws IOException {\r
- wrap.allowOverRun = false;\r
- wrap.overRun = false;\r
- while(epos < sb.length())\r
- write();\r
- write();\r
- w.close();\r
+ public void close()\r
+ throws IOException\r
+ {\r
+ wrap.allowOverRun = false;\r
+ wrap.overRun = false;\r
+ while (epos < sb.length())\r
+ {\r
+ write();\r
}\r
+ write();\r
+ w.close();\r
+ }\r
\r
- /** The current size of the StringBuffer in use by RegexWriter. */\r
- public int length() { return sb.length(); }\r
+ /** The current size of the StringBuffer in use by RegexWriter. */\r
+ public int length()\r
+ {\r
+ return sb.length();\r
+ }\r
\r
- /** The character at location i in the StringBuffer. */\r
- public char charAt(int i) { return sb.charAt(i); }\r
+ /** The character at location i in the StringBuffer. */\r
+ public char charAt(int i)\r
+ {\r
+ return sb.charAt(i);\r
+ }\r
\r
- /** Set the interval at which regex patterns are checked. */\r
- public void setInterval(int i) {\r
- interval = i;\r
- }\r
+ /** Set the interval at which regex patterns are checked. */\r
+ public void setInterval(int i)\r
+ {\r
+ interval = i;\r
+ }\r
\r
- /** Get the interval at which regex matches are checked. */\r
- public int getInterval() {\r
- return interval;\r
- }\r
+ /** Get the interval at which regex matches are checked. */\r
+ public int getInterval()\r
+ {\r
+ return interval;\r
+ }\r
\r
- /** Get the buffer size. */\r
- public int getBufferSize() {\r
- return bufferSize;\r
- }\r
+ /** Get the buffer size. */\r
+ public int getBufferSize()\r
+ {\r
+ return bufferSize;\r
+ }\r
\r
- /** Set the buffer size. */\r
- public void setBufferSize(int i) {\r
- bufferSize = i;\r
- }\r
+ /** Set the buffer size. */\r
+ public void setBufferSize(int i)\r
+ {\r
+ bufferSize = i;\r
+ }\r
\r
- static void test(String re,String inp,int n) throws Exception {\r
+ static void test(String re, String inp, int n)\r
+ throws Exception\r
+ {\r
StringWriter sw = new StringWriter();\r
Regex rex = Regex.perlCode(re);\r
String res1 = rex.replaceAll(inp);\r
- RegexWriter rw = new RegexWriter(rex,sw);\r
- for(int i=0;i<inp.length();i++)\r
+ RegexWriter rw = new RegexWriter(rex, sw);\r
+ for (int i = 0; i < inp.length(); i++)\r
+ {\r
rw.write(inp.charAt(i));\r
+ }\r
rw.close();\r
String res2 = sw.toString();\r
- if(!res1.equals(res2)) {\r
- System.out.println("nmax="+n);\r
- System.out.println("re="+re);\r
- System.out.println("inp="+inp);\r
- System.out.println("res1="+res1);\r
- System.out.println("res2="+res2);\r
+ if (!res1.equals(res2))\r
+ {\r
+ System.out.println("nmax=" + n);\r
+ System.out.println("re=" + re);\r
+ System.out.println("inp=" + inp);\r
+ System.out.println("res1=" + res1);\r
+ System.out.println("res2=" + res2);\r
System.exit(255);\r
}\r
}\r
- public static void main(String[] args) throws Exception {\r
- for(int n=1;n<=1;n++) {\r
- test("s/x/y/","-----x123456789",n);\r
- 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);\r
- test("s/^/a/","bbb",n);\r
- test("s/^/a/","",n);\r
- test("s{.*}{N}","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",n);\r
- test("s/.{0,7}/y/","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",n);\r
- test("s/x/$&/","xxx",n);\r
+\r
+ public static void main(String[] args)\r
+ throws Exception\r
+ {\r
+ for (int n = 1; n <= 1; n++)\r
+ {\r
+ test("s/x/y/", "-----x123456789", n);\r
+ 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);\r
+ test("s/^/a/", "bbb", n);\r
+ test("s/^/a/", "", n);\r
+ test("s{.*}{N}", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", n);\r
+ test("s/.{0,7}/y/", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", n);\r
+ test("s/x/$&/", "xxx", n);\r
}\r
System.out.println("Success!!!");\r
}\r