summaryrefslogtreecommitdiff
path: root/Objects/unicodeobject.c
diff options
context:
space:
mode:
authorFredrik Lundh <fredrik@pythonware.com>2006-05-26 19:29:05 +0000
committerFredrik Lundh <fredrik@pythonware.com>2006-05-26 19:29:05 +0000
commit7e3d09b2306266d5f96090ab64b60e866d8f00b5 (patch)
tree1b2e4d4f8d3c278e27cb99a69449a544cf0012fe /Objects/unicodeobject.c
parentb00f1dbd0237a0499643ae6fd1ac67b14fd34805 (diff)
downloadcpython-7e3d09b2306266d5f96090ab64b60e866d8f00b5.tar.gz
needforspeed: stringlib refactoring: use stringlib/find for unicode
find
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r--Objects/unicodeobject.c50
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;
}