42 |
supporting internal functions that are not used by other modules. */ |
supporting internal functions that are not used by other modules. */ |
43 |
|
|
44 |
|
|
45 |
|
#ifdef HAVE_CONFIG_H |
46 |
|
#include <config.h> |
47 |
|
#endif |
48 |
|
|
49 |
#define NLBLOCK cd /* Block containing newline information */ |
#define NLBLOCK cd /* Block containing newline information */ |
50 |
#define PSSTART start_pattern /* Field containing processed string start */ |
#define PSSTART start_pattern /* Field containing processed string start */ |
51 |
#define PSEND end_pattern /* Field containing processed string end */ |
#define PSEND end_pattern /* Field containing processed string end */ |
52 |
|
|
|
|
|
53 |
#include "pcre_internal.h" |
#include "pcre_internal.h" |
54 |
|
|
55 |
|
|
65 |
|
|
66 |
#define SETBIT(a,b) a[b/8] |= (1 << (b%8)) |
#define SETBIT(a,b) a[b/8] |= (1 << (b%8)) |
67 |
|
|
68 |
|
/* Maximum length value to check against when making sure that the integer that |
69 |
|
holds the compiled pattern length does not overflow. We make it a bit less than |
70 |
|
INT_MAX to allow for adding in group terminating bytes, so that we don't have |
71 |
|
to check them every time. */ |
72 |
|
|
73 |
|
#define OFLOW_MAX (INT_MAX - 20) |
74 |
|
|
75 |
|
|
76 |
/************************************************* |
/************************************************* |
77 |
* Code parameters and static tables * |
* Code parameters and static tables * |
130 |
/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', |
/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', |
131 |
/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, |
/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, |
132 |
/* C8 */-ESC_H, 0, 0, 0, 0, 0, 0, 0, |
/* C8 */-ESC_H, 0, 0, 0, 0, 0, 0, 0, |
133 |
/* D0 */ '}', 0, 0, 0, 0, 0, 0, -ESC_P, |
/* D0 */ '}', 0, -ESC_K, 0, 0, 0, 0, -ESC_P, |
134 |
/* D8 */-ESC_Q,-ESC_R, 0, 0, 0, 0, 0, 0, |
/* D8 */-ESC_Q,-ESC_R, 0, 0, 0, 0, 0, 0, |
135 |
/* E0 */ '\\', 0, -ESC_S, 0, 0,-ESC_V, -ESC_W, -ESC_X, |
/* E0 */ '\\', 0, -ESC_S, 0, 0,-ESC_V, -ESC_W, -ESC_X, |
136 |
/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, |
/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, |
140 |
#endif |
#endif |
141 |
|
|
142 |
|
|
143 |
|
/* Table of special "verbs" like (*PRUNE) */ |
144 |
|
|
145 |
|
typedef struct verbitem { |
146 |
|
const char *name; |
147 |
|
int len; |
148 |
|
int op; |
149 |
|
} verbitem; |
150 |
|
|
151 |
|
static verbitem verbs[] = { |
152 |
|
{ "ACCEPT", 6, OP_ACCEPT }, |
153 |
|
{ "COMMIT", 6, OP_COMMIT }, |
154 |
|
{ "F", 1, OP_FAIL }, |
155 |
|
{ "FAIL", 4, OP_FAIL }, |
156 |
|
{ "PRUNE", 5, OP_PRUNE }, |
157 |
|
{ "SKIP", 4, OP_SKIP }, |
158 |
|
{ "THEN", 4, OP_THEN } |
159 |
|
}; |
160 |
|
|
161 |
|
static int verbcount = sizeof(verbs)/sizeof(verbitem); |
162 |
|
|
163 |
|
|
164 |
/* Tables of names of POSIX character classes and their lengths. The list is |
/* Tables of names of POSIX character classes and their lengths. The list is |
165 |
terminated by a zero length entry. The first three must be alpha, lower, upper, |
terminated by a zero length entry. The first three must be alpha, lower, upper, |
166 |
as this is assumed for handling case independence. */ |
as this is assumed for handling case independence. */ |
234 |
"missing ) after comment", |
"missing ) after comment", |
235 |
"parentheses nested too deeply", /** DEAD **/ |
"parentheses nested too deeply", /** DEAD **/ |
236 |
/* 20 */ |
/* 20 */ |
237 |
"regular expression too large", |
"regular expression is too large", |
238 |
"failed to get memory", |
"failed to get memory", |
239 |
"unmatched parentheses", |
"unmatched parentheses", |
240 |
"internal error: code overflow", |
"internal error: code overflow", |
270 |
"subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)", |
"subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)", |
271 |
"too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")", |
"too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")", |
272 |
/* 50 */ |
/* 50 */ |
273 |
"repeated subpattern is too long", |
"repeated subpattern is too long", /** DEAD **/ |
274 |
"octal value is greater than \\377 (not in UTF-8 mode)", |
"octal value is greater than \\377 (not in UTF-8 mode)", |
275 |
"internal error: overran compiling workspace", |
"internal error: overran compiling workspace", |
276 |
"internal error: previously-checked referenced subpattern not found", |
"internal error: previously-checked referenced subpattern not found", |
279 |
"repeating a DEFINE group is not allowed", |
"repeating a DEFINE group is not allowed", |
280 |
"inconsistent NEWLINE options", |
"inconsistent NEWLINE options", |
281 |
"\\g is not followed by a braced name or an optionally braced non-zero number", |
"\\g is not followed by a braced name or an optionally braced non-zero number", |
282 |
"(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number" |
"(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number", |
283 |
|
"(*VERB) with an argument is not supported", |
284 |
|
/* 60 */ |
285 |
|
"(*VERB) not recognized", |
286 |
|
"number is too big" |
287 |
}; |
}; |
288 |
|
|
289 |
|
|
440 |
|
|
441 |
Returns: zero or positive => a data character |
Returns: zero or positive => a data character |
442 |
negative => a special escape sequence |
negative => a special escape sequence |
443 |
on error, errorptr is set |
on error, errorcodeptr is set |
444 |
*/ |
*/ |
445 |
|
|
446 |
static int |
static int |
524 |
c = 0; |
c = 0; |
525 |
while ((digitab[ptr[1]] & ctype_digit) != 0) |
while ((digitab[ptr[1]] & ctype_digit) != 0) |
526 |
c = c * 10 + *(++ptr) - '0'; |
c = c * 10 + *(++ptr) - '0'; |
527 |
|
|
528 |
|
if (c < 0) |
529 |
|
{ |
530 |
|
*errorcodeptr = ERR61; |
531 |
|
break; |
532 |
|
} |
533 |
|
|
534 |
if (c == 0 || (braced && *(++ptr) != '}')) |
if (c == 0 || (braced && *(++ptr) != '}')) |
535 |
{ |
{ |
536 |
*errorcodeptr = ERR57; |
*errorcodeptr = ERR57; |
537 |
return 0; |
break; |
538 |
} |
} |
539 |
|
|
540 |
if (negated) |
if (negated) |
542 |
if (c > bracount) |
if (c > bracount) |
543 |
{ |
{ |
544 |
*errorcodeptr = ERR15; |
*errorcodeptr = ERR15; |
545 |
return 0; |
break; |
546 |
} |
} |
547 |
c = bracount - (c - 1); |
c = bracount - (c - 1); |
548 |
} |
} |
571 |
c -= '0'; |
c -= '0'; |
572 |
while ((digitab[ptr[1]] & ctype_digit) != 0) |
while ((digitab[ptr[1]] & ctype_digit) != 0) |
573 |
c = c * 10 + *(++ptr) - '0'; |
c = c * 10 + *(++ptr) - '0'; |
574 |
|
if (c < 0) |
575 |
|
{ |
576 |
|
*errorcodeptr = ERR61; |
577 |
|
break; |
578 |
|
} |
579 |
if (c < 10 || c <= bracount) |
if (c < 10 || c <= bracount) |
580 |
{ |
{ |
581 |
c = -(ESC_REF + c); |
c = -(ESC_REF + c); |
671 |
if (c == 0) |
if (c == 0) |
672 |
{ |
{ |
673 |
*errorcodeptr = ERR2; |
*errorcodeptr = ERR2; |
674 |
return 0; |
break; |
675 |
} |
} |
676 |
|
|
677 |
#ifndef EBCDIC /* ASCII coding */ |
#ifndef EBCDIC /* ASCII coding */ |
747 |
*negptr = TRUE; |
*negptr = TRUE; |
748 |
ptr++; |
ptr++; |
749 |
} |
} |
750 |
for (i = 0; i < sizeof(name) - 1; i++) |
for (i = 0; i < (int)sizeof(name) - 1; i++) |
751 |
{ |
{ |
752 |
c = *(++ptr); |
c = *(++ptr); |
753 |
if (c == 0) goto ERROR_RETURN; |
if (c == 0) goto ERROR_RETURN; |
950 |
{ |
{ |
951 |
while (*(++ptr) != ']') |
while (*(++ptr) != ']') |
952 |
{ |
{ |
953 |
|
if (*ptr == 0) return -1; |
954 |
if (*ptr == '\\') |
if (*ptr == '\\') |
955 |
{ |
{ |
956 |
if (*(++ptr) == 0) return -1; |
if (*(++ptr) == 0) return -1; |
978 |
/* An opening parens must now be a real metacharacter */ |
/* An opening parens must now be a real metacharacter */ |
979 |
|
|
980 |
if (*ptr != '(') continue; |
if (*ptr != '(') continue; |
981 |
if (ptr[1] != '?') |
if (ptr[1] != '?' && ptr[1] != '*') |
982 |
{ |
{ |
983 |
count++; |
count++; |
984 |
if (name == NULL && count == lorn) return count; |
if (name == NULL && count == lorn) return count; |
1446 |
|
|
1447 |
/* For other groups, scan the branches. */ |
/* For other groups, scan the branches. */ |
1448 |
|
|
1449 |
if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE) |
if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND) |
1450 |
{ |
{ |
1451 |
BOOL empty_branch; |
BOOL empty_branch; |
1452 |
if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ |
if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ |
1470 |
|
|
1471 |
switch (c) |
switch (c) |
1472 |
{ |
{ |
1473 |
/* Check for quantifiers after a class */ |
/* Check for quantifiers after a class. XCLASS is used for classes that |
1474 |
|
cannot be represented just by a bit map. This includes negated single |
1475 |
|
high-valued characters. The length in _pcre_OP_lengths[] is zero; the |
1476 |
|
actual length is stored in the compiled code, so we must update "code" |
1477 |
|
here. */ |
1478 |
|
|
1479 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
1480 |
case OP_XCLASS: |
case OP_XCLASS: |
1481 |
ccode = code + GET(code, 1); |
ccode = code += GET(code, 1); |
1482 |
goto CHECK_CLASS_REPEAT; |
goto CHECK_CLASS_REPEAT; |
1483 |
#endif |
#endif |
1484 |
|
|
2306 |
*/ |
*/ |
2307 |
|
|
2308 |
if (code < last_code) code = last_code; |
if (code < last_code) code = last_code; |
2309 |
|
|
2310 |
|
/* Paranoid check for integer overflow */ |
2311 |
|
|
2312 |
|
if (OFLOW_MAX - *lengthptr < code - last_code) |
2313 |
|
{ |
2314 |
|
*errorcodeptr = ERR20; |
2315 |
|
goto FAILED; |
2316 |
|
} |
2317 |
|
|
2318 |
*lengthptr += code - last_code; |
*lengthptr += code - last_code; |
2319 |
DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c)); |
DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c)); |
2320 |
|
|
2427 |
*ptrptr = ptr; |
*ptrptr = ptr; |
2428 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
2429 |
{ |
{ |
2430 |
|
if (OFLOW_MAX - *lengthptr < code - last_code) |
2431 |
|
{ |
2432 |
|
*errorcodeptr = ERR20; |
2433 |
|
goto FAILED; |
2434 |
|
} |
2435 |
*lengthptr += code - last_code; /* To include callout length */ |
*lengthptr += code - last_code; /* To include callout length */ |
2436 |
DPRINTF((">> end branch\n")); |
DPRINTF((">> end branch\n")); |
2437 |
} |
} |
2494 |
goto FAILED; |
goto FAILED; |
2495 |
} |
} |
2496 |
|
|
2497 |
/* If the first character is '^', set the negation flag and skip it. */ |
/* If the first character is '^', set the negation flag and skip it. Also, |
2498 |
|
if the first few characters (either before or after ^) are \Q\E or \E we |
2499 |
|
skip them too. This makes for compatibility with Perl. */ |
2500 |
|
|
2501 |
if ((c = *(++ptr)) == '^') |
negate_class = FALSE; |
2502 |
|
for (;;) |
2503 |
{ |
{ |
|
negate_class = TRUE; |
|
2504 |
c = *(++ptr); |
c = *(++ptr); |
2505 |
} |
if (c == '\\') |
2506 |
else |
{ |
2507 |
{ |
if (ptr[1] == 'E') ptr++; |
2508 |
negate_class = FALSE; |
else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3; |
2509 |
|
else break; |
2510 |
|
} |
2511 |
|
else if (!negate_class && c == '^') |
2512 |
|
negate_class = TRUE; |
2513 |
|
else break; |
2514 |
} |
} |
2515 |
|
|
2516 |
/* Keep a count of chars with values < 256 so that we can optimize the case |
/* Keep a count of chars with values < 256 so that we can optimize the case |
2651 |
of the specials, which just set a flag. The sequence \b is a special |
of the specials, which just set a flag. The sequence \b is a special |
2652 |
case. Inside a class (and only there) it is treated as backspace. |
case. Inside a class (and only there) it is treated as backspace. |
2653 |
Elsewhere it marks a word boundary. Other escapes have preset maps ready |
Elsewhere it marks a word boundary. Other escapes have preset maps ready |
2654 |
to or into the one we are building. We assume they have more than one |
to 'or' into the one we are building. We assume they have more than one |
2655 |
character in them, so set class_charcount bigger than one. */ |
character in them, so set class_charcount bigger than one. */ |
2656 |
|
|
2657 |
if (c == '\\') |
if (c == '\\') |
3593 |
goto FAILED; |
goto FAILED; |
3594 |
} |
} |
3595 |
|
|
|
/* This is a paranoid check to stop integer overflow later on */ |
|
|
|
|
|
if (len > MAX_DUPLENGTH) |
|
|
{ |
|
|
*errorcodeptr = ERR50; |
|
|
goto FAILED; |
|
|
} |
|
|
|
|
3596 |
/* If the maximum repeat count is unlimited, find the end of the bracket |
/* If the maximum repeat count is unlimited, find the end of the bracket |
3597 |
by scanning through from the start, and compute the offset back to it |
by scanning through from the start, and compute the offset back to it |
3598 |
from the current code pointer. There may be an OP_OPT setting following |
from the current code pointer. There may be an OP_OPT setting following |
3681 |
if (repeat_min > 1) |
if (repeat_min > 1) |
3682 |
{ |
{ |
3683 |
/* In the pre-compile phase, we don't actually do the replication. We |
/* In the pre-compile phase, we don't actually do the replication. We |
3684 |
just adjust the length as if we had. */ |
just adjust the length as if we had. Do some paranoid checks for |
3685 |
|
potential integer overflow. */ |
3686 |
|
|
3687 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
3688 |
*lengthptr += (repeat_min - 1)*length_prevgroup; |
{ |
3689 |
|
int delta = (repeat_min - 1)*length_prevgroup; |
3690 |
|
if ((double)(repeat_min - 1)*(double)length_prevgroup > |
3691 |
|
(double)INT_MAX || |
3692 |
|
OFLOW_MAX - *lengthptr < delta) |
3693 |
|
{ |
3694 |
|
*errorcodeptr = ERR20; |
3695 |
|
goto FAILED; |
3696 |
|
} |
3697 |
|
*lengthptr += delta; |
3698 |
|
} |
3699 |
|
|
3700 |
/* This is compiling for real */ |
/* This is compiling for real */ |
3701 |
|
|
3733 |
/* In the pre-compile phase, we don't actually do the replication. We |
/* In the pre-compile phase, we don't actually do the replication. We |
3734 |
just adjust the length as if we had. For each repetition we must add 1 |
just adjust the length as if we had. For each repetition we must add 1 |
3735 |
to the length for BRAZERO and for all but the last repetition we must |
to the length for BRAZERO and for all but the last repetition we must |
3736 |
add 2 + 2*LINKSIZE to allow for the nesting that occurs. */ |
add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some |
3737 |
|
paranoid checks to avoid integer overflow. */ |
3738 |
|
|
3739 |
if (lengthptr != NULL && repeat_max > 0) |
if (lengthptr != NULL && repeat_max > 0) |
3740 |
*lengthptr += repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - |
{ |
3741 |
2 - 2*LINK_SIZE; /* Last one doesn't nest */ |
int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - |
3742 |
|
2 - 2*LINK_SIZE; /* Last one doesn't nest */ |
3743 |
|
if ((double)repeat_max * |
3744 |
|
(double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) |
3745 |
|
> (double)INT_MAX || |
3746 |
|
OFLOW_MAX - *lengthptr < delta) |
3747 |
|
{ |
3748 |
|
*errorcodeptr = ERR20; |
3749 |
|
goto FAILED; |
3750 |
|
} |
3751 |
|
*lengthptr += delta; |
3752 |
|
} |
3753 |
|
|
3754 |
/* This is compiling for real */ |
/* This is compiling for real */ |
3755 |
|
|
3901 |
/* ===================================================================*/ |
/* ===================================================================*/ |
3902 |
/* Start of nested parenthesized sub-expression, or comment or lookahead or |
/* Start of nested parenthesized sub-expression, or comment or lookahead or |
3903 |
lookbehind or option setting or condition or all the other extended |
lookbehind or option setting or condition or all the other extended |
3904 |
parenthesis forms. First deal with the specials; all are introduced by ?, |
parenthesis forms. */ |
|
and the appearance of any of them means that this is not a capturing |
|
|
group. */ |
|
3905 |
|
|
3906 |
case '(': |
case '(': |
3907 |
newoptions = options; |
newoptions = options; |
3910 |
save_hwm = cd->hwm; |
save_hwm = cd->hwm; |
3911 |
reset_bracount = FALSE; |
reset_bracount = FALSE; |
3912 |
|
|
3913 |
if (*(++ptr) == '?') |
/* First deal with various "verbs" that can be introduced by '*'. */ |
3914 |
|
|
3915 |
|
if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0) |
3916 |
|
{ |
3917 |
|
int i, namelen; |
3918 |
|
const uschar *name = ++ptr; |
3919 |
|
previous = NULL; |
3920 |
|
while ((cd->ctypes[*++ptr] & ctype_letter) != 0); |
3921 |
|
if (*ptr == ':') |
3922 |
|
{ |
3923 |
|
*errorcodeptr = ERR59; /* Not supported */ |
3924 |
|
goto FAILED; |
3925 |
|
} |
3926 |
|
if (*ptr != ')') |
3927 |
|
{ |
3928 |
|
*errorcodeptr = ERR60; |
3929 |
|
goto FAILED; |
3930 |
|
} |
3931 |
|
namelen = ptr - name; |
3932 |
|
for (i = 0; i < verbcount; i++) |
3933 |
|
{ |
3934 |
|
if (namelen == verbs[i].len && |
3935 |
|
strncmp((char *)name, verbs[i].name, namelen) == 0) |
3936 |
|
{ |
3937 |
|
*code = verbs[i].op; |
3938 |
|
if (*code++ == OP_ACCEPT) cd->had_accept = TRUE; |
3939 |
|
break; |
3940 |
|
} |
3941 |
|
} |
3942 |
|
if (i < verbcount) continue; |
3943 |
|
*errorcodeptr = ERR60; |
3944 |
|
goto FAILED; |
3945 |
|
} |
3946 |
|
|
3947 |
|
/* Deal with the extended parentheses; all are introduced by '?', and the |
3948 |
|
appearance of any of them means that this is not a capturing group. */ |
3949 |
|
|
3950 |
|
else if (*ptr == '?') |
3951 |
{ |
{ |
3952 |
int i, set, unset, namelen; |
int i, set, unset, namelen; |
3953 |
int *optset; |
int *optset; |
4189 |
|
|
4190 |
/* ------------------------------------------------------------ */ |
/* ------------------------------------------------------------ */ |
4191 |
case '!': /* Negative lookahead */ |
case '!': /* Negative lookahead */ |
|
bravalue = OP_ASSERT_NOT; |
|
4192 |
ptr++; |
ptr++; |
4193 |
|
if (*ptr == ')') /* Optimize (?!) */ |
4194 |
|
{ |
4195 |
|
*code++ = OP_FAIL; |
4196 |
|
previous = NULL; |
4197 |
|
continue; |
4198 |
|
} |
4199 |
|
bravalue = OP_ASSERT_NOT; |
4200 |
break; |
break; |
4201 |
|
|
4202 |
|
|
4752 |
|
|
4753 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
4754 |
{ |
{ |
4755 |
|
if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE) |
4756 |
|
{ |
4757 |
|
*errorcodeptr = ERR20; |
4758 |
|
goto FAILED; |
4759 |
|
} |
4760 |
*lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; |
*lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; |
4761 |
code++; |
code++; |
4762 |
PUTINC(code, 0, 1 + LINK_SIZE); |
PUTINC(code, 0, 1 + LINK_SIZE); |
5252 |
*ptrptr = ptr; |
*ptrptr = ptr; |
5253 |
*firstbyteptr = firstbyte; |
*firstbyteptr = firstbyte; |
5254 |
*reqbyteptr = reqbyte; |
*reqbyteptr = reqbyte; |
5255 |
if (lengthptr != NULL) *lengthptr += length; |
if (lengthptr != NULL) |
5256 |
|
{ |
5257 |
|
if (OFLOW_MAX - *lengthptr < length) |
5258 |
|
{ |
5259 |
|
*errorcodeptr = ERR20; |
5260 |
|
return FALSE; |
5261 |
|
} |
5262 |
|
*lengthptr += length; |
5263 |
|
} |
5264 |
return TRUE; |
return TRUE; |
5265 |
} |
} |
5266 |
|
|
5788 |
cd->hwm = cworkspace; |
cd->hwm = cworkspace; |
5789 |
cd->req_varyopt = 0; |
cd->req_varyopt = 0; |
5790 |
cd->nopartial = FALSE; |
cd->nopartial = FALSE; |
5791 |
|
cd->had_accept = FALSE; |
5792 |
|
|
5793 |
/* Set up a starting, non-extracting bracket, then compile the expression. On |
/* Set up a starting, non-extracting bracket, then compile the expression. On |
5794 |
error, errorcode will be set non-zero, so we don't need to look at the result |
error, errorcode will be set non-zero, so we don't need to look at the result |
5803 |
re->top_backref = cd->top_backref; |
re->top_backref = cd->top_backref; |
5804 |
|
|
5805 |
if (cd->nopartial) re->options |= PCRE_NOPARTIAL; |
if (cd->nopartial) re->options |= PCRE_NOPARTIAL; |
5806 |
|
if (cd->had_accept) reqbyte = -1; /* Must disable after (*ACCEPT) */ |
5807 |
|
|
5808 |
/* If not reached end of pattern on success, there's an excess bracket. */ |
/* If not reached end of pattern on success, there's an excess bracket. */ |
5809 |
|
|