diff options
| author | Eric Smith <eric@trueblade.com> | 2008-06-24 00:42:10 (GMT) | 
|---|---|---|
| committer | Eric Smith <eric@trueblade.com> | 2008-06-24 00:42:10 (GMT) | 
| commit | 65fe47b9319e20cebf02d34f8abdbcda96d2fa22 (patch) | |
| tree | 73451eac7ff36a4516fdb7130ef03ee8eafe97da /Objects/stringlib | |
| parent | 57acc8f5ab751f0831a28a149c4fe44ca0beaf57 (diff) | |
| download | cpython-65fe47b9319e20cebf02d34f8abdbcda96d2fa22.zip cpython-65fe47b9319e20cebf02d34f8abdbcda96d2fa22.tar.gz cpython-65fe47b9319e20cebf02d34f8abdbcda96d2fa22.tar.bz2  | |
Modified interface to _Py_[String|Unicode]InsertThousandsGrouping, in anticipation of fixing issue 3140.
Diffstat (limited to 'Objects/stringlib')
| -rw-r--r-- | Objects/stringlib/formatter.h | 6 | ||||
| -rw-r--r-- | Objects/stringlib/localeutil.h | 41 | 
2 files changed, 27 insertions, 20 deletions
diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h index 2bb2ed2..12e2931 100644 --- a/Objects/stringlib/formatter.h +++ b/Objects/stringlib/formatter.h @@ -563,8 +563,7 @@ format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format,      if (format->type == 'n')  	    /* Compute how many additional chars we need to allocate  	       to hold the thousands grouping. */ -	    STRINGLIB_GROUPING(pnumeric_chars, n_digits, -			       pnumeric_chars+n_digits, +	    STRINGLIB_GROUPING(NULL, n_digits, n_digits,  			       0, &n_grouping_chars, 0);      /* Allocate a new string to hold the result */ @@ -592,8 +591,7 @@ format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format,  	    /* We know this can't fail, since we've already  	       reserved enough space. */  	    STRINGLIB_CHAR *pstart = p + n_leading_chars; -	    int r = STRINGLIB_GROUPING(pstart, n_digits, -				       pstart + n_digits, +	    int r = STRINGLIB_GROUPING(pstart, n_digits, n_digits,  				       spec.n_total+n_grouping_chars-n_leading_chars,  				       NULL, 0);  	    assert(r); diff --git a/Objects/stringlib/localeutil.h b/Objects/stringlib/localeutil.h index 5cab0bb..1105609 100644 --- a/Objects/stringlib/localeutil.h +++ b/Objects/stringlib/localeutil.h @@ -8,10 +8,9 @@  /**   * _Py_InsertThousandsGrouping:   * @buffer: A pointer to the start of a string. - * @len: The length of the string. - * @plast: A pointer to the end of of the digits in the string.  This - *         may be before the end of the string (if the string contains - *         decimals, for example). + * @n_buffer: The length of the string. + * @n_digits: The number of digits in the string, in which we want + *            to put the grouping chars.   * @buf_size: The maximum size of the buffer pointed to by buffer.   * @count: If non-NULL, points to a variable that will receive the   *         number of characters we need to insert (and no formatting @@ -21,10 +20,11 @@   *         string.   *   * Inserts thousand grouping characters (as defined in the current - *  locale) into the string between buffer and plast.  If count is - *  non-NULL, don't do any formatting, just count the number of - *  characters to insert.  This is used by the caller to appropriately - *  resize the buffer, if needed. + *  locale) into the string between buffer and buffer+n_digits.  If + *  count is non-NULL, don't do any formatting, just count the number + *  of characters to insert.  This is used by the caller to + *  appropriately resize the buffer, if needed.  If count is non-NULL, + *  buffer can be NULL (it is not dereferenced at all in that case).   *   * Return value: 0 on error, else 1.  Note that no error can occur if   *  count is non-NULL. @@ -34,8 +34,8 @@   **/  int  _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer, -			    Py_ssize_t len, -			    STRINGLIB_CHAR *plast, +			    Py_ssize_t n_buffer, +			    Py_ssize_t n_digits,  			    Py_ssize_t buf_size,  			    Py_ssize_t *count,  			    int append_zero_char) @@ -44,15 +44,22 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,  	const char *grouping = locale_data->grouping;  	const char *thousands_sep = locale_data->thousands_sep;  	Py_ssize_t thousands_sep_len = strlen(thousands_sep); -	STRINGLIB_CHAR *pend = buffer + len; /* current end of buffer */ -	STRINGLIB_CHAR *pmax = buffer + buf_size;       /* max of buffer */ +	STRINGLIB_CHAR *pend = NULL; /* current end of buffer */ +	STRINGLIB_CHAR *pmax = NULL; /* max of buffer */  	char current_grouping; +	Py_ssize_t remaining = n_digits; /* Number of chars remaining to +					    be looked at */  	/* Initialize the character count, if we're just counting. */  	if (count)  		*count = 0; +	else { +		/* We're not just counting, we're modifying buffer */ +		pend = buffer + n_buffer; +		pmax = buffer + buf_size; +	} -	/* Starting at plast and working right-to-left, keep track of +	/* Starting at the end and working right-to-left, keep track of  	   what grouping needs to be added and insert that. */  	current_grouping = *grouping++; @@ -60,11 +67,11 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,  	if (current_grouping == 0)  		return 1; -	while (plast - buffer > current_grouping) { +	while (remaining > current_grouping) {  		/* Always leave buffer and pend valid at the end of this  		   loop, since we might leave with a return statement. */ -		plast -= current_grouping; +		remaining -= current_grouping;  		if (count) {  			/* We're only counting, not touching the memory. */  			*count += thousands_sep_len; @@ -72,6 +79,8 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,  		else {  			/* Do the formatting. */ +			STRINGLIB_CHAR *plast = buffer + remaining; +  			/* Is there room to insert thousands_sep_len chars? */  			if (pmax - pend < thousands_sep_len)  				/* No room. */ @@ -111,7 +120,7 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,  	if (append_zero_char) {  		/* Append a zero character to mark the end of the string,  		   if there's room. */ -		if (pend - plast < 1) +		if (pend - (buffer + remaining) < 1)  			/* No room, error. */  			return 0;  		*pend = 0;  | 
