static void call_aCalcPerform(acalcoutRecord *pcalc) { long numElements; epicsUInt32 amask; if (aCalcoutRecordDebug >= 10) printf("call_aCalcPerform:entry\n"); /* Note that we want to permit nuse == 0 as a way of saying "use nelm". */ numElements = acalcGetNumElements( pcalc ); pcalc->cstat = aCalcPerform(&pcalc->a, MAX_FIELDS, &pcalc->aa, ARRAY_MAX_FIELDS, numElements, &pcalc->val, pcalc->aval, pcalc->rpcl, pcalc->nelm, &pcalc->amask); if (pcalc->dopt == acalcoutDOPT_Use_OVAL) { pcalc->cstat |= aCalcPerform(&pcalc->a, MAX_FIELDS, &pcalc->aa, ARRAY_MAX_FIELDS, numElements, &pcalc->oval, pcalc->oav, pcalc->orpc, pcalc->nelm, &amask); pcalc->amask |= amask; } }
static void testAValExpr(const char* expr, double* args, double** aargs, double* expected, int length) { unsigned char rpn[255]; short err; double val; double aval[12]; epicsUInt32 amask; if (aCalcPostfix(expr, rpn, &err)) { testDiag("postfix: %s in expression '%s'", aCalcErrorStr(err), expr); return; } if (aCalcPerform(args, 12, aargs, 12, 12, &val, aval, rpn, 12, &amask)) { testDiag("calcPerform: error evaluating '%s'", expr); return; } bool pass = true; int i = 0; for (i = 0; i < length; i += 1) { if (finite(expected[i]) && finite(aval[i])) { if (fabs(expected[i] - aval[i]) > 1e-8) { pass = false; break; } } else if (isnan(expected[i]) && !isnan(aval[i])) { pass = false; break; } else if (aval[i] != expected[i]) { pass = false; break; } } if(!testOk(pass, "%s", expr)) { testDiag("Expected aval[%d]: %f, Got: %f", i, expected[i], aval[i]); } }
static void testValExpr(const char* expr, double* args, double** aargs, double expected) { unsigned char rpn[255]; short err; double val; double aval[1]; epicsUInt32 amask; if (aCalcPostfix(expr, rpn, &err)) { testDiag("postfix: %s in expression '%s'", aCalcErrorStr(err), expr); return; } if (aCalcPerform(args, 12, aargs, 12, 3, &val, aval, rpn, 1, &amask)) { testDiag("calcPerform: error evaluating '%s'", expr); return; } bool pass; if (finite(expected) && finite(val)) { pass = fabs(expected - val) < 1e-8; } else if (isnan(expected)) { pass = (bool) isnan(val); } else { pass = (val == expected); } if(!testOk(pass, "%s", expr)) { testDiag("Expected: %f, Got: %f", expected, val); } }