Fixed parser clamping of large negative numbers.
Added hack to parse floating point numbers but store them as integers. git-svn-id: http://yate.null.ro/svn/yate/trunk@6440 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
eedf31e959
commit
a3cfd6581e
|
@ -24,6 +24,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
using namespace TelEngine;
|
using namespace TelEngine;
|
||||||
|
|
||||||
|
@ -373,11 +374,32 @@ bool ExpEvaluator::getNumber(ParsePoint& expr)
|
||||||
if (inError())
|
if (inError())
|
||||||
return false;
|
return false;
|
||||||
XDebug(this,DebugAll,"getNumber line=0x%X '%.30s'",lineNumber(),(const char*)expr);
|
XDebug(this,DebugAll,"getNumber line=0x%X '%.30s'",lineNumber(),(const char*)expr);
|
||||||
|
static const Regexp r("^[-+]?([0-9]*(\\.)?[0-9]+|[0-9]+(\\.))([eE][-+]?[0-9]+)?",true);
|
||||||
|
String m(expr,50);
|
||||||
|
if (m.matches(r) && (m.matchLength(2) || m.matchLength(3) || m.matchLength(4))) {
|
||||||
|
String str = m.matchString();
|
||||||
|
double val = str.toDouble(0.0);
|
||||||
|
// Maximum IEEE double that can be converted to signed int64
|
||||||
|
#define DLONG_MAX 9223372036854774784.0
|
||||||
|
if (val >= DLONG_MAX)
|
||||||
|
val = DLONG_MAX;
|
||||||
|
else if (val <= -DLONG_MAX)
|
||||||
|
val = -DLONG_MAX;
|
||||||
|
#undef DLONG_MAX
|
||||||
|
expr += str.length();
|
||||||
|
ExpOperation* op = addOpcode(str);
|
||||||
|
op->m_number = ::round(val);
|
||||||
|
op->m_isNumber = true;
|
||||||
|
DDebug(this,DebugAll,"Fake float %s ~ " FMT64,str.safe(),op->m_number);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
char* endp = 0;
|
char* endp = 0;
|
||||||
int64_t val = ::strtoll(expr,&endp,0);
|
int64_t val = ::strtoll(expr,&endp,0);
|
||||||
if (!endp || (endp == expr))
|
if (!endp || (endp == expr))
|
||||||
return false;
|
return false;
|
||||||
expr = endp;
|
expr = endp;
|
||||||
|
if (LLONG_MIN == val)
|
||||||
|
val++;
|
||||||
DDebug(this,DebugAll,"Found " FMT64,val);
|
DDebug(this,DebugAll,"Found " FMT64,val);
|
||||||
addOpcode(val);
|
addOpcode(val);
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue