[Python-checkins] python/dist/src/Objects stringobject.c,2.167,2.168

nnorwitz@users.sourceforge.net nnorwitz@users.sourceforge.net
Thu, 13 Jun 2002 17:50:44 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv11051/Objects

Modified Files:
	stringobject.c 
Log Message:
SF bug # 493951 string.{starts,ends}with vs slices

Handle negative indices similar to slices.


Index: stringobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.167
retrieving revision 2.168
diff -C2 -d -r2.167 -r2.168
*** stringobject.c	13 Jun 2002 20:33:01 -0000	2.167
--- stringobject.c	14 Jun 2002 00:50:41 -0000	2.168
***************
*** 1311,1314 ****
--- 1311,1329 ----
  }
  
+ static void
+ string_adjust_indices(int *start, int *end, int len)
+ {
+ 	if (*end > len)
+ 		*end = len;
+ 	else if (*end < 0)
+ 		*end += len;
+ 	if (*end < 0)
+ 		*end = 0;
+ 	if (*start < 0)
+ 		*start += len;
+ 	if (*start < 0)
+ 		*start = 0;
+ }
+ 
  static long
  string_find_internal(PyStringObject *self, PyObject *args, int dir)
***************
*** 1333,1346 ****
  		return -2;
  
! 	if (last > len)
! 		last = len;
! 	if (last < 0)
! 		last += len;
! 	if (last < 0)
! 		last = 0;
! 	if (i < 0)
! 		i += len;
! 	if (i < 0)
! 		i = 0;
  
  	if (dir > 0) {
--- 1348,1352 ----
  		return -2;
  
! 	string_adjust_indices(&i, &last, len);
  
  	if (dir > 0) {
***************
*** 1764,1777 ****
  		return NULL;
  
! 	if (last > len)
! 		last = len;
! 	if (last < 0)
! 		last += len;
! 	if (last < 0)
! 		last = 0;
! 	if (i < 0)
! 		i += len;
! 	if (i < 0)
! 		i = 0;
  	m = last + 1 - n;
  	if (n == 0)
--- 1770,1775 ----
  		return NULL;
  
! 	string_adjust_indices(&i, &last, len);
! 
  	m = last + 1 - n;
  	if (n == 0)
***************
*** 2170,2174 ****
  	int plen;
  	int start = 0;
! 	int end = -1;
  	PyObject *subobj;
  
--- 2168,2172 ----
  	int plen;
  	int start = 0;
! 	int end = INT_MAX;
  	PyObject *subobj;
  
***************
*** 2194,2214 ****
  		return NULL;
  
! 	/* adopt Java semantics for index out of range.  it is legal for
! 	 * offset to be == plen, but this only returns true if prefix is
! 	 * the empty string.
! 	 */
! 	if (start < 0 || start+plen > len)
  		return PyBool_FromLong(0);
  
! 	if (!memcmp(str+start, prefix, plen)) {
! 		/* did the match end after the specified end? */
! 		if (end < 0)
! 			return PyBool_FromLong(1);
! 		else if (end - start < plen)
! 			return PyBool_FromLong(0);
! 		else
! 			return PyBool_FromLong(1);
! 	}
! 	else return PyBool_FromLong(0);
  }
  
--- 2192,2204 ----
  		return NULL;
  
! 	string_adjust_indices(&start, &end, len);
! 
! 	if (start+plen > len)
  		return PyBool_FromLong(0);
  
! 	if (end-start >= plen)
! 		return PyBool_FromLong(!memcmp(str+start, prefix, plen));
! 	else
! 		return PyBool_FromLong(0);
  }
  
***************
*** 2229,2234 ****
  	int slen;
  	int start = 0;
! 	int end = -1;
! 	int lower, upper;
  	PyObject *subobj;
  
--- 2219,2223 ----
  	int slen;
  	int start = 0;
! 	int end = INT_MAX;
  	PyObject *subobj;
  
***************
*** 2254,2266 ****
  		return NULL;
  
! 	if (start < 0 || start > len || slen > len)
! 		return PyBool_FromLong(0);
  
! 	upper = (end >= 0 && end <= len) ? end : len;
! 	lower = (upper - slen) > start ? (upper - slen) : start;
  
! 	if (upper-lower >= slen && !memcmp(str+lower, suffix, slen))
! 		return PyBool_FromLong(1);
! 	else return PyBool_FromLong(0);
  }
  
--- 2243,2257 ----
  		return NULL;
  
! 	string_adjust_indices(&start, &end, len);
  
! 	if (end-start < slen || start > len)
! 		return PyBool_FromLong(0);
  
! 	if (end-slen > start)
! 		start = end - slen;
! 	if (end-start >= slen)
! 		return PyBool_FromLong(!memcmp(str+start, suffix, slen));
! 	else
! 		return PyBool_FromLong(0);
  }