=== modified file Modules/_sre.c --- Modules/_sre.c 2008-09-26 17:00:31 +0000 +++ Modules/_sre.c 2008-09-30 00:34:20 +0000 @@ -631,6 +631,7 @@ backtrack_item = &context->backtrack_chunk->items[context->backtrack_chunk->count++]; backtrack_item->op = op; backtrack_item->pattern_ptr = pattern_ptr; + backtrack_item->text_start = context->text_start; backtrack_item->text_ptr = context->text_ptr; backtrack_item->index = index; backtrack_item->repeat_counter = context->repeat_counter[index]; @@ -922,6 +923,7 @@ result = SRE_SAVE_MARKS(&context); if (result != 0) return SRE_CLEANUP(&context, state, result); + context.text_start = state->beginning; context.pattern_ptr++; break; case SRE_OP_ASSERT_NOT: @@ -934,6 +936,7 @@ result = SRE_SAVE_MARKS(&context); if (result != 0) return SRE_CLEANUP(&context, state, result); + context.text_start = state->beginning; context.pattern_ptr++; break; case SRE_OP_ATOMIC: @@ -1062,6 +1065,7 @@ TRACE(("|%p|%p|END_ASSERT\n", context.pattern_ptr, context.text_ptr)); SRE_DISCARD_UNTIL_OP(&context, SRE_OP_ASSERT); backtrack_item = &context.backtrack_chunk->items[context.backtrack_chunk->count - 1]; + context.text_start = backtrack_item->text_start; context.text_ptr = backtrack_item->text_ptr; SRE_DISCARD_BACKTRACK(&context); SRE_RESTORE_MARKS(&context); @@ -1071,8 +1075,11 @@ { // Assert not subpattern. // ... + SRE_BACKTRACK_ITEM* backtrack_item; TRACE(("|%p|%p|END_ASSERT_NOT\n", context.pattern_ptr, context.text_ptr)); SRE_DISCARD_UNTIL_OP(&context, SRE_OP_ASSERT_NOT); + backtrack_item = &context.backtrack_chunk->items[context.backtrack_chunk->count - 1]; + context.text_start = backtrack_item->text_start; SRE_DISCARD_BACKTRACK(&context); SRE_RESTORE_MARKS(&context); goto backtrack; @@ -4356,12 +4363,16 @@ TRACE(("|%p|%p|BACKTRACK ", context.pattern_ptr, context.text_ptr)); switch(context.backtrack_chunk->items[context.backtrack_chunk->count - 1].op) { case SRE_OP_ASSERT: + { // Assert subpattern. // ... + SRE_BACKTRACK_ITEM* backtrack_item = &context.backtrack_chunk->items[context.backtrack_chunk->count - 1]; TRACE(("ASSERT\n")); + context.text_start = backtrack_item->text_start; SRE_RESTORE_MARKS(&context); SRE_DISCARD_BACKTRACK(&context); goto backtrack; + } case SRE_OP_ASSERT_NOT: { // Assert not subpattern. @@ -4369,6 +4380,7 @@ SRE_BACKTRACK_ITEM* backtrack_item = &context.backtrack_chunk->items[context.backtrack_chunk->count - 1]; TRACE(("ASSERT_NOT\n")); context.pattern_ptr = backtrack_item->pattern_ptr; + context.text_start = backtrack_item->text_start; context.text_ptr = backtrack_item->text_ptr; SRE_RESTORE_MARKS(&context); SRE_DISCARD_BACKTRACK(&context); @@ -5121,19 +5133,21 @@ if (look_literal != NULL) look_ahead = look_literal; - context.text_start = (SRE_CHAR *)state->beginning; + context.text_beginning = (SRE_CHAR *)state->beginning; + context.text_start = (SRE_CHAR *)state->start; context.text_end = (SRE_CHAR *)state->end; context.text_ptr = (SRE_CHAR *)state->start; while (context.text_ptr <= context.text_end) { TRACE(("|%p|%p|SEARCH\n", pattern, context.text_ptr)); if (SRE_LOOK_AHEAD_ONE(&context, state, look_ahead)) { - state->start = state->ptr = context.text_ptr; + state->start = state->ptr = context.text_ptr++; status = SRE_MATCH(state, state->pattern_code); if (status != 0) break; } - context.text_ptr++; + else + context.text_ptr++; } return status; === modified file Modules/sre.h --- Modules/sre.h 2008-09-25 18:21:17 +0000 +++ Modules/sre.h 2008-09-30 00:30:31 +0000 @@ -69,6 +69,7 @@ typedef struct SRE_BACKTRACK_ITEM { int op; SRE_CODE* pattern_ptr; + void* text_start; void* text_ptr; int index; int repeat_counter;