// 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; }
//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; }
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; }
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; }