From 60d8b1883113b35fa72e94dbf58e2e439120a1ae Mon Sep 17 00:00:00 2001 From: Fredrik Lundh Date: Sat, 27 May 2006 15:20:22 +0000 Subject: needforspeed: stringlib refactoring: changed find_obj to find_slice, to enable use from stringobject --- Objects/stringlib/find.h | 57 +++++++++++++++++++++++++++++++++--------------- Objects/unicodeobject.c | 48 +++++++++++++++++++++++++--------------- 2 files changed, 69 insertions(+), 36 deletions(-) diff --git a/Objects/stringlib/find.h b/Objects/stringlib/find.h index 9f010c7..4cea2db 100644 --- a/Objects/stringlib/find.h +++ b/Objects/stringlib/find.h @@ -48,18 +48,49 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len, return pos; } -#ifdef STRINGLIB_STR - Py_LOCAL_INLINE(Py_ssize_t) -stringlib_find_obj(PyObject* str, PyObject* sub, - Py_ssize_t start, Py_ssize_t end) +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) { + 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( - STRINGLIB_STR(str) + start, end - start, - STRINGLIB_STR(sub), STRINGLIB_LEN(sub), start + str + start, end - 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) stringlib_contains_obj(PyObject* str, PyObject* sub) { @@ -69,19 +100,9 @@ stringlib_contains_obj(PyObject* str, PyObject* sub) ) != -1; } -Py_LOCAL_INLINE(Py_ssize_t) -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 /* STRINGLIB_STR */ -#endif +#endif /* STRINGLIB_FIND_H */ /* Local variables: diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 3a855b6..f93cfa5 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3936,12 +3936,18 @@ Py_ssize_t PyUnicode_Find(PyObject *str, return -2; } - FIX_START_END((PyUnicodeObject*) str); - 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 - 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(sub); @@ -5284,14 +5290,15 @@ unicode_find(PyUnicodeObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; - substring = PyUnicode_FromObject(substring); if (!substring) return NULL; - FIX_START_END(self); - - result = stringlib_find_obj((PyObject*) self, substring, start, end); + result = stringlib_find_slice( + PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self), + PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring), + start, end + ); Py_DECREF(substring); @@ -5352,14 +5359,15 @@ unicode_index(PyUnicodeObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; - substring = PyUnicode_FromObject(substring); if (!substring) return NULL; - FIX_START_END(self); - - result = stringlib_find_obj((PyObject*) self, substring, start, end); + result = stringlib_find_slice( + PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self), + PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring), + start, end + ); Py_DECREF(substring); @@ -6027,9 +6035,11 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args) if (!substring) return NULL; - FIX_START_END(self); - - result = stringlib_rfind_obj((PyObject*)self, substring, start, end); + result = stringlib_rfind_slice( + PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self), + PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring), + start, end + ); Py_DECREF(substring); @@ -6056,9 +6066,11 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args) if (!substring) return NULL; - FIX_START_END(self); - - result = stringlib_rfind_obj((PyObject*)self, substring, start, end); + result = stringlib_rfind_slice( + PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self), + PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring), + start, end + ); Py_DECREF(substring); -- cgit v0.12