summaryrefslogtreecommitdiffstats
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2001-05-23 14:38:53 (GMT)
committerThomas Wouters <thomas@python.org>2001-05-23 14:38:53 (GMT)
commit1648e53efce867513ffdbdbdc044b9a8a810b8ad (patch)
treedcbc35d9dfa451f2d94b236877fe9beb4bdb2c32 /Objects/stringobject.c
parent49a8bec41f67dea8dc71cd7f0f38cbcc345a827a (diff)
downloadcpython-1648e53efce867513ffdbdbdc044b9a8a810b8ad.zip
cpython-1648e53efce867513ffdbdbdc044b9a8a810b8ad.tar.gz
cpython-1648e53efce867513ffdbdbdc044b9a8a810b8ad.tar.bz2
Net result of Tim's checkins to stropmodule.c (2.78, 2.79, 2.80, 2.81),
stringobject.c (2.114, 2.115) and test_strop.py (1.11, 1.12). Fixes 'replace' behaviour on systems on which 'malloc(0)' returns NULL (together with previous checkins) and re-synchs the string-operation code in stringobject.c and stropmodule.c, with the exception of 'replace', which has the old semantics in stropmodule but the new semantics in stringobjects.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 4de8b1f..25a7c92 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -1531,7 +1531,7 @@ mymemreplace(const char *str, int len, /* input string */
const char *pat, int pat_len, /* pattern string to find */
const char *sub, int sub_len, /* substitution string */
int count, /* number of replacements */
- int *out_len)
+ int *out_len)
{
char *out_s;
char *new_s;
@@ -1548,41 +1548,48 @@ mymemreplace(const char *str, int len, /* input string */
nfound = count;
if (nfound == 0)
goto return_same;
+
new_len = len + nfound*(sub_len - pat_len);
+ if (new_len == 0) {
+ /* Have to allocate something for the caller to free(). */
+ out_s = (char *)PyMem_MALLOC(1);
+ if (out_s == NULL)
+ return NULL;
+ out_s[0] = '\0';
+ }
+ else {
+ assert(new_len > 0);
+ new_s = (char *)PyMem_MALLOC(new_len);
+ if (new_s == NULL)
+ return NULL;
+ out_s = new_s;
- new_s = (char *)PyMem_MALLOC(new_len);
- if (new_s == NULL) return NULL;
+ 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;
+ }
+ /* copy any remaining values into output string */
+ if (len > 0)
+ memcpy(new_s, str, len);
+ }
*out_len = new_len;
- out_s = new_s;
-
- while (len > 0) {
- /* find index of next instance of pattern */
- offset = mymemfind(str, len, pat, pat_len);
- /* if not found, break out of loop */
- if (offset == -1) break;
-
- /* copy non matching part of input string */
- memcpy(new_s, str, offset); /* copy part of str before pat */
- str += offset + pat_len; /* move str past pattern */
- len -= offset + pat_len; /* reduce length of str remaining */
-
- /* copy substitute into the output string */
- new_s += offset; /* move new_s to dest for sub string */
- memcpy(new_s, sub, sub_len); /* copy substring into new_s */
- new_s += sub_len; /* offset new_s past sub string */
-
- /* break when we've done count replacements */
- if (--count == 0) break;
- }
- /* copy any remaining values into output string */
- if (len > 0)
- memcpy(new_s, str, len);
return out_s;
return_same:
*out_len = -1;
- return (char*)str; /* have to cast away constness here */
+ return (char *)str; /* cast away const */
}