}
LOCAL(Py_ssize_t)
-sre_match(SRE_STATE* state, SRE_CODE* pattern)
+sre_match(SRE_STATE* state, SRE_CODE* pattern, int match_all)
{
if (state->charsize == 1)
- return sre_ucs1_match(state, pattern);
+ return sre_ucs1_match(state, pattern, match_all);
if (state->charsize == 2)
- return sre_ucs2_match(state, pattern);
+ return sre_ucs2_match(state, pattern, match_all);
assert(state->charsize == 4);
- return sre_ucs4_match(state, pattern);
+ return sre_ucs4_match(state, pattern, match_all);
}
LOCAL(Py_ssize_t)
TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr));
- status = sre_match(&state, PatternObject_GetCode(self));
+ status = sre_match(&state, PatternObject_GetCode(self), 0);
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
if (PyErr_Occurred())
if (!string)
return NULL;
- state.match_all = 1;
state.ptr = state.start;
TRACE(("|%p|%p|FULLMATCH\n", PatternObject_GetCode(self), state.ptr));
- status = sre_match(&state, PatternObject_GetCode(self));
+ status = sre_match(&state, PatternObject_GetCode(self), 1);
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
if (PyErr_Occurred())
state->ptr = state->start;
- status = sre_match(state, PatternObject_GetCode(self->pattern));
+ status = sre_match(state, PatternObject_GetCode(self->pattern), 0);
if (PyErr_Occurred())
return NULL;
}
}
-LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, SRE_CODE* pattern);
+LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all);
LOCAL(Py_ssize_t)
SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
/* repeated single character pattern */
TRACE(("|%p|%p|COUNT SUBPATTERN\n", pattern, ptr));
while ((SRE_CHAR*) state->ptr < end) {
- i = SRE(match)(state, pattern);
+ i = SRE(match)(state, pattern, 0);
if (i < 0)
return i;
if (!i)
/* check if string matches the given pattern. returns <0 for
error, 0 for failure, and 1 for success */
LOCAL(Py_ssize_t)
-SRE(match)(SRE_STATE* state, SRE_CODE* pattern)
+SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
{
SRE_CHAR* end = (SRE_CHAR *)state->end;
Py_ssize_t alloc_pos, ctx_pos = -1;
ctx->last_ctx_pos = -1;
ctx->jump = JUMP_NONE;
ctx->pattern = pattern;
- ctx->match_all = state->match_all;
+ ctx->match_all = match_all;
ctx_pos = alloc_pos;
entrance:
RETURN_FAILURE;
if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS &&
- (!ctx->match_all || ctx->ptr == state->end)) {
+ ctx->ptr == state->end) {
/* tail is empty. we're finished */
state->ptr = ctx->ptr;
RETURN_SUCCESS;
}
if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS &&
- (!ctx->match_all || ctx->ptr == state->end)) {
+ (!match_all || ctx->ptr == state->end)) {
/* tail is empty. we're finished */
state->ptr = ctx->ptr;
RETURN_SUCCESS;
state->ptr = ptr - (prefix_len - prefix_skip - 1);
if (flags & SRE_INFO_LITERAL)
return 1; /* we got all of it */
- status = SRE(match)(state, pattern + 2*prefix_skip);
+ status = SRE(match)(state, pattern + 2*prefix_skip, 0);
if (status != 0)
return status;
/* close but no cigar -- try again */
state->ptr = ++ptr;
if (flags & SRE_INFO_LITERAL)
return 1; /* we got all of it */
- status = SRE(match)(state, pattern + 2);
+ status = SRE(match)(state, pattern + 2, 0);
if (status != 0)
break;
}
TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr));
state->start = ptr;
state->ptr = ptr;
- status = SRE(match)(state, pattern);
+ status = SRE(match)(state, pattern, 0);
if (status != 0)
break;
ptr++;
while (ptr <= end) {
TRACE(("|%p|%p|SEARCH\n", pattern, ptr));
state->start = state->ptr = ptr++;
- status = SRE(match)(state, pattern);
+ status = SRE(match)(state, pattern, 0);
if (status != 0)
break;
}