[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;