Commit 60d8b188 authored by Fredrik Lundh's avatar Fredrik Lundh

needforspeed: stringlib refactoring: changed find_obj to find_slice,

to enable use from stringobject
parent c2d29c5a
...@@ -48,18 +48,49 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len, ...@@ -48,18 +48,49 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
return pos; return pos;
} }
#ifdef STRINGLIB_STR
Py_LOCAL_INLINE(Py_ssize_t) Py_LOCAL_INLINE(Py_ssize_t)
stringlib_find_obj(PyObject* str, PyObject* sub, stringlib_find_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t start, Py_ssize_t end) Py_ssize_t start, Py_ssize_t end)
{ {
if (start < 0)
start += str_len;
if (start < 0)
start = 0;
if (end > str_len)
end = str_len;
if (end < 0)
end += str_len;
if (end < 0)
end = 0;
return stringlib_find( return stringlib_find(
STRINGLIB_STR(str) + start, end - start, str + start, end - start,
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start sub, sub_len, start
); );
} }
Py_LOCAL_INLINE(Py_ssize_t)
stringlib_rfind_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t start, Py_ssize_t end)
{
if (start < 0)
start += str_len;
if (start < 0)
start = 0;
if (end > str_len)
end = str_len;
if (end < 0)
end += str_len;
if (end < 0)
end = 0;
return stringlib_rfind(str + start, end - start, sub, sub_len, start);
}
#ifdef STRINGLIB_STR
Py_LOCAL_INLINE(int) Py_LOCAL_INLINE(int)
stringlib_contains_obj(PyObject* str, PyObject* sub) stringlib_contains_obj(PyObject* str, PyObject* sub)
{ {
...@@ -69,19 +100,9 @@ stringlib_contains_obj(PyObject* str, PyObject* sub) ...@@ -69,19 +100,9 @@ stringlib_contains_obj(PyObject* str, PyObject* sub)
) != -1; ) != -1;
} }
Py_LOCAL_INLINE(Py_ssize_t) #endif /* STRINGLIB_STR */
stringlib_rfind_obj(PyObject* str, PyObject* sub,
Py_ssize_t start, Py_ssize_t end)
{
return stringlib_rfind(
STRINGLIB_STR(str) + start, end - start,
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start
);
}
#endif
#endif #endif /* STRINGLIB_FIND_H */
/* /*
Local variables: Local variables:
......
...@@ -3936,12 +3936,18 @@ Py_ssize_t PyUnicode_Find(PyObject *str, ...@@ -3936,12 +3936,18 @@ Py_ssize_t PyUnicode_Find(PyObject *str,
return -2; return -2;
} }
FIX_START_END((PyUnicodeObject*) str);
if (direction > 0) if (direction > 0)
result = stringlib_find_obj(str, sub, start, end); result = stringlib_find_slice(
PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
start, end
);
else else
result = stringlib_rfind_obj(str, sub, start, end); result = stringlib_rfind_slice(
PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
start, end
);
Py_DECREF(str); Py_DECREF(str);
Py_DECREF(sub); Py_DECREF(sub);
...@@ -5284,14 +5290,15 @@ unicode_find(PyUnicodeObject *self, PyObject *args) ...@@ -5284,14 +5290,15 @@ unicode_find(PyUnicodeObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring, if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring,
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
return NULL; return NULL;
substring = PyUnicode_FromObject(substring); substring = PyUnicode_FromObject(substring);
if (!substring) if (!substring)
return NULL; return NULL;
FIX_START_END(self); result = stringlib_find_slice(
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
result = stringlib_find_obj((PyObject*) self, substring, start, end); PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
start, end
);
Py_DECREF(substring); Py_DECREF(substring);
...@@ -5352,14 +5359,15 @@ unicode_index(PyUnicodeObject *self, PyObject *args) ...@@ -5352,14 +5359,15 @@ unicode_index(PyUnicodeObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring, if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring,
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
return NULL; return NULL;
substring = PyUnicode_FromObject(substring); substring = PyUnicode_FromObject(substring);
if (!substring) if (!substring)
return NULL; return NULL;
FIX_START_END(self); result = stringlib_find_slice(
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
result = stringlib_find_obj((PyObject*) self, substring, start, end); PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
start, end
);
Py_DECREF(substring); Py_DECREF(substring);
...@@ -6027,9 +6035,11 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args) ...@@ -6027,9 +6035,11 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args)
if (!substring) if (!substring)
return NULL; return NULL;
FIX_START_END(self); result = stringlib_rfind_slice(
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
result = stringlib_rfind_obj((PyObject*)self, substring, start, end); PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
start, end
);
Py_DECREF(substring); Py_DECREF(substring);
...@@ -6056,9 +6066,11 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args) ...@@ -6056,9 +6066,11 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args)
if (!substring) if (!substring)
return NULL; return NULL;
FIX_START_END(self); result = stringlib_rfind_slice(
PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
result = stringlib_rfind_obj((PyObject*)self, substring, start, end); PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
start, end
);
Py_DECREF(substring); Py_DECREF(substring);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment