summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/stringlib/find.h57
-rw-r--r--Objects/unicodeobject.c48
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);