mirror of
				https://github.com/python/cpython.git
				synced 2025-10-28 20:25:04 +00:00 
			
		
		
		
	-- fixed width calculations for alternations
-- fixed literal check in branch operator (this broke test_tokenize, as reported by Mark Favas) -- added REPEAT_ONE operator (still not enabled, though) -- added some debugging stuff (maxlevel)
This commit is contained in:
		
							parent
							
								
									329e29198d
								
							
						
					
					
						commit
						2f2c67d7e5
					
				
					 4 changed files with 199 additions and 35 deletions
				
			
		|  | @ -270,6 +270,7 @@ def _compile_info(code, pattern, flags): | ||||||
|                     table[i+1] = table[table[i+1]-1]+1 |                     table[i+1] = table[table[i+1]-1]+1 | ||||||
|             code.extend(table[1:]) # don't store first entry |             code.extend(table[1:]) # don't store first entry | ||||||
|     elif charset: |     elif charset: | ||||||
|  |         # FIXME: use charset optimizer! | ||||||
|         for char in charset: |         for char in charset: | ||||||
|             emit(OPCODES[LITERAL]) |             emit(OPCODES[LITERAL]) | ||||||
|             emit(char) |             emit(char) | ||||||
|  | @ -283,7 +284,7 @@ def _compile_info(code, pattern, flags): | ||||||
| except NameError: | except NameError: | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
| def _compile1(p, flags): | def _code(p, flags): | ||||||
| 
 | 
 | ||||||
|     flags = p.pattern.flags | flags |     flags = p.pattern.flags | flags | ||||||
|     code = [] |     code = [] | ||||||
|  | @ -308,7 +309,7 @@ def compile(p, flags=0): | ||||||
|     else: |     else: | ||||||
|         pattern = None |         pattern = None | ||||||
| 
 | 
 | ||||||
|     code = _compile1(p, flags) |     code = _code(p, flags) | ||||||
| 
 | 
 | ||||||
|     # print code |     # print code | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -137,12 +137,12 @@ def getwidth(self): | ||||||
|         lo = hi = 0L |         lo = hi = 0L | ||||||
|         for op, av in self.data: |         for op, av in self.data: | ||||||
|             if op is BRANCH: |             if op is BRANCH: | ||||||
|                 l = sys.maxint |                 i = sys.maxint | ||||||
|                 h = 0 |                 j = 0 | ||||||
|                 for av in av[1]: |                 for av in av[1]: | ||||||
|                     i, j = av.getwidth() |                     l, h = av.getwidth() | ||||||
|                     l = min(l, i) |                     i = min(i, l) | ||||||
|                     h = min(h, j) |                     j = min(j, h) | ||||||
|                 lo = lo + i |                 lo = lo + i | ||||||
|                 hi = hi + j |                 hi = hi + j | ||||||
|             elif op is CALL: |             elif op is CALL: | ||||||
|  |  | ||||||
							
								
								
									
										217
									
								
								Modules/_sre.c
									
										
									
									
									
								
							
							
						
						
									
										217
									
								
								Modules/_sre.c
									
										
									
									
									
								
							|  | @ -219,6 +219,14 @@ mark_init(SRE_STATE* state) | ||||||
| static void | static void | ||||||
| mark_fini(SRE_STATE* state) | mark_fini(SRE_STATE* state) | ||||||
| { | { | ||||||
|  | #if 0 | ||||||
|  |     /* FIXME: debugging */ | ||||||
|  |     if (state->maxlevel > 0) | ||||||
|  |         printf("max %d\n", state->maxlevel); | ||||||
|  |     if (state->mark_stack_base > 0) | ||||||
|  |         printf("mark stack %d\n", state->mark_stack_base); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     if (state->mark_stack) |     if (state->mark_stack) | ||||||
|         free(state->mark_stack); |         free(state->mark_stack); | ||||||
|     mark_init(state); |     mark_init(state); | ||||||
|  | @ -430,7 +438,7 @@ SRE_MEMBER(SRE_CODE* set, SRE_CODE ch) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| LOCAL(int) | LOCAL(int) | ||||||
| SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) | ||||||
| { | { | ||||||
|     /* check if string matches the given pattern.  returns -1 for
 |     /* check if string matches the given pattern.  returns -1 for
 | ||||||
|        error, 0 for failure, and 1 for success */ |        error, 0 for failure, and 1 for success */ | ||||||
|  | @ -443,7 +451,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
| 
 | 
 | ||||||
|     SRE_REPEAT rep; /* FIXME: <fl> allocate in STATE instead */ |     SRE_REPEAT rep; /* FIXME: <fl> allocate in STATE instead */ | ||||||
| 
 | 
 | ||||||
|     TRACE(("%8d: enter\n", PTR(ptr))); |     TRACE(("%8d: enter %d\n", PTR(ptr), level)); | ||||||
| 
 | 
 | ||||||
|     if (pattern[0] == SRE_OP_INFO) { |     if (pattern[0] == SRE_OP_INFO) { | ||||||
|         /* optimization info block */ |         /* optimization info block */ | ||||||
|  | @ -456,6 +464,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|         pattern += pattern[1] + 1; |         pattern += pattern[1] + 1; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* FIXME: debugging */ | ||||||
|  |     if (level > state->maxlevel) | ||||||
|  |         state->maxlevel = level; | ||||||
|  | 
 | ||||||
|     for (;;) { |     for (;;) { | ||||||
| 
 | 
 | ||||||
|         switch (*pattern++) { |         switch (*pattern++) { | ||||||
|  | @ -623,7 +635,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             state->ptr = ptr - pattern[1]; |             state->ptr = ptr - pattern[1]; | ||||||
|             if (state->ptr < state->beginning) |             if (state->ptr < state->beginning) | ||||||
|                 return 0; |                 return 0; | ||||||
|             i = SRE_MATCH(state, pattern + 2); |             i = SRE_MATCH(state, pattern + 2, level + 1); | ||||||
|             if (i <= 0) |             if (i <= 0) | ||||||
|                 return i; |                 return i; | ||||||
|             if (pattern[1] > 0 && state->ptr != ptr) |             if (pattern[1] > 0 && state->ptr != ptr) | ||||||
|  | @ -638,7 +650,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             state->ptr = ptr - pattern[1]; |             state->ptr = ptr - pattern[1]; | ||||||
|             if (state->ptr < state->beginning) |             if (state->ptr < state->beginning) | ||||||
|                 return 0; |                 return 0; | ||||||
|             i = SRE_MATCH(state, pattern + 2); |             i = SRE_MATCH(state, pattern + 2, level + 1); | ||||||
|             if (i < 0) |             if (i < 0) | ||||||
|                 return i; |                 return i; | ||||||
|             if (i) |             if (i) | ||||||
|  | @ -656,10 +668,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|                 lastmark = state->lastmark; |                 lastmark = state->lastmark; | ||||||
|                 while (pattern[0]) { |                 while (pattern[0]) { | ||||||
|                     TRACE(("%8d: try branch\n", PTR(ptr))); |                     TRACE(("%8d: try branch\n", PTR(ptr))); | ||||||
|                     if (pattern[2] != SRE_OP_LITERAL || |                     if (pattern[1] != SRE_OP_LITERAL || | ||||||
|                         (ptr < end && (SRE_CODE) ptr[0] == pattern[3])) { |                         (ptr < end && (SRE_CODE) ptr[0] == pattern[2])) { | ||||||
|                         state->ptr = ptr; |                         state->ptr = ptr; | ||||||
|                         i = SRE_MATCH(state, pattern + 1); |                         i = SRE_MATCH(state, pattern + 1, level + 1); | ||||||
|                         if (i) |                         if (i) | ||||||
|                             return i; |                             return i; | ||||||
|                     } |                     } | ||||||
|  | @ -670,6 +682,155 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             } |             } | ||||||
|             return 0; |             return 0; | ||||||
| 
 | 
 | ||||||
|  |         case SRE_OP_REPEAT_ONE: | ||||||
|  |             /* match repeated sequence (maximizing regexp) */ | ||||||
|  | 
 | ||||||
|  |             /* this operator only works if the repeated item is
 | ||||||
|  |                exactly one character wide, and we're not already | ||||||
|  |                collecting backtracking points.  for other cases, | ||||||
|  |                use the MAX_REPEAT operator instead */ | ||||||
|  | 
 | ||||||
|  |             /* <REPEAT_ONE> <skip> <1=min> <2=max> item <SUCCESS> tail */ | ||||||
|  | 
 | ||||||
|  |             TRACE(("%8d: max repeat one {%d,%d}\n", PTR(ptr), | ||||||
|  |                    pattern[1], pattern[2])); | ||||||
|  | 
 | ||||||
|  |             count = 0; | ||||||
|  | 
 | ||||||
|  |             if (pattern[3] == SRE_OP_ANY) { | ||||||
|  |                 /* repeated wildcard.  skip to the end of the target
 | ||||||
|  |                    string, and backtrack from there */ | ||||||
|  |                 /* FIXME: must look for line endings */ | ||||||
|  |                 if (ptr + pattern[1] > end) | ||||||
|  |                     return 0; /* cannot match */ | ||||||
|  |                 count = pattern[2]; | ||||||
|  |                 if (count > end - ptr) | ||||||
|  |                     count = end - ptr; | ||||||
|  |                 ptr += count; | ||||||
|  | 
 | ||||||
|  |             } else if (pattern[3] == SRE_OP_LITERAL) { | ||||||
|  |                 /* repeated literal */ | ||||||
|  |                 SRE_CODE chr = pattern[4]; | ||||||
|  |                 while (count < (int) pattern[2]) { | ||||||
|  |                     if (ptr >= end || (SRE_CODE) ptr[0] != chr) | ||||||
|  |                         break; | ||||||
|  |                     ptr++; | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else if (pattern[3] == SRE_OP_LITERAL_IGNORE) { | ||||||
|  |                 /* repeated literal */ | ||||||
|  |                 SRE_CODE chr = pattern[4]; | ||||||
|  |                 while (count < (int) pattern[2]) { | ||||||
|  |                     if (ptr >= end || (SRE_CODE) state->lower(*ptr) != chr) | ||||||
|  |                         break; | ||||||
|  |                     ptr++; | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else if (pattern[3] == SRE_OP_NOT_LITERAL) { | ||||||
|  |                 /* repeated non-literal */ | ||||||
|  |                 SRE_CODE chr = pattern[4]; | ||||||
|  |                 while (count < (int) pattern[2]) { | ||||||
|  |                     if (ptr >= end || (SRE_CODE) ptr[0] == chr) | ||||||
|  |                         break; | ||||||
|  |                     ptr++; | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else if (pattern[3] == SRE_OP_NOT_LITERAL_IGNORE) { | ||||||
|  |                 /* repeated non-literal */ | ||||||
|  |                 SRE_CODE chr = pattern[4]; | ||||||
|  |                 while (count < (int) pattern[2]) { | ||||||
|  |                     if (ptr >= end || (SRE_CODE) state->lower(ptr[0]) == chr) | ||||||
|  |                         break; | ||||||
|  |                     ptr++; | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else if (pattern[3] == SRE_OP_IN) { | ||||||
|  |                 /* repeated set */ | ||||||
|  |                 while (count < (int) pattern[2]) { | ||||||
|  |                     if (ptr >= end || !SRE_MEMBER(pattern + 5, *ptr)) | ||||||
|  |                         break; | ||||||
|  |                     ptr++; | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else { | ||||||
|  |                 /* repeated single character pattern */ | ||||||
|  |                 state->ptr = ptr; | ||||||
|  |                 while (count < (int) pattern[2]) { | ||||||
|  |                     i = SRE_MATCH(state, pattern + 3, level + 1); | ||||||
|  |                     if (i < 0) | ||||||
|  |                         return i; | ||||||
|  |                     if (!i) | ||||||
|  |                         break; | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  |                 state->ptr = ptr; | ||||||
|  |                 ptr += count; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             /* when we arrive here, count contains the number of
 | ||||||
|  |                matches, and ptr points to the tail of the target | ||||||
|  |                string.  check if the rest of the pattern matches, | ||||||
|  |                and backtrack if not. */ | ||||||
|  | 
 | ||||||
|  |             TRACE(("%8d: repeat %d found\n", PTR(ptr), count)); | ||||||
|  | 
 | ||||||
|  |             if (count < (int) pattern[1]) | ||||||
|  |                 return 0; | ||||||
|  | 
 | ||||||
|  |             if (pattern[pattern[0]] == SRE_OP_SUCCESS) { | ||||||
|  |                 /* tail is empty.  we're finished */ | ||||||
|  |                 TRACE(("%8d: tail is empty\n", PTR(ptr))); | ||||||
|  |                 state->ptr = ptr; | ||||||
|  |                 return 1; | ||||||
|  | 
 | ||||||
|  |             } else if (pattern[pattern[0]] == SRE_OP_LITERAL) { | ||||||
|  |                 /* tail starts with a literal. skip positions where
 | ||||||
|  |                    the rest of the pattern cannot possibly match */ | ||||||
|  |                 SRE_CODE chr = pattern[pattern[0]+1]; | ||||||
|  |                 TRACE(("%8d: tail is literal %d\n", PTR(ptr), chr)); | ||||||
|  |                 for (;;) { | ||||||
|  |                     TRACE(("%8d: scan for tail match\n", PTR(ptr))); | ||||||
|  |                     while (count >= (int) pattern[1] && | ||||||
|  |                            (ptr >= end || *ptr != chr)) { | ||||||
|  |                         ptr--; | ||||||
|  |                         count--; | ||||||
|  |                     } | ||||||
|  |                     TRACE(("%8d: check tail\n", PTR(ptr))); | ||||||
|  |                     if (count < (int) pattern[1]) | ||||||
|  |                         break; | ||||||
|  |                     state->ptr = ptr; | ||||||
|  |                     i = SRE_MATCH(state, pattern + pattern[0], level + 1); | ||||||
|  |                     if (i > 0) { | ||||||
|  |                         TRACE(("%8d: repeat %d picked\n", PTR(ptr), count)); | ||||||
|  |                         return 1; | ||||||
|  |                     } | ||||||
|  |                     ptr--; | ||||||
|  |                     count--; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else { | ||||||
|  |                 /* general case */ | ||||||
|  |                 TRACE(("%8d: tail is pattern\n", PTR(ptr))); | ||||||
|  |                 while (count >= (int) pattern[1]) { | ||||||
|  |                     state->ptr = ptr; | ||||||
|  |                     i = SRE_MATCH(state, pattern + pattern[0], level + 1); | ||||||
|  |                     if (i < 0) | ||||||
|  |                         return i; | ||||||
|  |                     if (i) { | ||||||
|  |                         TRACE(("%8d: repeat %d picked\n", PTR(ptr), count)); | ||||||
|  |                         return 1; | ||||||
|  |                     } | ||||||
|  |                     ptr--; | ||||||
|  |                     count--; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return 0; | ||||||
|  | 
 | ||||||
|         case SRE_OP_REPEAT: |         case SRE_OP_REPEAT: | ||||||
|             /* create repeat context.  all the hard work is done
 |             /* create repeat context.  all the hard work is done
 | ||||||
|                by the UNTIL operator */ |                by the UNTIL operator */ | ||||||
|  | @ -677,8 +838,6 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             TRACE(("%8d: repeat {%d,%d}\n", PTR(ptr), |             TRACE(("%8d: repeat {%d,%d}\n", PTR(ptr), | ||||||
|                    pattern[1], pattern[2])); |                    pattern[1], pattern[2])); | ||||||
| 
 | 
 | ||||||
|             state->ptr = ptr; |  | ||||||
| 
 |  | ||||||
|             rep.count = -1; |             rep.count = -1; | ||||||
|             rep.pattern = pattern; |             rep.pattern = pattern; | ||||||
| 
 | 
 | ||||||
|  | @ -686,10 +845,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             rep.prev = state->repeat; |             rep.prev = state->repeat; | ||||||
|             state->repeat = &rep; |             state->repeat = &rep; | ||||||
| 
 | 
 | ||||||
|             i = SRE_MATCH(state, pattern + pattern[0]); |             state->ptr = ptr; | ||||||
|  |             i = SRE_MATCH(state, pattern + pattern[0], level + 1); | ||||||
| 
 | 
 | ||||||
|             state->repeat = rep.prev; |             state->repeat = rep.prev; | ||||||
|             /* free(rp); */ |  | ||||||
| 
 | 
 | ||||||
|             return i; |             return i; | ||||||
| 
 | 
 | ||||||
|  | @ -714,7 +873,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|                 /* not enough matches */ |                 /* not enough matches */ | ||||||
|                 TRACE(("%8d: match item (required)\n", PTR(ptr))); |                 TRACE(("%8d: match item (required)\n", PTR(ptr))); | ||||||
|                 rp->count = count; |                 rp->count = count; | ||||||
|                 i = SRE_MATCH(state, rp->pattern + 3); |                 i = SRE_MATCH(state, rp->pattern + 3, level + 1); | ||||||
|                 if (i) |                 if (i) | ||||||
|                     return i; |                     return i; | ||||||
|                 rp->count = count - 1; |                 rp->count = count - 1; | ||||||
|  | @ -729,7 +888,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|                 rp->count = count; |                 rp->count = count; | ||||||
|                 lastmark = state->lastmark; |                 lastmark = state->lastmark; | ||||||
|                 mark_save(state, 0, lastmark); |                 mark_save(state, 0, lastmark); | ||||||
|                 i = SRE_MATCH(state, rp->pattern + 3); |                 i = SRE_MATCH(state, rp->pattern + 3, level + 1); | ||||||
|                 if (i) |                 if (i) | ||||||
|                     return i; |                     return i; | ||||||
|                 mark_restore(state, 0, lastmark); |                 mark_restore(state, 0, lastmark); | ||||||
|  | @ -741,11 +900,9 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|                tail matches */ |                tail matches */ | ||||||
|             TRACE(("%8d: match tail\n", PTR(ptr))); |             TRACE(("%8d: match tail\n", PTR(ptr))); | ||||||
|             state->repeat = rp->prev; |             state->repeat = rp->prev; | ||||||
|             i = SRE_MATCH(state, pattern); |             i = SRE_MATCH(state, pattern, level + 1); | ||||||
|             if (i) { |             if (i) | ||||||
|                 /* free(rp); */ |  | ||||||
|                 return i; |                 return i; | ||||||
|             } |  | ||||||
|             state->repeat = rp; |             state->repeat = rp; | ||||||
|             return 0; |             return 0; | ||||||
| 
 | 
 | ||||||
|  | @ -767,7 +924,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|                 /* not enough matches */ |                 /* not enough matches */ | ||||||
|                 TRACE(("%8d: match item (required)\n", PTR(ptr))); |                 TRACE(("%8d: match item (required)\n", PTR(ptr))); | ||||||
|                 rp->count = count; |                 rp->count = count; | ||||||
|                 i = SRE_MATCH(state, rp->pattern + 3); |                 i = SRE_MATCH(state, rp->pattern + 3, level + 1); | ||||||
|                 if (i) |                 if (i) | ||||||
|                     return i; |                     return i; | ||||||
|                 rp->count = count-1; |                 rp->count = count-1; | ||||||
|  | @ -778,7 +935,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             /* see if the tail matches */ |             /* see if the tail matches */ | ||||||
|             TRACE(("%8d: match tail\n", PTR(ptr))); |             TRACE(("%8d: match tail\n", PTR(ptr))); | ||||||
|             state->repeat = rp->prev; |             state->repeat = rp->prev; | ||||||
|             i = SRE_MATCH(state, pattern); |             i = SRE_MATCH(state, pattern, level + 1); | ||||||
|             if (i) { |             if (i) { | ||||||
|                 /* free(rp); */ |                 /* free(rp); */ | ||||||
|                 return i; |                 return i; | ||||||
|  | @ -790,7 +947,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
| 
 | 
 | ||||||
|             TRACE(("%8d: match item (optional)\n", PTR(ptr))); |             TRACE(("%8d: match item (optional)\n", PTR(ptr))); | ||||||
|             rp->count = count; |             rp->count = count; | ||||||
|             i = SRE_MATCH(state, rp->pattern + 3); |             i = SRE_MATCH(state, rp->pattern + 3, level + 1); | ||||||
|             if (i) |             if (i) | ||||||
|                 return i; |                 return i; | ||||||
|             rp->count = count - 1; |             rp->count = count - 1; | ||||||
|  | @ -865,7 +1022,7 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|                         state->ptr = ptr + 1; |                         state->ptr = ptr + 1; | ||||||
|                         if (flags & SRE_INFO_LITERAL) |                         if (flags & SRE_INFO_LITERAL) | ||||||
|                             return 1; /* we got all of it */ |                             return 1; /* we got all of it */ | ||||||
|                         status = SRE_MATCH(state, pattern + 2*prefix_len); |                         status = SRE_MATCH(state, pattern + 2*prefix_len, 1); | ||||||
|                         if (status != 0) |                         if (status != 0) | ||||||
|                             return status; |                             return status; | ||||||
|                         /* close but no cigar -- try again */ |                         /* close but no cigar -- try again */ | ||||||
|  | @ -893,7 +1050,7 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             TRACE(("%8d: === SEARCH === literal\n", PTR(ptr))); |             TRACE(("%8d: === SEARCH === literal\n", PTR(ptr))); | ||||||
|             state->start = ptr; |             state->start = ptr; | ||||||
|             state->ptr = ++ptr; |             state->ptr = ++ptr; | ||||||
|             status = SRE_MATCH(state, pattern + 2); |             status = SRE_MATCH(state, pattern + 2, 1); | ||||||
|             if (status != 0) |             if (status != 0) | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  | @ -907,7 +1064,7 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|             TRACE(("%8d: === SEARCH === charset\n", PTR(ptr))); |             TRACE(("%8d: === SEARCH === charset\n", PTR(ptr))); | ||||||
|             state->start = ptr; |             state->start = ptr; | ||||||
|             state->ptr = ptr; |             state->ptr = ptr; | ||||||
|             status = SRE_MATCH(state, pattern); |             status = SRE_MATCH(state, pattern, 1); | ||||||
|             if (status != 0) |             if (status != 0) | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  | @ -916,7 +1073,7 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern) | ||||||
|         while (ptr <= end) { |         while (ptr <= end) { | ||||||
|             TRACE(("%8d: === SEARCH ===\n", PTR(ptr)));  |             TRACE(("%8d: === SEARCH ===\n", PTR(ptr)));  | ||||||
|             state->start = state->ptr = ptr++; |             state->start = state->ptr = ptr++; | ||||||
|             status = SRE_MATCH(state, pattern); |             status = SRE_MATCH(state, pattern, 1); | ||||||
|             if (status != 0) |             if (status != 0) | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  | @ -1032,6 +1189,9 @@ state_reset(SRE_STATE* state) | ||||||
| 
 | 
 | ||||||
|     state->repeat = NULL; |     state->repeat = NULL; | ||||||
| 
 | 
 | ||||||
|  |     /* FIXME: debugging */ | ||||||
|  |     state->maxlevel = 0; | ||||||
|  | 
 | ||||||
|     mark_fini(state); |     mark_fini(state); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1110,6 +1270,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, | ||||||
|         state->lower = sre_lower; |         state->lower = sre_lower; | ||||||
| 
 | 
 | ||||||
|     state->mark_stack = NULL; |     state->mark_stack = NULL; | ||||||
|  |     state->mark_stack_base = 0; | ||||||
| 
 | 
 | ||||||
|     state_reset(state); |     state_reset(state); | ||||||
| 
 | 
 | ||||||
|  | @ -1262,10 +1423,10 @@ pattern_match(PatternObject* self, PyObject* args) | ||||||
|     state.ptr = state.start; |     state.ptr = state.start; | ||||||
| 
 | 
 | ||||||
|     if (state.charsize == 1) { |     if (state.charsize == 1) { | ||||||
|         status = sre_match(&state, PatternObject_GetCode(self)); |         status = sre_match(&state, PatternObject_GetCode(self), 1); | ||||||
|     } else { |     } else { | ||||||
| #if defined(HAVE_UNICODE) | #if defined(HAVE_UNICODE) | ||||||
|         status = sre_umatch(&state, PatternObject_GetCode(self)); |         status = sre_umatch(&state, PatternObject_GetCode(self), 1); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -1941,10 +2102,10 @@ scanner_match(ScannerObject* self, PyObject* args) | ||||||
|     state->ptr = state->start; |     state->ptr = state->start; | ||||||
| 
 | 
 | ||||||
|     if (state->charsize == 1) { |     if (state->charsize == 1) { | ||||||
|         status = sre_match(state, PatternObject_GetCode(self->pattern)); |         status = sre_match(state, PatternObject_GetCode(self->pattern), 1); | ||||||
|     } else { |     } else { | ||||||
| #if defined(HAVE_UNICODE) | #if defined(HAVE_UNICODE) | ||||||
|         status = sre_umatch(state, PatternObject_GetCode(self->pattern)); |         status = sre_umatch(state, PatternObject_GetCode(self->pattern), 1); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -74,6 +74,8 @@ typedef struct { | ||||||
|     SRE_REPEAT *repeat; /* current repeat context */ |     SRE_REPEAT *repeat; /* current repeat context */ | ||||||
|     /* hooks */ |     /* hooks */ | ||||||
|     SRE_TOLOWER_HOOK lower; |     SRE_TOLOWER_HOOK lower; | ||||||
|  |     /* debugging */ | ||||||
|  |     int maxlevel; | ||||||
| } SRE_STATE; | } SRE_STATE; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Fredrik Lundh
						Fredrik Lundh