32#pragma GCC diagnostic push
33#pragma GCC diagnostic ignored "-Wunused-variable"
34#pragma GCC diagnostic ignored "-Wsign-compare"
37#include <libeval/grammar.c>
38#include <libeval/grammar.h>
41#pragma GCC diagnostic pop
54 m_parser = numEval::ParseAlloc( malloc );
62 numEval::ParseFree(
m_parser, free );
102 struct lconv* lc = localeconv();
124 if( std::isnan( val ) )
156 if( aString.IsEmpty() )
173 }
while( tok.
token );
215 auto isOldSchoolDecimalSeparator =
216 [](
char ch,
double* siScaler ) ->
bool
220 case 'a': *siScaler = 1.0e-18;
return true;
221 case 'f': *siScaler = 1.0e-15;
return true;
222 case 'p': *siScaler = 1.0e-12;
return true;
223 case 'n': *siScaler = 1.0e-9;
return true;
224 case 'u': *siScaler = 1.0e-6;
return true;
225 case 'm': *siScaler = 1.0e-3;
return true;
227 case 'K': *siScaler = 1.0e3;
return true;
228 case 'M': *siScaler = 1.0e6;
return true;
229 case 'G': *siScaler = 1.0e9;
return true;
230 case 'T': *siScaler = 1.0e12;
return true;
231 case 'P': *siScaler = 1.0e15;
return true;
232 case 'E': *siScaler = 1.0e18;
return true;
233 default:
return false;
237 auto isDecimalSeparator =
238 [&](
char ch ) ->
bool
253 [&](
double* aScaler )
255 bool haveSeparator =
false;
256 double siScaler = 1.0;
263 if( isDecimalSeparator( ch ) )
268 haveSeparator =
true;
270 if( isOldSchoolDecimalSeparator( ch, &siScaler ) )
284 }
while( isdigit(
static_cast<unsigned char>( ch ) ) || isDecimalSeparator( ch ) );
292 [&](
double* siScaler ) ->
Unit
307 if( sizeLeft >= 2 && ch ==
'\xC2' && cptr[1] ==
'\xB0' )
317 if( sizeLeft >= 2 && ch ==
'u' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
323 if( sizeLeft >= 5 && ch ==
'p' && cptr[1] ==
's' && cptr[2] ==
'/' && cptr[3] ==
'i'
324 && cptr[4] ==
'n' && !isalnum( cptr[5] ) )
330 if( sizeLeft >= 5 && ch ==
'p' && cptr[1] ==
's' && cptr[2] ==
'/' && cptr[3] ==
'c'
331 && cptr[4] ==
'm' && !isalnum( cptr[5] ) )
337 if( sizeLeft >= 5 && ch ==
'p' && cptr[1] ==
's' && cptr[2] ==
'/' && cptr[3] ==
'm'
338 && cptr[4] ==
'm' && !isalnum( cptr[5] ) )
344 if( sizeLeft >= 2 && ch ==
'f' && cptr[1] ==
's' && !isalnum( cptr[2] ) )
350 if( sizeLeft >= 2 && ch ==
'p' && cptr[1] ==
's' && !isalnum( cptr[2] ) )
356 if( sizeLeft >= 2 && ch ==
'm' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
362 if( sizeLeft >= 2 && ch ==
'c' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
368 if( sizeLeft >= 2 && ch ==
'i' && cptr[ 1 ] ==
'n' && !isalnum( cptr[ 2 ] ) )
374 if( sizeLeft >= 3 && ch ==
'm' && cptr[ 1 ] ==
'i' && cptr[ 2 ] ==
'l'
375 && !isalnum( cptr[ 3 ] ) )
381 if( sizeLeft >= 4 && ch ==
't' && cptr[ 1 ] ==
'h' && cptr[ 2 ] ==
'o'
382 && cptr[ 3 ] ==
'u' && !isalnum( cptr[ 4 ] ) )
389 && isOldSchoolDecimalSeparator( ch, siScaler ) )
411 double siScaler = 1.0;
418 else if( isdigit(
static_cast<unsigned char>( ch ) ) || isDecimalSeparator( ch ) )
423 extractNumber( &siScaler );
427 else if( ( convertFrom = checkUnit( &siScaler ) ) !=
Unit::Invalid )
439 switch( convertFrom )
452 switch( convertFrom )
465 switch( convertFrom )
486 switch( convertFrom )
496 switch( convertFrom )
506 switch( convertFrom )
517 switch( convertFrom )
528 switch( convertFrom )
538 else if( isalpha( ch ) )
544 while( isalnum( *cptr ) )
550 if( bytesToCopy >=
sizeof( retval.
value.
text ) )
551 bytesToCopy =
sizeof( retval.
value.
text ) - 1;
562 case '+': retval.
token = PLUS;
break;
563 case '-': retval.
token = MINUS;
break;
564 case '*': retval.
token = MULT;
break;
565 case '/': retval.
token = DIVIDE;
break;
566 case '(': retval.
token = PARENL;
break;
567 case ')': retval.
token = PARENR;
break;
568 case '=': retval.
token = ASSIGN;
break;
569 case ';': retval.
token = SEMCOL;
break;
void parseSetResult(double)
wxString OriginalText() const
struct NUMERIC_EVALUATOR::TokenStat m_token
void newString(const wxString &aString)
char m_localeDecimalSeparator
void parseError(const char *s)
double GetVar(const wxString &aString)
NUMERIC_EVALUATOR(EDA_UNITS aUnits)
void SetDefaultUnits(EDA_UNITS aUnits)
void SetVar(const wxString &aString, double aValue)
bool Process(const wxString &aString)
std::map< wxString, double > m_varMap
std::vector< FAB_LAYER_COLOR > dummy
std::string UIDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 We want to avoid scientific ...
@ VALUE
Field Value of part, i.e. "3.3K".