41 42 private int range; // right range 43 private int sprev; 44 private int sstart; 45 private int sbegin; 46 47 private final int[] code; // byte code 48 private int ip; // instruction pointer 49 50 ByteCodeMachine(Regex regex, char[] chars, int p, int end) { 51 super(regex, chars, p, end); 52 this.code = regex.code; 53 } 54 55 private boolean stringCmpIC(int caseFlodFlag, int s1, IntHolder ps2, int mbLen, int textEnd) { 56 57 int s2 = ps2.value; 58 int end1 = s1 + mbLen; 59 60 while (s1 < end1) { 61 char c1 = Character.toLowerCase(chars[s1++]); 62 char c2 = Character.toLowerCase(chars[s2++]); 63 64 if (c1 != c2) { 65 return false; 66 } 67 } 68 ps2.value = s2; 69 return true; 70 } 71 72 private void debugMatchBegin() { 73 Config.log.println("match_at: " + 74 "str: " + str + 75 ", end: " + end + 76 ", start: " + this.sstart + 77 ", sprev: " + this.sprev); 78 Config.log.println("size: " + (end - str) + ", start offset: " + (this.sstart - str)); 79 } 80 81 private void debugMatchLoop() { 82 if (Config.DEBUG_MATCH) { 350 ip++; s++; 351 } 352 353 private void opExactN() { 354 int tlen = code[ip++]; 355 if (s + tlen > range) {opFail(); return;} 356 357 if (Config.USE_STRING_TEMPLATES) { 358 char[] bs = regex.templates[code[ip++]]; 359 int ps = code[ip++]; 360 361 while (tlen-- > 0) if (bs[ps++] != chars[s++]) {opFail(); return;} 362 363 } else { 364 while (tlen-- > 0) if (code[ip++] != chars[s++]) {opFail(); return;} 365 } 366 sprev = s - 1; 367 } 368 369 private void opExact1IC() { 370 if (s >= range || code[ip] != Character.toLowerCase(chars[s++])) {opFail(); return;} 371 ip++; 372 sprev = sbegin; // break; 373 } 374 375 private void opExactNIC() { 376 int tlen = code[ip++]; 377 if (s + tlen > range) {opFail(); return;} 378 379 if (Config.USE_STRING_TEMPLATES) { 380 char[] bs = regex.templates[code[ip++]]; 381 int ps = code[ip++]; 382 383 while (tlen-- > 0) if (bs[ps++] != Character.toLowerCase(chars[s++])) {opFail(); return;} 384 } else { 385 386 while (tlen-- > 0) if (code[ip++] != Character.toLowerCase(chars[s++])) {opFail(); return;} 387 } 388 sprev = s - 1; 389 } 390 391 private boolean isInBitSet() { 392 int c = chars[s]; 393 return (c <= 0xff && (code[ip + (c >>> BitSet.ROOM_SHIFT)] & (1 << c)) != 0); 394 } 395 396 private void opCClass() { 397 if (s >= range || !isInBitSet()) {opFail(); return;} 398 ip += BitSet.BITSET_SIZE; 399 s++; 400 sprev = sbegin; // break; 401 } 402 403 private boolean isInClassMB() { 404 int tlen = code[ip++]; 405 if (s >= range) return false; 406 int ss = s; | 41 42 private int range; // right range 43 private int sprev; 44 private int sstart; 45 private int sbegin; 46 47 private final int[] code; // byte code 48 private int ip; // instruction pointer 49 50 ByteCodeMachine(Regex regex, char[] chars, int p, int end) { 51 super(regex, chars, p, end); 52 this.code = regex.code; 53 } 54 55 private boolean stringCmpIC(int caseFlodFlag, int s1, IntHolder ps2, int mbLen, int textEnd) { 56 57 int s2 = ps2.value; 58 int end1 = s1 + mbLen; 59 60 while (s1 < end1) { 61 char c1 = EncodingHelper.toLowerCase(chars[s1++]); 62 char c2 = EncodingHelper.toLowerCase(chars[s2++]); 63 64 if (c1 != c2) { 65 return false; 66 } 67 } 68 ps2.value = s2; 69 return true; 70 } 71 72 private void debugMatchBegin() { 73 Config.log.println("match_at: " + 74 "str: " + str + 75 ", end: " + end + 76 ", start: " + this.sstart + 77 ", sprev: " + this.sprev); 78 Config.log.println("size: " + (end - str) + ", start offset: " + (this.sstart - str)); 79 } 80 81 private void debugMatchLoop() { 82 if (Config.DEBUG_MATCH) { 350 ip++; s++; 351 } 352 353 private void opExactN() { 354 int tlen = code[ip++]; 355 if (s + tlen > range) {opFail(); return;} 356 357 if (Config.USE_STRING_TEMPLATES) { 358 char[] bs = regex.templates[code[ip++]]; 359 int ps = code[ip++]; 360 361 while (tlen-- > 0) if (bs[ps++] != chars[s++]) {opFail(); return;} 362 363 } else { 364 while (tlen-- > 0) if (code[ip++] != chars[s++]) {opFail(); return;} 365 } 366 sprev = s - 1; 367 } 368 369 private void opExact1IC() { 370 if (s >= range || code[ip] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;} 371 ip++; 372 sprev = sbegin; // break; 373 } 374 375 private void opExactNIC() { 376 int tlen = code[ip++]; 377 if (s + tlen > range) {opFail(); return;} 378 379 if (Config.USE_STRING_TEMPLATES) { 380 char[] bs = regex.templates[code[ip++]]; 381 int ps = code[ip++]; 382 383 while (tlen-- > 0) if (bs[ps++] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;} 384 } else { 385 386 while (tlen-- > 0) if (code[ip++] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;} 387 } 388 sprev = s - 1; 389 } 390 391 private boolean isInBitSet() { 392 int c = chars[s]; 393 return (c <= 0xff && (code[ip + (c >>> BitSet.ROOM_SHIFT)] & (1 << c)) != 0); 394 } 395 396 private void opCClass() { 397 if (s >= range || !isInBitSet()) {opFail(); return;} 398 ip += BitSet.BITSET_SIZE; 399 s++; 400 sprev = sbegin; // break; 401 } 402 403 private boolean isInClassMB() { 404 int tlen = code[ip++]; 405 if (s >= range) return false; 406 int ss = s; |