mirror of
https://github.com/python/cpython.git
synced 2025-11-02 19:12:55 +00:00
Committing patch #591250 which provides "str1 in str2" when str1 is a
string of longer than 1 character.
This commit is contained in:
parent
b57089cdf8
commit
817918cc3c
8 changed files with 140 additions and 99 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue