| 146 |
const char *name; |
const char *name; |
| 147 |
int len; |
int len; |
| 148 |
int op; |
int op; |
| 149 |
} verbitem; |
} verbitem; |
| 150 |
|
|
| 151 |
static verbitem verbs[] = { |
static verbitem verbs[] = { |
| 152 |
{ "ACCEPT", 6, OP_ACCEPT }, |
{ "ACCEPT", 6, OP_ACCEPT }, |
| 153 |
{ "COMMIT", 6, OP_COMMIT }, |
{ "COMMIT", 6, OP_COMMIT }, |
| 154 |
{ "F", 1, OP_FAIL }, |
{ "F", 1, OP_FAIL }, |
| 155 |
{ "FAIL", 4, OP_FAIL }, |
{ "FAIL", 4, OP_FAIL }, |
| 156 |
{ "PRUNE", 5, OP_PRUNE }, |
{ "PRUNE", 5, OP_PRUNE }, |
| 157 |
{ "SKIP", 4, OP_SKIP }, |
{ "SKIP", 4, OP_SKIP }, |
| 158 |
{ "THEN", 4, OP_THEN } |
{ "THEN", 4, OP_THEN } |
| 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", |
"(*VERB) with an argument is not supported", |
| 284 |
/* 60 */ |
/* 60 */ |
| 285 |
"(*VERB) not recognized" |
"(*VERB) not recognized" |
| 286 |
}; |
}; |
| 287 |
|
|
| 288 |
|
|
| 3892 |
bravalue = OP_CBRA; |
bravalue = OP_CBRA; |
| 3893 |
save_hwm = cd->hwm; |
save_hwm = cd->hwm; |
| 3894 |
reset_bracount = FALSE; |
reset_bracount = FALSE; |
| 3895 |
|
|
| 3896 |
/* First deal with various "verbs" that can be introduced by '*'. */ |
/* First deal with various "verbs" that can be introduced by '*'. */ |
| 3897 |
|
|
| 3898 |
if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0) |
if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0) |
| 3899 |
{ |
{ |
| 3900 |
int i, namelen; |
int i, namelen; |
| 3901 |
const uschar *name = ++ptr; |
const uschar *name = ++ptr; |
| 3902 |
previous = NULL; |
previous = NULL; |
| 3903 |
while ((cd->ctypes[*++ptr] & ctype_letter) != 0); |
while ((cd->ctypes[*++ptr] & ctype_letter) != 0); |
| 3904 |
if (*ptr == ':') |
if (*ptr == ':') |
| 3905 |
{ |
{ |
| 3906 |
*errorcodeptr = ERR59; /* Not supported */ |
*errorcodeptr = ERR59; /* Not supported */ |
| 3907 |
goto FAILED; |
goto FAILED; |
| 3908 |
} |
} |
| 3909 |
if (*ptr != ')') |
if (*ptr != ')') |
| 3910 |
{ |
{ |
| 3911 |
*errorcodeptr = ERR60; |
*errorcodeptr = ERR60; |
| 3912 |
goto FAILED; |
goto FAILED; |
| 3913 |
} |
} |
| 3914 |
namelen = ptr - name; |
namelen = ptr - name; |
| 3915 |
for (i = 0; i < verbcount; i++) |
for (i = 0; i < verbcount; i++) |
| 3916 |
{ |
{ |
| 3917 |
if (namelen == verbs[i].len && |
if (namelen == verbs[i].len && |
| 3918 |
strncmp((char *)name, verbs[i].name, namelen) == 0) |
strncmp((char *)name, verbs[i].name, namelen) == 0) |
| 3919 |
{ |
{ |
| 3920 |
*code = verbs[i].op; |
*code = verbs[i].op; |
| 3921 |
if (*code++ == OP_ACCEPT) cd->had_accept = TRUE; |
if (*code++ == OP_ACCEPT) cd->had_accept = TRUE; |
| 3922 |
break; |
break; |
| 3923 |
} |
} |
| 3924 |
} |
} |
| 3925 |
if (i < verbcount) continue; |
if (i < verbcount) continue; |
| 3926 |
*errorcodeptr = ERR60; |
*errorcodeptr = ERR60; |
| 3927 |
goto FAILED; |
goto FAILED; |
| 3928 |
} |
} |
| 3929 |
|
|
| 3930 |
/* Deal with the extended parentheses; all are introduced by '?', and the |
/* Deal with the extended parentheses; all are introduced by '?', and the |
| 3931 |
appearance of any of them means that this is not a capturing group. */ |
appearance of any of them means that this is not a capturing group. */ |
| 3932 |
|
|
| 4176 |
if (*ptr == ')') /* Optimize (?!) */ |
if (*ptr == ')') /* Optimize (?!) */ |
| 4177 |
{ |
{ |
| 4178 |
*code++ = OP_FAIL; |
*code++ = OP_FAIL; |
| 4179 |
previous = NULL; |
previous = NULL; |
| 4180 |
continue; |
continue; |
| 4181 |
} |
} |
| 4182 |
bravalue = OP_ASSERT_NOT; |
bravalue = OP_ASSERT_NOT; |
| 4183 |
break; |
break; |
| 4184 |
|
|