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 );
184 m_token.input = aString.utf8_str();
186 m_token.outputLen = std::max<std::size_t>( 64,
m_token.inputLen + 1 );
198 if( ch ==
'p' ) { *siScaler = 1.0e-12;
return true; }
199 else if( ch ==
'n' ) { *siScaler = 1.0e-9;
return true; }
200 else if( ch == wxT(
"µ" )[0] ) { *siScaler = 1.0e-6;
return true; }
201 else if( ch == wxT(
"μ" )[0] ) { *siScaler = 1.0e-6;
return true; }
202 else if( ch ==
'u' ) { *siScaler = 1.0e-6;
return true; }
203 else if( ch ==
'm' ) { *siScaler = 1.0e-3;
return true; }
204 else if( ch ==
'L' ) { *siScaler = 1.0e-3;
return true; }
205 else if( ch ==
'R' ) { *siScaler = 1.0;
return true; }
206 else if( ch ==
'F' ) { *siScaler = 1.0;
return true; }
207 else if( ch ==
'k' ) { *siScaler = 1.0e3;
return true; }
208 else if( ch ==
'K' ) { *siScaler = 1.0e3;
return true; }
209 else if( ch ==
'M' ) { *siScaler = 1.0e6;
return true; }
210 else if( ch ==
'G' ) { *siScaler = 1.0e9;
return true; }
211 else if( ch ==
'T' ) { *siScaler = 1.0e12;
return true; }
221 case 'p': *siScaler = 1.0e-12;
return true;
222 case 'n': *siScaler = 1.0e-9;
return true;
223 case 'u': *siScaler = 1.0e-6;
return true;
224 case 'm': *siScaler = 1.0e-3;
return true;
225 case 'L': *siScaler = 1.0e-3;
return true;
226 case 'R': *siScaler = 1.0;
return true;
227 case 'F': *siScaler = 1.0;
return true;
228 case 'k': *siScaler = 1.0e3;
return true;
229 case 'K': *siScaler = 1.0e3;
return true;
230 case 'M': *siScaler = 1.0e6;
return true;
231 case 'G': *siScaler = 1.0e9;
return true;
232 case 'T': *siScaler = 1.0e12;
return true;
233 default:
return false;
242 if( ch == localeSeparator || ch ==
'.' || ch ==
',' )
255 return isdigit(
static_cast<unsigned char>( ch ) );
280 [&](
double* aScaler )
282 bool haveSeparator =
false;
283 double siScaler = 1.0;
295 haveSeparator =
true;
317 [&](
double* siScaler ) ->
Unit
332 if( sizeLeft >= 2 && ch ==
'\xC2' && cptr[1] ==
'\xB0' )
342 if( sizeLeft >= 2 && ch ==
'u' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
348 if( sizeLeft >= 5 && ch ==
'p' && cptr[1] ==
's' && cptr[2] ==
'/' && cptr[3] ==
'i'
349 && cptr[4] ==
'n' && !isalnum( cptr[5] ) )
355 if( sizeLeft >= 5 && ch ==
'p' && cptr[1] ==
's' && cptr[2] ==
'/' && cptr[3] ==
'c'
356 && cptr[4] ==
'm' && !isalnum( cptr[5] ) )
362 if( sizeLeft >= 5 && ch ==
'p' && cptr[1] ==
's' && cptr[2] ==
'/' && cptr[3] ==
'm'
363 && cptr[4] ==
'm' && !isalnum( cptr[5] ) )
369 if( sizeLeft >= 2 && ch ==
'f' && cptr[1] ==
's' && !isalnum( cptr[2] ) )
375 if( sizeLeft >= 2 && ch ==
'p' && cptr[1] ==
's' && !isalnum( cptr[2] ) )
381 if( sizeLeft >= 2 && ch ==
'm' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
387 if( sizeLeft >= 2 && ch ==
'c' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
393 if( sizeLeft >= 2 && ch ==
'i' && cptr[ 1 ] ==
'n' && !isalnum( cptr[ 2 ] ) )
399 if( sizeLeft >= 3 && ch ==
'm' && cptr[ 1 ] ==
'i' && cptr[ 2 ] ==
'l'
400 && !isalnum( cptr[ 3 ] ) )
406 if( sizeLeft >= 4 && ch ==
't' && cptr[ 1 ] ==
'h' && cptr[ 2 ] ==
'o'
407 && cptr[ 3 ] ==
'u' && !isalnum( cptr[ 4 ] ) )
435 double siScaler = 1.0;
445 extractNumber( &siScaler );
449 else if( ( convertFrom = checkUnit( &siScaler ) ) !=
Unit::Invalid )
461 switch( convertFrom )
474 switch( convertFrom )
487 switch( convertFrom )
508 switch( convertFrom )
518 switch( convertFrom )
528 switch( convertFrom )
539 switch( convertFrom )
550 switch( convertFrom )
560 else if( isalpha( ch ) )
566 while( isalnum( *cptr ) )
572 if( bytesToCopy >=
sizeof( retval.
value.
text ) )
573 bytesToCopy =
sizeof( retval.
value.
text ) - 1;
586 case '*': retval.
token = MULT;
break;
588 case '(': retval.
token = PARENL;
break;
589 case ')': retval.
token = PARENR;
break;
590 case '=': retval.
token = ASSIGN;
break;
591 case ';': retval.
token = SEMCOL;
break;
static bool isOldSchoolDecimalSeparator(char ch, double *siScaler)
void parseSetResult(double)
static bool IsOldSchoolDecimalSeparator(wxUniChar ch, double *siScaler)
wxString OriginalText() const
static bool IsDecimalSeparator(char ch, char localeSeparator, bool allowInfixNotation)
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
static bool IsDigit(char ch)
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".