factor out isNumber() in dsnlexer.cpp, add support for numbers with exponents, leave commented out for further testing
This commit is contained in:
parent
6231ce5959
commit
0eae829b11
|
@ -394,6 +394,93 @@ static bool isSpace( int cc )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function isNumber
|
||||||
|
* return true if the next sequence of s-expression text is a number:
|
||||||
|
* either an integer, fixed point, or float with exponent.
|
||||||
|
*
|
||||||
|
* @param cp is the start of the current token.
|
||||||
|
* @param limit is the end of the current line of text.
|
||||||
|
* @param next is where to put a pointer to the start of the token after this one, but is only
|
||||||
|
* updated if the return value is true.
|
||||||
|
* @return bool - true if this is a number, else false.
|
||||||
|
*/
|
||||||
|
static bool isNumber( const char* cp, const char* limit, const char** next )
|
||||||
|
{
|
||||||
|
#if 1 // no exponents supported
|
||||||
|
|
||||||
|
if( strchr( "+-.0123456789", *cp ) )
|
||||||
|
{
|
||||||
|
++cp;
|
||||||
|
while( cp<limit && strchr( ".0123456789", *cp ) )
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
if( (cp<limit && isSpace(*cp)) || *cp==')' || *cp=='(' || cp==limit )
|
||||||
|
{
|
||||||
|
*next = cp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#else // support numbers with exponents.
|
||||||
|
|
||||||
|
// regex for a float: "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?" i.e. any number
|
||||||
|
// is traversed, coded manually here:
|
||||||
|
|
||||||
|
bool sawNumber = false;
|
||||||
|
|
||||||
|
if( cp < limit && strchr( "-+", *cp ) )
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
while( cp < limit && strchr( "0123456789", *cp ) )
|
||||||
|
{
|
||||||
|
++cp;
|
||||||
|
sawNumber = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
if( cp < limit && *cp == '.' )
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
while( cp < limit && strchr( "0123456789", *cp ) )
|
||||||
|
{
|
||||||
|
sawNumber = true;
|
||||||
|
++cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( cp < limit && strchr( "Ee", *cp ) )
|
||||||
|
{
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
sawNumber = false; // exponent mandates at least one digit thereafter.
|
||||||
|
|
||||||
|
if( cp < limit && strchr( "-+", *cp ) )
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
while( cp < limit && strchr( "0123456789", *cp ) )
|
||||||
|
{
|
||||||
|
++cp;
|
||||||
|
sawNumber = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sawNumber )
|
||||||
|
{
|
||||||
|
if( ( cp<limit && isSpace(*cp) ) || *cp==')' || *cp=='(' || cp==limit )
|
||||||
|
{
|
||||||
|
*next = cp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int DSNLEXER::NextTok() throw( IO_ERROR )
|
int DSNLEXER::NextTok() throw( IO_ERROR )
|
||||||
{
|
{
|
||||||
const char* cur = next;
|
const char* cur = next;
|
||||||
|
@ -507,22 +594,13 @@ L_read:
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle DSN_NUMBER
|
if( isNumber( cur, limit, &head ) )
|
||||||
if( strchr( "+-.0123456789", *cur ) )
|
|
||||||
{
|
{
|
||||||
head = cur+1;
|
// handle DSN_NUMBER
|
||||||
while( head<limit && strchr( ".0123456789", *head ) )
|
curText.clear();
|
||||||
++head;
|
curText.append( cur, head );
|
||||||
|
curTok = DSN_NUMBER;
|
||||||
if( (head<limit && isSpace(*head)) || *head==')' || *head=='(' || head==limit )
|
goto exit;
|
||||||
{
|
|
||||||
curText.clear();
|
|
||||||
curText.append( cur, head );
|
|
||||||
curTok = DSN_NUMBER;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// else it was something like +5V, fall through below
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// a quoted string, will return DSN_STRING
|
// a quoted string, will return DSN_STRING
|
||||||
|
|
Loading…
Reference in New Issue