-//
-// 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.*;
-
-/**
- * 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;
- }
- }
-}
+//\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
+ * A special case of Multi, implemented when minChars().equals(maxChars()), and\r
+ * some other conditions spelled out in RegOpt.safe4fm "Safe for FastMulti." It\r
+ * avoids stack growth problems as well as being slightly faster.\r
+ */\r
+class FastMulti extends PatternSub\r
+{\r
+ patInt fewestMatches, mostMatches;\r
+\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) 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() + "{" + fewestMatches + "," + mostMatches + "}"\r
+ + (matchFewest ? "?" : "") + "(?# <= fast multi)"\r
+ + nextString();\r
+ }\r
+\r
+ int step = -1;\r
+\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
+ } catch (RegSyntax rs)\r
+ {\r
+ return null;\r
+ }\r
+ }\r
+}\r