@@ -406,6 +406,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
406406 int stackbase ;
407407 int lastmark ;
408408 int i , count ;
409+ SRE_STACK * sp ;
409410
410411 /* FIXME: this is a hack! */
411412 void * mark_copy [SRE_MARK_SIZE ];
@@ -571,8 +572,8 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
571572 /* set mark */
572573 /* args: <mark> */
573574 TRACE (("%8d: set mark %d\n" , PTR (ptr ), pattern [0 ]));
574- if (state -> lastmark < pattern [0 ])
575- state -> lastmark = pattern [0 ];
575+ if (state -> lastmark < pattern [0 ]+ 1 )
576+ state -> lastmark = pattern [0 ]+ 1 ;
576577 if (!mark ) {
577578 mark = mark_copy ;
578579 memcpy (mark , state -> mark , state -> lastmark * sizeof (void * ));
@@ -780,10 +781,8 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
780781#endif
781782
782783 case SRE_OP_MAX_REPEAT :
783- /* match repeated sequence (maximizing regexp). repeated
784- group should end with a MAX_UNTIL code */
785-
786- /* args: <skip> <min> <max> <item> */
784+ /* match repeated sequence (maximizing regexp) */
785+ /* args: <skip> <1=min> <2=max> <3=save> <4=item> */
787786
788787 TRACE (("%8d: max repeat (%d %d)\n" , PTR (ptr ),
789788 pattern [1 ], pattern [2 ]));
@@ -793,7 +792,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
793792
794793 /* match minimum number of items */
795794 while (count < (int ) pattern [1 ]) {
796- i = SRE_MATCH (state , pattern + 3 );
795+ i = SRE_MATCH (state , pattern + 4 );
797796 if (i < 0 )
798797 return i ;
799798 if (!i )
@@ -817,8 +816,13 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
817816 points to the stack */
818817
819818 while (pattern [2 ] == 65535 || count < (int ) pattern [2 ]) {
819+ void * mark0 , * mark1 ;
820+ if (pattern [3 ] != 65535 ) {
821+ mark0 = state -> mark [pattern [3 ]];
822+ mark1 = state -> mark [pattern [3 ]+ 1 ];
823+ }
820824 state -> stackbase = stack ;
821- i = SRE_MATCH (state , pattern + 3 );
825+ i = SRE_MATCH (state , pattern + 4 );
822826 state -> stackbase = stackbase ; /* rewind */
823827 if (i < 0 )
824828 return i ;
@@ -837,8 +841,14 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
837841 return i ; /* out of memory */
838842 }
839843 TRACE (("%8d: stack[%d] = %d\n" , PTR (ptr ), stack , PTR (ptr )));
840- state -> stack [stack ].ptr = ptr ;
841- state -> stack [stack ].pattern = pattern + pattern [0 ];
844+ sp = state -> stack + stack ;
845+ sp -> ptr = ptr ;
846+ sp -> pattern = pattern + pattern [0 ];
847+ sp -> mark = pattern [3 ];
848+ if (pattern [3 ] != 65535 ) {
849+ sp -> mark0 = mark0 ;
850+ sp -> mark1 = mark1 ;
851+ }
842852 stack ++ ;
843853 /* move forward */
844854 ptr = state -> ptr ;
@@ -855,13 +865,15 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
855865
856866 case SRE_OP_MIN_REPEAT :
857867 /* match repeated sequence (minimizing regexp) */
868+ /* args: <skip> <1=min> <2=max> <3=save> <4=item> */
869+
858870 TRACE (("%8d: min repeat %d %d\n" , PTR (ptr ),
859871 pattern [1 ], pattern [2 ]));
860872 count = 0 ;
861873 state -> ptr = ptr ;
862874 /* match minimum number of items */
863875 while (count < (int ) pattern [1 ]) {
864- i = SRE_MATCH (state , pattern + 3 );
876+ i = SRE_MATCH (state , pattern + 4 );
865877 if (i < 0 )
866878 return i ;
867879 if (!i )
@@ -877,7 +889,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
877889 goto success ;
878890 }
879891 state -> ptr = ptr ; /* backtrack */
880- i = SRE_MATCH (state , pattern + 3 );
892+ i = SRE_MATCH (state , pattern + 4 );
881893 if (i < 0 )
882894 return i ;
883895 if (!i )
@@ -940,15 +952,20 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
940952 }
941953
942954 failure :
955+ TRACE (("%8d: leave (failure)\n" , PTR (ptr )));
943956 if (stack -- > stackbase ) {
944- ptr = state -> stack [stack ].ptr ;
945- pattern = state -> stack [stack ].pattern ;
957+ sp = state -> stack + stack ;
958+ ptr = sp -> ptr ;
959+ pattern = sp -> pattern ;
960+ if (sp -> mark != 65535 ) {
961+ state -> mark [sp -> mark ] = sp -> mark0 ;
962+ state -> mark [sp -> mark + 1 ] = sp -> mark1 ;
963+ }
946964 TRACE (("%8d: retry (%d)\n" , PTR (ptr ), stack ));
947965 goto retry ;
948966 }
949- TRACE (("%8d: leave (failure)\n" , PTR (ptr )));
950- state -> stackbase = stackbase ;
951967 state -> lastmark = lastmark ;
968+ state -> stackbase = stackbase ;
952969 if (mark )
953970 memcpy (state -> mark , mark , state -> lastmark * sizeof (void * ));
954971 return 0 ;
0 commit comments