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; }
//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; }
//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; }
//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; }
//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; }
HRESULT math_cos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount) { LONG ltemp; if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[0], <emp))) { ScriptVariant_ChangeType(*pretvar, VT_DECIMAL); (*pretvar)->dblVal = cos_table[(ltemp % 360 + 360) % 360]; return S_OK; } *pretvar = NULL; return E_FAIL; }
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; }
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; }
//'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; }
//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; }
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; }
//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], <emp))) { 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; }
// 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); }
void ScriptVariant_Clear(ScriptVariant *var) { ScriptVariant_ChangeType(var, VT_EMPTY); var->ptrVal = NULL; // not sure, maybe this is the longest member in the union }