[Python-checkins] CVS: python/dist/src/Modules stropmodule.c,2.76,2.77
Tim Peters
tim_one@users.sourceforge.net
Wed, 09 May 2001 16:00:28 -0700
Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv15893/python/dist/src/Modules
Modified Files:
stropmodule.c
Log Message:
SF bug #422088: [OSF1 alpha] string.replace().
Platform blew up on "123".replace("123", ""). Michael Hudson pinned the
blame on platform malloc(0) returning NULL.
This is a candidate for all bugfix releases.
Index: stropmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/stropmodule.c,v
retrieving revision 2.76
retrieving revision 2.77
diff -C2 -r2.76 -r2.77
*** stropmodule.c 2001/05/09 22:15:03 2.76
--- stropmodule.c 2001/05/09 23:00:26 2.77
***************
*** 1062,1095 ****
if (nfound == 0)
goto return_same;
- new_len = len + nfound*(sub_len - pat_len);
-
- new_s = (char *)PyMem_MALLOC(new_len);
- if (new_s == NULL) return NULL;
-
- *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;
--- 1062,1102 ----
if (nfound == 0)
goto return_same;
! new_len = len + nfound*(sub_len - pat_len);
! if (new_len == 0) {
! out_s = "";
}
! else {
! assert(new_len > 0);
! new_s = (char *)PyMem_MALLOC(new_len);
! if (new_s == NULL)
! return NULL;
! out_s = new_s;
!
! while (len > 0) {
! /* 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;
!
! /* note count==0 is effectively infinity */
! if (--count == 0)
! break;
! }
! /* copy any remaining values into output string */
! if (len > 0)
! memcpy(new_s, str, len);
! }
! *out_len = new_len;
return out_s;