]> granicus.if.org Git - php/commitdiff
MFZE1 (floats & locale issue)
authorIlia Alshanetsky <iliaa@php.net>
Sat, 12 Oct 2002 21:15:35 +0000 (21:15 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Sat, 12 Oct 2002 21:15:35 +0000 (21:15 +0000)
Zend/zend.c
Zend/zend_execute_API.c
Zend/zend_globals.h
Zend/zend_operators.c
Zend/zend_operators.h

index e3a467d4460310281d0bd80133b7c98065bf4a7a..0311c3ece5331f9e9addea540ce8e767a3a77c2f 100644 (file)
@@ -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);
index e3903e291beb1d75be1465ab749cd93ef1726f72..e451aa54d53e2fd53e076b040d718ee75081d024 100644 (file)
@@ -180,6 +180,8 @@ void init_executor(TSRMLS_D)
        EG(current_execute_data) = NULL;
 
        EG(This) = NULL;
+
+       EG(float_separator)[0] = '.';
 }
 
 
index 12311fdb9796b3961afaea44baad54e2d60606f1..2be5df282ae4d1a8a898e3f2f528e34783a9ffdc 100644 (file)
@@ -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];
 };
 
index 285cce834d9c2c268cf7ff7c5ab3d03c31350497..d9556e77f27d192608048e3131b5322617735be4 100644 (file)
@@ -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
index c0fa057494a1b4c0e981bcf44b52f864bbc0988f..74b71e1b12f2167776ccea56d5f124a0261807ab 100644 (file)
@@ -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) {                                                         \