[Python-checkins] CVS: python/dist/src/Modules _sre.c,2.23,2.24 sre.h,2.13,2.14

Fredrik Lundh python-dev@python.org
Mon, 3 Jul 2000 14:31:51 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory slayer.i.sourceforge.net:/tmp/cvs-serv28299/Modules
Modified Files:
	_sre.c sre.h 
Log Message:
- fixed grouping error bug
- changed "group" operator to "groupref"
Index: _sre.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_sre.c,v
retrieving revision 2.23
retrieving revision 2.24
diff -C2 -r2.23 -r2.24
*** _sre.c	2000年07月03日 18:44:21	2.23
--- _sre.c	2000年07月03日 21:31:48	2.24
***************
*** 407,410 ****
--- 407,411 ----
 int lastmark;
 	int i, count;
+ SRE_STACK* sp;
 
 /* FIXME: this is a hack! */
***************
*** 572,577 ****
 			/* args: <mark> */
 			TRACE(("%8d: set mark %d\n", PTR(ptr), pattern[0]));
! if (state->lastmark < pattern[0])
! state->lastmark = pattern[0];
 if (!mark) {
 mark = mark_copy;
--- 573,578 ----
 			/* args: <mark> */
 			TRACE(("%8d: set mark %d\n", PTR(ptr), pattern[0]));
! if (state->lastmark < pattern[0]+1)
! state->lastmark = pattern[0]+1;
 if (!mark) {
 mark = mark_copy;
***************
*** 781,788 ****
 
 		case SRE_OP_MAX_REPEAT:
! 			/* match repeated sequence (maximizing regexp).	 repeated
! 			 group should end with a MAX_UNTIL code */
! 
! /* args: <skip> <min> <max> <item> */
 
 			TRACE(("%8d: max repeat (%d %d)\n", PTR(ptr),
--- 782,787 ----
 
 		case SRE_OP_MAX_REPEAT:
! 			/* match repeated sequence (maximizing regexp) */
! /* args: <skip> <1=min> <2=max> <3=save> <4=item> */
 
 			TRACE(("%8d: max repeat (%d %d)\n", PTR(ptr),
***************
*** 794,798 ****
 /* match minimum number of items */
 while (count < (int) pattern[1]) {
! i = SRE_MATCH(state, pattern + 3);
 if (i < 0)
 return i;
--- 793,797 ----
 /* match minimum number of items */
 while (count < (int) pattern[1]) {
! i = SRE_MATCH(state, pattern + 4);
 if (i < 0)
 return i;
***************
*** 818,823 ****
 
 while (pattern[2] == 65535 || count < (int) pattern[2]) {
 				state->stackbase = stack;
! 				i = SRE_MATCH(state, pattern + 3);
 				state->stackbase = stackbase; /* rewind */
 if (i < 0)
--- 817,827 ----
 
 while (pattern[2] == 65535 || count < (int) pattern[2]) {
+ void *mark0, *mark1;
+ if (pattern[3] != 65535) {
+ mark0 = state->mark[pattern[3]];
+ mark1 = state->mark[pattern[3]+1];
+ }
 				state->stackbase = stack;
! 				i = SRE_MATCH(state, pattern + 4);
 				state->stackbase = stackbase; /* rewind */
 if (i < 0)
***************
*** 838,843 ****
 				}
 TRACE(("%8d: stack[%d] = %d\n", PTR(ptr), stack, PTR(ptr)));
! 				state->stack[stack].ptr = ptr;
! 				state->stack[stack].pattern = pattern + pattern[0];
 stack++;
 				/* move forward */
--- 842,853 ----
 				}
 TRACE(("%8d: stack[%d] = %d\n", PTR(ptr), stack, PTR(ptr)));
! sp = state->stack + stack;
! 				sp->ptr = ptr;
! 				sp->pattern = pattern + pattern[0];
! sp->mark = pattern[3];
! if (pattern[3] != 65535) {
! sp->mark0 = mark0;
! sp->mark1 = mark1;
! }
 stack++;
 				/* move forward */
***************
*** 856,859 ****
--- 866,871 ----
 		case SRE_OP_MIN_REPEAT:
 			/* match repeated sequence (minimizing regexp) */
+ /* args: <skip> <1=min> <2=max> <3=save> <4=item> */
+ 
 			TRACE(("%8d: min repeat %d %d\n", PTR(ptr),
 				 pattern[1], pattern[2]));
***************
*** 862,866 ****
 			/* match minimum number of items */
 			while (count < (int) pattern[1]) {
! 				i = SRE_MATCH(state, pattern + 3);
 				if (i < 0)
 return i;
--- 874,878 ----
 			/* match minimum number of items */
 			while (count < (int) pattern[1]) {
! 				i = SRE_MATCH(state, pattern + 4);
 				if (i < 0)
 return i;
***************
*** 878,882 ****
 				}
 				state->ptr = ptr; /* backtrack */
! 				i = SRE_MATCH(state, pattern + 3);
 if (i < 0)
 return i;
--- 890,894 ----
 				}
 				state->ptr = ptr; /* backtrack */
! 				i = SRE_MATCH(state, pattern + 4);
 if (i < 0)
 return i;
***************
*** 941,953 ****
 
 failure:
 if (stack-- > stackbase) {
! ptr = state->stack[stack].ptr;
! pattern = state->stack[stack].pattern;
 TRACE(("%8d: retry (%d)\n", PTR(ptr), stack));
 goto retry;
 }
- TRACE(("%8d: leave (failure)\n", PTR(ptr)));
- state->stackbase = stackbase;
 state->lastmark = lastmark;
 if (mark)
 memcpy(state->mark, mark, state->lastmark*sizeof(void*));
--- 953,970 ----
 
 failure:
+ TRACE(("%8d: leave (failure)\n", PTR(ptr)));
 if (stack-- > stackbase) {
! sp = state->stack + stack;
! ptr = sp->ptr;
! pattern = sp->pattern;
! if (sp->mark != 65535) {
! state->mark[sp->mark] = sp->mark0;
! state->mark[sp->mark+1] = sp->mark1;
! }
 TRACE(("%8d: retry (%d)\n", PTR(ptr), stack));
 goto retry;
 }
 state->lastmark = lastmark;
+ state->stackbase = stackbase;
 if (mark)
 memcpy(state->mark, mark, state->lastmark*sizeof(void*));
Index: sre.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/sre.h,v
retrieving revision 2.13
retrieving revision 2.14
diff -C2 -r2.13 -r2.14
*** sre.h	2000年07月03日 18:44:21	2.13
--- sre.h	2000年07月03日 21:31:48	2.14
***************
*** 47,50 ****
--- 47,53 ----
 SRE_CODE* pattern;
 void* ptr;
+ int mark;
+ void* mark0;
+ void* mark1;
 } SRE_STACK;
 

AltStyle によって変換されたページ (->オリジナル) /