Skip to content

Commit 503c8a1

Browse files
committed
Refactor substr methods
1 parent b028f4d commit 503c8a1

File tree

1 file changed

+27
-31
lines changed

1 file changed

+27
-31
lines changed

src/cstring.c

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
256276
PyDoc_STRVAR(find__doc__, "");
257277
PyObject *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

275290
PyDoc_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

310306
PyDoc_STRVAR(rfind__doc__, "");

0 commit comments

Comments
 (0)