Example #1
0
// faster if it is not VT_STR
void ScriptVariant_Copy(ScriptVariant * svar, ScriptVariant * rightChild) {
	// collect the str cache index
	if(svar->vt == VT_STR && rightChild->vt != VT_STR) {
		StrCache_Collect(svar->strVal);
	}
	switch (rightChild->vt) {
		case VT_INTEGER:
			svar->lVal = rightChild->lVal;
			break;
		case VT_DECIMAL:
			svar->dblVal = rightChild->dblVal;
			break;
		case VT_PTR:
			svar->ptrVal = rightChild->ptrVal;
			break;
		case VT_STR:
			// if it is not string, give it a string cache index
			if(svar->vt != VT_STR)
				svar->strVal = StrCache_Pop();
			StrCache_Get(rightChild->strVal)[MAX_STR_VAR_LEN] = 0;
			strcpy(StrCache_Get(svar->strVal), StrCache_Get(rightChild->strVal));
			break;
		default:
			//should not happen unless the variant is not intialized correctly
			//shutdown(1, "invalid variant type");
			svar->ptrVal = NULL;
			break;
	}
	svar->vt = rightChild->vt;
}
Example #2
0
//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;
}
Example #3
0
void ScriptVariant_ChangeType(ScriptVariant *var, VARTYPE cvt)
{
    // Always collect make it safer for string copy
    // since now reference has been added.
    // String variables should never be changed
    // unless the engine is creating a new one
    if(var->vt == VT_STR)
    {
        StrCache_Collect(var->strVal);
    }
    if(cvt == VT_STR)
    {
        var->strVal = StrCache_Pop();
    }
    var->vt = cvt;

}
Example #4
0
void ScriptVariant_ChangeType(ScriptVariant * var, VARTYPE cvt) {
	if(var->vt == cvt)
		return;
/*
	if(var->vt == VT_INTEGER)
	{
		switch(cvt)
		{
		case VT_DECIMAL:
			var->dblVal = (DOUBLE)var->lVal;
			break;
		case VT_STR:
			var->strVal = StrCache_Pop();
			sprintf(StrCache_Get(var->strVal), "%ld", var->lVal);
			break;
		}
	}
	else if(var->vt == VT_DECIMAL)
	{
		switch(cvt)
		{
		case VT_INTEGER:
			var->dblVal = (LONG)var->lVal;
			break;
		case VT_STR:
			var->strVal = StrCache_Pop();
			sprintf(StrCache_Get(var->strVal), "%lf", var->dblVal);
			break;
		}
	}
	else */ if(var->vt == VT_STR) {
		if(cvt != VT_STR) {
			StrCache_Collect(var->strVal);
		}
	} else if(cvt == VT_STR) {
		var->strVal = StrCache_Pop();
	}
	var->vt = cvt;

}