| 249 |
|
|
| 250 |
/* These versions of the macros use the stack, as normal. There are debugging |
/* These versions of the macros use the stack, as normal. There are debugging |
| 251 |
versions and production versions. Note that the "rw" argument of RMATCH isn't |
versions and production versions. Note that the "rw" argument of RMATCH isn't |
| 252 |
actuall used in this definition. */ |
actually used in this definition. */ |
| 253 |
|
|
| 254 |
#ifndef NO_RECURSE |
#ifndef NO_RECURSE |
| 255 |
#define REGISTER register |
#define REGISTER register |
| 258 |
#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ |
#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ |
| 259 |
{ \ |
{ \ |
| 260 |
printf("match() called in line %d\n", __LINE__); \ |
printf("match() called in line %d\n", __LINE__); \ |
| 261 |
rrc = match(ra,rb,mstart,rc,rd,re,rf,rg,rdepth+1); \ |
rrc = match(ra,rb,mstart,markptr,rc,rd,re,rf,rg,rdepth+1); \ |
| 262 |
printf("to line %d\n", __LINE__); \ |
printf("to line %d\n", __LINE__); \ |
| 263 |
} |
} |
| 264 |
#define RRETURN(ra) \ |
#define RRETURN(ra) \ |
| 268 |
} |
} |
| 269 |
#else |
#else |
| 270 |
#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ |
#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ |
| 271 |
rrc = match(ra,rb,mstart,rc,rd,re,rf,rg,rdepth+1) |
rrc = match(ra,rb,mstart,markptr,rc,rd,re,rf,rg,rdepth+1) |
| 272 |
#define RRETURN(ra) return ra |
#define RRETURN(ra) return ra |
| 273 |
#endif |
#endif |
| 274 |
|
|
| 288 |
newframe->Xeptr = ra;\ |
newframe->Xeptr = ra;\ |
| 289 |
newframe->Xecode = rb;\ |
newframe->Xecode = rb;\ |
| 290 |
newframe->Xmstart = mstart;\ |
newframe->Xmstart = mstart;\ |
| 291 |
|
newframe->Xmarkptr = markptr;\ |
| 292 |
newframe->Xoffset_top = rc;\ |
newframe->Xoffset_top = rc;\ |
| 293 |
newframe->Xims = re;\ |
newframe->Xims = re;\ |
| 294 |
newframe->Xeptrb = rf;\ |
newframe->Xeptrb = rf;\ |
| 326 |
USPTR Xeptr; |
USPTR Xeptr; |
| 327 |
const uschar *Xecode; |
const uschar *Xecode; |
| 328 |
USPTR Xmstart; |
USPTR Xmstart; |
| 329 |
|
USPTR Xmarkptr; |
| 330 |
int Xoffset_top; |
int Xoffset_top; |
| 331 |
long int Xims; |
long int Xims; |
| 332 |
eptrblock *Xeptrb; |
eptrblock *Xeptrb; |
| 434 |
ecode pointer to current position in compiled code |
ecode pointer to current position in compiled code |
| 435 |
mstart pointer to the current match start position (can be modified |
mstart pointer to the current match start position (can be modified |
| 436 |
by encountering \K) |
by encountering \K) |
| 437 |
|
markptr pointer to the most recent MARK name, or NULL |
| 438 |
offset_top current top pointer |
offset_top current top pointer |
| 439 |
md pointer to "static" info for the match |
md pointer to "static" info for the match |
| 440 |
ims current /i, /m, and /s options |
ims current /i, /m, and /s options |
| 453 |
*/ |
*/ |
| 454 |
|
|
| 455 |
static int |
static int |
| 456 |
match(REGISTER USPTR eptr, REGISTER const uschar *ecode, USPTR mstart, |
match(REGISTER USPTR eptr, REGISTER const uschar *ecode, USPTR mstart, USPTR |
| 457 |
int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, |
markptr, int offset_top, match_data *md, unsigned long int ims, |
| 458 |
int flags, unsigned int rdepth) |
eptrblock *eptrb, int flags, unsigned int rdepth) |
| 459 |
{ |
{ |
| 460 |
/* These variables do not need to be preserved over recursion in this function, |
/* These variables do not need to be preserved over recursion in this function, |
| 461 |
so they can be ordinary variables in all cases. Mark some of them with |
so they can be ordinary variables in all cases. Mark some of them with |
| 483 |
frame->Xeptr = eptr; |
frame->Xeptr = eptr; |
| 484 |
frame->Xecode = ecode; |
frame->Xecode = ecode; |
| 485 |
frame->Xmstart = mstart; |
frame->Xmstart = mstart; |
| 486 |
|
frame->Xmarkptr = markptr; |
| 487 |
frame->Xoffset_top = offset_top; |
frame->Xoffset_top = offset_top; |
| 488 |
frame->Xims = ims; |
frame->Xims = ims; |
| 489 |
frame->Xeptrb = eptrb; |
frame->Xeptrb = eptrb; |
| 499 |
#define eptr frame->Xeptr |
#define eptr frame->Xeptr |
| 500 |
#define ecode frame->Xecode |
#define ecode frame->Xecode |
| 501 |
#define mstart frame->Xmstart |
#define mstart frame->Xmstart |
| 502 |
|
#define markptr frame->Xmarkptr |
| 503 |
#define offset_top frame->Xoffset_top |
#define offset_top frame->Xoffset_top |
| 504 |
#define ims frame->Xims |
#define ims frame->Xims |
| 505 |
#define eptrb frame->Xeptrb |
#define eptrb frame->Xeptrb |
| 1118 |
{ |
{ |
| 1119 |
RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0, |
RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0, |
| 1120 |
RM4); |
RM4); |
| 1121 |
if (rrc == MATCH_MATCH) |
if (rrc == MATCH_MATCH) |
| 1122 |
{ |
{ |
| 1123 |
mstart = md->start_match_ptr; /* In case \K reset it */ |
mstart = md->start_match_ptr; /* In case \K reset it */ |
| 1124 |
break; |
break; |
| 1125 |
} |
} |
| 1126 |
if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); |
| 1127 |
ecode += GET(ecode, 1); |
ecode += GET(ecode, 1); |
| 1128 |
} |
} |
| 1332 |
do |
do |
| 1333 |
{ |
{ |
| 1334 |
RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM7); |
RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM7); |
| 1335 |
if (rrc == MATCH_MATCH) |
if (rrc == MATCH_MATCH) |
| 1336 |
{ |
{ |
| 1337 |
mstart = md->start_match_ptr; |
mstart = md->start_match_ptr; |
| 1338 |
break; |
break; |
| 1339 |
} |
} |
| 1340 |
if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); |
| 1341 |
ecode += GET(ecode,1); |
ecode += GET(ecode,1); |
| 1342 |
} |
} |
| 5663 |
md->start_match_ptr = start_match; |
md->start_match_ptr = start_match; |
| 5664 |
md->start_used_ptr = start_match; |
md->start_used_ptr = start_match; |
| 5665 |
md->match_call_count = 0; |
md->match_call_count = 0; |
| 5666 |
rc = match(start_match, md->start_code, start_match, 2, md, ims, NULL, 0, 0); |
rc = match(start_match, md->start_code, start_match, NULL, 2, md, ims, NULL, |
| 5667 |
|
0, 0); |
| 5668 |
if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; |
if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; |
| 5669 |
|
|
| 5670 |
switch(rc) |
switch(rc) |