@@ -253,23 +253,38 @@ static PyObject *cstring_count(PyObject *self, PyObject *args) {
253253 return PyLong_FromLong (result );
254254}
255255
256+ static const char * _substr_params_str (const struct _substr_params * params ) {
257+ const char * p = strstr (params -> start , params -> substr );
258+ if (!p || p + params -> substr_len > params -> end )
259+ return NULL ;
260+ return p ;
261+ }
262+
263+ static const char * _substr_params_rstr (const struct _substr_params * params ) {
264+ const char * p = params -> end - params -> substr_len + 1 ;
265+ for (;;) {
266+ p = memrchr (params -> start , * params -> substr , p - params -> start );
267+ if (!p )
268+ goto done ;
269+ if (memcmp (p , params -> substr , params -> substr_len ) == 0 )
270+ return p ;
271+ }
272+ done :
273+ return NULL ;
274+ }
275+
256276PyDoc_STRVAR (find__doc__ , "" );
257277PyObject * cstring_find (PyObject * self , PyObject * args ) {
258278 struct _substr_params params ;
259279
260280 if (!_parse_substr_args (self , args , & params ))
261281 return NULL ;
262282
263- char * p = strstr ( params . start , params . substr );
283+ const char * p = _substr_params_str ( & params );
264284 if (!p )
265- goto err ;
266- if (p + params .substr_len > params .end )
267- goto err ;
285+ return PyLong_FromLong (-1 );
268286
269287 return PyLong_FromSsize_t (p - CSTRING_VALUE (self ));
270-
271- err :
272- return PyLong_FromLong (-1 );
273288}
274289
275290PyDoc_STRVAR (index__doc__ , "" );
@@ -279,32 +294,13 @@ PyObject *cstring_index(PyObject *self, PyObject *args) {
279294 if (!_parse_substr_args (self , args , & params ))
280295 return NULL ;
281296
282- char * p = strstr (params .start , params .substr );
283- if (!p )
284- goto err ;
285- if (p + params .substr_len > params .end )
286- goto err ;
287-
288- return PyLong_FromSsize_t (p - CSTRING_VALUE (self ));
289-
290- err :
291- PyErr_SetString (PyExc_ValueError , "substring not found" );
292- return NULL ;
293- }
294-
295- static const char * _substr_params_rstr (struct _substr_params * params ) {
296- const char * p = params -> end - params -> substr_len + 1 ;
297-
298- for (;;) {
299- p = memrchr (params -> start , * params -> substr , p - params -> start );
300- if (!p )
301- goto done ;
302- if (memcmp (p , params -> substr , params -> substr_len ) == 0 )
303- return p ;
297+ const char * p = _substr_params_str (& params );
298+ if (!p ) {
299+ PyErr_SetString (PyExc_ValueError , "substring not found" );
300+ return NULL ;
304301 }
305302
306- done :
307- return NULL ;
303+ return PyLong_FromSsize_t (p - CSTRING_VALUE (self ));
308304}
309305
310306PyDoc_STRVAR (rfind__doc__ , "" );
0 commit comments