// -- Happy Computing!\r
//\r
package com.stevesoft.pat;\r
-import java.util.Hashtable;\r
+\r
+import java.util.*;\r
\r
/** A special optimization of multi that is used when the\r
- * common subpattern ".*" is encountered.\r
- */\r
-class DotMulti extends PatternSub {\r
- patInt fewestMatches,mostMatches;\r
- public patInt minChars() {\r
- return fewestMatches;\r
- }\r
- public patInt maxChars() {\r
- return mostMatches;\r
- }\r
- public boolean matchFewest = false;\r
+ * common subpattern ".*" is encountered.\r
+ */\r
+class DotMulti\r
+ extends PatternSub\r
+{\r
+ patInt fewestMatches, mostMatches;\r
+ public patInt minChars()\r
+ {\r
+ return fewestMatches;\r
+ }\r
\r
- StringLike src=null;\r
- int srclength=0;\r
- boolean dotDoesntMatchCR=true;\r
- DotMulti(patInt a,patInt b) {\r
- fewestMatches = a;\r
- mostMatches = b;\r
- }\r
- public String toString() {\r
- return ".{"\r
- +fewestMatches+","+mostMatches+"}"+\r
- (matchFewest ? "?" : "")+"(?# <= dot multi)"+\r
- nextString();\r
+ public patInt maxChars()\r
+ {\r
+ return mostMatches;\r
+ }\r
+\r
+ public boolean matchFewest = false;\r
+\r
+ StringLike src = null;\r
+ int srclength = 0;\r
+ boolean dotDoesntMatchCR = true;\r
+ DotMulti(patInt a, patInt b)\r
+ {\r
+ fewestMatches = a;\r
+ mostMatches = b;\r
+ }\r
+\r
+ public String toString()\r
+ {\r
+ return ".{"\r
+ + fewestMatches + "," + mostMatches + "}" +\r
+ (matchFewest ? "?" : "") + "(?# <= dot multi)" +\r
+ nextString();\r
+ }\r
+\r
+ final int submatchInternal(int pos, Pthings pt)\r
+ {\r
+ if (pos < srclength)\r
+ {\r
+ if (dotDoesntMatchCR)\r
+ {\r
+ if (src.charAt(pos) != '\n')\r
+ {\r
+ return 1 + pos;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ return 1 + pos;\r
+ }\r
}\r
- final int submatchInternal(int pos,Pthings pt) {\r
- if(pos < srclength) {\r
- if(dotDoesntMatchCR) {\r
- if(src.charAt(pos) != '\n')\r
- return 1+pos;\r
- } else return 1+pos;\r
+ return -1;\r
+ }\r
+\r
+ final static int step = 1;\r
+ static int idcount = 1;\r
+ public int matchInternal(int pos, Pthings pt)\r
+ {\r
+ int m = -1;\r
+ int i = pos;\r
+ src = pt.src;\r
+ srclength = src.length();\r
+ dotDoesntMatchCR = pt.dotDoesntMatchCR;\r
+ if (matchFewest)\r
+ {\r
+ int nMatches = 0;\r
+ while (fewestMatches.intValue() > nMatches)\r
+ {\r
+ i = submatchInternal(i, pt);\r
+ if (i < 0)\r
+ {\r
+ return -1;\r
}\r
+ nMatches++;\r
+ }\r
+ if (i < 0)\r
+ {\r
return -1;\r
- }\r
- final static int step = 1;\r
- static int idcount = 1;\r
- public int matchInternal(int pos,Pthings pt) {\r
- int m=-1;\r
- int i=pos;\r
- src = pt.src;\r
- srclength = src.length();\r
- dotDoesntMatchCR = pt.dotDoesntMatchCR;\r
- if(matchFewest) {\r
- int nMatches = 0;\r
- while(fewestMatches.intValue() > nMatches) {\r
- i=submatchInternal(i,pt);\r
- if(i<0) return -1;\r
- nMatches++;\r
- }\r
- if(i<0) return -1;\r
- int ii = nextMatch(i,pt);\r
- if(ii >= 0) return ii;\r
- if(!mostMatches.finite()) {\r
- while(i >= 0) {\r
- i = submatchInternal(i,pt);\r
- if(i < 0) return -1;\r
- ii = nextMatch(i,pt);\r
- if(ii >= 0) return ii;\r
- }\r
- } else {\r
- while(i > 0) {\r
- i = submatchInternal(i,pt);\r
- if(i < 0) return -1;\r
- nMatches++;\r
- if(nMatches > mostMatches.intValue())\r
- return -1;\r
- ii = nextMatch(i,pt);\r
- if(ii >= 0) return ii;\r
- }\r
- }\r
+ }\r
+ int ii = nextMatch(i, pt);\r
+ if (ii >= 0)\r
+ {\r
+ return ii;\r
+ }\r
+ if (!mostMatches.finite())\r
+ {\r
+ while (i >= 0)\r
+ {\r
+ i = submatchInternal(i, pt);\r
+ if (i < 0)\r
+ {\r
return -1;\r
+ }\r
+ ii = nextMatch(i, pt);\r
+ if (ii >= 0)\r
+ {\r
+ return ii;\r
+ }\r
}\r
- int nMatches = 0;\r
- while(fewestMatches.intValue() > nMatches) {\r
- i=submatchInternal(i,pt);\r
- if(i >= 0)\r
- nMatches++;\r
- else\r
- return -1;\r
+ }\r
+ else\r
+ {\r
+ while (i > 0)\r
+ {\r
+ i = submatchInternal(i, pt);\r
+ if (i < 0)\r
+ {\r
+ return -1;\r
+ }\r
+ nMatches++;\r
+ if (nMatches > mostMatches.intValue())\r
+ {\r
+ return -1;\r
+ }\r
+ ii = nextMatch(i, pt);\r
+ if (ii >= 0)\r
+ {\r
+ return ii;\r
+ }\r
}\r
- m=i;\r
- if(mostMatches.finite()) {\r
- while(nMatches < mostMatches.intValue()) {\r
- i = submatchInternal(i,pt);\r
- if(i>=0) {\r
- m=i;\r
- nMatches++;\r
- } else break;\r
- }\r
- } else {\r
- while(true) {\r
- i = submatchInternal(i,pt);\r
- if(i>=0) {\r
- m=i;\r
- nMatches++;\r
- } else break;\r
- }\r
+ }\r
+ return -1;\r
+ }\r
+ int nMatches = 0;\r
+ while (fewestMatches.intValue() > nMatches)\r
+ {\r
+ i = submatchInternal(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 = submatchInternal(i, pt);\r
+ if (i >= 0)\r
+ {\r
+ m = i;\r
+ nMatches++;\r
}\r
- while(m >= pos) {\r
- int r=nextMatch(m,pt);\r
- if(r >= 0) return r;\r
- m -= step;\r
- nMatches--;\r
- if(nMatches < fewestMatches.intValue())\r
- return -1;\r
+ else\r
+ {\r
+ break;\r
}\r
- return -1;\r
+ }\r
}\r
- Pattern clone1(Hashtable h) {\r
- DotMulti dm = new DotMulti(fewestMatches,mostMatches);\r
- dm.matchFewest = matchFewest;\r
- return dm;\r
+ else\r
+ {\r
+ while (true)\r
+ {\r
+ i = submatchInternal(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
+ Pattern clone1(Hashtable h)\r
+ {\r
+ DotMulti dm = new DotMulti(fewestMatches, mostMatches);\r
+ dm.matchFewest = matchFewest;\r
+ return dm;\r
+ }\r
}\r