1
0
Fork 0

Codechange: use std::string_view for sq_getstring

pull/12692/merge
Rubidium 2025-05-02 18:46:50 +02:00 committed by rubidium42
parent f4f05dea33
commit 278aee2c19
12 changed files with 74 additions and 73 deletions

View File

@ -174,7 +174,7 @@ typedef SQObject HSQOBJECT;
typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM); typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size); typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/); typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const std::string &); typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,std::string_view);
typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger); typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger); typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
@ -250,7 +250,7 @@ SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
SQBool sq_instanceof(HSQUIRRELVM v); SQBool sq_instanceof(HSQUIRRELVM v);
void sq_tostring(HSQUIRRELVM v,SQInteger idx); void sq_tostring(HSQUIRRELVM v,SQInteger idx);
void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b); void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c); SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,std::string_view &str);
SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i); SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f); SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b); SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);

View File

@ -16,7 +16,6 @@ void sqstd_printcallstack(HSQUIRRELVM v)
SQInteger i; SQInteger i;
SQBool b; SQBool b;
SQFloat f; SQFloat f;
const SQChar *s;
SQInteger level=1; //1 is to skip this function that is level 0 SQInteger level=1; //1 is to skip this function that is level 0
const SQChar *name=nullptr; const SQChar *name=nullptr;
SQInteger seq=0; SQInteger seq=0;
@ -66,10 +65,12 @@ void sqstd_printcallstack(HSQUIRRELVM v)
case OT_USERPOINTER: case OT_USERPOINTER:
pf(v,fmt::format("[{}] USERPOINTER\n",name)); pf(v,fmt::format("[{}] USERPOINTER\n",name));
break; break;
case OT_STRING: case OT_STRING: {
sq_getstring(v,-1,&s); std::string_view view;
pf(v,fmt::format("[{}] \"{}\"\n",name,s)); sq_getstring(v,-1,view);
pf(v,fmt::format("[{}] \"{}\"\n",name,view));
break; break;
}
case OT_TABLE: case OT_TABLE:
pf(v,fmt::format("[{}] TABLE\n",name)); pf(v,fmt::format("[{}] TABLE\n",name));
break; break;
@ -117,10 +118,10 @@ static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
{ {
SQPRINTFUNCTION pf = sq_getprintfunc(v); SQPRINTFUNCTION pf = sq_getprintfunc(v);
if(pf) { if(pf) {
const SQChar *sErr = nullptr; std::string_view error;
if(sq_gettop(v)>=1) { if(sq_gettop(v)>=1) {
if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) { if(SQ_SUCCEEDED(sq_getstring(v,2,error))) {
pf(v,fmt::format("\nAN ERROR HAS OCCURRED [{}]\n",sErr)); pf(v,fmt::format("\nAN ERROR HAS OCCURRED [{}]\n",error));
} }
else{ else{
pf(v,"\nAN ERROR HAS OCCURRED [unknown]\n"); pf(v,"\nAN ERROR HAS OCCURRED [unknown]\n");

View File

@ -553,11 +553,11 @@ SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b)
return SQ_ERROR; return SQ_ERROR;
} }
SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c) SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,std::string_view &str)
{ {
SQObjectPtr *o = nullptr; SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_STRING,o); _GETSAFE_OBJ(v, idx, OT_STRING,o);
*c = _stringval(*o); str = _stringval(*o);
return SQ_OK; return SQ_OK;
} }

View File

@ -170,9 +170,9 @@ static SQInteger get_slice_params(HSQUIRRELVM v,SQInteger &sidx,SQInteger &eidx,
static SQInteger base_print(HSQUIRRELVM v) static SQInteger base_print(HSQUIRRELVM v)
{ {
const SQChar *str; std::string_view str;
sq_tostring(v,2); sq_tostring(v,2);
sq_getstring(v,-1,&str); sq_getstring(v,-1,str);
if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,str); if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,str);
return 0; return 0;
} }
@ -181,12 +181,12 @@ static SQInteger base_print(HSQUIRRELVM v)
static SQInteger base_compilestring(HSQUIRRELVM v) static SQInteger base_compilestring(HSQUIRRELVM v)
{ {
SQInteger nargs=sq_gettop(v); SQInteger nargs=sq_gettop(v);
const SQChar *src=nullptr,*name="unnamedbuffer"; std::string_view src, name="unnamedbuffer";
SQInteger size; SQInteger size;
sq_getstring(v,2,&src); sq_getstring(v,2,src);
size=sq_getsize(v,2); size=sq_getsize(v,2);
if(nargs>2){ if(nargs>2){
sq_getstring(v,3,&name); sq_getstring(v,3,name);
} }
if(SQ_SUCCEEDED(sq_compilebuffer(v,src,size,name,SQFalse))) if(SQ_SUCCEEDED(sq_compilebuffer(v,src,size,name,SQFalse)))
return 1; return 1;
@ -649,13 +649,13 @@ static SQInteger string_slice(HSQUIRRELVM v)
static SQInteger string_find(HSQUIRRELVM v) static SQInteger string_find(HSQUIRRELVM v)
{ {
SQInteger top,start_idx=0; SQInteger top,start_idx=0;
const SQChar *str,*substr,*ret; std::string_view str,substr;
if(((top=sq_gettop(v))>1) && SQ_SUCCEEDED(sq_getstring(v,1,&str)) && SQ_SUCCEEDED(sq_getstring(v,2,&substr))){ if(((top=sq_gettop(v))>1) && SQ_SUCCEEDED(sq_getstring(v,1,str)) && SQ_SUCCEEDED(sq_getstring(v,2,substr))){
if(top>2)sq_getinteger(v,3,&start_idx); if(top>2)sq_getinteger(v,3,&start_idx);
if((sq_getsize(v,1)>start_idx) && (start_idx>=0)){ if((sq_getsize(v,1)>start_idx) && (start_idx>=0)){
ret=strstr(&str[start_idx],substr); auto ret = str.find(substr, start_idx);
if(ret){ if(ret != std::string_view::npos){
sq_pushinteger(v,(SQInteger)(ret-str)); sq_pushinteger(v,static_cast<SQInteger>(ret));
return 1; return 1;
} }
} }

View File

@ -45,10 +45,10 @@ bool ScriptAdminMakeJSON(nlohmann::json &json, HSQUIRRELVM vm, SQInteger index,
} }
case OT_STRING: { case OT_STRING: {
const SQChar *buf; std::string_view view;
sq_getstring(vm, index, &buf); sq_getstring(vm, index, view);
json = std::string(buf); json = view;
return true; return true;
} }
@ -78,9 +78,9 @@ bool ScriptAdminMakeJSON(nlohmann::json &json, HSQUIRRELVM vm, SQInteger index,
sq_pushnull(vm); sq_pushnull(vm);
while (SQ_SUCCEEDED(sq_next(vm, index - 1))) { while (SQ_SUCCEEDED(sq_next(vm, index - 1))) {
sq_tostring(vm, -2); sq_tostring(vm, -2);
const SQChar *buf; std::string_view view;
sq_getstring(vm, -1, &buf); sq_getstring(vm, -1, view);
std::string key = std::string(buf); std::string key{view};
sq_pop(vm, 1); sq_pop(vm, 1);
nlohmann::json value; nlohmann::json value;

View File

@ -60,10 +60,10 @@ SQInteger ScriptText::_SetParam(int parameter, HSQUIRRELVM vm)
switch (sq_gettype(vm, -1)) { switch (sq_gettype(vm, -1)) {
case OT_STRING: { case OT_STRING: {
const SQChar *value; std::string_view view;
sq_getstring(vm, -1, &value); sq_getstring(vm, -1, view);
this->param[parameter] = StrMakeValid(value); this->param[parameter] = StrMakeValid(view);
break; break;
} }
@ -135,10 +135,10 @@ SQInteger ScriptText::_set(HSQUIRRELVM vm)
int32_t k; int32_t k;
if (sq_gettype(vm, 2) == OT_STRING) { if (sq_gettype(vm, 2) == OT_STRING) {
const SQChar *key_string; std::string_view view;
sq_getstring(vm, 2, &key_string); sq_getstring(vm, 2, view);
std::string str = StrMakeValid(key_string); std::string str = StrMakeValid(view);
if (!str.starts_with("param_") || str.size() > 8) return SQ_ERROR; if (!str.starts_with("param_") || str.size() > 8) return SQ_ERROR;
k = stoi(str.substr(6)); k = stoi(str.substr(6));

View File

@ -105,13 +105,13 @@ SQInteger ScriptInfo::AddSetting(HSQUIRRELVM vm)
/* Read the table, and find all properties we care about */ /* Read the table, and find all properties we care about */
sq_pushnull(vm); sq_pushnull(vm);
while (SQ_SUCCEEDED(sq_next(vm, -2))) { while (SQ_SUCCEEDED(sq_next(vm, -2))) {
const SQChar *key_string; std::string_view key_string;
if (SQ_FAILED(sq_getstring(vm, -2, &key_string))) return SQ_ERROR; if (SQ_FAILED(sq_getstring(vm, -2, key_string))) return SQ_ERROR;
std::string key = StrMakeValid(key_string); std::string key = StrMakeValid(key_string);
if (key == "name") { if (key == "name") {
const SQChar *sqvalue; std::string_view sqvalue;
if (SQ_FAILED(sq_getstring(vm, -1, &sqvalue))) return SQ_ERROR; if (SQ_FAILED(sq_getstring(vm, -1, sqvalue))) return SQ_ERROR;
/* Don't allow '=' and ',' in configure setting names, as we need those /* Don't allow '=' and ',' in configure setting names, as we need those
* 2 chars to nicely store the settings as a string. */ * 2 chars to nicely store the settings as a string. */
@ -120,8 +120,8 @@ SQInteger ScriptInfo::AddSetting(HSQUIRRELVM vm)
std::replace_if(config.name.begin(), config.name.end(), replace_with_underscore, '_'); std::replace_if(config.name.begin(), config.name.end(), replace_with_underscore, '_');
present.Set(ScriptConfigItemKey::Name); present.Set(ScriptConfigItemKey::Name);
} else if (key == "description") { } else if (key == "description") {
const SQChar *sqdescription; std::string_view sqdescription;
if (SQ_FAILED(sq_getstring(vm, -1, &sqdescription))) return SQ_ERROR; if (SQ_FAILED(sq_getstring(vm, -1, sqdescription))) return SQ_ERROR;
config.description = StrMakeValid(sqdescription); config.description = StrMakeValid(sqdescription);
present.Set(ScriptConfigItemKey::Description); present.Set(ScriptConfigItemKey::Description);
} else if (key == "min_value") { } else if (key == "min_value") {
@ -199,9 +199,9 @@ SQInteger ScriptInfo::AddSetting(HSQUIRRELVM vm)
SQInteger ScriptInfo::AddLabels(HSQUIRRELVM vm) SQInteger ScriptInfo::AddLabels(HSQUIRRELVM vm)
{ {
const SQChar *setting_name_str; std::string_view setting_name_view;
if (SQ_FAILED(sq_getstring(vm, -2, &setting_name_str))) return SQ_ERROR; if (SQ_FAILED(sq_getstring(vm, -2, setting_name_view))) return SQ_ERROR;
std::string setting_name = StrMakeValid(setting_name_str); std::string setting_name = StrMakeValid(setting_name_view);
ScriptConfigItem *config = nullptr; ScriptConfigItem *config = nullptr;
for (auto &item : this->config_list) { for (auto &item : this->config_list) {
@ -217,18 +217,18 @@ SQInteger ScriptInfo::AddLabels(HSQUIRRELVM vm)
/* Read the table and find all labels */ /* Read the table and find all labels */
sq_pushnull(vm); sq_pushnull(vm);
while (SQ_SUCCEEDED(sq_next(vm, -2))) { while (SQ_SUCCEEDED(sq_next(vm, -2))) {
const SQChar *key_string; std::string_view key_string;
const SQChar *label; std::string_view label;
if (SQ_FAILED(sq_getstring(vm, -2, &key_string))) return SQ_ERROR; if (SQ_FAILED(sq_getstring(vm, -2, key_string))) return SQ_ERROR;
if (SQ_FAILED(sq_getstring(vm, -1, &label))) return SQ_ERROR; if (SQ_FAILED(sq_getstring(vm, -1, label))) return SQ_ERROR;
/* Because squirrel doesn't support identifiers starting with a digit, /* Because squirrel doesn't support identifiers starting with a digit,
* we skip the first character. */ * we skip the first character. */
key_string++; key_string.remove_prefix(1);
int sign = 1; int sign = 1;
if (*key_string == '_') { if (key_string.starts_with('_')) {
/* When the second character is '_', it indicates the value is negative. */ /* When the second character is '_', it indicates the value is negative. */
sign = -1; sign = -1;
key_string++; key_string.remove_prefix(1);
} }
auto key = ParseInteger<int>(key_string); auto key = ParseInteger<int>(key_string);
if (!key.has_value()) return SQ_ERROR; if (!key.has_value()) return SQ_ERROR;

View File

@ -40,10 +40,10 @@ ScriptStorage::~ScriptStorage() = default;
* @param error_msg Is this an error message? * @param error_msg Is this an error message?
* @param message The actual message text. * @param message The actual message text.
*/ */
static void PrintFunc(bool error_msg, const std::string &message) static void PrintFunc(bool error_msg, std::string_view message)
{ {
/* Convert to OpenTTD internal capable string */ /* Convert to OpenTTD internal capable string */
ScriptController::Print(error_msg, message); ScriptController::Print(error_msg, std::string{message});
} }
ScriptInstance::ScriptInstance(std::string_view api_name) ScriptInstance::ScriptInstance(std::string_view api_name)
@ -383,9 +383,9 @@ static const SaveLoad _script_byte[] = {
_script_sl_byte = SQSL_STRING; _script_sl_byte = SQSL_STRING;
SlObject(nullptr, _script_byte); SlObject(nullptr, _script_byte);
} }
const SQChar *buf; std::string_view view;
sq_getstring(vm, index, &buf); sq_getstring(vm, index, view);
size_t len = strlen(buf) + 1; size_t len = view.size() + 1;
if (len >= 255) { if (len >= 255) {
ScriptLog::Error("Maximum string length is 254 chars. No data saved."); ScriptLog::Error("Maximum string length is 254 chars. No data saved.");
return false; return false;
@ -393,7 +393,7 @@ static const SaveLoad _script_byte[] = {
if (!test) { if (!test) {
_script_sl_byte = (uint8_t)len; _script_sl_byte = (uint8_t)len;
SlObject(nullptr, _script_byte); SlObject(nullptr, _script_byte);
SlCopy(const_cast<char *>(buf), len, SLE_CHAR); SlCopy(const_cast<char *>(view.data()), len, SLE_CHAR);
} }
return true; return true;
} }
@ -678,10 +678,10 @@ bool ScriptInstance::IsPaused()
case SQSL_INSTANCE: { case SQSL_INSTANCE: {
SQInteger top = sq_gettop(this->vm); SQInteger top = sq_gettop(this->vm);
LoadObjects(this->vm, this->data); LoadObjects(this->vm, this->data);
const SQChar *buf; std::string_view view;
sq_getstring(this->vm, -1, &buf); sq_getstring(this->vm, -1, view);
Squirrel *engine = static_cast<Squirrel *>(sq_getforeignptr(this->vm)); Squirrel *engine = static_cast<Squirrel *>(sq_getforeignptr(this->vm));
std::string class_name = fmt::format("{}{}", engine->GetAPIName(), buf); std::string class_name = fmt::format("{}{}", engine->GetAPIName(), view);
sq_pushroottable(this->vm); sq_pushroottable(this->vm);
sq_pushstring(this->vm, class_name); sq_pushstring(this->vm, class_name);
if (SQ_FAILED(sq_get(this->vm, -2))) throw Script_FatalError(fmt::format("'{}' doesn't exist", class_name)); if (SQ_FAILED(sq_get(this->vm, -2))) throw Script_FatalError(fmt::format("'{}' doesn't exist", class_name));

View File

@ -194,7 +194,7 @@ void Squirrel::CompileError(HSQUIRRELVM vm, const SQChar *desc, const SQChar *so
} }
} }
void Squirrel::ErrorPrintFunc(HSQUIRRELVM vm, const std::string &s) void Squirrel::ErrorPrintFunc(HSQUIRRELVM vm, std::string_view s)
{ {
/* Check if we have a custom print function */ /* Check if we have a custom print function */
SQPrintFunc *func = ((Squirrel *)sq_getforeignptr(vm))->print_func; SQPrintFunc *func = ((Squirrel *)sq_getforeignptr(vm))->print_func;
@ -205,7 +205,7 @@ void Squirrel::ErrorPrintFunc(HSQUIRRELVM vm, const std::string &s)
} }
} }
void Squirrel::RunError(HSQUIRRELVM vm, const SQChar *error) void Squirrel::RunError(HSQUIRRELVM vm, std::string_view error)
{ {
/* Set the print function to something that prints to stderr */ /* Set the print function to something that prints to stderr */
SQPRINTFUNCTION pf = sq_getprintfunc(vm); SQPRINTFUNCTION pf = sq_getprintfunc(vm);
@ -229,11 +229,11 @@ void Squirrel::RunError(HSQUIRRELVM vm, const SQChar *error)
SQInteger Squirrel::_RunError(HSQUIRRELVM vm) SQInteger Squirrel::_RunError(HSQUIRRELVM vm)
{ {
const SQChar *sErr = nullptr; std::string_view view;
if (sq_gettop(vm) >= 1) { if (sq_gettop(vm) >= 1) {
if (SQ_SUCCEEDED(sq_getstring(vm, -1, &sErr))) { if (SQ_SUCCEEDED(sq_getstring(vm, -1, view))) {
Squirrel::RunError(vm, sErr); Squirrel::RunError(vm, view);
return 0; return 0;
} }
} }
@ -242,7 +242,7 @@ SQInteger Squirrel::_RunError(HSQUIRRELVM vm)
return 0; return 0;
} }
void Squirrel::PrintFunc(HSQUIRRELVM vm, const std::string &s) void Squirrel::PrintFunc(HSQUIRRELVM vm, std::string_view s)
{ {
/* Check if we have a custom print function */ /* Check if we have a custom print function */
SQPrintFunc *func = ((Squirrel *)sq_getforeignptr(vm))->print_func; SQPrintFunc *func = ((Squirrel *)sq_getforeignptr(vm))->print_func;

View File

@ -26,7 +26,7 @@ class Squirrel {
friend class ScriptInstance; friend class ScriptInstance;
private: private:
typedef void (SQPrintFunc)(bool error_msg, const std::string &message); using SQPrintFunc = void (bool error_msg, std::string_view message);
HSQUIRRELVM vm; ///< The VirtualMachine instance for squirrel HSQUIRRELVM vm; ///< The VirtualMachine instance for squirrel
void *global_pointer; ///< Can be set by who ever initializes Squirrel void *global_pointer; ///< Can be set by who ever initializes Squirrel
@ -60,17 +60,17 @@ protected:
/** /**
* The RunError handler. * The RunError handler.
*/ */
static void RunError(HSQUIRRELVM vm, const SQChar *error); static void RunError(HSQUIRRELVM vm, std::string_view error);
/** /**
* If a user runs 'print' inside a script, this function gets the params. * If a user runs 'print' inside a script, this function gets the params.
*/ */
static void PrintFunc(HSQUIRRELVM vm, const std::string &s); static void PrintFunc(HSQUIRRELVM vm, std::string_view s);
/** /**
* If an error has to be print, this function is called. * If an error has to be print, this function is called.
*/ */
static void ErrorPrintFunc(HSQUIRRELVM vm, const std::string &s); static void ErrorPrintFunc(HSQUIRRELVM vm, std::string_view s);
public: public:
Squirrel(std::string_view api_name); Squirrel(std::string_view api_name);

View File

@ -110,9 +110,9 @@ namespace SQConvert {
/* Convert what-ever there is as parameter to a string */ /* Convert what-ever there is as parameter to a string */
sq_tostring(vm, index); sq_tostring(vm, index);
const SQChar *tmp; std::string_view view;
sq_getstring(vm, -1, &tmp); sq_getstring(vm, -1, view);
std::string result = StrMakeValid(tmp); std::string result = StrMakeValid(view);
sq_poptop(vm); sq_poptop(vm);
return result; return result;
} }

View File

@ -41,9 +41,9 @@ SQInteger SquirrelStd::max(HSQUIRRELVM vm)
SQInteger SquirrelStd::require(HSQUIRRELVM vm) SQInteger SquirrelStd::require(HSQUIRRELVM vm)
{ {
SQInteger top = sq_gettop(vm); SQInteger top = sq_gettop(vm);
const SQChar *filename; std::string_view filename;
sq_getstring(vm, 2, &filename); sq_getstring(vm, 2, filename);
/* Get the script-name of the current file, so we can work relative from it */ /* Get the script-name of the current file, so we can work relative from it */
SQStackInfos si; SQStackInfos si;