Merge branch 'documentation/JAL-3111_release_211' into bug/JAL-2830_editManglesDatase...
[jalview.git] / src / com / stevesoft / pat / Multi_stage2.java
index 41afa39..f5a54db 100755 (executable)
-//\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
-import java.util.Hashtable;\r
-\r
-/** If Multi were not split into a second stage, then\r
- a nested Multi would try to re-use the same count\r
- variable and the whole thing would break. */\r
-class Multi_stage2 extends PatternSub {\r
-    Pattern nextRet;\r
-    patInt count;\r
-    patInt matchMin,matchMax;\r
-    public boolean matchFewest = false;\r
-    public String toString() {\r
-        String ret = "";\r
-        ret += sub.toString();\r
-        ret += "{"+matchMin+","+matchMax+"}";\r
-        if(matchFewest) ret += "?";\r
-        ret += parent.nextString();\r
-        return ret;\r
-    }\r
-    Multi_stage2(patInt a,patInt b,Pattern p) throws RegSyntax {\r
-        if(p == null) RegSyntaxError.endItAll(\r
-                "Multiple match of Null pattern requested.");\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
-            //throw new BadMultiArgs();\r
-            RegSyntaxError.endItAll("Bad Multi Args: "+a+">"+b);\r
-        patInt i = new patInt(-1);\r
-        if(a.lessEq(i))\r
-            //throw new BadMultiArgs();\r
-            RegSyntaxError.endItAll("Bad Multi Args: "+a+"< 0");\r
-    }\r
-    public Pattern getNext() {\r
-        return nextRet;\r
-    }\r
-    int pos_old = -1;\r
-    public int matchInternal(int pos,Pthings pt) {\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
-            return -1;\r
-        }\r
-        pos_old = pos;\r
-\r
-        if(matchMin.lessEq(count))\r
-            canUse = pos;\r
-        if(!count.lessEq(matchMax) || pos > pt.src.length())\r
-            return -1;\r
-\r
-        if((matchFewest||count.equals(matchMax)) && canUse >= 0) {\r
-            Pattern n = super.getNext();\r
-            if(n == null)\r
-                return canUse;\r
-            int ret = testMatch(n,pos,pt);\r
-            if(ret >= 0) {\r
-               return ret;\r
-            }\r
-            else canUse = -1;\r
-        }\r
-\r
-        count.inc();\r
-        try {\r
-            if(count.lessEq(matchMax)) {\r
-                int r = testMatch(sub,pos,pt);\r
-                if(r >= 0)\r
-                    return r;\r
-            }\r
-        } finally { count.dec(); }\r
-\r
-        if(!matchFewest && canUse >= 0) {\r
-            Pattern n = super.getNext();\r
-            if(n == null)\r
-                return canUse;\r
-            int ret = testMatch(n,pos,pt);\r
-            return ret;\r
-        } else return canUse;\r
-    }\r
-    public Pattern clone1(Hashtable h) {\r
-        try {\r
-            Multi_stage2 m = new Multi_stage2(matchMin,matchMax,sub.clone(h));\r
-            m.matchFewest = matchFewest;\r
-            return m;\r
-        } catch(RegSyntax rs) {\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;
+
+/**
+ * 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;
+    }
+  }
+};