summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2002-10-12 21:15:35 +0000
committerIlia Alshanetsky <iliaa@php.net>2002-10-12 21:15:35 +0000
commite842ef9f4b784b11a87a4f006db6e5b28552b1b5 (patch)
tree631add01c9d8f843a5cc3a78d497e1eea8783af5
parent06455b10bfabaea15e2a560688674fbc8569ff57 (diff)
downloadphp-git-e842ef9f4b784b11a87a4f006db6e5b28552b1b5.tar.gz
MFZE1 (floats & locale issue)
-rw-r--r--Zend/zend.c5
-rw-r--r--Zend/zend_execute_API.c2
-rw-r--r--Zend/zend_globals.h3
-rw-r--r--Zend/zend_operators.c18
-rw-r--r--Zend/zend_operators.h2
5 files changed, 30 insertions, 0 deletions
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) { \