| 343 |
"digit expected after (?+\0" |
"digit expected after (?+\0" |
| 344 |
"] is an invalid data character in JavaScript compatibility mode\0" |
"] is an invalid data character in JavaScript compatibility mode\0" |
| 345 |
/* 65 */ |
/* 65 */ |
| 346 |
"different names for subpatterns of the same number are not allowed"; |
"different names for subpatterns of the same number are not allowed"; |
| 347 |
|
|
| 348 |
|
|
| 349 |
/* Table to identify digits and hex digits. This is used when compiling |
/* Table to identify digits and hex digits. This is used when compiling |
| 1102 |
if (name != NULL && lorn == ptr - thisname && |
if (name != NULL && lorn == ptr - thisname && |
| 1103 |
strncmp((const char *)name, (const char *)thisname, lorn) == 0) |
strncmp((const char *)name, (const char *)thisname, lorn) == 0) |
| 1104 |
return *count; |
return *count; |
| 1105 |
term++; |
term++; |
| 1106 |
} |
} |
| 1107 |
} |
} |
| 1108 |
} |
} |
| 1148 |
break; |
break; |
| 1149 |
} |
} |
| 1150 |
else if (!negate_class && ptr[1] == CHAR_CIRCUMFLEX_ACCENT) |
else if (!negate_class && ptr[1] == CHAR_CIRCUMFLEX_ACCENT) |
| 1151 |
{ |
{ |
| 1152 |
negate_class = TRUE; |
negate_class = TRUE; |
| 1153 |
ptr++; |
ptr++; |
| 1154 |
} |
} |
| 1155 |
else break; |
else break; |
| 1156 |
} |
} |
| 1157 |
|
|
| 1340 |
|
|
| 1341 |
/* Scan a branch and compute the fixed length of subject that will match it, |
/* Scan a branch and compute the fixed length of subject that will match it, |
| 1342 |
if the length is fixed. This is needed for dealing with backward assertions. |
if the length is fixed. This is needed for dealing with backward assertions. |
| 1343 |
In UTF8 mode, the result is in characters rather than bytes. The branch is |
In UTF8 mode, the result is in characters rather than bytes. The branch is |
| 1344 |
temporarily terminated with OP_END when this function is called. |
temporarily terminated with OP_END when this function is called. |
| 1345 |
|
|
| 1346 |
This function is called when a backward assertion is encountered, so that if it |
This function is called when a backward assertion is encountered, so that if it |
| 1347 |
fails, the error message can point to the correct place in the pattern. |
fails, the error message can point to the correct place in the pattern. |
| 1348 |
However, we cannot do this when the assertion contains subroutine calls, |
However, we cannot do this when the assertion contains subroutine calls, |
| 1349 |
because they can be forward references. We solve this by remembering this case |
because they can be forward references. We solve this by remembering this case |
| 1350 |
and doing the check at the end; a flag specifies which mode we are running in. |
and doing the check at the end; a flag specifies which mode we are running in. |
| 1351 |
|
|
| 1352 |
Arguments: |
Arguments: |
| 1353 |
code points to the start of the pattern (the bracket) |
code points to the start of the pattern (the bracket) |
| 1354 |
options the compiling options |
options the compiling options |
| 1355 |
atend TRUE if called when the pattern is complete |
atend TRUE if called when the pattern is complete |
| 1356 |
cd the "compile data" structure |
cd the "compile data" structure |
| 1357 |
|
|
| 1358 |
Returns: the fixed length, |
Returns: the fixed length, |
| 1359 |
or -1 if there is no fixed length, |
or -1 if there is no fixed length, |
| 1360 |
or -2 if \C was encountered |
or -2 if \C was encountered |
| 1361 |
or -3 if an OP_RECURSE item was encountered and atend is FALSE |
or -3 if an OP_RECURSE item was encountered and atend is FALSE |
| 1405 |
cc += 1 + LINK_SIZE; |
cc += 1 + LINK_SIZE; |
| 1406 |
branchlength = 0; |
branchlength = 0; |
| 1407 |
break; |
break; |
| 1408 |
|
|
| 1409 |
/* A true recursion implies not fixed length, but a subroutine call may |
/* A true recursion implies not fixed length, but a subroutine call may |
| 1410 |
be OK. If the subroutine is a forward reference, we can't deal with |
be OK. If the subroutine is a forward reference, we can't deal with |
| 1411 |
it until the end of the pattern, so return -3. */ |
it until the end of the pattern, so return -3. */ |
| 1412 |
|
|
| 1413 |
case OP_RECURSE: |
case OP_RECURSE: |
| 1414 |
if (!atend) return -3; |
if (!atend) return -3; |
| 1415 |
cs = ce = (uschar *)cd->start_code + GET(cc, 1); /* Start subpattern */ |
cs = ce = (uschar *)cd->start_code + GET(cc, 1); /* Start subpattern */ |
| 1416 |
do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */ |
do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */ |
| 1417 |
if (cc > cs && cc < ce) return -1; /* Recursion */ |
if (cc > cs && cc < ce) return -1; /* Recursion */ |
| 1418 |
d = find_fixedlength(cs + 2, options, atend, cd); |
d = find_fixedlength(cs + 2, options, atend, cd); |
| 1419 |
if (d < 0) return d; |
if (d < 0) return d; |
| 1420 |
branchlength += d; |
branchlength += d; |
| 1421 |
cc += 1 + LINK_SIZE; |
cc += 1 + LINK_SIZE; |
| 1422 |
break; |
break; |
| 1423 |
|
|
| 1424 |
/* Skip over assertive subpatterns */ |
/* Skip over assertive subpatterns */ |
| 1425 |
|
|
| 1459 |
branchlength++; |
branchlength++; |
| 1460 |
cc += 2; |
cc += 2; |
| 1461 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1462 |
if ((options & PCRE_UTF8) != 0 && cc[-1] >= 0xc0) |
if ((options & PCRE_UTF8) != 0 && cc[-1] >= 0xc0) |
| 1463 |
cc += _pcre_utf8_table4[cc[-1] & 0x3f]; |
cc += _pcre_utf8_table4[cc[-1] & 0x3f]; |
| 1464 |
#endif |
#endif |
| 1465 |
break; |
break; |
| 1471 |
branchlength += GET2(cc,1); |
branchlength += GET2(cc,1); |
| 1472 |
cc += 4; |
cc += 4; |
| 1473 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1474 |
if ((options & PCRE_UTF8) != 0 && cc[-1] >= 0xc0) |
if ((options & PCRE_UTF8) != 0 && cc[-1] >= 0xc0) |
| 1475 |
cc += _pcre_utf8_table4[cc[-1] & 0x3f]; |
cc += _pcre_utf8_table4[cc[-1] & 0x3f]; |
| 1476 |
#endif |
#endif |
| 1477 |
break; |
break; |
| 1556 |
|
|
| 1557 |
/* This little function scans through a compiled pattern until it finds a |
/* This little function scans through a compiled pattern until it finds a |
| 1558 |
capturing bracket with the given number, or, if the number is negative, an |
capturing bracket with the given number, or, if the number is negative, an |
| 1559 |
instance of OP_REVERSE for a lookbehind. The function is global in the C sense |
instance of OP_REVERSE for a lookbehind. The function is global in the C sense |
| 1560 |
so that it can be called from pcre_study() when finding the minimum matching |
so that it can be called from pcre_study() when finding the minimum matching |
| 1561 |
length. |
length. |
| 1562 |
|
|
| 1563 |
Arguments: |
Arguments: |
| 1581 |
the table is zero; the actual length is stored in the compiled code. */ |
the table is zero; the actual length is stored in the compiled code. */ |
| 1582 |
|
|
| 1583 |
if (c == OP_XCLASS) code += GET(code, 1); |
if (c == OP_XCLASS) code += GET(code, 1); |
| 1584 |
|
|
| 1585 |
/* Handle recursion */ |
/* Handle recursion */ |
| 1586 |
|
|
| 1587 |
else if (c == OP_REVERSE) |
else if (c == OP_REVERSE) |
| 1588 |
{ |
{ |
| 1589 |
if (number < 0) return (uschar *)code; |
if (number < 0) return (uschar *)code; |
| 1590 |
code += _pcre_OP_lengths[c]; |
code += _pcre_OP_lengths[c]; |
| 1591 |
} |
} |
| 1592 |
|
|
| 1957 |
case OP_POSQUERY: |
case OP_POSQUERY: |
| 1958 |
if (utf8 && code[1] >= 0xc0) code += _pcre_utf8_table4[code[1] & 0x3f]; |
if (utf8 && code[1] >= 0xc0) code += _pcre_utf8_table4[code[1] & 0x3f]; |
| 1959 |
break; |
break; |
| 1960 |
|
|
| 1961 |
case OP_UPTO: |
case OP_UPTO: |
| 1962 |
case OP_MINUPTO: |
case OP_MINUPTO: |
| 1963 |
case OP_POSUPTO: |
case OP_POSUPTO: |
| 3915 |
|
|
| 3916 |
if (repeat_max == 0) goto END_REPEAT; |
if (repeat_max == 0) goto END_REPEAT; |
| 3917 |
|
|
| 3918 |
/*--------------------------------------------------------------------*/ |
/*--------------------------------------------------------------------*/ |
| 3919 |
/* This code is obsolete from release 8.00; the restriction was finally |
/* This code is obsolete from release 8.00; the restriction was finally |
| 3920 |
removed: */ |
removed: */ |
| 3921 |
|
|
| 3922 |
/* All real repeats make it impossible to handle partial matching (maybe |
/* All real repeats make it impossible to handle partial matching (maybe |
| 3923 |
one day we will be able to remove this restriction). */ |
one day we will be able to remove this restriction). */ |
| 3924 |
|
|
| 3925 |
/* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ |
/* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ |
| 3926 |
/*--------------------------------------------------------------------*/ |
/*--------------------------------------------------------------------*/ |
| 3927 |
|
|
| 3928 |
/* Combine the op_type with the repeat_type */ |
/* Combine the op_type with the repeat_type */ |
| 3929 |
|
|
| 4070 |
goto END_REPEAT; |
goto END_REPEAT; |
| 4071 |
} |
} |
| 4072 |
|
|
| 4073 |
/*--------------------------------------------------------------------*/ |
/*--------------------------------------------------------------------*/ |
| 4074 |
/* This code is obsolete from release 8.00; the restriction was finally |
/* This code is obsolete from release 8.00; the restriction was finally |
| 4075 |
removed: */ |
removed: */ |
| 4076 |
|
|
| 4078 |
one day we will be able to remove this restriction). */ |
one day we will be able to remove this restriction). */ |
| 4079 |
|
|
| 4080 |
/* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ |
/* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ |
| 4081 |
/*--------------------------------------------------------------------*/ |
/*--------------------------------------------------------------------*/ |
| 4082 |
|
|
| 4083 |
if (repeat_min == 0 && repeat_max == -1) |
if (repeat_min == 0 && repeat_max == -1) |
| 4084 |
*code++ = OP_CRSTAR + repeat_type; |
*code++ = OP_CRSTAR + repeat_type; |
| 4393 |
if (possessive_quantifier) |
if (possessive_quantifier) |
| 4394 |
{ |
{ |
| 4395 |
int len; |
int len; |
| 4396 |
|
|
| 4397 |
if (*tempcode == OP_TYPEEXACT) |
if (*tempcode == OP_TYPEEXACT) |
| 4398 |
tempcode += _pcre_OP_lengths[*tempcode] + |
tempcode += _pcre_OP_lengths[*tempcode] + |
| 4399 |
((tempcode[3] == OP_PROP || tempcode[3] == OP_NOTPROP)? 2 : 0); |
((tempcode[3] == OP_PROP || tempcode[3] == OP_NOTPROP)? 2 : 0); |
| 4400 |
|
|
| 4401 |
else if (*tempcode == OP_EXACT || *tempcode == OP_NOTEXACT) |
else if (*tempcode == OP_EXACT || *tempcode == OP_NOTEXACT) |
| 4402 |
{ |
{ |
| 4403 |
tempcode += _pcre_OP_lengths[*tempcode]; |
tempcode += _pcre_OP_lengths[*tempcode]; |
| 4405 |
if (utf8 && tempcode[-1] >= 0xc0) |
if (utf8 && tempcode[-1] >= 0xc0) |
| 4406 |
tempcode += _pcre_utf8_table4[tempcode[-1] & 0x3f]; |
tempcode += _pcre_utf8_table4[tempcode[-1] & 0x3f]; |
| 4407 |
#endif |
#endif |
| 4408 |
} |
} |
| 4409 |
|
|
| 4410 |
len = code - tempcode; |
len = code - tempcode; |
| 4411 |
if (len > 0) switch (*tempcode) |
if (len > 0) switch (*tempcode) |
| 4412 |
{ |
{ |
| 4485 |
strncmp((char *)name, vn, namelen) == 0) |
strncmp((char *)name, vn, namelen) == 0) |
| 4486 |
{ |
{ |
| 4487 |
/* Check for open captures before ACCEPT */ |
/* Check for open captures before ACCEPT */ |
| 4488 |
|
|
| 4489 |
if (verbs[i].op == OP_ACCEPT) |
if (verbs[i].op == OP_ACCEPT) |
| 4490 |
{ |
{ |
| 4491 |
open_capitem *oc; |
open_capitem *oc; |
| 4492 |
cd->had_accept = TRUE; |
cd->had_accept = TRUE; |
| 4493 |
for (oc = cd->open_caps; oc != NULL; oc = oc->next) |
for (oc = cd->open_caps; oc != NULL; oc = oc->next) |
| 4494 |
{ |
{ |
| 4495 |
*code++ = OP_CLOSE; |
*code++ = OP_CLOSE; |
| 4496 |
PUT2INC(code, 0, oc->number); |
PUT2INC(code, 0, oc->number); |
| 4497 |
} |
} |
| 4498 |
} |
} |
| 4499 |
*code++ = verbs[i].op; |
*code++ = verbs[i].op; |
| 4500 |
break; |
break; |
| 4501 |
} |
} |
| 4658 |
} |
} |
| 4659 |
|
|
| 4660 |
/* Otherwise (did not start with "+" or "-"), start by looking for the |
/* Otherwise (did not start with "+" or "-"), start by looking for the |
| 4661 |
name. If we find a name, add one to the opcode to change OP_CREF or |
name. If we find a name, add one to the opcode to change OP_CREF or |
| 4662 |
OP_RREF into OP_NCREF or OP_NRREF. These behave exactly the same, |
OP_RREF into OP_NCREF or OP_NRREF. These behave exactly the same, |
| 4663 |
except they record that the reference was originally to a name. The |
except they record that the reference was originally to a name. The |
| 4664 |
information is used to check duplicate names. */ |
information is used to check duplicate names. */ |
| 4665 |
|
|
| 4666 |
slot = cd->name_table; |
slot = cd->name_table; |
| 4887 |
is because the number of names, and hence the table size, is computed |
is because the number of names, and hence the table size, is computed |
| 4888 |
in the pre-compile, and it affects various numbers and pointers which |
in the pre-compile, and it affects various numbers and pointers which |
| 4889 |
would all have to be modified, and the compiled code moved down, if |
would all have to be modified, and the compiled code moved down, if |
| 4890 |
duplicates with the same number were omitted from the table. This |
duplicates with the same number were omitted from the table. This |
| 4891 |
doesn't seem worth the hassle. However, *different* names for the |
doesn't seem worth the hassle. However, *different* names for the |
| 4892 |
same number are not permitted. */ |
same number are not permitted. */ |
| 4893 |
|
|
| 4895 |
{ |
{ |
| 4896 |
BOOL dupname = FALSE; |
BOOL dupname = FALSE; |
| 4897 |
slot = cd->name_table; |
slot = cd->name_table; |
| 4898 |
|
|
| 4899 |
for (i = 0; i < cd->names_found; i++) |
for (i = 0; i < cd->names_found; i++) |
| 4900 |
{ |
{ |
| 4901 |
int crc = memcmp(name, slot+2, namelen); |
int crc = memcmp(name, slot+2, namelen); |
| 4909 |
*errorcodeptr = ERR43; |
*errorcodeptr = ERR43; |
| 4910 |
goto FAILED; |
goto FAILED; |
| 4911 |
} |
} |
| 4912 |
else dupname = TRUE; |
else dupname = TRUE; |
| 4913 |
} |
} |
| 4914 |
else crc = -1; /* Current name is a substring */ |
else crc = -1; /* Current name is a substring */ |
| 4915 |
} |
} |
| 4916 |
|
|
| 4917 |
/* Make space in the table and break the loop for an earlier |
/* Make space in the table and break the loop for an earlier |
| 4918 |
name. For a duplicate or later name, carry on. We do this for |
name. For a duplicate or later name, carry on. We do this for |
| 4919 |
duplicates so that in the simple case (when ?(| is not used) they |
duplicates so that in the simple case (when ?(| is not used) they |
| 4920 |
are in order of their numbers. */ |
are in order of their numbers. */ |
| 4921 |
|
|
| 4922 |
if (crc < 0) |
if (crc < 0) |
| 4923 |
{ |
{ |
| 4924 |
memmove(slot + cd->name_entry_size, slot, |
memmove(slot + cd->name_entry_size, slot, |
| 4925 |
(cd->names_found - i) * cd->name_entry_size); |
(cd->names_found - i) * cd->name_entry_size); |
| 4926 |
break; |
break; |
| 4927 |
} |
} |
| 4928 |
|
|
| 4929 |
/* Continue the loop for a later or duplicate name */ |
/* Continue the loop for a later or duplicate name */ |
| 4930 |
|
|
| 4931 |
slot += cd->name_entry_size; |
slot += cd->name_entry_size; |
| 4932 |
} |
} |
| 4933 |
|
|
| 4934 |
/* For non-duplicate names, check for a duplicate number before |
/* For non-duplicate names, check for a duplicate number before |
| 4935 |
adding the new name. */ |
adding the new name. */ |
| 4936 |
|
|
| 4937 |
if (!dupname) |
if (!dupname) |
| 4938 |
{ |
{ |
| 4939 |
uschar *cslot = cd->name_table; |
uschar *cslot = cd->name_table; |
| 4945 |
{ |
{ |
| 4946 |
*errorcodeptr = ERR65; |
*errorcodeptr = ERR65; |
| 4947 |
goto FAILED; |
goto FAILED; |
| 4948 |
} |
} |
| 4949 |
} |
} |
| 4950 |
else i--; |
else i--; |
| 4951 |
cslot += cd->name_entry_size; |
cslot += cd->name_entry_size; |
| 4952 |
} |
} |
| 4953 |
} |
} |
| 4954 |
|
|
| 4955 |
PUT2(slot, 0, cd->bracount + 1); |
PUT2(slot, 0, cd->bracount + 1); |
| 4956 |
memcpy(slot + 2, name, namelen); |
memcpy(slot + 2, name, namelen); |
| 5131 |
if (lengthptr == NULL) |
if (lengthptr == NULL) |
| 5132 |
{ |
{ |
| 5133 |
*code = OP_END; |
*code = OP_END; |
| 5134 |
if (recno != 0) |
if (recno != 0) |
| 5135 |
called = _pcre_find_bracket(cd->start_code, utf8, recno); |
called = _pcre_find_bracket(cd->start_code, utf8, recno); |
| 5136 |
|
|
| 5137 |
/* Forward reference */ |
/* Forward reference */ |
| 5812 |
capnumber = GET2(code, 1 + LINK_SIZE); |
capnumber = GET2(code, 1 + LINK_SIZE); |
| 5813 |
capitem.number = capnumber; |
capitem.number = capnumber; |
| 5814 |
capitem.next = cd->open_caps; |
capitem.next = cd->open_caps; |
| 5815 |
cd->open_caps = &capitem; |
cd->open_caps = &capitem; |
| 5816 |
} |
} |
| 5817 |
|
|
| 5818 |
/* Offset is set zero to mark that this bracket is still open */ |
/* Offset is set zero to mark that this bracket is still open */ |
| 5819 |
|
|
| 5909 |
|
|
| 5910 |
/* If lookbehind, check that this branch matches a fixed-length string, and |
/* If lookbehind, check that this branch matches a fixed-length string, and |
| 5911 |
put the length into the OP_REVERSE item. Temporarily mark the end of the |
put the length into the OP_REVERSE item. Temporarily mark the end of the |
| 5912 |
branch with OP_END. If the branch contains OP_RECURSE, the result is -3 |
branch with OP_END. If the branch contains OP_RECURSE, the result is -3 |
| 5913 |
because there may be forward references that we can't check here. Set a |
because there may be forward references that we can't check here. Set a |
| 5914 |
flag to cause another lookbehind check at the end. Why not do it all at the |
flag to cause another lookbehind check at the end. Why not do it all at the |
| 5915 |
end? Because common, erroneous checks are picked up here and the offset of |
end? Because common, erroneous checks are picked up here and the offset of |
| 5916 |
the problem can be shown. */ |
the problem can be shown. */ |
| 5917 |
|
|
| 5918 |
if (lookbehind) |
if (lookbehind) |
| 5923 |
DPRINTF(("fixed length = %d\n", fixed_length)); |
DPRINTF(("fixed length = %d\n", fixed_length)); |
| 5924 |
if (fixed_length == -3) |
if (fixed_length == -3) |
| 5925 |
{ |
{ |
| 5926 |
cd->check_lookbehind = TRUE; |
cd->check_lookbehind = TRUE; |
| 5927 |
} |
} |
| 5928 |
else if (fixed_length < 0) |
else if (fixed_length < 0) |
| 5929 |
{ |
{ |
| 5930 |
*errorcodeptr = (fixed_length == -2)? ERR36 : ERR25; |
*errorcodeptr = (fixed_length == -2)? ERR36 : ERR25; |
| 5958 |
} |
} |
| 5959 |
while (branch_length > 0); |
while (branch_length > 0); |
| 5960 |
} |
} |
| 5961 |
|
|
| 5962 |
/* If it was a capturing subpattern, remove it from the chain. */ |
/* If it was a capturing subpattern, remove it from the chain. */ |
| 5963 |
|
|
| 5964 |
if (capnumber > 0) cd->open_caps = cd->open_caps->next; |
if (capnumber > 0) cd->open_caps = cd->open_caps->next; |
| 5965 |
|
|
| 5966 |
/* Fill in the ket */ |
/* Fill in the ket */ |
| 6654 |
|
|
| 6655 |
if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; |
if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; |
| 6656 |
|
|
| 6657 |
/* If there were any lookbehind assertions that contained OP_RECURSE |
/* If there were any lookbehind assertions that contained OP_RECURSE |
| 6658 |
(recursions or subroutine calls), a flag is set for them to be checked here, |
(recursions or subroutine calls), a flag is set for them to be checked here, |
| 6659 |
because they may contain forward references. Actual recursions can't be fixed |
because they may contain forward references. Actual recursions can't be fixed |
| 6660 |
length, but subroutine calls can. It is done like this so that those without |
length, but subroutine calls can. It is done like this so that those without |
| 6665 |
if (cd->check_lookbehind) |
if (cd->check_lookbehind) |
| 6666 |
{ |
{ |
| 6667 |
uschar *cc = (uschar *)codestart; |
uschar *cc = (uschar *)codestart; |
| 6668 |
|
|
| 6669 |
/* Loop, searching for OP_REVERSE items, and process those that do not have |
/* Loop, searching for OP_REVERSE items, and process those that do not have |
| 6670 |
their length set. (Actually, it will also re-process any that have a length |
their length set. (Actually, it will also re-process any that have a length |
| 6671 |
of zero, but that is a pathological case, and it does no harm.) When we find |
of zero, but that is a pathological case, and it does no harm.) When we find |
| 6672 |
one, we temporarily terminate the branch it is in while we scan it. */ |
one, we temporarily terminate the branch it is in while we scan it. */ |
| 6673 |
|
|
| 6674 |
for (cc = (uschar *)_pcre_find_bracket(codestart, utf8, -1); |
for (cc = (uschar *)_pcre_find_bracket(codestart, utf8, -1); |
| 6675 |
cc != NULL; |
cc != NULL; |
| 6676 |
cc = (uschar *)_pcre_find_bracket(cc, utf8, -1)) |
cc = (uschar *)_pcre_find_bracket(cc, utf8, -1)) |
| 6677 |
{ |
{ |
| 6678 |
if (GET(cc, 1) == 0) |
if (GET(cc, 1) == 0) |
| 6679 |
{ |
{ |
| 6680 |
int fixed_length; |
int fixed_length; |
| 6681 |
uschar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE); |
uschar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE); |
| 6682 |
int end_op = *be; |
int end_op = *be; |
| 6683 |
*be = OP_END; |
*be = OP_END; |
| 6684 |
fixed_length = find_fixedlength(cc, re->options, TRUE, cd); |
fixed_length = find_fixedlength(cc, re->options, TRUE, cd); |
| 6685 |
*be = end_op; |
*be = end_op; |
| 6687 |
if (fixed_length < 0) |
if (fixed_length < 0) |
| 6688 |
{ |
{ |
| 6689 |
errorcode = (fixed_length == -2)? ERR36 : ERR25; |
errorcode = (fixed_length == -2)? ERR36 : ERR25; |
| 6690 |
break; |
break; |
| 6691 |
} |
} |
| 6692 |
PUT(cc, 1, fixed_length); |
PUT(cc, 1, fixed_length); |
| 6693 |
} |
} |
| 6694 |
cc += 1 + LINK_SIZE; |
cc += 1 + LINK_SIZE; |
| 6695 |
} |
} |
| 6696 |
} |
} |
| 6697 |
|
|
| 6698 |
/* Failed to compile, or error while post-processing */ |
/* Failed to compile, or error while post-processing */ |
| 6699 |
|
|