Re: cvs: php4 /ext/standard formatted_print.c string.c
| From: | Ilia A. | Date: | Fri, 11 Oct 2002 01:34:35 +0000 |
| Subject: | Re: cvs: php4 /ext/standard formatted_print.c string.c | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-14805@lists.php.net to get a copy of this message | ||
On October 10, 2002 08:55 pm, Sean R. Bright wrote:
> localeconv is not threadsafe AFAIK, which is why the localeconv_r
> function was introduced.
I'll make the correction.
Also, does HAVE_SETLOCALE necessarily imply
> HAVE_LOCALECONV?
I believe it is, on all the systems I have access to both functions are
defined within locale.h
Ilia
> -----Original Message-----
> From: Ilia Alshanetsky [mailto:ilia@prohost.org]
> Sent: Thursday, October 10, 2002 12:30 PM
> To: php-cvs@lists.php.net
> Subject: [PHP-CVS] cvs: php4 /ext/standard formatted_print.c string.c
>
>
> iliaa Thu Oct 10 12:29:35 2002 EDT
>
> Modified files:
> /php4/ext/standard string.c formatted_print.c
> Log:
> This patch fixes handling of floats on locales where decimal point is
> not a
> '.'. Problem is best demonstrated by bug #17079.
>
>
>
> Index: php4/ext/standard/string.c
> diff -u php4/ext/standard/string.c:1.319
> php4/ext/standard/string.c:1.320
> --- php4/ext/standard/string.c:1.319 Wed Oct 9 09:50:06 2002
> +++ php4/ext/standard/string.c Thu Oct 10 12:29:35 2002
> @@ -18,7 +18,7 @@
>
> +----------------------------------------------------------------------+
> */
>
> -/* $Id: string.c,v 1.319 2002/10/09 13:50:06 andrey Exp $ */
> +/* $Id: string.c,v 1.320 2002/10/10 16:29:35 iliaa Exp $ */
>
> /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
>
> @@ -3216,6 +3216,19 @@
>
> efree(args);
> RETVAL_STRING(retval, 1);
> +
> + if (cat == LC_NUMERIC || cat == LC_ALL) {
> + struct lconv *lc;
> + lc = localeconv();
> +
> + EG(float_separator)[0] =
> (lc->decimal_point)[0];
> +
> + if ((lc->decimal_point)[0] != '.') {
> + /* set locale back to C */
> + setlocale(LC_NUMERIC, "C");
> + }
> + }
> +
> return;
> }
>
> Index: php4/ext/standard/formatted_print.c
> diff -u php4/ext/standard/formatted_print.c:1.53
> php4/ext/standard/formatted_print.c:1.54
> --- php4/ext/standard/formatted_print.c:1.53 Sat Sep 21 11:08:59 2002
> +++ php4/ext/standard/formatted_print.c Thu Oct 10 12:29:35 2002
> @@ -16,7 +16,7 @@
>
> +----------------------------------------------------------------------+
> */
>
> -/* $Id: formatted_print.c,v 1.53 2002/09/21 15:08:59 sas Exp $ */
> +/* $Id: formatted_print.c,v 1.54 2002/10/10 16:29:35 iliaa Exp $ */
>
> #include <math.h> /* modf() */
> #include "php.h"
> @@ -284,14 +284,7 @@
> char *cvt;
> register int i = 0, j = 0;
> int sign, decpt;
> - char decimal_point = '.';
> -#ifdef HAVE_LOCALECONV
> - struct lconv l;
> -
> - localeconv_r(&l);
> -
> - decimal_point = l.decimal_point[0];
> -#endif
> + char decimal_point = EG(float_separator)[0];
>
> PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c',
> %d, %c)\n",
> *buffer, pos, size, number, width,
> padding, alignment, fmt)); @@ -611,14 +604,13 @@
> case 'e':
> case 'f':
> /* XXX not done */
> -
> convert_to_double_ex(args[argnum]);
>
> php_sprintf_appenddouble(&result, &outpos, &size,
>
> Z_DVAL_PP(args[argnum]),
>
> width, padding, alignment,
>
> precision, adjusting,
>
> format[inpos], always_sign);
> break;
> -
> +
> case 'c':
>
> convert_to_long_ex(args[argnum]);
> php_sprintf_appendchar(&result,
> &outpos, &size,