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 );
97 struct lconv* lc = localeconv();
119 if( std::isnan( val ) )
151 if( aString.IsEmpty() )
168 }
while( tok.
token );
210 auto isOldSchoolDecimalSeparator =
211 [](
char ch,
double* siScaler ) ->
bool
215 case 'a': *siScaler = 1.0e-18;
return true;
216 case 'f': *siScaler = 1.0e-15;
return true;
217 case 'p': *siScaler = 1.0e-12;
return true;
218 case 'n': *siScaler = 1.0e-9;
return true;
219 case 'u': *siScaler = 1.0e-6;
return true;
220 case 'm': *siScaler = 1.0e-3;
return true;
222 case 'K': *siScaler = 1.0e3;
return true;
223 case 'M': *siScaler = 1.0e6;
return true;
224 case 'G': *siScaler = 1.0e9;
return true;
225 case 'T': *siScaler = 1.0e12;
return true;
226 case 'P': *siScaler = 1.0e15;
return true;
227 case 'E': *siScaler = 1.0e18;
return true;
228 default:
return false;
232 auto isDecimalSeparator =
233 [&](
char ch ) ->
bool
248 [&](
double* aScaler )
250 bool haveSeparator =
false;
251 double siScaler = 1.0;
258 if( isDecimalSeparator( ch ) )
263 haveSeparator =
true;
265 if( isOldSchoolDecimalSeparator( ch, &siScaler ) )
276 }
while( isdigit( ch ) || isDecimalSeparator( ch ) );
284 [&](
double* siScaler ) ->
Unit
299 if( sizeLeft >= 2 && ch ==
'\xC2' && cptr[1] ==
'\xB0' )
305 if( sizeLeft >= 2 && ch ==
'm' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
311 if( sizeLeft >= 2 && ch ==
'c' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
317 if( sizeLeft >= 2 && ch ==
'i' && cptr[ 1 ] ==
'n' && !isalnum( cptr[ 2 ] ) )
323 if( sizeLeft >= 3 && ch ==
'm' && cptr[ 1 ] ==
'i' && cptr[ 2 ] ==
'l'
324 && !isalnum( cptr[ 3 ] ) )
330 if( sizeLeft >= 4 && ch ==
't' && cptr[ 1 ] ==
'h' && cptr[ 2 ] ==
'o'
331 && cptr[ 3 ] ==
'u' && !isalnum( cptr[ 4 ] ) )
338 && isOldSchoolDecimalSeparator( ch, siScaler ) )
360 double siScaler = 1.0;
367 else if( isdigit( ch ) || isDecimalSeparator( ch ) )
370 extractNumber( &siScaler );
371 retval.
token = VALUE;
374 else if( ( convertFrom = checkUnit( &siScaler ) ) !=
Unit::Invalid )
386 switch( convertFrom )
398 switch( convertFrom )
410 switch( convertFrom )
429 else if( isalpha( ch ) )
435 while( isalnum( *cptr ) )
441 if( bytesToCopy >=
sizeof( retval.
value.
text ) )
442 bytesToCopy =
sizeof( retval.
value.
text ) - 1;
453 case '+': retval.
token = PLUS;
break;
454 case '-': retval.
token = MINUS;
break;
455 case '*': retval.
token = MULT;
break;
456 case '/': retval.
token = DIVIDE;
break;
457 case '(': retval.
token = PARENL;
break;
458 case ')': retval.
token = PARENR;
break;
459 case '=': retval.
token = ASSIGN;
break;
460 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 ...