2121 * 00-06-29 fl fixed split, added more scanner features (0.9.2)
2222 * 00-06-30 fl added fast search optimization (0.9.3)
2323 * 00-06-30 fl added assert (lookahead) primitives, etc (0.9.4)
24+ * 00-07-02 fl added charset optimizations, etc (0.9.5)
2425 *
2526 * Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved.
2627 *
3132
3233#ifndef SRE_RECURSIVE
3334
34- char copyright [] = " SRE 0.9.4 Copyright (c) 1997-2000 by Secret Labs AB " ;
35+ char copyright [] = " SRE 0.9.5 Copyright (c) 1997-2000 by Secret Labs AB " ;
3536
3637#include "Python.h"
3738
@@ -587,6 +588,14 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
587588 pattern ++ ;
588589 break ;
589590
591+ case SRE_OP_INDEX :
592+ /* set index */
593+ /* args: <index> */
594+ TRACE (("%8d: set index %d\n" , PTR (ptr ), pattern [0 ]));
595+ state -> index = pattern [0 ];
596+ pattern ++ ;
597+ break ;
598+
590599 case SRE_OP_JUMP :
591600 case SRE_OP_INFO :
592601 /* jump forward */
@@ -810,7 +819,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
810819 /* match maximum number of items, pushing alternate end
811820 points to the stack */
812821
813- while (pattern [2 ] == 32767 || count < (int ) pattern [2 ]) {
822+ while (pattern [2 ] == 65535 || count < (int ) pattern [2 ]) {
814823 state -> stackbase = stack ;
815824 i = SRE_MATCH (state , pattern + 3 );
816825 state -> stackbase = stackbase ; /* rewind */
@@ -980,10 +989,12 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
980989 }
981990
982991 if (flags & SRE_INFO_PREFIX ) {
992+ /* pattern starts with a known prefix */
983993 prefix_len = pattern [5 ];
984994 prefix = pattern + 6 ;
985995 overlap = prefix + prefix_len - 1 ;
986996 } else if (flags & SRE_INFO_CHARSET )
997+ /* pattern starts with a character from a known set */
987998 charset = pattern + 5 ;
988999
9891000 pattern += 1 + pattern [1 ];
@@ -1042,7 +1053,6 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
10421053 if (status != 0 )
10431054 break ;
10441055 }
1045- #if 0
10461056 } else if (charset ) {
10471057 /* pattern starts with a character from a known set */
10481058 for (;;) {
@@ -1057,7 +1067,6 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
10571067 if (status != 0 )
10581068 break ;
10591069 }
1060- #endif
10611070 } else
10621071 /* general case */
10631072 while (ptr <= end ) {
@@ -1204,6 +1213,8 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* args)
12041213 for (i = 0 ; i < SRE_MARK_SIZE ; i ++ )
12051214 state -> mark [i ] = NULL ;
12061215
1216+ state -> index = -1 ;
1217+
12071218 state -> stack = NULL ;
12081219 state -> stackbase = 0 ;
12091220 state -> stacksize = 0 ;
@@ -1286,6 +1297,8 @@ pattern_new_match(PatternObject* pattern, SRE_STATE* state,
12861297 } else
12871298 match -> mark [j + 2 ] = match -> mark [j + 3 ] = -1 ; /* undefined */
12881299
1300+ match -> index = state -> index ;
1301+
12891302 return (PyObject * ) match ;
12901303
12911304 } else if (status < 0 ) {
@@ -1887,6 +1900,15 @@ match_getattr(MatchObject* self, char* name)
18871900 if (!strcmp (name , "endpos" ))
18881901 return Py_BuildValue ("i" , 0 ); /* FIXME */
18891902
1903+ if (!strcmp (name , "index" )) {
1904+ /* experimental */
1905+ if (self -> index < 0 ) {
1906+ Py_INCREF (Py_None );
1907+ return Py_None ;
1908+ } else
1909+ return Py_BuildValue ("i" , self -> index );
1910+ }
1911+
18901912 PyErr_SetString (PyExc_AttributeError , name );
18911913 return NULL ;
18921914}
0 commit comments