|
|
|
@ -101,7 +101,7 @@ SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at) |
|
|
|
} |
|
|
|
|
|
|
|
LOCAL(int) |
|
|
|
SRE(charset)(SRE_CODE* set, SRE_CODE ch) |
|
|
|
SRE(charset)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) |
|
|
|
{ |
|
|
|
/* check if character is a member of the given set */ |
|
|
|
|
|
|
|
@ -142,6 +142,20 @@ SRE(charset)(SRE_CODE* set, SRE_CODE ch) |
|
|
|
set += 2; |
|
|
|
break; |
|
|
|
|
|
|
|
case SRE_OP_RANGE_IGNORE: |
|
|
|
/* <RANGE_IGNORE> <lower> <upper> */ |
|
|
|
{ |
|
|
|
SRE_CODE uch; |
|
|
|
/* ch is already lower cased */ |
|
|
|
if (set[0] <= ch && ch <= set[1]) |
|
|
|
return ok; |
|
|
|
uch = state->upper(ch); |
|
|
|
if (set[0] <= uch && uch <= set[1]) |
|
|
|
return ok; |
|
|
|
set += 2; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case SRE_OP_NEGATE: |
|
|
|
ok = !ok; |
|
|
|
break; |
|
|
|
@ -193,7 +207,7 @@ SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) |
|
|
|
case SRE_OP_IN: |
|
|
|
/* repeated set */ |
|
|
|
TRACE(("|%p|%p|COUNT IN\n", pattern, ptr)); |
|
|
|
while (ptr < end && SRE(charset)(pattern + 2, *ptr)) |
|
|
|
while (ptr < end && SRE(charset)(state, pattern + 2, *ptr)) |
|
|
|
ptr++; |
|
|
|
break; |
|
|
|
|
|
|
|
@ -628,7 +642,8 @@ entrance: |
|
|
|
/* match set member (or non_member) */ |
|
|
|
/* <IN> <skip> <set> */ |
|
|
|
TRACE(("|%p|%p|IN\n", ctx->pattern, ctx->ptr)); |
|
|
|
if (ctx->ptr >= end || !SRE(charset)(ctx->pattern + 1, *ctx->ptr)) |
|
|
|
if (ctx->ptr >= end || |
|
|
|
!SRE(charset)(state, ctx->pattern + 1, *ctx->ptr)) |
|
|
|
RETURN_FAILURE; |
|
|
|
ctx->pattern += ctx->pattern[0]; |
|
|
|
ctx->ptr++; |
|
|
|
@ -657,7 +672,7 @@ entrance: |
|
|
|
case SRE_OP_IN_IGNORE: |
|
|
|
TRACE(("|%p|%p|IN_IGNORE\n", ctx->pattern, ctx->ptr)); |
|
|
|
if (ctx->ptr >= end |
|
|
|
|| !SRE(charset)(ctx->pattern+1, |
|
|
|
|| !SRE(charset)(state, ctx->pattern+1, |
|
|
|
(SRE_CODE)state->lower(*ctx->ptr))) |
|
|
|
RETURN_FAILURE; |
|
|
|
ctx->pattern += ctx->pattern[0]; |
|
|
|
@ -688,7 +703,8 @@ entrance: |
|
|
|
continue; |
|
|
|
if (ctx->pattern[1] == SRE_OP_IN && |
|
|
|
(ctx->ptr >= end || |
|
|
|
!SRE(charset)(ctx->pattern + 3, (SRE_CODE) *ctx->ptr))) |
|
|
|
!SRE(charset)(state, ctx->pattern + 3, |
|
|
|
(SRE_CODE) *ctx->ptr))) |
|
|
|
continue; |
|
|
|
state->ptr = ctx->ptr; |
|
|
|
DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1); |
|
|
|
@ -1310,7 +1326,7 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern) |
|
|
|
/* pattern starts with a character from a known set */ |
|
|
|
end = (SRE_CHAR *)state->end; |
|
|
|
for (;;) { |
|
|
|
while (ptr < end && !SRE(charset)(charset, *ptr)) |
|
|
|
while (ptr < end && !SRE(charset)(state, charset, *ptr)) |
|
|
|
ptr++; |
|
|
|
if (ptr >= end) |
|
|
|
return 0; |
|
|
|
|