--- /dev/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
+/** This class implements the (?: ... ) extended Pattern.\r
+ It provides a base class from which we derive the\r
+ [ ... ], ( ... ), (?! ... ), and (?= ... ) patterns. */\r
+class Or extends Pattern {\r
+ Vector v;\r
+ Pattern[] pv = null;\r
+ Or() { v = new Vector(); }\r
+ String leftForm() { return "(?:"; }\r
+ String rightForm() { return ")"; }\r
+ String sepForm() { return "|"; }\r
+ public Or addOr(Pattern p) {\r
+ pv = null;\r
+ v.addElement(p);\r
+ p.setParent(this);\r
+ return this;\r
+ }\r
+ public String toString() {\r
+ int i;\r
+ StringBuffer sb = new StringBuffer();\r
+ sb.append(leftForm());\r
+ if(v.size()>0)\r
+ sb.append( ((Pattern)v.elementAt(0)).toString() );\r
+ for(i=1;i<v.size();i++) {\r
+ sb.append(sepForm());\r
+ sb.append( ((Pattern)v.elementAt(i)).toString() );\r
+ }\r
+ sb.append(rightForm());\r
+ sb.append(nextString());\r
+ return sb.toString();\r
+ }\r
+ public int matchInternal(int pos,Pthings pt) {\r
+ if(pv == null) {\r
+ pv = new Pattern[v.size()];\r
+ v.copyInto(pv);\r
+ }\r
+ for(int i=0;i<v.size();i++) {\r
+ Pattern p = pv[i];//(Pattern)v.elementAt(i);\r
+ int r = p.matchInternal(pos,pt);\r
+ if(r >= 0)\r
+ return r;\r
+ }\r
+ return -1;\r
+ }\r
+ public patInt minChars() {\r
+ if(v.size()==0) return new patInt(0);\r
+ patInt m = ((Pattern)v.elementAt(0)).countMinChars();\r
+ for(int i=1;i<v.size();i++) {\r
+ Pattern p = (Pattern)v.elementAt(i);\r
+ m.mineq(p.countMinChars());\r
+ }\r
+ return m;\r
+ }\r
+ public patInt maxChars() {\r
+ if(v.size()==0) return new patInt(0);\r
+ patInt m = ((Pattern)v.elementAt(0)).countMaxChars();\r
+ for(int i=1;i<v.size();i++) {\r
+ Pattern p = (Pattern)v.elementAt(i);\r
+ m.maxeq(p.countMaxChars());\r
+ }\r
+ return m;\r
+ }\r
+ Pattern clone1(Hashtable h) {\r
+ Or o=new Or();\r
+ h.put(this,o);\r
+ h.put(o,o);\r
+ for(int i=0;i<v.size();i++)\r
+ o.v.addElement( ((Pattern)v.elementAt(i)).clone(h) );\r
+ return o;\r
+ }\r
+};\r