diff --git a/artifacts/scripting/headers/sfall.h b/artifacts/scripting/headers/sfall.h index a6abce18..1961b7ba 100644 --- a/artifacts/scripting/headers/sfall.h +++ b/artifacts/scripting/headers/sfall.h @@ -323,10 +323,10 @@ #define string_compare(str1, str2) sfall_func2("string_compare", str1, str2) #define string_compare_locale(str1, str2, codePage) sfall_func3("string_compare", str1, str2, codePage) #define string_format(format, a1, a2) sfall_func3("string_format", format, a1, a2) +#define string_tolower(text) sfall_func2("string_to_case", text, 0) +#define string_toupper(text) sfall_func2("string_to_case", text, 1) #define tile_by_position(x, y) sfall_func2("tile_by_position", x, y) #define tile_refresh_display sfall_func0("tile_refresh_display") -#define tolower(text) sfall_func1("tolower", text) -#define toupper(text) sfall_func1("toupper", text) #define unjam_lock(obj) sfall_func1("unjam_lock", obj) #define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1) #define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot) diff --git a/artifacts/scripting/sfall function notes.txt b/artifacts/scripting/sfall function notes.txt index 6ae70aa6..51c3b0be 100644 --- a/artifacts/scripting/sfall function notes.txt +++ b/artifacts/scripting/sfall function notes.txt @@ -697,13 +697,9 @@ optional argument: - returns the tile number at the x, y position relative to the top-left corner of the screen - if the position is outside of the range of tiles, it will return -1 -> string sfall_func1("tolower", string text) -- converts all uppercase letters in the given string to lowercase -- returns -1 on argument error - -> string sfall_func1("toupper", string text) -- converts all lowercase letters in the given string to uppercase -- returns -1 on argument error +> string sfall_func2("string_to_case", string text, int toCase) +- converts all letters in the given string to the specified case +- toCase: 0 - lowercase, 1 - uppercase ------------------------ ------ MORE INFO ------- diff --git a/sfall/Modules/Scripting/Handlers/Metarule.cpp b/sfall/Modules/Scripting/Handlers/Metarule.cpp index f93744f8..8b44c3a8 100644 --- a/sfall/Modules/Scripting/Handlers/Metarule.cpp +++ b/sfall/Modules/Scripting/Handlers/Metarule.cpp @@ -134,10 +134,9 @@ static const SfallMetarule metarules[] = { {"spatial_radius", sf_spatial_radius, 1, 1, 0, {ARG_OBJECT}}, {"string_compare", sf_string_compare, 2, 3, 0, {ARG_STRING, ARG_STRING, ARG_INT}}, {"string_format", sf_string_format, 2, 5, 0, {ARG_STRING, ARG_ANY, ARG_ANY, ARG_ANY, ARG_ANY}}, + {"string_to_case", sf_string_to_case, 2, 2, -1, {ARG_STRING, ARG_INT}}, {"tile_by_position", sf_tile_by_position, 2, 2, -1, {ARG_INT, ARG_INT}}, {"tile_refresh_display", sf_tile_refresh_display, 0, 0}, - {"tolower", sf_tolower, 1, 1, -1, {ARG_STRING}}, - {"toupper", sf_toupper, 1, 1, -1, {ARG_STRING}}, {"unjam_lock", sf_unjam_lock, 1, 1, -1, {ARG_OBJECT}}, {"unwield_slot", sf_unwield_slot, 2, 2, -1, {ARG_OBJECT, ARG_INT}}, #ifndef NDEBUG diff --git a/sfall/Modules/Scripting/Handlers/Utils.cpp b/sfall/Modules/Scripting/Handlers/Utils.cpp index 4b7604d3..5948fb74 100644 --- a/sfall/Modules/Scripting/Handlers/Utils.cpp +++ b/sfall/Modules/Scripting/Handlers/Utils.cpp @@ -466,29 +466,16 @@ void sf_get_text_width(OpcodeContext& ctx) { ctx.setReturn(fo::GetTextWidth(ctx.arg(0).strValue())); } -static char* cstrdup(const char* str) { - size_t len = strlen(str); - const size_t bufMaxLen = ScriptExtender::TextBufferSize() - 1; - if (len > bufMaxLen) len = bufMaxLen; +static std::string strToCase; - if (len) memcpy(ScriptExtender::gTextBuffer, str, len); - ScriptExtender::gTextBuffer[len] = '\0'; +void sf_string_to_case(OpcodeContext& ctx) { + strToCase = ctx.arg(0).strValue(); + if (ctx.arg(1).rawValue()) + std::transform(strToCase.begin(), strToCase.end(), strToCase.begin(), ::toupper); + else + std::transform(strToCase.begin(), strToCase.end(), strToCase.begin(), ::tolower); - return ScriptExtender::gTextBuffer; -} - -void sf_tolower(OpcodeContext& ctx) { - auto str = std::string(ctx.arg(0).strValue()); - std::transform(str.begin(), str.end(), str.begin(), ::tolower); - - ctx.setReturn(cstrdup(str.c_str())); -} - -void sf_toupper(OpcodeContext& ctx) { - auto str = std::string(ctx.arg(0).strValue()); - std::transform(str.begin(), str.end(), str.begin(), ::toupper); - - ctx.setReturn(cstrdup(str.c_str())); + ctx.setReturn(strToCase.c_str()); } } diff --git a/sfall/Modules/Scripting/Handlers/Utils.h b/sfall/Modules/Scripting/Handlers/Utils.h index a5198a48..d9b238da 100644 --- a/sfall/Modules/Scripting/Handlers/Utils.h +++ b/sfall/Modules/Scripting/Handlers/Utils.h @@ -77,9 +77,7 @@ void sf_get_string_pointer(OpcodeContext&); void sf_get_text_width(OpcodeContext&); -void sf_tolower(OpcodeContext&); - -void sf_toupper(OpcodeContext&); +void sf_string_to_case(OpcodeContext&); } }