SXString::SXString(BaseGame *inGame, ScStack *stack) : BaseScriptable(inGame) { _string = nullptr; _capacity = 0; stack->correctParams(1); ScValue *val = stack->pop(); if (val->isInt()) { _capacity = MAX(0, val->getInt()); if (_capacity > 0) { _string = new char[_capacity]; memset(_string, 0, _capacity); } } else { setStringVal(val->getString()); } if (_capacity == 0) { setStringVal(""); } }
ScValue::ScValue(BaseGame *inGame, const char *val) : BaseClass(inGame) { _type = VAL_STRING; _valString = nullptr; setStringVal(val); _valBool = false; _valInt = 0; _valFloat = 0.0f; _valNative = nullptr; _valRef = nullptr; _persistent = false; _isConstVar = false; }
void ScValue::copy(ScValue *orig, bool copyWhole) { _gameRef = orig->_gameRef; if (_valNative && !_persistent) { _valNative->_refCount--; if (_valNative->_refCount <= 0) { if (_valNative != orig->_valNative) { delete _valNative; } _valNative = nullptr; } } if (orig->_type == VAL_VARIABLE_REF && orig->_valRef && copyWhole) { orig = orig->_valRef; } cleanup(true); _type = orig->_type; _valBool = orig->_valBool; _valInt = orig->_valInt; _valFloat = orig->_valFloat; setStringVal(orig->_valString); _valRef = orig->_valRef; _persistent = orig->_persistent; _valNative = orig->_valNative; if (_valNative && !_persistent) { _valNative->_refCount++; } //!!!! ref->native++ // copy properties if (orig->_type == VAL_OBJECT && orig->_valObject.size() > 0) { orig->_valIter = orig->_valObject.begin(); while (orig->_valIter != orig->_valObject.end()) { _valObject[orig->_valIter->_key] = new ScValue(_gameRef); _valObject[orig->_valIter->_key]->copy(orig->_valIter->_value); orig->_valIter++; } } else { _valObject.clear(); } }
const char *ScValue::getString() { if (_type == VAL_VARIABLE_REF) { return _valRef->getString(); } switch (_type) { case VAL_OBJECT: setStringVal("[object]"); break; case VAL_NULL: setStringVal("[null]"); break; case VAL_NATIVE: { const char *strVal = _valNative->scToString(); setStringVal(strVal); return strVal; break; } case VAL_BOOL: setStringVal(_valBool ? "yes" : "no"); break; case VAL_INT: { char dummy[50]; sprintf(dummy, "%d", _valInt); setStringVal(dummy); break; } case VAL_FLOAT: { char dummy[50]; sprintf(dummy, "%f", _valFloat); setStringVal(dummy); break; } case VAL_STRING: break; default: setStringVal(""); } return _valString; }
void ScValue::setString(const char *val) { if (_type == VAL_VARIABLE_REF) { _valRef->setString(val); return; } if (_type == VAL_NATIVE) { _valNative->scSetString(val); return; } setStringVal(val); if (_valString) { _type = VAL_STRING; } else { _type = VAL_NULL; } }
void SXString::scSetString(const char *val) { setStringVal(val); }