summaryrefslogtreecommitdiffstats
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2002-08-06 16:58:21 (GMT)
committerBarry Warsaw <barry@python.org>2002-08-06 16:58:21 (GMT)
commit817918cc3c10d0ed6b14e0e3f2bc0c5227c508cd (patch)
tree5dcdd3861db33fde0a76f275c09d40cba9c6fa22 /Objects/stringobject.c
parentb57089cdf8b63b38ca736785c9fcc38a9fce89da (diff)
downloadcpython-817918cc3c10d0ed6b14e0e3f2bc0c5227c508cd.zip
cpython-817918cc3c10d0ed6b14e0e3f2bc0c5227c508cd.tar.gz
cpython-817918cc3c10d0ed6b14e0e3f2bc0c5227c508cd.tar.bz2
Committing patch #591250 which provides "str1 in str2" when str1 is a
string of longer than 1 character.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 3c1b303..1d5277c 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -803,24 +803,31 @@ string_slice(register PyStringObject *a, register int i, register int j)
static int
string_contains(PyObject *a, PyObject *el)
{
- register char *s, *end;
- register char c;
+ const char *lhs, *rhs, *end;
+ int size;
#ifdef Py_USING_UNICODE
if (PyUnicode_Check(el))
return PyUnicode_Contains(a, el);
#endif
- if (!PyString_Check(el) || PyString_Size(el) != 1) {
+ if (!PyString_Check(el)) {
PyErr_SetString(PyExc_TypeError,
- "'in <string>' requires character as left operand");
+ "'in <string>' requires string as left operand");
return -1;
}
- c = PyString_AsString(el)[0];
- s = PyString_AsString(a);
- end = s + PyString_Size(a);
- while (s < end) {
- if (c == *s++)
+ size = PyString_Size(el);
+ rhs = PyString_AS_STRING(el);
+ lhs = PyString_AS_STRING(a);
+
+ /* optimize for a single character */
+ if (size == 1)
+ return memchr(lhs, *rhs, PyString_Size(a)) != NULL;
+
+ end = lhs + (PyString_Size(a) - size);
+ while (lhs <= end) {
+ if (memcmp(lhs++, rhs, size) == 0)
return 1;
}
+
return 0;
}