]> granicus.if.org Git - php/commitdiff
- Fixed scanning decimal numbers in internationalized environments. They should
authorAndi Gutmans <andi@php.net>
Fri, 26 May 2000 07:49:56 +0000 (07:49 +0000)
committerAndi Gutmans <andi@php.net>
Fri, 26 May 2000 07:49:56 +0000 (07:49 +0000)
- always be in standard US format e.g. 23.3

Zend/zend-scanner.l
Zend/zend_operators.c
Zend/zend_operators.h

index d1ff0b28a5c8486adcc1dab1f637c19925eec8bd..3db1f7e96aa4cea3c9f3f0c07bb31506c0986cf1 100644 (file)
@@ -1133,7 +1133,7 @@ ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+
        errno = 0;
        zendlval->value.lval = strtol(yytext, NULL, 0);
        if (errno == ERANGE) { /* overflow */
-               zendlval->value.dval = strtod(yytext,NULL);
+               zendlval->value.dval = zend_string_to_double(yytext, yyleng);
                zendlval->type = IS_DOUBLE;
                return T_DNUMBER;
        } else {
@@ -1150,7 +1150,7 @@ ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+
 }
 
 <ST_IN_SCRIPTING>{DNUM}|{EXPONENT_DNUM} {
-       zendlval->value.dval = strtod(yytext,NULL);
+       zendlval->value.dval = zend_string_to_double(yytext, yyleng);
        zendlval->type = IS_DOUBLE;
        return T_DNUMBER;
 }
index 95b682ee1bdcf4326fde6d563a66dbc564d50142..a058083ef85bff1052ab8a0ca749269cbcb5bb9f 100644 (file)
 #include "ext/bcmath/number.h"
 #endif
 
+ZEND_API double zend_string_to_double(const char *number, zend_uint length)
+{
+       zend_uint i=0;
+       double divisor = 10.0;
+       double result = 0.0;
+       double exponent;
+
+       if (!length) {
+               return result;
+       }
+
+       for (i=0; i<length; i++) {
+               if ((number[i] <= '9' && number[i] >= '0')) {
+                       result *= 10;
+                       result += number[i] - '0';
+               } else if (number[i] == '.') {
+                       i++;
+                       break;
+               } else if (toupper(number[i]) == 'E') {
+                       exponent = (double) atoi(&number[i+1]);
+                       result *= pow(10.0, exponent);
+                       return result;
+               } else {
+                       return result;
+               }
+       }
+
+       for (; i<length; i++) {
+               if ((number[i] <= '9' && number[i] >= '0')) {
+                       result += (number[i] - '0') / divisor;
+                       divisor *= 10;
+               } else if (toupper(number[i]) == 'E') {
+                       exponent = (double) atoi(&number[i+1]);
+                       result *= pow(10.0, exponent);
+                       return result;
+               } else {
+                       return result;
+               }
+       }
+       return result;
+}
+
 
 ZEND_API void convert_scalar_to_number(zval *op)
 {
index 9e1ced2c701cdd72b058d7f854607b5e1b4c94f3..d906660a4617a7d61e127d6e56066ae9f8b6fbd8 100644 (file)
@@ -65,6 +65,8 @@ ZEND_API void convert_to_object(zval *op);
 ZEND_API int add_char_to_string(zval *result, zval *op1, zval *op2);
 ZEND_API int add_string_to_string(zval *result, zval *op1, zval *op2);
 #define convert_to_string(op)                  _convert_to_string((op) ZEND_FILE_LINE_CC)
+
+ZEND_API double zend_string_to_double(const char *number, zend_uint length);
 END_EXTERN_C()
 
 ZEND_API int zval_is_true(zval *op);