// -- Happy Computing!\r
//\r
package com.stevesoft.pat;\r
-import java.util.Hashtable;\r
+\r
+import java.util.*;\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
+class Multi_stage2\r
+ extends PatternSub\r
+{\r
+ Pattern nextRet;\r
+ patInt count;\r
+ patInt matchMin, matchMax;\r
+ public boolean matchFewest = false;\r
+ public String toString()\r
+ {\r
+ String ret = "";\r
+ ret += sub.toString();\r
+ ret += "{" + matchMin + "," + matchMax + "}";\r
+ if (matchFewest)\r
+ {\r
+ 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
+ ret += parent.nextString();\r
+ return ret;\r
+ }\r
+\r
+ Multi_stage2(patInt a, patInt b, Pattern p)\r
+ throws RegSyntax\r
+ {\r
+ if (p == null)\r
+ {\r
+ RegSyntaxError.endItAll(\r
+ "Multiple match of Null pattern requested.");\r
}\r
- public Pattern getNext() {\r
- return nextRet;\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
- int pos_old = -1;\r
- public int matchInternal(int pos,Pthings pt) {\r
- sub.setParent(this);\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
- int canUse = -1;\r
+ public Pattern getNext()\r
+ {\r
+ return nextRet;\r
+ }\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
+ int pos_old = -1;\r
+ public int matchInternal(int pos, Pthings pt)\r
+ {\r
+ sub.setParent(this);\r
\r
- if(matchMin.lessEq(count))\r
- canUse = pos;\r
- if(!count.lessEq(matchMax) || pos > pt.src.length())\r
- return -1;\r
+ int canUse = -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
+ // 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
- 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
+ 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 && 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
+ 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
- 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
+ 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
+ }\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
+ }\r
+ catch (RegSyntax rs)\r
+ {\r
+ return null;\r
}\r
+ }\r
};\r