コード例 #1
0
ファイル: ScriptVariant.c プロジェクト: OpenBOR/openbor
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
ファイル: string.c プロジェクト: DCurrent/openbor
//strinlast(char string, char search_string);
HRESULT openbor_strinlast(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    char *tempstr = NULL;

    if(paramCount < 2)
    {
        goto sil_error;
    }

    if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_STR)
    {
        printf("\n Error, strinlast({string}, {search string}): Strinlast must be passed valid {string} and {search string}. \n");
        goto sil_error;
    }

    // this definitely doesn't work??? it interprets a string cache index as a character
    tempstr = strrchr((char *)StrCache_Get(varlist[0]->strVal), varlist[1]->strVal);

    if (tempstr != NULL)
    {
        ScriptVariant_ChangeType(*pretvar, VT_STR);
        (*pretvar)->strVal = StrCache_CreateNewFrom(tempstr);
    }
    else
    {
        ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
        (*pretvar)->lVal = -1;
    }
    return S_OK;
sil_error:
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #3
0
ファイル: string.c プロジェクト: DCurrent/openbor
//strinfirst(char string, char search_string);
HRESULT openbor_strinfirst(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    char *tempstr = NULL;

    if(paramCount < 2)
    {
        goto sif_error;
    }

    if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_STR)
    {
        printf("\n Error, strinfirst({string}, {search string}): Strinfirst must be passed valid {string} and {search string}. \n");
        goto sif_error;
    }

    tempstr = strstr((char *)StrCache_Get(varlist[0]->strVal), (char *)StrCache_Get(varlist[1]->strVal));

    if (tempstr != NULL)
    {
        ScriptVariant_ChangeType(*pretvar, VT_STR);
        (*pretvar)->strVal = StrCache_CreateNewFrom(tempstr);
    }
    else
    {
        ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
        (*pretvar)->lVal = -1;
    }
    return S_OK;

sif_error:
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #4
0
ファイル: string.c プロジェクト: DCurrent/openbor
//strright(char string, int i);
HRESULT openbor_strright(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    char *tempstr = NULL;

    if(paramCount < 2)
    {
        goto sr_error;
    }

    if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_INTEGER)
    {
        printf("\n Error, strright({string}, {characters}): Invalid or missing parameter. Strright must be passed valid {string} and number of {characters}.\n");
        goto sr_error;
    }

    tempstr = (char *)StrCache_Get(varlist[0]->strVal);

    if (tempstr && tempstr[0])
    {
        ScriptVariant_ChangeType(*pretvar, VT_STR);
        (*pretvar)->strVal = StrCache_CreateNewFrom(&tempstr[varlist[1]->lVal]);
    }
    else
    {
        ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
        (*pretvar)->lVal = -1;
    }

    return S_OK;
sr_error:
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #5
0
ファイル: string.c プロジェクト: DCurrent/openbor
//strleft(char string, int i);
HRESULT openbor_strleft(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    const char *src;
    char *dst;
    int srcLength, dstLength;

    if(paramCount < 2)
    {
        goto sl_error;
    }

    if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_INTEGER)
    {
        printf("\n Error, strleft({string}, {characters}): Invalid or missing parameter. Strleft must be passed valid {string} and number of {characters}.\n");
        goto sl_error;
    }

    src = StrCache_Get(varlist[0]->strVal);
    srcLength = strlen(src);
    dstLength = (srcLength < varlist[1]->lVal) ? srcLength : varlist[1]->lVal;
    ScriptVariant_ChangeType(*pretvar, VT_STR);
    (*pretvar)->strVal = StrCache_Pop(dstLength);
    dst = StrCache_Get((*pretvar)->strVal);
    memcpy(dst, src, dstLength);
    dst[dstLength] = '\0';

    return S_OK;
sl_error:
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #6
0
ファイル: math.c プロジェクト: DCurrent/openbor
HRESULT math_cos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    LONG ltemp;
    if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[0], &ltemp)))
    {
        ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
        (*pretvar)->dblVal = cos_table[(ltemp % 360 + 360) % 360];
        return S_OK;
    }
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #7
0
ファイル: math.c プロジェクト: DCurrent/openbor
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;
}
コード例 #8
0
ファイル: math.c プロジェクト: DCurrent/openbor
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;
}
コード例 #9
0
ファイル: math.c プロジェクト: DCurrent/openbor
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;
}
コード例 #10
0
ファイル: math.c プロジェクト: DCurrent/openbor
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;
}
コード例 #11
0
ファイル: Instruction.c プロジェクト: OpenBOR/openbor
//'compile' constant to improve speed
void Instruction_ConvertConstant(Instruction * pins) {
	ScriptVariant *pvar;
	if(pins->theVal)
		return;		//already have the constant as a variant
	if(pins->OpCode == CONSTDBL) {
		pvar = (ScriptVariant *) malloc(sizeof(ScriptVariant));
		ScriptVariant_Init(pvar);
		ScriptVariant_ChangeType(pvar, VT_DECIMAL);
		if(pins->theToken->theType != END_OF_TOKENS)
			pvar->dblVal = (DOUBLE) atof(pins->theToken->theSource);
		else
			pvar->dblVal = (DOUBLE) atof(pins->Label);
	} else if(pins->OpCode == CONSTINT || pins->OpCode == CHECKARG) {
		pvar = (ScriptVariant *) malloc(sizeof(ScriptVariant));
		ScriptVariant_Init(pvar);
		ScriptVariant_ChangeType(pvar, VT_INTEGER);
		if(pins->theToken->theType != END_OF_TOKENS) {
			if(pins->theToken->theType == TOKEN_HEXCONSTANT)
				pvar->lVal = (LONG) htoi(pins->theToken->theSource);
			else
				pvar->lVal = (LONG) atoi(pins->theToken->theSource);
		} else {
			if(pins->Label[1] == 'x' || pins->Label[1] == 'X')
				pvar->lVal = (LONG) htoi(pins->Label);
			else
				pvar->lVal = (LONG) atoi(pins->Label);
		}
	} else if(pins->OpCode == CONSTSTR) {
		pvar = (ScriptVariant *) malloc(sizeof(ScriptVariant));
		ScriptVariant_Init(pvar);
		ScriptVariant_ChangeType(pvar, VT_STR);
		strcpy(StrCache_Get(pvar->strVal), pins->theToken->theSource);
	} else
		return;
	pins->theVal = pvar;
}
コード例 #12
0
ファイル: string.c プロジェクト: DCurrent/openbor
//strlength(char string);
HRESULT openbor_strlength(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    if(paramCount < 1 || varlist[0]->vt != VT_STR)
    {
        goto strlength_error;
    }

    ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
    (*pretvar)->lVal = strlen((char *)StrCache_Get(varlist[0]->strVal));
    return S_OK;

strlength_error:
    printf("Error, strlength({string}): Invalid or missing parameter. Strlength must be passed a valid {string}.\n");
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #13
0
ファイル: math.c プロジェクト: DCurrent/openbor
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;
}
コード例 #14
0
ファイル: string.c プロジェクト: DCurrent/openbor
//strwidth(char string, int font);
HRESULT openbor_strwidth(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
{
    LONG ltemp;
    if(paramCount < 2 || varlist[0]->vt != VT_STR ||
            FAILED(ScriptVariant_IntegerValue(varlist[1], &ltemp)))
    {
        goto strwidth_error;
    }

    ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
    (*pretvar)->lVal = font_string_width((int)ltemp, (char *)StrCache_Get(varlist[0]->strVal));
    return S_OK;

strwidth_error:
    printf("Error, strwidth({string}, {font}): Invalid or missing parameter.\n");
    *pretvar = NULL;
    return E_FAIL;
}
コード例 #15
0
ファイル: ScriptVariant.c プロジェクト: marstau/shinsango
// find an existing constant before copy
void ScriptVariant_ParseStringConstant(ScriptVariant *var, CHAR *str)
{
    //assert(index<strcache_size);
    //assert(size>0);
    int i;
    for(i = 0; i < strcache_size; i++)
    {
        if(strcache[i].ref && strcmp(str, strcache[i].str) == 0)
        {
            var->strVal = i;
            strcache[i].ref++;
            var->vt = VT_STR;
            break;
        }
    }

    ScriptVariant_ChangeType(var, VT_STR);
    StrCache_Copy(var->strVal, str);
}
コード例 #16
0
ファイル: ScriptVariant.c プロジェクト: marstau/shinsango
void ScriptVariant_Clear(ScriptVariant *var)
{
    ScriptVariant_ChangeType(var, VT_EMPTY);
    var->ptrVal = NULL; // not sure, maybe this is the longest member in the union
}