Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}
Пример #8
0
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;
}