diff options
author | Stanislav Malyshev <stas@php.net> | 2000-11-14 17:02:52 +0000 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2000-11-14 17:02:52 +0000 |
commit | 89d5983ad903562f53793e1191fceb89dbdce0d5 (patch) | |
tree | 12ba728183453a7831469f9ed0b87e50ffbbfe98 | |
parent | 8f0d033450b1a0c2b8fedd72476f90166e57fcbd (diff) | |
download | php-git-89d5983ad903562f53793e1191fceb89dbdce0d5.tar.gz |
Attempt at better handling long 0x-numbers, like 0xffffffff
-rw-r--r-- | Zend/zend_language_scanner.l | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 585073781c..1e02fc4818 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -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; |