📄 evaluate.cpp
字号:
while( isdigit(* pEnd) || * pEnd == '.' ) pEnd++;
TCHAR szNum[2048]; INT nLen = pEnd - pExpr;
if( nLen > 0 ) { strncpy( szNum, pExpr, nLen ); szNum[nLen] = '\0'; }
else { * pError = EVAL_ERROR_WRONG_SYNTAX; return pExpr; }
* pValue = atof( szNum );
pExpr = pEnd;
return pExpr;
}
TCHAR * EVAL::EvalParentheses(TCHAR * pExpr, double * pValue, INT * pError)
{
EVAL_EAT_WHITE( pExpr );
if( * pExpr == '(' ) pExpr++; // skip '('
else { * pError = EVAL_ERROR_INTERNAL; return pExpr; }
EVAL_EAT_WHITE( pExpr );
pExpr = EvalExpression( pExpr, pValue, pError );
if( * pError ) return pExpr;
EVAL_EAT_WHITE( pExpr );
if( * pExpr == ')' ) pExpr++; // skip ')'
else { * pError = EVAL_ERROR_WRONG_SYNTAX; return pExpr; }
return pExpr;
}
TCHAR * EVAL::EvalVariable(TCHAR * pExpr, double * pValue, INT * pError)
{
EVAL_EAT_WHITE( pExpr );
if( * pExpr == '$' ) pExpr++; // skip '$'
else { * pError = EVAL_ERROR_INTERNAL; return pExpr; }
TCHAR * pEnd = pExpr;
while( isalnum(* pEnd) ) pEnd++;
TCHAR szVar[2048]; INT nLen = pEnd - pExpr;
if( nLen > 0 ) { strncpy( szVar, pExpr, nLen ); szVar[nLen] = '\0'; strlwr(szVar); }
else { * pError = EVAL_ERROR_WRONG_SYNTAX; return pExpr; }
double dValue;
if( hashVariables.Lookup( szVar, dValue ) ) { * pValue = dValue; pExpr = pEnd; }
else { * pError = EVAL_ERROR_VARIABLE_NOT_DEFINED; return pExpr; }
return pExpr;
}
TCHAR * EVAL::EvalFunction(TCHAR * pExpr, double * pValue, INT * pError)
{
EVAL_EAT_WHITE( pExpr );
TCHAR * pEnd = pExpr;
while( isalnum(* pEnd) ) pEnd++;
TCHAR szFun[2048]; INT nLen = pEnd - pExpr;
if( nLen > 0 ) { strncpy( szFun, pExpr, nLen ); szFun[nLen] = '\0'; strlwr(szFun); }
else { * pError = EVAL_ERROR_WRONG_SYNTAX; return pExpr; }
INT nFunction;
if( hashFunctions.Lookup( szFun, nFunction ) ) { pExpr = pEnd; }
else { * pError = EVAL_ERROR_FUNCTION_NOT_DEFINED; return pExpr; }
INT argc = 0; double argv[EVAL_MAX_ARGUMENT_COUNT];
EVAL_EAT_WHITE( pExpr );
if( * pExpr == '(' ) pExpr++; // skip '('
else { * pError = EVAL_ERROR_WRONG_SYNTAX; return pExpr; }
EVAL_EAT_WHITE( pExpr );
if( * pExpr != ')' ) { // not a void parameter function
pExpr = EvalExpression( pExpr, & (argv[argc++]), pError );
if( * pError ) return pExpr;
}
EVAL_EAT_WHITE( pExpr );
TCHAR op = * pExpr;
while( op == ',' ) {
pExpr++; // skip commma operator
EVAL_EAT_WHITE( pExpr );
pExpr = EvalExpression( pExpr, & (argv[argc++]), pError );
if( * pError ) return pExpr;
EVAL_EAT_WHITE( pExpr );
op = * pExpr;
}
EVAL_EAT_WHITE( pExpr );
if( * pExpr == ')' ) pExpr++; // skip ')'
else { * pError = EVAL_ERROR_WRONG_SYNTAX; return pExpr; }
if( EvalFunction( nFunction, argc, argv, pValue ) ) { }
else { * pError = EVAL_ERROR_FUNCTION_ARGUMENT_COUNT; return pExpr; }
return pExpr;
}
BOOL EVAL::EvalFunction(INT nFunction, INT argc, double * argv, double * pValue)
{
switch( nFunction ) {
case EVAL_FUNCTION_ABS:
if( argc == 1 ) { * pValue = fabs( argv[0] ); return TRUE; }
break;
case EVAL_FUNCTION_MOD:
if( argc == 2 ) { * pValue = fmod( argv[0], argv[1] ); return TRUE; }
break;
case EVAL_FUNCTION_CEIL:
if( argc == 1 ) { * pValue = ceil( argv[0] ); return TRUE; }
break;
case EVAL_FUNCTION_FLOOR:
if( argc == 1 ) { * pValue = floor( argv[0] ); return TRUE; }
break;
case EVAL_FUNCTION_ROUND:
if( argc == 1 ) { * pValue = floor( argv[0] + 0.5 ); return TRUE; }
break;
case EVAL_FUNCTION_MIN:
if( argc == 2 ) { * pValue = argv[0] < argv[1] ? argv[0] : argv[1]; return TRUE; }
break;
case EVAL_FUNCTION_MAX:
if( argc == 2 ) { * pValue = argv[0] > argv[1] ? argv[0] : argv[1]; return TRUE; }
break;
case EVAL_FUNCTION_ACOS:
if( argc == 1 ) { * pValue = acos(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_ASIN:
if( argc == 1 ) { * pValue = asin(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_ATAN:
if( argc == 1 ) { * pValue = atan(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_ATAN2:
if( argc == 2 ) { * pValue = atan2(argv[0], argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_COS:
if( argc == 1 ) { * pValue = cos(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_SIN:
if( argc == 1 ) { * pValue = sin(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_TAN:
if( argc == 1 ) { * pValue = tan(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_COSH:
if( argc == 1 ) { * pValue = cosh(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_SINH:
if( argc == 1 ) { * pValue = sinh(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_TANH:
if( argc == 1 ) { * pValue = tanh(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_EXP:
if( argc == 1 ) { * pValue = exp(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_LOG:
if( argc == 1 ) { * pValue = log(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_LOG10:
if( argc == 1 ) { * pValue = log10(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_POW:
if( argc == 2 ) { * pValue = pow(argv[0], argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_SQR:
if( argc == 1 ) { * pValue = argv[0] * argv[0]; return TRUE; }
break;
case EVAL_FUNCTION_SQRT:
if( argc == 1 ) { * pValue = sqrt(argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_TODAY:
if( argc == 0 ) { * pValue = (double)today(); return TRUE; }
break;
case EVAL_FUNCTION_YEARDAYS:
if( argc == 1 ) { * pValue = (double)yeardays((int)argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_MONTHDAYS:
if( argc == 2 ) { * pValue = (double)monthdays((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_DATE2DAYS:
if( argc == 1 ) { * pValue = (double)date2days((int)argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_DAYS2DATE:
if( argc == 1 ) { * pValue = (double)days2date((int)argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_EOMDAY:
if( argc == 2 ) { * pValue = (double)eomday((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_EOMDATE:
if( argc == 2 ) { * pValue = (double)eomdate((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_WEEKDAY:
if( argc == 1 ) { * pValue = (double)weekday((int)argv[0]); return TRUE; }
break;
case EVAL_FUNCTION_ISBIZDATE:
if( argc == 1 ) { * pValue = (double)isbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; }
if( argc == 2 ) { * pValue = (double)isbizdate((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_NBIZDATE:
if( argc == 1 ) { * pValue = (double)nbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; }
if( argc == 2 ) { * pValue = (double)nbizdate((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_PBIZDATE:
if( argc == 1 ) { * pValue = (double)pbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; }
if( argc == 2 ) { * pValue = (double)pbizdate((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_ADDDAYS:
if( argc == 2 ) { * pValue = (double)adddays((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_ADDMONTHS:
if( argc == 2 ) { * pValue = (double)addmonths((int)argv[0], (int)argv[1], EMR_ACTUAL ); return TRUE; }
if( argc == 3 ) { * pValue = (double)addmonths((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; }
break;
case EVAL_FUNCTION_ADDTERMS:
if( argc == 3 ) { * pValue = (double)addterms((int)argv[0], (int)argv[1], (int)argv[2], EMR_ACTUAL ); return TRUE; }
if( argc == 4 ) { * pValue = (double)addterms((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3]); return TRUE; }
break;
case EVAL_FUNCTION_DAYS360:
if( argc == 2 ) { * pValue = (double)days360((int)argv[0], (int)argv[1], 0 /* USA */ ); return TRUE; }
if( argc == 3 ) { * pValue = (double)days360((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; }
break;
case EVAL_FUNCTION_DAYS365:
if( argc == 2 ) { * pValue = (double)days365((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_DAYSACT:
if( argc == 2 ) { * pValue = (double)daysact((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_DAYSBET:
if( argc == 2 ) { * pValue = (double)daysbet((int)argv[0], (int)argv[1], DCB_ACTACT ); return TRUE; }
if( argc == 3 ) { * pValue = (double)daysbet((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; }
break;
case EVAL_FUNCTION_MONTHSBET:
if( argc == 2 ) { * pValue = (double)monthsbet((int)argv[0], (int)argv[1]); return TRUE; }
break;
case EVAL_FUNCTION_TERMSBET:
if( argc == 3 ) { * pValue = (double)termsbet((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; }
break;
case EVAL_FUNCTION_TERMFRAC:
if( argc == 3 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], DCB_ACTACT, EMR_ACTUAL ); return TRUE; }
if( argc == 4 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3], EMR_ACTUAL ); return TRUE; }
if( argc == 5 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3], (int)argv[4]); return TRUE; }
break;
case EVAL_FUNCTION_YEARFRAC:
if( argc == 2 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], DCB_ACTACT, EMR_ACTUAL ); return TRUE; }
if( argc == 3 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], (int)argv[2], EMR_ACTUAL ); return TRUE; }
if( argc == 4 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3]); return TRUE; }
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -