82 #define PSSTART start_subject
83 #define PSEND end_subject
102 #define OP_PROP_EXTRA 300
103 #define OP_EXTUNI_EXTRA 320
104 #define OP_ANYNL_EXTRA 340
105 #define OP_HSPACE_EXTRA 360
106 #define OP_VSPACE_EXTRA 380
117 static const uschar coptable[] = {
175 static const uschar poptable[] = {
231 static const uschar toptable1[] = {
239 static const uschar toptable2[] = {
260 #define INTS_PER_STATEBLOCK (sizeof(stateblock)/sizeof(int))
279 pchars(
unsigned char *p,
int length, FILE *f)
284 if (isprint(c = *(p++)))
287 fprintf(f,
"\\x%02x", c);
324 #define ADD_ACTIVE(x,y) \
325 if (active_count++ < wscount) \
327 next_active_state->offset = (x); \
328 next_active_state->count = (y); \
329 next_active_state->ims = ims; \
330 next_active_state++; \
331 DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
333 else return PCRE_ERROR_DFA_WSSIZE
335 #define ADD_ACTIVE_DATA(x,y,z) \
336 if (active_count++ < wscount) \
338 next_active_state->offset = (x); \
339 next_active_state->count = (y); \
340 next_active_state->ims = ims; \
341 next_active_state->data = (z); \
342 next_active_state++; \
343 DPRINTF(("%.*sADD_ACTIVE_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \
345 else return PCRE_ERROR_DFA_WSSIZE
347 #define ADD_NEW(x,y) \
348 if (new_count++ < wscount) \
350 next_new_state->offset = (x); \
351 next_new_state->count = (y); \
352 next_new_state->ims = ims; \
354 DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
356 else return PCRE_ERROR_DFA_WSSIZE
358 #define ADD_NEW_DATA(x,y,z) \
359 if (new_count++ < wscount) \
361 next_new_state->offset = (x); \
362 next_new_state->count = (y); \
363 next_new_state->ims = ims; \
364 next_new_state->data = (z); \
366 DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \
368 else return PCRE_ERROR_DFA_WSSIZE
375 const uschar *this_start_code,
376 const uschar *current_subject,
386 stateblock *active_states, *new_states, *temp_states;
387 stateblock *next_active_state, *next_new_state;
389 const uschar *ctypes, *lcc, *fcc;
391 const uschar *end_code, *first_op;
393 int active_count, new_count, match_count;
415 DPRINTF((
"\n%.*s---------------------\n"
416 "%.*sCall to internal_dfa_exec f=%d r=%d\n",
417 rlevel*2-2,
SP, rlevel*2-2,
SP, rlevel, recursing));
425 active_states = (
stateblock *)(workspace + 2);
426 next_new_state = new_states = active_states + wscount;
429 first_op = this_start_code + 1 +
LINK_SIZE +
446 end_code = this_start_code;
449 int back = GET(end_code, 2+LINK_SIZE);
450 if (back > max_back) max_back = back;
451 end_code += GET(end_code, 1);
453 while (*end_code ==
OP_ALT);
463 for (gone_back = 0; gone_back < max_back; gone_back++)
465 if (current_subject <= start_subject)
break;
467 while (current_subject > start_subject &&
468 (*current_subject & 0xc0) == 0x80)
478 gone_back = (current_subject - max_back < start_subject)?
479 (
int)(current_subject - start_subject) : max_back;
480 current_subject -= gone_back;
485 if (current_subject < md->start_used_ptr)
490 end_code = this_start_code;
493 int back = GET(end_code, 2+LINK_SIZE);
494 if (back <= gone_back)
496 int bstate = (int)(end_code - start_code + 2 + 2*LINK_SIZE);
499 end_code += GET(end_code, 1);
501 while (*end_code ==
OP_ALT);
512 end_code = this_start_code;
518 do { end_code += GET(end_code, 1); }
while (*end_code ==
OP_ALT);
519 new_count = workspace[1];
521 memcpy(new_states, active_states, new_count *
sizeof(
stateblock));
528 int length = 1 + LINK_SIZE +
532 ADD_NEW((
int)(end_code - start_code + length), 0);
533 end_code += GET(end_code, 1);
536 while (*end_code ==
OP_ALT);
542 DPRINTF((
"%.*sEnd state = %d\n", rlevel*2-2,
SP, end_code - start_code));
546 ptr = current_subject;
558 temp_states = active_states;
559 active_states = new_states;
560 new_states = temp_states;
561 active_count = new_count;
565 workspace[1] = active_count;
568 printf(
"%.*sNext character: rest of subject = \"", rlevel*2-2,
SP);
569 pchars((
uschar *)ptr, strlen((
char *)ptr), stdout);
572 printf(
"%.*sActive states: ", rlevel*2-2,
SP);
573 for (i = 0; i < active_count; i++)
574 printf(
"%d/%d ", active_states[i].offset, active_states[i].count);
580 next_active_state = active_states + active_count;
581 next_new_state = new_states;
587 if (ptr < end_subject)
606 for (i = 0; i < active_count; i++)
608 stateblock *current_state = active_states + i;
610 int state_offset = current_state->offset;
611 int count, codevalue, rrc;
614 printf (
"%.*sProcessing state %d c=", rlevel*2-2,
SP, state_offset);
615 if (clen == 0) printf(
"EOL\n");
616 else if (c > 32 && c < 127) printf(
"'%c'\n", c);
617 else printf(
"0x%02x\n", c);
622 ims = current_state->ims;
628 if (state_offset < 0)
630 if (current_state->data > 0)
632 DPRINTF((
"%.*sSkipping this character\n", rlevel*2-2,
SP));
634 current_state->data - 1);
639 current_state->offset = state_offset = -state_offset;
647 for (j = 0; j < i; j++)
649 if (active_states[j].offset == state_offset &&
650 active_states[j].count == current_state->count)
652 DPRINTF((
"%.*sDuplicate state: skipped\n", rlevel*2-2,
SP));
653 goto NEXT_ACTIVE_STATE;
659 code = start_code + state_offset;
665 if (clen == 0 && poptable[codevalue] != 0)
666 could_continue =
TRUE;
679 if (coptable[codevalue] > 0)
683 if (utf8) {
GETCHARLEN(d, (code + coptable[codevalue]), dlen); }
else
685 d = code[coptable[codevalue]];
737 if (code != end_code)
747 if (ptr > current_subject ||
752 if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0;
753 else if (match_count > 0 && ++match_count * 2 >= offsetcount)
755 count = ((match_count == 0)? offsetcount : match_count * 2) - 2;
756 if (count > 0)
memmove(offsets + 2, offsets, count *
sizeof(
int));
757 if (offsetcount >= 2)
759 offsets[0] = (int)(current_subject - start_subject);
760 offsets[1] = (int)(ptr - start_subject);
761 DPRINTF((
"%.*sSet matched string = \"%.*s\"\n", rlevel*2-2,
SP,
762 offsets[1] - offsets[0], current_subject));
766 DPRINTF((
"%.*sEnd of internal_dfa_exec %d: returning %d\n"
767 "%.*s---------------------\n\n", rlevel*2-2,
SP, rlevel,
768 match_count, rlevel*2-2,
SP));
781 do { code += GET(code, 1); }
while (*code ==
OP_ALT);
790 ADD_ACTIVE((
int)(code - start_code + 1 + LINK_SIZE), 0);
791 code += GET(code, 1);
799 ADD_ACTIVE((
int)(code - start_code + 3 + LINK_SIZE), 0);
800 code += GET(code, 1);
803 ADD_ACTIVE((
int)(code - start_code + 1 + LINK_SIZE), 0);
804 code += GET(code, 1);
812 code += 1 + GET(code, 2);
813 while (*code ==
OP_ALT) code += GET(code, 1);
814 ADD_ACTIVE((
int)(code - start_code + 1 + LINK_SIZE), 0);
819 code += 1 + GET(code, 2);
820 while (*code ==
OP_ALT) code += GET(code, 1);
821 ADD_ACTIVE((
int)(code - start_code + 1 + LINK_SIZE), 0);
828 ptr != end_subject &&
835 if (ptr >= end_subject)
838 could_continue =
TRUE;
851 if (ptr == start_subject) {
ADD_ACTIVE(state_offset + 1, 0); }
856 if (ptr == start_subject + start_offset) {
ADD_ACTIVE(state_offset + 1, 0); }
869 {
ADD_NEW(state_offset + 1, 0); }
875 {
ADD_NEW(state_offset + 1, 0); }
881 could_continue =
TRUE;
882 else if (clen == 0 || (
IS_NEWLINE(ptr) && ptr == end_subject - md->
nllen))
891 could_continue =
TRUE;
892 else if (clen == 0 ||
894 ((ims & PCRE_MULTILINE) != 0 || ptr == end_subject - md->
nllen)
898 else if ((ims & PCRE_MULTILINE) != 0 &&
IS_NEWLINE(ptr))
907 if (clen > 0 && c < 256 &&
908 ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)
909 {
ADD_NEW(state_offset + 1, 0); }
916 if (clen > 0 && (c >= 256 ||
917 ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0))
918 {
ADD_NEW(state_offset + 1, 0); }
925 int left_word, right_word;
927 if (ptr > start_subject)
929 const uschar *temp = ptr - 1;
932 if (utf8) BACKCHAR(temp);
938 if (d ==
'_') left_word =
TRUE;
else
946 left_word = d < 256 && (ctypes[d] &
ctype_word) != 0;
948 else left_word =
FALSE;
955 if (c ==
'_') right_word =
TRUE;
else
963 right_word = c < 256 && (ctypes[c] &
ctype_word) != 0;
965 else right_word =
FALSE;
1005 OK = prop->
script == code[2];
1039 if (OK == (codevalue ==
OP_PROP)) {
ADD_NEW(state_offset + 3, 0); }
1055 count = current_state->count;
1056 if (count > 0) {
ADD_ACTIVE(state_offset + 2, 0); }
1062 ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
1067 next_active_state--;
1085 ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
1090 next_active_state--;
1107 ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
1112 next_active_state--;
1121 count = current_state->count;
1127 ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
1129 if (++count >=
GET2(code, 1))
1130 {
ADD_NEW(state_offset + 4, 0); }
1132 {
ADD_NEW(state_offset, count); }
1142 count = current_state->count;
1148 ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
1153 next_active_state--;
1155 if (++count >=
GET2(code, 1))
1156 {
ADD_NEW(state_offset + 4, 0); }
1158 {
ADD_NEW(state_offset, count); }
1173 count = current_state->count;
1174 if (count > 0) {
ADD_ACTIVE(state_offset + 4, 0); }
1199 OK = prop->
script == code[3];
1238 next_active_state--;
1250 count = current_state->count;
1251 if (count > 0) {
ADD_ACTIVE(state_offset + 2, 0); }
1254 const uschar *nptr = ptr + clen;
1259 next_active_state--;
1261 while (nptr < end_subject)
1280 count = current_state->count;
1281 if (count > 0) {
ADD_ACTIVE(state_offset + 2, 0); }
1296 if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;
1304 next_active_state--;
1320 count = current_state->count;
1321 if (count > 0) {
ADD_ACTIVE(state_offset + 2, 0); }
1347 next_active_state--;
1359 count = current_state->count;
1360 if (count > 0) {
ADD_ACTIVE(state_offset + 2, 0); }
1398 next_active_state--;
1446 OK = prop->
script == code[3];
1486 next_active_state--;
1488 ADD_NEW(state_offset + count, 0);
1510 const uschar *nptr = ptr + clen;
1516 next_active_state--;
1518 while (nptr < end_subject)
1560 if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;
1569 next_active_state--;
1619 next_active_state--;
1678 next_active_state--;
1693 count = current_state->count;
1718 OK = prop->
script == code[5];
1757 next_active_state--;
1759 if (++count >=
GET2(code, 1))
1760 {
ADD_NEW(state_offset + 6, 0); }
1762 {
ADD_NEW(state_offset, count); }
1774 count = current_state->count;
1777 const uschar *nptr = ptr + clen;
1782 next_active_state--;
1784 while (nptr < end_subject)
1793 if (++count >=
GET2(code, 1))
1808 count = current_state->count;
1823 if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;
1831 next_active_state--;
1833 if (++count >=
GET2(code, 1))
1852 count = current_state->count;
1877 next_active_state--;
1879 if (++count >=
GET2(code, 1))
1894 count = current_state->count;
1932 next_active_state--;
1934 if (++count >=
GET2(code, 1))
1950 if (clen > 0 && c == d) {
ADD_NEW(state_offset + dlen + 1, 0); }
1955 if (clen == 0)
break;
1960 if (c == d) {
ADD_NEW(state_offset + dlen + 1, 0); }
else
1962 unsigned int othercase;
1963 if (c < 128) othercase = fcc[c];
else
1974 if (d == othercase) {
ADD_NEW(state_offset + dlen + 1, 0); }
1982 if (lcc[c] == lcc[d]) {
ADD_NEW(state_offset + 2, 0); }
1996 const uschar *nptr = ptr + clen;
1998 while (nptr < end_subject)
2017 if (clen > 0)
switch(c)
2031 if (ptr + 1 < end_subject && ptr[1] == 0x0a)
2045 if (clen > 0)
switch(c)
2064 if (clen > 0)
switch(c)
2082 if (clen > 0)
switch(c)
2113 if (clen > 0)
switch(c)
2147 unsigned int otherd = ((ims &
PCRE_CASELESS) != 0)? fcc[d] : d;
2148 if (c != d && c != otherd) {
ADD_NEW(state_offset + dlen + 1, 0); }
2159 count = current_state->count;
2160 if (count > 0) {
ADD_ACTIVE(state_offset + dlen + 1, 0); }
2167 if (utf8 && d >= 128)
2177 if ((c == d || c == otherd) == (codevalue <
OP_NOTSTAR))
2183 next_active_state--;
2205 if (utf8 && d >= 128)
2215 if ((c == d || c == otherd) == (codevalue <
OP_NOTSTAR))
2220 next_active_state--;
2222 ADD_NEW(state_offset + dlen + 1, 0);
2241 if (utf8 && d >= 128)
2251 if ((c == d || c == otherd) == (codevalue <
OP_NOTSTAR))
2256 next_active_state--;
2266 count = current_state->count;
2273 if (utf8 && d >= 128)
2283 if ((c == d || c == otherd) == (codevalue <
OP_NOTSTAR))
2285 if (++count >=
GET2(code, 1))
2286 {
ADD_NEW(state_offset + dlen + 3, 0); }
2288 {
ADD_NEW(state_offset, count); }
2301 count = current_state->count;
2308 if (utf8 && d >= 128)
2318 if ((c == d || c == otherd) == (codevalue <
OP_NOTSTAR))
2323 next_active_state--;
2325 if (++count >=
GET2(code, 1))
2326 {
ADD_NEW(state_offset + dlen + 3, 0); }
2328 {
ADD_NEW(state_offset, count); }
2342 int next_state_offset;
2353 isinclass = (c > 255)? (codevalue ==
OP_NCLASS) :
2354 ((code[1 + c/8] & (1 << (c&7))) != 0);
2364 ecode = code + GET(code, 1);
2365 if (clen > 0) isinclass =
_pcre_xclass(c, code + 1 + LINK_SIZE);
2372 next_state_offset = (int)(ecode - start_code);
2379 if (isinclass) {
ADD_NEW(state_offset, 0); }
2384 count = current_state->count;
2385 if (count > 0) {
ADD_ACTIVE(next_state_offset + 1, 0); }
2386 if (isinclass) { count++;
ADD_NEW(state_offset, count); }
2392 if (isinclass) {
ADD_NEW(next_state_offset + 1, 0); }
2397 count = current_state->count;
2398 if (count >=
GET2(ecode, 1))
2402 int max =
GET2(ecode, 3);
2403 if (++count >= max && max != 0)
2404 {
ADD_NEW(next_state_offset + 5, 0); }
2406 {
ADD_NEW(state_offset, count); }
2411 if (isinclass) {
ADD_NEW(next_state_offset, 0); }
2433 int local_offsets[2];
2434 int local_workspace[1000];
2435 const uschar *endasscode = code + GET(code, 1);
2437 while (*endasscode ==
OP_ALT) endasscode += GET(endasscode, 1);
2439 rc = internal_dfa_exec(
2443 (
int)(ptr - start_subject),
2445 sizeof(local_offsets)/
sizeof(
int),
2447 sizeof(local_workspace)/
sizeof(
int),
2454 {
ADD_ACTIVE((
int)(endasscode + LINK_SIZE + 1 - start_code), 0); }
2462 int local_offsets[1000];
2463 int local_workspace[1000];
2464 int codelink = GET(code, 1);
2482 cb.
start_match = (int)(current_subject - start_subject);
2495 condcode = code[LINK_SIZE+1];
2505 {
ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
2513 int value =
GET2(code, LINK_SIZE+2);
2516 {
ADD_ACTIVE(state_offset + LINK_SIZE + 4, 0); }
2517 else {
ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
2525 const uschar *asscode = code + LINK_SIZE + 1;
2526 const uschar *endasscode = asscode + GET(asscode, 1);
2528 while (*endasscode ==
OP_ALT) endasscode += GET(endasscode, 1);
2530 rc = internal_dfa_exec(
2534 (
int)(ptr - start_subject),
2536 sizeof(local_offsets)/
sizeof(
int),
2538 sizeof(local_workspace)/
sizeof(
int),
2546 {
ADD_ACTIVE((
int)(endasscode + LINK_SIZE + 1 - start_code), 0); }
2548 {
ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
2556 int local_offsets[1000];
2557 int local_workspace[1000];
2560 DPRINTF((
"%.*sStarting regex recursion %d\n", rlevel*2-2,
SP,
2563 rc = internal_dfa_exec(
2565 start_code + GET(code, 1),
2567 (
int)(ptr - start_subject),
2569 sizeof(local_offsets)/
sizeof(
int),
2571 sizeof(local_workspace)/
sizeof(
int),
2576 DPRINTF((
"%.*sReturn from regex recursion %d: rc=%d\n", rlevel*2-2,
SP,
2577 recursing + 1, rc));
2589 for (rc = rc*2 - 2; rc >= 0; rc -= 2)
2591 const uschar *p = start_subject + local_offsets[rc];
2592 const uschar *pp = start_subject + local_offsets[rc+1];
2593 int charcount = local_offsets[rc+1] - local_offsets[rc];
2594 while (p < pp)
if ((*p++ & 0xc0) == 0x80) charcount--;
2597 ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1));
2612 int local_offsets[2];
2613 int local_workspace[1000];
2615 int rc = internal_dfa_exec(
2619 (
int)(ptr - start_subject),
2621 sizeof(local_offsets)/
sizeof(
int),
2623 sizeof(local_workspace)/
sizeof(
int),
2630 const uschar *end_subpattern = code;
2631 int charcount = local_offsets[1] - local_offsets[0];
2632 int next_state_offset, repeat_state_offset;
2634 do { end_subpattern += GET(end_subpattern, 1); }
2635 while (*end_subpattern ==
OP_ALT);
2637 (int)(end_subpattern - start_code + LINK_SIZE + 1);
2643 repeat_state_offset = (*end_subpattern ==
OP_KETRMAX ||
2645 (
int)(end_subpattern - start_code - GET(end_subpattern, 1)) : -1;
2662 else if (i + 1 >= active_count && new_count == 0)
2666 ADD_NEW(next_state_offset, 0);
2673 if (repeat_state_offset >= 0)
2675 next_active_state = active_states;
2683 const uschar *p = start_subject + local_offsets[0];
2684 const uschar *pp = start_subject + local_offsets[1];
2685 while (p < pp)
if ((*p++ & 0xc0) == 0x80) charcount--;
2687 if (repeat_state_offset >= 0)
2688 {
ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); }
2710 cb.
start_match = (int)(current_subject - start_subject);
2729 NEXT_ACTIVE_STATE:
continue;
2750 forced_fail != workspace[1] &&
2757 ptr >= end_subject &&
2760 if (offsetcount >= 2)
2763 offsets[1] = (int)(end_subject - start_subject);
2768 DPRINTF((
"%.*sEnd of internal_dfa_exec %d: returning %d\n"
2769 "%.*s---------------------\n\n", rlevel*2-2,
SP, rlevel, match_count,
2819 const char *subject,
int length,
int start_offset,
int options,
int *offsets,
2820 int offsetcount,
int *workspace,
int wscount)
2825 BOOL utf8, anchored, startline, firstline;
2826 const uschar *current_subject, *end_subject, *lcc;
2832 const uschar *req_byte_ptr;
2833 const uschar *start_bits = NULL;
2836 int first_byte = -1;
2844 if (re == NULL || subject == NULL || workspace == NULL ||
2858 if (extra_data != NULL)
2860 unsigned int flags = extra_data->
flags;
2881 if (study != NULL) study = &internal_study;
2886 current_subject = (
const unsigned char *)subject + start_offset;
2887 end_subject = (
const unsigned char *)subject + length;
2888 req_byte_ptr = current_subject - 1;
2927 case 0: newline =
NEWLINE;
break;
2941 else if (newline < 0)
2951 md->
nl[0] = (newline >> 8) & 255;
2952 md->
nl[1] = newline & 255;
2957 md->
nl[0] = newline;
2971 if (start_offset > 0 && start_offset < length)
2973 tb = ((
USPTR)subject)[start_offset] & 0xc0;
3004 first_byte = lcc[first_byte];
3008 if (!startline && study != NULL &&
3034 const uschar *save_end_subject = end_subject;
3043 USPTR t = current_subject;
3047 while (t < md->end_subject && !
IS_NEWLINE(t))
3050 while (t < end_subject && (*t & 0xc0) == 0x80) t++;
3055 while (t < md->end_subject && !
IS_NEWLINE(t)) t++;
3069 if (first_byte >= 0)
3071 if (first_byte_caseless)
3072 while (current_subject < end_subject &&
3073 lcc[*current_subject] != first_byte)
3076 while (current_subject < end_subject &&
3077 *current_subject != first_byte)
3090 while (current_subject < end_subject &&
3094 while(current_subject < end_subject &&
3095 (*current_subject & 0xc0) == 0x80)
3101 while (current_subject < end_subject && !
WAS_NEWLINE(current_subject))
3108 if (current_subject[-1] ==
CHAR_CR &&
3110 current_subject < end_subject &&
3118 else if (start_bits != NULL)
3120 while (current_subject < end_subject)
3122 register unsigned int c = *current_subject;
3123 if ((start_bits[c/8] & (1 << (c&7))) == 0)
3128 while(current_subject < end_subject &&
3129 (*current_subject & 0xc0) == 0x80) current_subject++;
3139 end_subject = save_end_subject;
3154 (pcre_uint32)(end_subject - current_subject) < study->
minlength)
3170 if (req_byte >= 0 && end_subject - current_subject <
REQ_BYTE_MAX)
3172 register const uschar *p = current_subject + ((first_byte >= 0)? 1 : 0);
3177 if (p > req_byte_ptr)
3179 if (req_byte_caseless)
3181 while (p < end_subject)
3183 register int pp = *p++;
3184 if (pp == req_byte || pp == req_byte2) { p--;
break; }
3189 while (p < end_subject)
3191 if (*p++ == req_byte) { p--;
break; }
3198 if (p >= end_subject)
break;
3214 rc = internal_dfa_exec(
3235 if (firstline &&
IS_NEWLINE(current_subject))
break;
3239 while (current_subject < end_subject && (*current_subject & 0xc0) == 0x80)
3242 if (current_subject > end_subject)
break;
3248 if (current_subject[-1] ==
CHAR_CR &&
3249 current_subject < end_subject &&
3250 *current_subject ==
CHAR_NL &&