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
49 struct lconv* lc = localeconv();
55 m_parser = numEval::ParseAlloc( malloc );
69 numEval::ParseFree(
m_parser, free );
102 if( std::isnan( val ) )
134 if( aString.IsEmpty() )
151 }
while( tok.
token );
192 auto isDecimalSeparator = [ & ](
char ch ) ->
bool {
197 auto extractNumber = [ & ]() {
198 bool haveSeparator =
false;
204 if( isDecimalSeparator( ch ) && haveSeparator )
209 if( isDecimalSeparator( ch ) )
210 haveSeparator =
true;
213 }
while( isdigit( ch ) || isDecimalSeparator( ch ) );
227 auto checkUnit = [ this ]() ->
Unit {
240 if( sizeLeft >= 2 && ch ==
'm' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
246 if( sizeLeft >= 2 && ch ==
'c' && cptr[ 1 ] ==
'm' && !isalnum( cptr[ 2 ] ) )
252 if( sizeLeft >= 2 && ch ==
'i' && cptr[ 1 ] ==
'n' && !isalnum( cptr[ 2 ] ) )
258 if( sizeLeft >= 3 && ch ==
'm' && cptr[ 1 ] ==
'i' && cptr[ 2 ] ==
'l'
259 && !isalnum( cptr[ 3 ] ) )
265 if( sizeLeft >= 4 && ch ==
't' && cptr[ 1 ] ==
'h' && cptr[ 2 ] ==
'o'
266 && cptr[ 3 ] ==
'u' && !isalnum( cptr[ 4 ] ) )
294 else if( isdigit( ch ) || isDecimalSeparator( ch ))
298 retval.
token = VALUE;
313 switch( convertFrom )
324 switch( convertFrom )
335 switch( convertFrom )
345 else if( isalpha( ch ))
351 while( isalnum( *cptr ))
357 if( bytesToCopy >=
sizeof( retval.
value.
text ) )
358 bytesToCopy =
sizeof( retval.
value.
text ) - 1;
369 case '+': retval.
token = PLUS;
break;
370 case '-': retval.
token = MINUS;
break;
371 case '*': retval.
token = MULT;
break;
372 case '/': retval.
token = DIVIDE;
break;
373 case '(': retval.
token = PARENL;
break;
374 case ')': retval.
token = PARENR;
break;
375 case '=': retval.
token = ASSIGN;
break;
376 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 SetVar(const wxString &aString, double aValue)
bool Process(const wxString &aString)
std::map< wxString, double > m_varMap
PARSE_RESULT Parse(const wxString &aString, NOTATION aNotation=NOTATION::SI, SIM_VALUE::TYPE aValueType=SIM_VALUE::TYPE_FLOAT)
std::string Double2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 We want to avoid scientific ...