-//
-// 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.util.*;
-
-/**
- * If Multi were not split into a second stage, then a nested Multi would try to
- * re-use the same count variable and the whole thing would break.
- */
-class Multi_stage2 extends PatternSub
-{
- Pattern nextRet;
-
- patInt count;
-
- patInt matchMin, matchMax;
-
- public boolean matchFewest = false;
-
- public String toString()
- {
- String ret = "";
- ret += sub.toString();
- ret += "{" + matchMin + "," + matchMax + "}";
- if (matchFewest)
- {
- ret += "?";
- }
- ret += parent.nextString();
- return ret;
- }
-
- Multi_stage2(patInt a, patInt b, Pattern p) throws RegSyntax
- {
- if (p == null)
- {
- RegSyntaxError.endItAll("Multiple match of Null pattern requested.");
- }
- sub = p;
- nextRet = this;
- sub.setParent(this);
- matchMin = a;
- matchMax = b;
- count = new patInt(0);
- // we must have b > a > -1 for this
- // to make sense.
- if (!a.lessEq(b))
- {
- // throw new BadMultiArgs();
- RegSyntaxError.endItAll("Bad Multi Args: " + a + ">" + b);
- }
- patInt i = new patInt(-1);
- if (a.lessEq(i))
- {
- // throw new BadMultiArgs();
- RegSyntaxError.endItAll("Bad Multi Args: " + a + "< 0");
- }
- }
-
- public Pattern getNext()
- {
- return nextRet;
- }
-
- int pos_old = -1;
-
- public int matchInternal(int pos, Pthings pt)
- {
- sub.setParent(this);
-
- int canUse = -1;
-
- // check for some forms of infinite recursion...
- if (pos_old >= 0 && pos == pos_old)
- {
- return -1;
- }
- pos_old = pos;
-
- if (matchMin.lessEq(count))
- {
- canUse = pos;
- }
- if (!count.lessEq(matchMax) || pos > pt.src.length())
- {
- return -1;
- }
-
- if ((matchFewest || count.equals(matchMax)) && canUse >= 0)
- {
- Pattern n = super.getNext();
- if (n == null)
- {
- return canUse;
- }
- int ret = testMatch(n, pos, pt);
- if (ret >= 0)
- {
- return ret;
- }
- else
- {
- canUse = -1;
- }
- }
-
- count.inc();
- try
- {
- if (count.lessEq(matchMax))
- {
- int r = testMatch(sub, pos, pt);
- if (r >= 0)
- {
- return r;
- }
- }
- } finally
- {
- count.dec();
- }
-
- if (!matchFewest && canUse >= 0)
- {
- Pattern n = super.getNext();
- if (n == null)
- {
- return canUse;
- }
- int ret = testMatch(n, pos, pt);
- return ret;
- }
- else
- {
- return canUse;
- }
- }
-
- public Pattern clone1(Hashtable h)
- {
- try
- {
- Multi_stage2 m = new Multi_stage2(matchMin, matchMax, sub.clone(h));
- m.matchFewest = matchFewest;
- return m;
- } catch (RegSyntax rs)
- {
- return null;
- }
- }
-};
+//\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.util.*;\r
+\r
+/**\r
+ * If Multi were not split into a second stage, then a nested Multi would try to\r
+ * re-use the same count variable and the whole thing would break.\r
+ */\r
+class Multi_stage2 extends PatternSub\r
+{\r
+ Pattern nextRet;\r
+\r
+ patInt count;\r
+\r
+ patInt matchMin, matchMax;\r
+\r
+ public boolean matchFewest = false;\r
+\r
+ public String toString()\r
+ {\r
+ String ret = "";\r
+ ret += sub.toString();\r
+ ret += "{" + matchMin + "," + matchMax + "}";\r
+ if (matchFewest)\r
+ {\r
+ ret += "?";\r
+ }\r
+ ret += parent.nextString();\r
+ return ret;\r
+ }\r
+\r
+ Multi_stage2(patInt a, patInt b, Pattern p) throws RegSyntax\r
+ {\r
+ if (p == null)\r
+ {\r
+ RegSyntaxError.endItAll("Multiple match of Null pattern requested.");\r
+ }\r
+ sub = p;\r
+ nextRet = this;\r
+ sub.setParent(this);\r
+ matchMin = a;\r
+ matchMax = b;\r
+ count = new patInt(0);\r
+ // we must have b > a > -1 for this\r
+ // to make sense.\r
+ if (!a.lessEq(b))\r
+ {\r
+ // throw new BadMultiArgs();\r
+ RegSyntaxError.endItAll("Bad Multi Args: " + a + ">" + b);\r
+ }\r
+ patInt i = new patInt(-1);\r
+ if (a.lessEq(i))\r
+ {\r
+ // throw new BadMultiArgs();\r
+ RegSyntaxError.endItAll("Bad Multi Args: " + a + "< 0");\r
+ }\r
+ }\r
+\r
+ public Pattern getNext()\r
+ {\r
+ return nextRet;\r
+ }\r
+\r
+ int pos_old = -1;\r
+\r
+ public int matchInternal(int pos, Pthings pt)\r
+ {\r
+ sub.setParent(this);\r
+\r
+ int canUse = -1;\r
+\r
+ // check for some forms of infinite recursion...\r
+ if (pos_old >= 0 && pos == pos_old)\r
+ {\r
+ return -1;\r
+ }\r
+ pos_old = pos;\r
+\r
+ if (matchMin.lessEq(count))\r
+ {\r
+ canUse = pos;\r
+ }\r
+ if (!count.lessEq(matchMax) || pos > pt.src.length())\r
+ {\r
+ return -1;\r
+ }\r
+\r
+ if ((matchFewest || count.equals(matchMax)) && canUse >= 0)\r
+ {\r
+ Pattern n = super.getNext();\r
+ if (n == null)\r
+ {\r
+ return canUse;\r
+ }\r
+ int ret = testMatch(n, pos, pt);\r
+ if (ret >= 0)\r
+ {\r
+ return ret;\r
+ }\r
+ else\r
+ {\r
+ canUse = -1;\r
+ }\r
+ }\r
+\r
+ count.inc();\r
+ try\r
+ {\r
+ if (count.lessEq(matchMax))\r
+ {\r
+ int r = testMatch(sub, pos, pt);\r
+ if (r >= 0)\r
+ {\r
+ return r;\r
+ }\r
+ }\r
+ } finally\r
+ {\r
+ count.dec();\r
+ }\r
+\r
+ if (!matchFewest && canUse >= 0)\r
+ {\r
+ Pattern n = super.getNext();\r
+ if (n == null)\r
+ {\r
+ return canUse;\r
+ }\r
+ int ret = testMatch(n, pos, pt);\r
+ return ret;\r
+ }\r
+ else\r
+ {\r
+ return canUse;\r
+ }\r
+ }\r
+\r
+ public Pattern clone1(Hashtable h)\r
+ {\r
+ try\r
+ {\r
+ Multi_stage2 m = new Multi_stage2(matchMin, matchMax, sub.clone(h));\r
+ m.matchFewest = matchFewest;\r
+ return m;\r
+ } catch (RegSyntax rs)\r
+ {\r
+ return null;\r
+ }\r
+ }\r
+};\r