@@ -100,6 +100,14 @@ SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
100100 return 0 ;
101101}
102102
103+ LOCAL (int )
104+ SRE (char_loc_ignore )(SRE_STATE * state , SRE_CODE pattern , SRE_CODE ch )
105+ {
106+ return ch == pattern
107+ || (SRE_CODE ) state -> lower (ch ) == pattern
108+ || (SRE_CODE ) state -> upper (ch ) == pattern ;
109+ }
110+
103111LOCAL (int )
104112SRE (charset )(SRE_STATE * state , SRE_CODE * set , SRE_CODE ch )
105113{
@@ -187,6 +195,18 @@ SRE(charset)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch)
187195 }
188196}
189197
198+ LOCAL (int )
199+ SRE (charset_loc_ignore )(SRE_STATE * state , SRE_CODE * set , SRE_CODE ch )
200+ {
201+ SRE_CODE lo , up ;
202+ lo = state -> lower (ch );
203+ if (SRE (charset )(state , set , lo ))
204+ return 1 ;
205+
206+ up = state -> upper (ch );
207+ return up != lo && SRE (charset )(state , set , up );
208+ }
209+
190210LOCAL (Py_ssize_t ) SRE (match )(SRE_STATE * state , SRE_CODE * pattern , int match_all );
191211
192212LOCAL (Py_ssize_t )
@@ -247,6 +267,14 @@ SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
247267 ptr ++ ;
248268 break ;
249269
270+ case SRE_OP_LITERAL_LOC_IGNORE :
271+ /* repeated literal */
272+ chr = pattern [1 ];
273+ TRACE (("|%p|%p|COUNT LITERAL_LOC_IGNORE %d\n" , pattern , ptr , chr ));
274+ while (ptr < end && SRE (char_loc_ignore )(state , chr , * ptr ))
275+ ptr ++ ;
276+ break ;
277+
250278 case SRE_OP_NOT_LITERAL :
251279 /* repeated non-literal */
252280 chr = pattern [1 ];
@@ -269,6 +297,14 @@ SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
269297 ptr ++ ;
270298 break ;
271299
300+ case SRE_OP_NOT_LITERAL_LOC_IGNORE :
301+ /* repeated non-literal */
302+ chr = pattern [1 ];
303+ TRACE (("|%p|%p|COUNT NOT_LITERAL_LOC_IGNORE %d\n" , pattern , ptr , chr ));
304+ while (ptr < end && !SRE (char_loc_ignore )(state , chr , * ptr ))
305+ ptr ++ ;
306+ break ;
307+
272308 default :
273309 /* repeated single character pattern */
274310 TRACE (("|%p|%p|COUNT SUBPATTERN\n" , pattern , ptr ));
@@ -651,7 +687,17 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
651687 TRACE (("|%p|%p|LITERAL_IGNORE %d\n" ,
652688 ctx -> pattern , ctx -> ptr , ctx -> pattern [0 ]));
653689 if (ctx -> ptr >= end ||
654- state -> lower (* ctx -> ptr ) != state -> lower (* ctx -> pattern ))
690+ state -> lower (* ctx -> ptr ) != * ctx -> pattern )
691+ RETURN_FAILURE ;
692+ ctx -> pattern ++ ;
693+ ctx -> ptr ++ ;
694+ break ;
695+
696+ case SRE_OP_LITERAL_LOC_IGNORE :
697+ TRACE (("|%p|%p|LITERAL_LOC_IGNORE %d\n" ,
698+ ctx -> pattern , ctx -> ptr , ctx -> pattern [0 ]));
699+ if (ctx -> ptr >= end
700+ || !SRE (char_loc_ignore )(state , * ctx -> pattern , * ctx -> ptr ))
655701 RETURN_FAILURE ;
656702 ctx -> pattern ++ ;
657703 ctx -> ptr ++ ;
@@ -661,7 +707,17 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
661707 TRACE (("|%p|%p|NOT_LITERAL_IGNORE %d\n" ,
662708 ctx -> pattern , ctx -> ptr , * ctx -> pattern ));
663709 if (ctx -> ptr >= end ||
664- state -> lower (* ctx -> ptr ) == state -> lower (* ctx -> pattern ))
710+ state -> lower (* ctx -> ptr ) == * ctx -> pattern )
711+ RETURN_FAILURE ;
712+ ctx -> pattern ++ ;
713+ ctx -> ptr ++ ;
714+ break ;
715+
716+ case SRE_OP_NOT_LITERAL_LOC_IGNORE :
717+ TRACE (("|%p|%p|NOT_LITERAL_LOC_IGNORE %d\n" ,
718+ ctx -> pattern , ctx -> ptr , * ctx -> pattern ));
719+ if (ctx -> ptr >= end
720+ || SRE (char_loc_ignore )(state , * ctx -> pattern , * ctx -> ptr ))
665721 RETURN_FAILURE ;
666722 ctx -> pattern ++ ;
667723 ctx -> ptr ++ ;
@@ -677,6 +733,15 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
677733 ctx -> ptr ++ ;
678734 break ;
679735
736+ case SRE_OP_IN_LOC_IGNORE :
737+ TRACE (("|%p|%p|IN_LOC_IGNORE\n" , ctx -> pattern , ctx -> ptr ));
738+ if (ctx -> ptr >= end
739+ || !SRE (charset_loc_ignore )(state , ctx -> pattern + 1 , * ctx -> ptr ))
740+ RETURN_FAILURE ;
741+ ctx -> pattern += ctx -> pattern [0 ];
742+ ctx -> ptr ++ ;
743+ break ;
744+
680745 case SRE_OP_JUMP :
681746 case SRE_OP_INFO :
682747 /* jump forward */
0 commit comments