]> granicus.if.org Git - php/commitdiff
Attempt at better handling long 0x-numbers, like 0xffffffff
authorStanislav Malyshev <stas@php.net>
Tue, 14 Nov 2000 17:02:52 +0000 (17:02 +0000)
committerStanislav Malyshev <stas@php.net>
Tue, 14 Nov 2000 17:02:52 +0000 (17:02 +0000)
Zend/zend_language_scanner.l

index 585073781cccb8e87db232566e4b23e2e7c3c1ca..1e02fc4818a083f4e532e96553565b4dad488604 100644 (file)
@@ -38,6 +38,7 @@
 #endif
 
 #include <errno.h>
+#include <limits.h>
 #include "zend.h"
 #include "zend_alloc.h"
 #include "zend_language_parser.h"
@@ -1002,10 +1003,17 @@ ANY_CHAR (.|[\n])
 
 <ST_IN_SCRIPTING>{LNUM}|{HNUM} {
        errno = 0;
-       zendlval->value.lval = strtol(yytext, NULL, 0);
+       zendlval->value.lval = strtoul(yytext, NULL, 0);
        if (errno == ERANGE) { /* overflow */
-               zendlval->value.dval = strtod(yytext,NULL);
-               zendlval->type = IS_DOUBLE;
+               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;
+               }
                return T_DNUMBER;
        } else {
                zendlval->type = IS_LONG;