@@ -448,6 +448,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
448448 int i , count ;
449449 SRE_REPEAT * rp ;
450450 int lastmark ;
451+ SRE_CODE chr ;
451452
452453 SRE_REPEAT rep ; /* FIXME: <fl> allocate in STATE instead */
453454
@@ -525,8 +526,17 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
525526 break ;
526527
527528 case SRE_OP_ANY :
528- /* match anything */
529+ /* match anything (except a newline) */
529530 /* <ANY> */
531+ TRACE (("%8d: anything (except newline)\n" , PTR (ptr )));
532+ if (ptr >= end || SRE_IS_LINEBREAK (ptr [0 ]))
533+ return 0 ;
534+ ptr ++ ;
535+ break ;
536+
537+ case SRE_OP_ANY_ALL :
538+ /* match anything */
539+ /* <ANY_ALL> */
530540 TRACE (("%8d: anything\n" , PTR (ptr )));
531541 if (ptr >= end )
532542 return 0 ;
@@ -695,69 +705,89 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
695705 TRACE (("%8d: max repeat one {%d,%d}\n" , PTR (ptr ),
696706 pattern [1 ], pattern [2 ]));
697707
708+ if (ptr + pattern [1 ] > end )
709+ return 0 ; /* cannot match */
710+
698711 count = 0 ;
699712
700- if (pattern [3 ] == SRE_OP_ANY ) {
713+ switch (pattern [3 ]) {
714+
715+ case SRE_OP_ANY :
716+ /* repeated wildcard. */
717+ while (count < (int ) pattern [2 ]) {
718+ if (ptr >= end || SRE_IS_LINEBREAK (ptr [0 ]))
719+ break ;
720+ ptr ++ ;
721+ count ++ ;
722+ }
723+ break ;
724+
725+ case SRE_OP_ANY_ALL :
701726 /* repeated wildcard. skip to the end of the target
702727 string, and backtrack from there */
703- /* FIXME: must look for line endings */
704728 if (ptr + pattern [1 ] > end )
705729 return 0 ; /* cannot match */
706730 count = pattern [2 ];
707731 if (count > end - ptr )
708732 count = end - ptr ;
709733 ptr += count ;
734+ break ;
710735
711- } else if ( pattern [ 3 ] == SRE_OP_LITERAL ) {
736+ case SRE_OP_LITERAL :
712737 /* repeated literal */
713- SRE_CODE chr = pattern [4 ];
738+ chr = pattern [4 ];
714739 while (count < (int ) pattern [2 ]) {
715740 if (ptr >= end || (SRE_CODE ) ptr [0 ] != chr )
716741 break ;
717742 ptr ++ ;
718743 count ++ ;
719744 }
745+ break ;
720746
721- } else if ( pattern [ 3 ] == SRE_OP_LITERAL_IGNORE ) {
747+ case SRE_OP_LITERAL_IGNORE :
722748 /* repeated literal */
723- SRE_CODE chr = pattern [4 ];
749+ chr = pattern [4 ];
724750 while (count < (int ) pattern [2 ]) {
725751 if (ptr >= end || (SRE_CODE ) state -> lower (* ptr ) != chr )
726752 break ;
727753 ptr ++ ;
728754 count ++ ;
729755 }
756+ break ;
730757
731- } else if ( pattern [ 3 ] == SRE_OP_NOT_LITERAL ) {
758+ case SRE_OP_NOT_LITERAL :
732759 /* repeated non-literal */
733- SRE_CODE chr = pattern [4 ];
760+ chr = pattern [4 ];
734761 while (count < (int ) pattern [2 ]) {
735762 if (ptr >= end || (SRE_CODE ) ptr [0 ] == chr )
736763 break ;
737764 ptr ++ ;
738765 count ++ ;
739766 }
740-
741- } else if (pattern [3 ] == SRE_OP_NOT_LITERAL_IGNORE ) {
767+ break ;
768+
769+ case SRE_OP_NOT_LITERAL_IGNORE :
742770 /* repeated non-literal */
743- SRE_CODE chr = pattern [4 ];
771+ chr = pattern [4 ];
744772 while (count < (int ) pattern [2 ]) {
745773 if (ptr >= end || (SRE_CODE ) state -> lower (ptr [0 ]) == chr )
746774 break ;
747775 ptr ++ ;
748776 count ++ ;
749777 }
778+ break ;
750779
751- } else if ( pattern [ 3 ] == SRE_OP_IN ) {
780+ case SRE_OP_IN :
752781 /* repeated set */
753782 while (count < (int ) pattern [2 ]) {
754783 if (ptr >= end || !SRE_MEMBER (pattern + 5 , * ptr ))
755784 break ;
756785 ptr ++ ;
757786 count ++ ;
758787 }
788+ break ;
759789
760- } else {
790+ default :
761791 /* repeated single character pattern */
762792 state -> ptr = ptr ;
763793 while (count < (int ) pattern [2 ]) {
@@ -770,6 +800,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
770800 }
771801 state -> ptr = ptr ;
772802 ptr += count ;
803+ break ;
773804 }
774805
775806 /* when we arrive here, count contains the number of
@@ -791,7 +822,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
791822 } else if (pattern [pattern [0 ]] == SRE_OP_LITERAL ) {
792823 /* tail starts with a literal. skip positions where
793824 the rest of the pattern cannot possibly match */
794- SRE_CODE chr = pattern [pattern [0 ]+ 1 ];
825+ chr = pattern [pattern [0 ]+ 1 ];
795826 TRACE (("%8d: tail is literal %d\n" , PTR (ptr ), chr ));
796827 for (;;) {
797828 TRACE (("%8d: scan for tail match\n" , PTR (ptr )));
0 commit comments