summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2000-11-14 17:02:52 +0000
committerStanislav Malyshev <stas@php.net>2000-11-14 17:02:52 +0000
commit89d5983ad903562f53793e1191fceb89dbdce0d5 (patch)
tree12ba728183453a7831469f9ed0b87e50ffbbfe98
parent8f0d033450b1a0c2b8fedd72476f90166e57fcbd (diff)
downloadphp-git-89d5983ad903562f53793e1191fceb89dbdce0d5.tar.gz
Attempt at better handling long 0x-numbers, like 0xffffffff
-rw-r--r--Zend/zend_language_scanner.l14
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;