int plen = this.patternLength;\r
int i = start;\r
int end = buf.Count - plen;\r
- while (i <= end)\r
+ //最適化のためわざとコピペした\r
+ if (this.caseInsenstive)\r
{\r
- int j = 0;\r
- while (j < plen)\r
+ while (i <= end)\r
{\r
- bool unmatch;\r
- if (this.caseInsenstive)\r
- unmatch = CharTool.ToUpperFastIf(buf[i + j]) != this.pattern[j];\r
+ int j = 0;\r
+ while (j < plen)\r
+ {\r
+ if (CharTool.ToUpperFastIf(buf[i + j]) != this.pattern[j])\r
+ break;\r
+ j++;\r
+ }\r
+ if (j == plen)\r
+ {\r
+ return i;\r
+ }\r
else\r
- unmatch = buf[i + j] != this.pattern[j];\r
- if (unmatch)\r
- break;\r
- j++;\r
- }\r
- if (j == plen)\r
- {\r
- return i;\r
+ {\r
+ int k = i + plen;\r
+ if (k <= buflen) //buffer以降にアクセスする可能性がある\r
+ {\r
+ int moveDelta;\r
+ if (this.qsTable.TryGetValue(buf[k], out moveDelta))\r
+ i += moveDelta;\r
+ else\r
+ i += plen;\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
+ }\r
}\r
- else\r
+\r
+ }\r
+ else\r
+ {\r
+ while (i <= end)\r
{\r
- int k = i + plen;\r
- if (k <= buflen) //buffer以降にアクセスする可能性がある\r
+ int j = 0;\r
+ while (j < plen)\r
{\r
- int moveDelta;\r
- if (this.qsTable.TryGetValue(buf[k], out moveDelta))\r
- i += moveDelta;\r
- else\r
- i += plen;\r
+ if (buf[i + j] != this.pattern[j])\r
+ break;\r
+ j++;\r
+ }\r
+ if (j == plen)\r
+ {\r
+ return i;\r
}\r
else\r
{\r
- break;\r
+ int k = i + plen;\r
+ if (k <= buflen) //buffer以降にアクセスする可能性がある\r
+ {\r
+ int moveDelta;\r
+ if (this.qsTable.TryGetValue(buf[k], out moveDelta))\r
+ i += moveDelta;\r
+ else\r
+ i += plen;\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
}\r
}\r
}\r