diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 19:29:05 +0000 |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 19:29:05 +0000 |
commit | 7e3d09b2306266d5f96090ab64b60e866d8f00b5 (patch) | |
tree | 1b2e4d4f8d3c278e27cb99a69449a544cf0012fe /Objects/unicodeobject.c | |
parent | b00f1dbd0237a0499643ae6fd1ac67b14fd34805 (diff) | |
download | cpython-7e3d09b2306266d5f96090ab64b60e866d8f00b5.tar.gz |
needforspeed: stringlib refactoring: use stringlib/find for unicode
find
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 596bd101c8..0f791c0602 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3951,27 +3951,49 @@ static Py_ssize_t findstring(PyUnicodeObject *self, } Py_ssize_t PyUnicode_Find(PyObject *str, - PyObject *substr, - Py_ssize_t start, - Py_ssize_t end, - int direction) + PyObject *substr, + Py_ssize_t start, + Py_ssize_t end, + int direction) { Py_ssize_t result; + PyUnicodeObject* str_obj; + PyUnicodeObject* sub_obj; - str = PyUnicode_FromObject(str); - if (str == NULL) + str_obj = (PyUnicodeObject*) PyUnicode_FromObject(str); + if (!str) return -2; - substr = PyUnicode_FromObject(substr); - if (substr == NULL) { - Py_DECREF(str); + sub_obj = (PyUnicodeObject*) PyUnicode_FromObject(substr); + if (!sub_obj) { + Py_DECREF(str_obj); return -2; } - result = findstring((PyUnicodeObject *)str, - (PyUnicodeObject *)substr, - start, end, direction); - Py_DECREF(str); - Py_DECREF(substr); + if (start < 0) + start += str_obj->length; + if (start < 0) + start = 0; + if (end > str_obj->length) + end = str_obj->length; + if (end < 0) + end += str_obj->length; + if (end < 0) + end = 0; + + if (direction > 0) + result = stringlib_find( + str_obj->str + start, end - start, sub_obj->str, sub_obj->length + ); + else + result = stringlib_rfind( + str_obj->str + start, end - start, sub_obj->str, sub_obj->length + ); + + if (result >= 0) + result += start; + + Py_DECREF(str_obj); + Py_DECREF(sub_obj); return result; } |