diff options
author | Guido van Rossum <guido@python.org> | 2002-08-23 18:21:28 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2002-08-23 18:21:28 (GMT) |
commit | 8b1a6d694fa2f38cde77892c5ee0bb177be49db6 (patch) | |
tree | e3f7c901c642cd2500cb87648b6976c8d539a1fb /Objects/stringobject.c | |
parent | 280488b9a3b5cc213d01aae794751b89144f8609 (diff) | |
download | cpython-8b1a6d694fa2f38cde77892c5ee0bb177be49db6.zip cpython-8b1a6d694fa2f38cde77892c5ee0bb177be49db6.tar.gz cpython-8b1a6d694fa2f38cde77892c5ee0bb177be49db6.tar.bz2 |
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.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r-- | Objects/stringobject.c | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 9f41317..0b79a06 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -2215,11 +2215,11 @@ mymemreplace(const char *str, int len, /* input string */ char *new_s; int nfound, offset, new_len; - if (len == 0 || pat_len > len) + if (len == 0 || (pat_len == 0 && sub_len == 0) || pat_len > len) goto return_same; /* find length of output string */ - nfound = mymemcnt(str, len, pat, pat_len); + nfound = (pat_len > 0) ? mymemcnt(str, len, pat, pat_len) : len + 1; if (count < 0) count = INT_MAX; else if (nfound > count) @@ -2242,25 +2242,38 @@ mymemreplace(const char *str, int len, /* input string */ return NULL; out_s = new_s; - for (; count > 0 && len > 0; --count) { - /* find index of next instance of pattern */ - offset = mymemfind(str, len, pat, pat_len); - if (offset == -1) - break; - - /* copy non matching part of input string */ - memcpy(new_s, str, offset); - str += offset + pat_len; - len -= offset + pat_len; - - /* copy substitute into the output string */ - new_s += offset; - memcpy(new_s, sub, sub_len); - new_s += sub_len; + if (pat_len > 0) { + for (; nfound > 0; --nfound) { + /* find index of next instance of pattern */ + offset = mymemfind(str, len, pat, pat_len); + if (offset == -1) + break; + + /* copy non matching part of input string */ + memcpy(new_s, str, offset); + str += offset + pat_len; + len -= offset + pat_len; + + /* copy substitute into the output string */ + new_s += offset; + memcpy(new_s, sub, sub_len); + new_s += sub_len; + } + /* copy any remaining values into output string */ + if (len > 0) + memcpy(new_s, str, len); + } + else { + for (;;++str, --len) { + memcpy(new_s, sub, sub_len); + new_s += sub_len; + if (--nfound <= 0) { + memcpy(new_s, str, len); + break; + } + *new_s++ = *str; + } } - /* copy any remaining values into output string */ - if (len > 0) - memcpy(new_s, str, len); } *out_len = new_len; return out_s; @@ -2317,10 +2330,6 @@ string_replace(PyStringObject *self, PyObject *args) else if (PyObject_AsCharBuffer(replobj, &repl, &repl_len)) return NULL; - if (sub_len <= 0) { - PyErr_SetString(PyExc_ValueError, "empty pattern string"); - return NULL; - } new_s = mymemreplace(str,len,sub,sub_len,repl,repl_len,count,&out_len); if (new_s == NULL) { PyErr_NoMemory(); |