-//
-// 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.IOException;
-import java.io.Writer;
-
-import com.stevesoft.pat.wrap.WriterWrap;
-
-/**
- * A basic extension of FilterWriter that uses Transformer to make replacements
- * in data as it is written out. It attempts to transform a string whenever the
- * End-of-Line (EOL) character is written (which is, by default, the carriage
- * return '\n'). Only the transformed portion of the line is written out,
- * allowing the RegexWriter to wait until a complete pattern is present before
- * attempting to write out info. Until a pattern completes, data is stored in a
- * javajs.util.SB -- which can be accessed through the length() and charAt()
- * methods of this class.
- * <p>
- * Note a subtlety here -- while a Transformer normally matches at higher
- * priority against the pattern added to it first, this will not necessarily be
- * true when a multi-line match is in progress because one of the complete
- * multi-line patterns may not be completely loaded in RegexWriter's buffer. For
- * this reason, the Transformer class is equipped with a way to add a pattern
- * and replacement rule in three pieces -- a beginning (once this matches,
- * nothing else in the Transformer can match until the whole pattern matches),
- * an ending (the whole pattern is a String formed by adding the beginning and
- * ending), and a ReplaceRule.
- * <p>
- * An illustration of this is given in the this <a
- * href="../test/trans.java">example.</a>
- */
-public class RegexWriter extends Writer
-{
- Replacer repr;
-
- Writer w;
-
- WriterWrap ww;
-
- javajs.util.SB sb = new javajs.util.SB();
-
- PartialBuffer wrap = new PartialBuffer(sb);
-
- int pos, epos;
-
- int interval = 128;
-
- int bufferSize = 2 * 1024;
-
- public RegexWriter(Transformer t, Writer w)
- {
- this.w = w;
- ww = new WriterWrap(w);
- repr = t.getReplacer();
- repr.setBuffer(new StringBufferLike(ww));
- repr.setSource(wrap);
- }
-
- public RegexWriter(Regex r, Writer w)
- {
- this.w = w;
- ww = new WriterWrap(w);
- repr = r.getReplacer();
- repr.setBuffer(new StringBufferLike(ww));
- repr.setSource(wrap);
- }
-
- char EOLchar = '\n';
-
- /**
- * This method no longer serves any purpose.
- *
- * @deprecated
- */
- @Deprecated
- public char getEOLchar()
- {
- return EOLchar;
- }
-
- /**
- * This method no longer serves any purpose.
- *
- * @deprecated
- */
- @Deprecated
- public void setEOLchar(char c)
- {
- EOLchar = c;
- }
-
- int max_lines = 2;
-
- /**
- * This method no longer serves any purpose.
- *
- * @deprecated
- */
- @Deprecated
- public int getMaxLines()
- {
- return max_lines;
- }
-
- /**
- * This method no longer serves any purpose.
- *
- * @deprecated
- */
- @Deprecated
- public void setMaxLines(int ml)
- {
- max_lines = ml;
- }
-
- void write() throws IOException
- {
- Regex rex = repr.getRegex();
- int eposOld = epos;
- if (rex.matchAt(wrap, epos) && !wrap.overRun)
- {
- while (pos < epos)
- {
- w.write(sb.charAt(pos++));
- }
- int to = rex.matchedTo();
- repr.setPos(to);
- repr.apply(rex, rex.getReplaceRule());
- epos = pos = to;
- if (epos == eposOld && epos < sb.length())
- {
- epos++;
- }
- }
- else if (!wrap.overRun && epos < sb.length())
- {
- epos++;
- }
- while (pos < epos)
- {
- w.write(sb.charAt(pos++));
- }
- if (epos == sb.length())
- {
- sb.setLength(1);
- pos = epos = 1;
- }
- else if (pos > bufferSize)
- {
-
- String s = sb.substring(bufferSize);
- sb.setLength(0);
- sb.append(s);
-// for (int i = bufferSize; i < sb.length(); i++)
-// {
-// sb.setCharAt(i - bufferSize, sb.charAt(i));
-// }
- pos -= bufferSize;
- epos -= bufferSize;
- sb.setLength(sb.length() - bufferSize);
- }
- }
-
- public void write(char[] ca, int b, int n) throws IOException
- {
- int m = b + n;
- for (int i = b; i < m; i++)
- {
- sb.appendC(ca[i]);
- if (sb.length() % interval == interval - 1)
- {
- wrap.overRun = false;
- while (epos + interval < sb.length() && !wrap.overRun)
- {
- write();
- }
- }
- }
- }
-
- public void flush() throws IOException
- {
- }
-
- public void close() throws IOException
- {
- wrap.allowOverRun = false;
- wrap.overRun = false;
- while (epos < sb.length())
- {
- write();
- }
- write();
- w.close();
- }
-
- /** The current size of the javajs.util.SB in use by RegexWriter. */
- public int length()
- {
- return sb.length();
- }
-
- /** The character at location i in the StringBuffer. */
- public char charAt(int i)
- {
- return sb.charAt(i);
- }
-
- /** Set the interval at which regex patterns are checked. */
- public void setInterval(int i)
- {
- interval = i;
- }
-
- /** Get the interval at which regex matches are checked. */
- public int getInterval()
- {
- return interval;
- }
-
- /** Get the buffer size. */
- public int getBufferSize()
- {
- return bufferSize;
- }
-
- /** Set the buffer size. */
- public void setBufferSize(int i)
- {
- bufferSize = i;
- }
-}
+//\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.IOException;\r
+import java.io.Writer;\r
+\r
+import com.stevesoft.pat.wrap.WriterWrap;\r
+\r
+/**\r
+ * A basic extension of FilterWriter that uses Transformer to make replacements\r
+ * in data as it is written out. It attempts to transform a string whenever the\r
+ * End-of-Line (EOL) character is written (which is, by default, the carriage\r
+ * return '\n'). Only the transformed portion of the line is written out,\r
+ * allowing the RegexWriter to wait until a complete pattern is present before\r
+ * attempting to write out info. Until a pattern completes, data is stored in a\r
+ * javajs.util.SB -- which can be accessed through the length() and charAt()\r
+ * methods of this class.\r
+ * <p>\r
+ * Note a subtlety here -- while a Transformer normally matches at higher\r
+ * priority against the pattern added to it first, this will not necessarily be\r
+ * true when a multi-line match is in progress because one of the complete\r
+ * multi-line patterns may not be completely loaded in RegexWriter's buffer. For\r
+ * this reason, the Transformer class is equipped with a way to add a pattern\r
+ * and replacement rule in three pieces -- a beginning (once this matches,\r
+ * nothing else in the Transformer can match until the whole pattern matches),\r
+ * an ending (the whole pattern is a String formed by adding the beginning and\r
+ * ending), and a ReplaceRule.\r
+ * <p>\r
+ * An illustration of this is given in the this <a\r
+ * href="../test/trans.java">example.</a>\r
+ */\r
+public class RegexWriter extends Writer\r
+{\r
+ Replacer repr;\r
+\r
+ Writer w;\r
+\r
+ WriterWrap ww;\r
+\r
+ javajs.util.SB sb = new javajs.util.SB();\r
+\r
+ PartialBuffer wrap = new PartialBuffer(sb);\r
+\r
+ int pos, epos;\r
+\r
+ int interval = 128;\r
+\r
+ int bufferSize = 2 * 1024;\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
+\r
+ /**\r
+ * This method no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ @Deprecated\r
+ public char getEOLchar()\r
+ {\r
+ return EOLchar;\r
+ }\r
+\r
+ /**\r
+ * This method no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ @Deprecated\r
+ public void setEOLchar(char c)\r
+ {\r
+ EOLchar = c;\r
+ }\r
+\r
+ int max_lines = 2;\r
+\r
+ /**\r
+ * This method no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ @Deprecated\r
+ public int getMaxLines()\r
+ {\r
+ return max_lines;\r
+ }\r
+\r
+ /**\r
+ * This method no longer serves any purpose.\r
+ * \r
+ * @deprecated\r
+ */\r
+ @Deprecated\r
+ public void setMaxLines(int ml)\r
+ {\r
+ max_lines = ml;\r
+ }\r
+\r
+ void write() 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
+ }\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
+ \r
+ String s = sb.substring(bufferSize);\r
+ sb.setLength(0);\r
+ sb.append(s);\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
+ {\r
+ int m = b + n;\r
+ for (int i = b; i < m; i++)\r
+ {\r
+ sb.appendC(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
+ }\r
+\r
+ public void close() 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 javajs.util.SB 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)\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
+ {\r
+ interval = i;\r
+ }\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
+ {\r
+ return bufferSize;\r
+ }\r
+\r
+ /** Set the buffer size. */\r
+ public void setBufferSize(int i)\r
+ {\r
+ bufferSize = i;\r
+ }\r
+}\r