From e842ef9f4b784b11a87a4f006db6e5b28552b1b5 Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Sat, 12 Oct 2002 21:15:35 +0000 Subject: [PATCH] MFZE1 (floats & locale issue) --- Zend/zend.c | 5 +++++ Zend/zend_execute_API.c | 2 ++ Zend/zend_globals.h | 3 +++ Zend/zend_operators.c | 18 ++++++++++++++++++ Zend/zend_operators.h | 2 ++ 5 files changed, 30 insertions(+) diff --git a/Zend/zend.c b/Zend/zend.c index e3a467d446..0311c3ece5 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -156,6 +156,11 @@ ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_cop expr_copy->value.str.val = estrndup("Object", expr_copy->value.str.len); #endif break; + case IS_DOUBLE: + *expr_copy = *expr; + zval_copy_ctor(expr_copy); + zend_locale_sprintf_double(expr_copy ZEND_FILE_LINE_CC); + break; default: *expr_copy = *expr; zval_copy_ctor(expr_copy); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e3903e291b..e451aa54d5 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -180,6 +180,8 @@ void init_executor(TSRMLS_D) EG(current_execute_data) = NULL; EG(This) = NULL; + + EG(float_separator)[0] = '.'; } diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 12311fdb97..2be5df282a 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -209,6 +209,9 @@ struct _zend_executor_globals { struct _zend_execute_data *current_execute_data; + /* locale stuff */ + char float_separator[1]; + void *reserved[ZEND_MAX_RESERVED_RESOURCES]; }; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 285cce834d..d9556e77f2 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1764,3 +1764,21 @@ ZEND_API void zend_compare_objects(zval *result, zval *o1, zval *o2 TSRMLS_DC) result->value.lval = Z_OBJ_HT_P(o1)->compare_objects(o1, o2 TSRMLS_CC); } } + +ZEND_API void zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC) +{ + double dval = op->value.dval; + + TSRMLS_FETCH(); + + op->value.str.val = (char *) emalloc_rel(MAX_LENGTH_OF_DOUBLE + EG(precision) + 1); + sprintf(op->value.str.val, "%.*G", (int) EG(precision), dval); + op->value.str.len = strlen(op->value.str.val); + + if (EG(float_separator)[0] != '.') { + char *p = op->value.str.val; + if ((p = strchr(p, '.'))) { + *p = EG(float_separator)[0]; + } + } +} \ No newline at end of file diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index c0fa057494..74b71e1b12 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -187,6 +187,8 @@ ZEND_API void zend_compare_objects(zval *result, zval *o1, zval *o2 TSRMLS_DC); ZEND_API int zend_atoi(const char *str, int str_len); +ZEND_API void zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC); + #define convert_to_ex_master(ppzv, lower_type, upper_type) \ if ((*ppzv)->type!=IS_##upper_type) { \ if (!(*ppzv)->is_ref) { \ -- 2.40.0