mirror of
https://github.com/python/cpython.git
synced 2025-07-12 05:45:15 +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
|
@ -3732,15 +3732,14 @@ int PyUnicode_Contains(PyObject *container,
|
|||
PyObject *element)
|
||||
{
|
||||
PyUnicodeObject *u = NULL, *v = NULL;
|
||||
int result;
|
||||
register const Py_UNICODE *p, *e;
|
||||
register Py_UNICODE ch;
|
||||
int result, size;
|
||||
register const Py_UNICODE *lhs, *end, *rhs;
|
||||
|
||||
/* Coerce the two arguments */
|
||||
v = (PyUnicodeObject *)PyUnicode_FromObject(element);
|
||||
if (v == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"'in <string>' requires character as left operand");
|
||||
"'in <string>' requires string as left operand");
|
||||
goto onError;
|
||||
}
|
||||
u = (PyUnicodeObject *)PyUnicode_FromObject(container);
|
||||
|
@ -3749,20 +3748,27 @@ int PyUnicode_Contains(PyObject *container,
|
|||
goto onError;
|
||||
}
|
||||
|
||||
/* Check v in u */
|
||||
if (PyUnicode_GET_SIZE(v) != 1) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"'in <string>' requires character as left operand");
|
||||
goto onError;
|
||||
}
|
||||
ch = *PyUnicode_AS_UNICODE(v);
|
||||
p = PyUnicode_AS_UNICODE(u);
|
||||
e = p + PyUnicode_GET_SIZE(u);
|
||||
size = PyUnicode_GET_SIZE(v);
|
||||
rhs = PyUnicode_AS_UNICODE(v);
|
||||
lhs = PyUnicode_AS_UNICODE(u);
|
||||
|
||||
result = 0;
|
||||
while (p < e) {
|
||||
if (*p++ == ch) {
|
||||
result = 1;
|
||||
break;
|
||||
if (size == 1) {
|
||||
end = lhs + PyUnicode_GET_SIZE(u);
|
||||
while (lhs < end) {
|
||||
if (*lhs++ == *rhs) {
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
end = lhs + (PyUnicode_GET_SIZE(u) - size);
|
||||
while (lhs <= end) {
|
||||
if (memcmp(lhs++, rhs, size) == 0) {
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue