-//\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
-/** A special case of Multi, implemented when minChars().equals(maxChars()),\r
- * and some other conditions spelled out in RegOpt.safe4fm "Safe for\r
- * FastMulti." It avoids stack growth problems as well as being slightly\r
- * faster.\r
- */\r
-class FastMulti\r
- extends PatternSub\r
-{\r
- patInt fewestMatches, mostMatches;\r
- public patInt minChars()\r
- {\r
- return sub.countMinChars().mul(fewestMatches);\r
- }\r
-\r
- public patInt maxChars()\r
- {\r
- return sub.countMaxChars().mul(mostMatches);\r
- }\r
-\r
- public boolean matchFewest = false;\r
-\r
- FastMulti(patInt a, patInt b, Pattern p)\r
- throws RegSyntax\r
- {\r
- if (p == null)\r
- {\r
- RegSyntaxError.endItAll("Null length pattern " +\r
- "followed by *, +, or other Multi.");\r
- }\r
- fewestMatches = a;\r
- mostMatches = b;\r
- sub = p;\r
- step = p.countMinChars().intValue();\r
- sub.setParent(null);\r
- }\r
-\r
- public String toString()\r
- {\r
- return sub.toString() + "{"\r
- + fewestMatches + "," + mostMatches + "}" +\r
- (matchFewest ? "?" : "") + "(?# <= fast multi)" +\r
- nextString();\r
- }\r
-\r
- int step = -1;\r
- public int matchInternal(int pos, Pthings pt)\r
- {\r
- int m = -1;\r
- int i = pos;\r
- int endstr = pt.src.length() - step;\r
- patInt matches = new patInt(0);\r
- if (matchFewest)\r
- {\r
- if (fewestMatches.lessEq(matches))\r
- {\r
- int ii = nextMatch(i, pt);\r
- if (ii >= 0)\r
- {\r
- return ii;\r
- }\r
- }\r
- while (i >= 0 && i <= endstr)\r
- {\r
- i = sub.matchInternal(i, pt);\r
- if (i >= 0)\r
- {\r
- matches.inc();\r
- if (fewestMatches.lessEq(matches))\r
- {\r
- int ii = nextMatch(i, pt);\r
- if (ii >= 0)\r
- {\r
- return ii;\r
- }\r
- }\r
- if (matches.equals(mostMatches))\r
- {\r
- return -1;\r
- }\r
- }\r
- }\r
- return -1;\r
- }\r
- int nMatches = 0;\r
- while (fewestMatches.intValue() > nMatches)\r
- {\r
- i = sub.matchInternal(i, pt);\r
- if (i >= 0)\r
- {\r
- nMatches++;\r
- }\r
- else\r
- {\r
- return -1;\r
- }\r
- }\r
- m = i;\r
- if (mostMatches.finite())\r
- {\r
- while (nMatches < mostMatches.intValue())\r
- {\r
- i = sub.matchInternal(i, pt);\r
- if (i >= 0)\r
- {\r
- m = i;\r
- nMatches++;\r
- }\r
- else\r
- {\r
- break;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- while (true)\r
- {\r
- i = sub.matchInternal(i, pt);\r
- if (i >= 0)\r
- {\r
- m = i;\r
- nMatches++;\r
- }\r
- else\r
- {\r
- break;\r
- }\r
- }\r
- }\r
- while (m >= pos)\r
- {\r
- int r = nextMatch(m, pt);\r
- if (r >= 0)\r
- {\r
- return r;\r
- }\r
- m -= step;\r
- nMatches--;\r
- if (nMatches < fewestMatches.intValue())\r
- {\r
- return -1;\r
- }\r
- }\r
- return -1;\r
- }\r
-\r
- public Pattern clone1(Hashtable h)\r
- {\r
- try\r
- {\r
- FastMulti fm = new FastMulti(fewestMatches, mostMatches, sub.clone(h));\r
- fm.matchFewest = matchFewest;\r
- return fm;\r
- }\r
- catch (RegSyntax rs)\r
- {\r
- return null;\r
- }\r
- }\r
-}\r
+//
+// 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.Hashtable;
+
+/**
+ * A special case of Multi, implemented when minChars().equals(maxChars()), and
+ * some other conditions spelled out in RegOpt.safe4fm "Safe for FastMulti." It
+ * avoids stack growth problems as well as being slightly faster.
+ */
+class FastMulti extends PatternSub
+{
+ patInt fewestMatches, mostMatches;
+
+ public patInt minChars()
+ {
+ return sub.countMinChars().mul(fewestMatches);
+ }
+
+ public patInt maxChars()
+ {
+ return sub.countMaxChars().mul(mostMatches);
+ }
+
+ public boolean matchFewest = false;
+
+ FastMulti(patInt a, patInt b, Pattern p) throws RegSyntax
+ {
+ if (p == null)
+ {
+ RegSyntaxError.endItAll("Null length pattern "
+ + "followed by *, +, or other Multi.");
+ }
+ fewestMatches = a;
+ mostMatches = b;
+ sub = p;
+ step = p.countMinChars().intValue();
+ sub.setParent(null);
+ }
+
+ public String toString()
+ {
+ return sub.toString() + "{" + fewestMatches + "," + mostMatches + "}"
+ + (matchFewest ? "?" : "") + "(?# <= fast multi)"
+ + nextString();
+ }
+
+ int step = -1;
+
+ public int matchInternal(int pos, Pthings pt)
+ {
+ int m = -1;
+ int i = pos;
+ int endstr = pt.src.length() - step;
+ patInt matches = new patInt(0);
+ if (matchFewest)
+ {
+ if (fewestMatches.lessEq(matches))
+ {
+ int ii = nextMatch(i, pt);
+ if (ii >= 0)
+ {
+ return ii;
+ }
+ }
+ while (i >= 0 && i <= endstr)
+ {
+ i = sub.matchInternal(i, pt);
+ if (i >= 0)
+ {
+ matches.inc();
+ if (fewestMatches.lessEq(matches))
+ {
+ int ii = nextMatch(i, pt);
+ if (ii >= 0)
+ {
+ return ii;
+ }
+ }
+ if (matches.equals(mostMatches))
+ {
+ return -1;
+ }
+ }
+ }
+ return -1;
+ }
+ int nMatches = 0;
+ while (fewestMatches.intValue() > nMatches)
+ {
+ i = sub.matchInternal(i, pt);
+ if (i >= 0)
+ {
+ nMatches++;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ m = i;
+ if (mostMatches.finite())
+ {
+ while (nMatches < mostMatches.intValue())
+ {
+ i = sub.matchInternal(i, pt);
+ if (i >= 0)
+ {
+ m = i;
+ nMatches++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ while (true)
+ {
+ i = sub.matchInternal(i, pt);
+ if (i >= 0)
+ {
+ m = i;
+ nMatches++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ while (m >= pos)
+ {
+ int r = nextMatch(m, pt);
+ if (r >= 0)
+ {
+ return r;
+ }
+ m -= step;
+ nMatches--;
+ if (nMatches < fewestMatches.intValue())
+ {
+ return -1;
+ }
+ }
+ return -1;
+ }
+
+ public Pattern clone1(Hashtable h)
+ {
+ try
+ {
+ FastMulti fm = new FastMulti(fewestMatches, mostMatches, sub.clone(h));
+ fm.matchFewest = matchFewest;
+ return fm;
+ } catch (RegSyntax rs)
+ {
+ return null;
+ }
+ }
+}