version of String.indexOf.\r
@see com.stevesoft.pat.Skip2\r
@see com.stevesoft.pat.SkipBMH\r
- */\r
-public class Skip {\r
- static int mkmask(int c) {\r
- char x = (char)c;\r
- return ~( CaseMgr.toUpperCase(x) |\r
- CaseMgr.toLowerCase(x) |\r
- CaseMgr.toTitleCase(x));\r
- }\r
- static { int x = Regex.BackRefOffset; }\r
- String src;\r
- int c,mask;\r
- int offset;\r
- boolean ign,m1;\r
- /** Examine a Regex to determine what String it will\r
- attempt to skip to when searching for patterns.\r
- Return -1 if we aren't doing this. */\r
- public static String string(Regex r) {\r
- return r.skipper == null ? null : r.skipper.src;\r
- }\r
- /** Determine the offset of the String within the pattern\r
- that we are skipping to. Return -1 if we aren't doing\r
- this. */\r
- public static int offset(Regex r) {\r
- return r.skipper == null ? -1 : r.skipper.offset;\r
+ */\r
+public class Skip\r
+{\r
+ static int mkmask(int c)\r
+ {\r
+ char x = (char) c;\r
+ return~ (CaseMgr.toUpperCase(x) |\r
+ CaseMgr.toLowerCase(x) |\r
+ CaseMgr.toTitleCase(x));\r
+ }\r
+\r
+ String src;\r
+ int c, mask;\r
+ int offset;\r
+ boolean ign, m1;\r
+ /** Examine a Regex to determine what String it will\r
+ attempt to skip to when searching for patterns.\r
+ Return -1 if we aren't doing this. */\r
+ public static String string(Regex r)\r
+ {\r
+ return r.skipper == null ? null : r.skipper.src;\r
+ }\r
+\r
+ /** Determine the offset of the String within the pattern\r
+ that we are skipping to. Return -1 if we aren't doing\r
+ this. */\r
+ public static int offset(Regex r)\r
+ {\r
+ return r.skipper == null ? -1 : r.skipper.offset;\r
+ }\r
+\r
+ /** Initialize, give it a String to search for, tell it\r
+ whether or not to ignoreCase, and what the offset is\r
+ of the String within the String to be searched. */\r
+ public Skip(String s, boolean ign, int o)\r
+ {\r
+ src = s;\r
+ c = s.charAt(0);\r
+ if (ign)\r
+ {\r
+ mask = mkmask(c);\r
}\r
- /** Initialize, give it a String to search for, tell it\r
- whether or not to ignoreCase, and what the offset is\r
- of the String within the String to be searched. */\r
- public Skip(String s,boolean ign,int o) {\r
- src = s;\r
- c = s.charAt(0);\r
- if(ign) {\r
- mask = mkmask(c);\r
- } else mask = 0;\r
- offset = o;\r
- this.ign = ign;\r
- m1 = (s.length()==1);\r
+ else\r
+ {\r
+ mask = 0;\r
}\r
- /** The same as find(s,0,s.length()) */\r
- public final int find(StringLike s) {\r
- return find(s,0,s.length());\r
+ offset = o;\r
+ this.ign = ign;\r
+ m1 = (s.length() == 1);\r
+ }\r
+\r
+ /** The same as find(s,0,s.length()) */\r
+ public final int find(StringLike s)\r
+ {\r
+ return find(s, 0, s.length());\r
+ }\r
+\r
+ static final int min(int a, int b)\r
+ {\r
+ return a < b ? a : b;\r
+ }\r
+\r
+ /** Searches a given region of text beginning at position start\r
+ and ending at position end for the skip object. */\r
+ public int find(StringLike s, int start, int end)\r
+ {\r
+ if (start > end)\r
+ {\r
+ return -1;\r
}\r
- static final int min(int a,int b) { return a<b ? a : b; }\r
- /** Searches a given region of text beginning at position start\r
- and ending at position end for the skip object. */\r
- public int find(StringLike s,int start,int end) {\r
- if(start > end) return -1;\r
- start += offset;\r
- int vend = min(s.length()-1,end+offset);\r
- if(mask != c) {\r
- for(int i=start;i<=vend;i++)\r
- if(0 == (s.charAt(i) & mask))\r
- //if(m1||s.regionMatches(ign,i,src,0,src.length()) )\r
- if(m1||CaseMgr.regionMatches(s,ign,i,src,0,src.length()) )\r
- return i-offset;\r
- } else {\r
- for(int i=start;i<=vend;i++)\r
- if(c == s.charAt(i))\r
- //if(m1||s.regionMatches(ign,i,src,0,src.length()) )\r
- if(m1||CaseMgr.regionMatches(s,ign,i,src,0,src.length()) )\r
- return i-offset;\r
+ start += offset;\r
+ int vend = min(s.length() - 1, end + offset);\r
+ if (mask != c)\r
+ {\r
+ for (int i = start; i <= vend; i++)\r
+ {\r
+ if (0 == (s.charAt(i) & mask))\r
+ {\r
+ //if(m1||s.regionMatches(ign,i,src,0,src.length()) )\r
+ if (m1 || CaseMgr.regionMatches(s, ign, i, src, 0, src.length()))\r
+ {\r
+ return i - offset;\r
+ }\r
}\r
- return -1;\r
+ }\r
}\r
- static Skip findSkip(Regex r) {\r
- return findSkip(r.thePattern,r.ignoreCase,!r.dontMatchInQuotes);\r
+ else\r
+ {\r
+ for (int i = start; i <= vend; i++)\r
+ {\r
+ if (c == s.charAt(i))\r
+ {\r
+ //if(m1||s.regionMatches(ign,i,src,0,src.length()) )\r
+ if (m1 || CaseMgr.regionMatches(s, ign, i, src, 0, src.length()))\r
+ {\r
+ return i - offset;\r
+ }\r
+ }\r
+ }\r
}\r
- // look for things that can be skipped\r
- static Skip findSkip(Pattern p,boolean ignoreCase,boolean trnc) {\r
- StringBuffer sb = new StringBuffer();\r
- Skip subsk = null;\r
- int offset = 0;\r
- int skipc = -1,skipoff=0;\r
- for(;p != null;p = p.next) {\r
- if(p instanceof oneChar) {\r
- skipc = ((oneChar)p).c;\r
- skipoff = offset;\r
- }\r
- if(p instanceof oneChar && p.next instanceof oneChar) {\r
- Pattern psav = p;\r
- sb.append(((oneChar)p).c);\r
- while(p.next instanceof oneChar) {\r
- sb.append(((oneChar)p.next).c);\r
- p = p.next;\r
- }\r
- String st = sb.toString();\r
- char c0 = st.charAt(0), c1 = st.charAt(1);\r
- Skip sk=null;\r
- if(st.length()>2)\r
- sk = new SkipBMH(st,ignoreCase,offset);\r
- else\r
- sk = new Skip2(st,ignoreCase,offset);\r
- if(trnc && st.length()>2) { // chop out a whole string...\r
- psav.next = new Skipped(st.substring(1));\r
- psav.next.next = p.next;\r
- psav.next.parent = p.parent;\r
- }\r
- return sk;\r
- } else if(p instanceof Or && ((Or)p).v.size()==1\r
- && !((Or)p).leftForm().equals("(?!")\r
- && null != (subsk=\r
- findSkip( (Pattern)((Or)p).v.elementAt(0),ignoreCase,trnc) )) {\r
- subsk.offset += offset;\r
- return subsk;\r
- } else if(p.minChars().equals(p.maxChars())) {\r
- offset += p.minChars().intValue();\r
- } else return skipc < 0 ? null :\r
- new Skip(""+(char)skipc,ignoreCase,skipoff);\r
+ return -1;\r
+ }\r
+\r
+ static Skip findSkip(Regex r)\r
+ {\r
+ return findSkip(r.thePattern, r.ignoreCase, !r.dontMatchInQuotes);\r
+ }\r
+\r
+ // look for things that can be skipped\r
+ static Skip findSkip(Pattern p, boolean ignoreCase, boolean trnc)\r
+ {\r
+ StringBuffer sb = new StringBuffer();\r
+ Skip subsk = null;\r
+ int offset = 0;\r
+ int skipc = -1, skipoff = 0;\r
+ for (; p != null; p = p.next)\r
+ {\r
+ if (p instanceof oneChar)\r
+ {\r
+ skipc = ( (oneChar) p).c;\r
+ skipoff = offset;\r
+ }\r
+ if (p instanceof oneChar && p.next instanceof oneChar)\r
+ {\r
+ Pattern psav = p;\r
+ sb.append( ( (oneChar) p).c);\r
+ while (p.next instanceof oneChar)\r
+ {\r
+ sb.append( ( (oneChar) p.next).c);\r
+ p = p.next;\r
+ }\r
+ String st = sb.toString();\r
+ Skip sk = null;\r
+ if (st.length() > 2)\r
+ {\r
+ sk = new SkipBMH(st, ignoreCase, offset);\r
+ }\r
+ else\r
+ {\r
+ sk = new Skip2(st, ignoreCase, offset);\r
+ }\r
+ if (trnc && st.length() > 2)\r
+ { // chop out a whole string...\r
+ psav.next = new Skipped(st.substring(1));\r
+ psav.next.next = p.next;\r
+ psav.next.parent = p.parent;\r
}\r
- return null;\r
+ return sk;\r
+ }\r
+ else if (p instanceof Or && ( (Or) p).v.size() == 1\r
+ && ! ( (Or) p).leftForm().equals("(?!")\r
+ && null != (subsk =\r
+ findSkip( (Pattern) ( (Or) p).v.elementAt(0),\r
+ ignoreCase, trnc)))\r
+ {\r
+ subsk.offset += offset;\r
+ return subsk;\r
+ }\r
+ else if (p.minChars().equals(p.maxChars()))\r
+ {\r
+ offset += p.minChars().intValue();\r
+ }\r
+ else\r
+ {\r
+ return skipc < 0 ? null :\r
+ new Skip("" + (char) skipc, ignoreCase, skipoff);\r
+ }\r
}\r
+ return null;\r
+ }\r
}\r