diff options
Diffstat (limited to 'Modules/_sre.c')
-rw-r--r-- | Modules/_sre.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/Modules/_sre.c b/Modules/_sre.c index 6fcd65e..22b6c73 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -20,6 +20,7 @@ * 00-06-28 fl fixed findall (0.9.1) * 00-06-29 fl fixed split, added more scanner features (0.9.2) * 00-06-30 fl tuning, fast search (0.9.3) + * 00-06-30 fl added assert (lookahead) primitives (0.9.4) * * Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved. * @@ -30,7 +31,7 @@ #ifndef SRE_RECURSIVE -char copyright[] = " SRE 0.9.3 Copyright (c) 1997-2000 by Secret Labs AB "; +char copyright[] = " SRE 0.9.4 Copyright (c) 1997-2000 by Secret Labs AB "; #include "Python.h" @@ -576,11 +577,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) pattern += pattern[0]; break; -#if 0 - case SRE_OP_CALL: - /* match subpattern, without backtracking */ + case SRE_OP_ASSERT: + /* assert subpattern */ /* args: <skip> <pattern> */ - TRACE(("%8d: subpattern\n", PTR(ptr))); + TRACE(("%8d: assert subpattern\n", PTR(ptr))); state->ptr = ptr; i = SRE_MATCH(state, pattern + 1); if (i < 0) @@ -588,9 +588,20 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) if (!i) goto failure; pattern += pattern[0]; - ptr = state->ptr; break; -#endif + + case SRE_OP_ASSERT_NOT: + /* assert not subpattern */ + /* args: <skip> <pattern> */ + TRACE(("%8d: assert not subpattern\n", PTR(ptr))); + state->ptr = ptr; + i = SRE_MATCH(state, pattern + 1); + if (i < 0) + return i; + if (i) + goto failure; + pattern += pattern[0]; + break; #if 0 case SRE_OP_MAX_REPEAT_ONE: |