ScriptVariant *ScriptVariant_Add(ScriptVariant * svar, ScriptVariant * rightChild) { static ScriptVariant retvar; static int flag = 1; DOUBLE dbl1, dbl2; CHAR buf[MAX_STR_VAR_LEN + 1]; if(flag) { ScriptVariant_Init(&retvar); flag = 0; } else ScriptVariant_Clear(&retvar); if(ScriptVariant_DecimalValue(svar, &dbl1) == S_OK && ScriptVariant_DecimalValue(rightChild, &dbl2) == S_OK) { if(svar->vt == VT_DECIMAL || rightChild->vt == VT_DECIMAL) { ScriptVariant_ChangeType(&retvar, VT_DECIMAL); retvar.dblVal = dbl1 + dbl2; } else { ScriptVariant_ChangeType(&retvar, VT_INTEGER); retvar.lVal = (LONG) (dbl1 + dbl2); } } else if(svar->vt == VT_STR || rightChild->vt == VT_STR) { ScriptVariant_ChangeType(&retvar, VT_STR); StrCache_Get(retvar.strVal)[0] = 0; ScriptVariant_ToString(svar, StrCache_Get(retvar.strVal)); ScriptVariant_ToString(rightChild, buf); strcat(StrCache_Get(retvar.strVal), buf); } return &retvar; }
HRESULT math_pow(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount) { DOUBLE dbltempA, dbltempB; if( SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltempA)) && SUCCEEDED(ScriptVariant_DecimalValue(varlist[1], &dbltempB)) ) { ScriptVariant_ChangeType(*pretvar, VT_DECIMAL); (*pretvar)->dblVal = pow((double)dbltempA,(double)dbltempB); return S_OK; } *pretvar = NULL; return E_FAIL; }
ScriptVariant *ScriptVariant_Mul(ScriptVariant * svar, ScriptVariant * rightChild) { static ScriptVariant retvar; DOUBLE dbl1, dbl2; if(ScriptVariant_DecimalValue(svar, &dbl1) == S_OK && ScriptVariant_DecimalValue(rightChild, &dbl2) == S_OK) { if(svar->vt == VT_DECIMAL || rightChild->vt == VT_DECIMAL) { retvar.vt = VT_DECIMAL; retvar.dblVal = dbl1 * dbl2; } else { retvar.vt = VT_INTEGER; retvar.lVal = (LONG) (dbl1 * dbl2); } } else { ScriptVariant_Init(&retvar); } return &retvar; }
ScriptVariant *ScriptVariant_Le(ScriptVariant * svar, ScriptVariant * rightChild) { DOUBLE dbl1, dbl2; static ScriptVariant retvar; retvar.vt = VT_INTEGER; if(ScriptVariant_DecimalValue(svar, &dbl1) == S_OK && ScriptVariant_DecimalValue(rightChild, &dbl2) == S_OK) { retvar.lVal = (dbl1 <= dbl2); } else if(svar->vt == VT_STR && rightChild->vt == VT_STR) { retvar.lVal = (strcmp(StrCache_Get(svar->strVal), StrCache_Get(rightChild->strVal)) <= 0); } else if(svar->vt == VT_PTR && rightChild->vt == VT_PTR) { retvar.lVal = (svar->ptrVal <= rightChild->ptrVal); } else if(svar->vt == VT_EMPTY || rightChild->vt == VT_EMPTY) { retvar.lVal = 0; } else { retvar.lVal = (memcmp(svar, rightChild, sizeof(ScriptVariant)) <= 0); } return &retvar; }
HRESULT math_round(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount) { DOUBLE dbltemp; if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp))) { ScriptVariant_ChangeType(*pretvar, VT_DECIMAL); (*pretvar)->dblVal = (DOUBLE)(round(dbltemp)); return S_OK; } *pretvar = NULL; return E_FAIL; }
HRESULT math_trunc(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount) { DOUBLE dbltemp; if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp))) { ScriptVariant_ChangeType(*pretvar, VT_INTEGER); (*pretvar)->lVal = (LONG)(trunc(dbltemp)); return S_OK; } *pretvar = NULL; return E_FAIL; }
HRESULT math_scos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount) { DOUBLE dbltemp; if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp))) { double PI = 3.14159265; ScriptVariant_ChangeType(*pretvar, VT_DECIMAL); (*pretvar)->dblVal = (DOUBLE)cos(dbltemp*PI/180.0); return S_OK; } *pretvar = NULL; return E_FAIL; }
HRESULT math_sqrt(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount) { DOUBLE dbltemp; float inv; if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp))) { ScriptVariant_ChangeType(*pretvar, VT_DECIMAL); inv = invsqrt((float)dbltemp); assert(inv != 0.0f); (*pretvar)->dblVal = (DOUBLE)1.0 / inv; return S_OK; } *pretvar = NULL; return E_FAIL; }