]> granicus.if.org Git - php/commitdiff
Better 0x handling - not change non-0x number behaviour
authorStanislav Malyshev <stas@php.net>
Tue, 14 Nov 2000 17:54:11 +0000 (17:54 +0000)
committerStanislav Malyshev <stas@php.net>
Tue, 14 Nov 2000 17:54:11 +0000 (17:54 +0000)
Zend/zend_language_scanner.l

index 1e02fc4818a083f4e532e96553565b4dad488604..b537c08141ba4b028b54f0d8ef38be3d88be94b6 100644 (file)
@@ -1001,19 +1001,12 @@ ANY_CHAR (.|[\n])
 }
 
 
-<ST_IN_SCRIPTING>{LNUM}|{HNUM} {
+<ST_IN_SCRIPTING>{LNUM} {
        errno = 0;
-       zendlval->value.lval = strtoul(yytext, NULL, 0);
+       zendlval->value.lval = strtol(yytext, NULL, 0);
        if (errno == ERANGE) { /* overflow */
-               if(yytext[0] == 0 && (yytext[1] == 'x' || yytext[1] == 'X') ) {
-                       /* strtod for 0x'es returns trash */
-                       zendlval->value.lval = LONG_MAX; /* maximal long */
-                       zendlval->type = IS_LONG;
-                       zend_error(E_NOTICE,"Hex number is too big: %s",yytext);
-               } else {
-                       zendlval->value.dval = strtod(yytext,NULL);
-                       zendlval->type = IS_DOUBLE;
-               }
+               zendlval->value.dval = strtod(yytext,NULL);
+               zendlval->type = IS_DOUBLE;
                return T_DNUMBER;
        } else {
                zendlval->type = IS_LONG;
@@ -1021,6 +1014,20 @@ ANY_CHAR (.|[\n])
        }
 }
 
+<ST_IN_SCRIPTING>{HNUM} {
+       errno = 0;
+       zendlval->value.lval = strtoul(yytext, NULL, 16);
+       if (errno == ERANGE) { /* overflow */
+               /* not trying strtod - it returns trans on 0x-es */
+               zendlval->value.lval = LONG_MAX; /* maximal long */
+               zend_error(E_NOTICE,"Hex number is too big: %s",yytext);
+       } else {
+               zendlval->type = IS_LONG;
+       }
+       zendlval->type = IS_LONG;
+       return T_LNUMBER;
+}
+
 <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{LNUM}|{HNUM} { /* treat numbers (almost) as strings inside encapsulated strings */
        zendlval->value.str.val = (char *)estrndup(yytext, yyleng);
        zendlval->value.str.len = yyleng;