Code by Inyeol Lee, submitted to SF bug 595350, to implement

the string/unicode method .replace() with a zero-lengt first argument.
Inyeol contributed tests for this too.
This commit is contained in:
Guido van Rossum 2002-08-23 18:21:28 +00:00
parent 280488b9a3
commit 8b1a6d694f
5 changed files with 59 additions and 46 deletions

View file

@ -3494,11 +3494,6 @@ PyObject *replace(PyUnicodeObject *self,
{
PyUnicodeObject *u;
if (str1->length == 0) {
PyErr_SetString(PyExc_ValueError, "empty pattern string");
return NULL;
}
if (maxcount < 0)
maxcount = INT_MAX;
@ -3549,19 +3544,30 @@ PyObject *replace(PyUnicodeObject *self,
if (u) {
i = 0;
p = u->str;
while (i <= self->length - str1->length)
if (Py_UNICODE_MATCH(self, i, str1)) {
/* replace string segment */
if (str1->length > 0) {
while (i <= self->length - str1->length)
if (Py_UNICODE_MATCH(self, i, str1)) {
/* replace string segment */
Py_UNICODE_COPY(p, str2->str, str2->length);
p += str2->length;
i += str1->length;
if (--n <= 0) {
/* copy remaining part */
Py_UNICODE_COPY(p, self->str+i, self->length-i);
break;
}
} else
*p++ = self->str[i++];
} else {
while (n > 0) {
Py_UNICODE_COPY(p, str2->str, str2->length);
p += str2->length;
i += str1->length;
if (--n <= 0) {
/* copy remaining part */
Py_UNICODE_COPY(p, self->str+i, self->length-i);
if (--n <= 0)
break;
}
} else
*p++ = self->str[i++];
}
Py_UNICODE_COPY(p, self->str+i, self->length-i);
}
}
}
}