JAL-1807 still testing
[jalviewjs.git] / unused / com / stevesoft / pat / FastMulti.java
index a8387b4..6e6d578 100644 (file)
-//
-// 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