From c5d22e6a92be91fe30b1eda5a10edc218e3117d4 Mon Sep 17 00:00:00 2001 From: Dusan Milutinovic Date: Tue, 7 Apr 2020 15:02:28 +0200 Subject: [PATCH 1/4] Added some new stocks Added the following stocks: - IsStringNumber - IsStringFloat - StringToLowerCase - StringToUpperCase - IndexOfChar - LastIndexOfChar Tested: Test plugin source link: https://pastebin.com/QWXUy0ta Test results: https://i.imgur.com/NKhvsl4.png --- plugins/include/string.inc | 146 +++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/plugins/include/string.inc b/plugins/include/string.inc index 6fe84f3290..9acb10d8d0 100644 --- a/plugins/include/string.inc +++ b/plugins/include/string.inc @@ -557,3 +557,149 @@ stock int ImplodeStrings(const char[][] strings, int numStrings, const char[] jo } return total; } + +/** + * Checks if the given string is an integer (Supports negative values) + * + * @param szString Input string + * @return Boolean + */ +stock bool IsStringNumber(const char[] szString) +{ + int iIterator = 0; + int iLength = strlen(szString); + + char[] szTemporary = new char[iLength + 1]; + strcopy(szTemporary, iLength + 1, szString); + + TrimString(szTemporary); + + if (szTemporary[0] == '-' && iLength > 1) + ++iIterator; + + while (szTemporary[iIterator] && IsCharNumeric(szTemporary[iIterator])) + ++iIterator; + + return szTemporary[iIterator] == 0 && iIterator != 0; +} + +/** + * Converts the given string to lower case + * + * @param szString Input string for conversion and also the output + * @return void + */ +stock void StringToLowerCase(char[] szInput) +{ + int iIterator = 0; + int iLength = strlen(szInput); + char[] szOutput = new char[iLength + 1]; + + while (szInput[iIterator] != EOS) + { + if (!IsCharLower(szInput[iIterator]))szOutput[iIterator] = CharToLower(szInput[iIterator]); + else szOutput[iIterator] = szInput[iIterator]; + + iIterator++; + } + + szOutput[iIterator + 1] = EOS; + strcopy(szInput, iLength + 1, szOutput); +} + +/** + * Converts the given string to upper case + * + * @param szString Input string for conversion and also the output + * @return void + */ +stock void StringToUpperCase(char[] szInput) +{ + int iIterator = 0; + int iLength = strlen(szInput); + char[] szOutput = new char[iLength + 1]; + + while (szInput[iIterator] != EOS) + { + if (!IsCharUpper(szInput[iIterator]))szOutput[iIterator] = CharToUpper(szInput[iIterator]); + else szOutput[iIterator] = szInput[iIterator]; + + iIterator++; + } + + szOutput[iIterator + 1] = EOS; + strcopy(szInput, iLength + 1, szOutput); +} + +/** + * Checks if the given string is a float (Supports negative values) + * + * @param szString Input string + * @return Boolean + */ +stock bool IsStringFloat(const char[] szString) +{ + char cCharacter; + int iIterator; + int iP; + int iLength = strlen(szString); + + while (0 < szString[iIterator] <= 255) { + if (szString[0] == '-' && iLength > 1) { + iIterator++; + continue; + } + + cCharacter = szString[iIterator]; + + if (!IsCharNumeric(cCharacter)) { + if (cCharacter != '.' || iP) + return false; + + iP = 1; + } + + iIterator++; + } + + return (iIterator > 2); +} + +/** + * Finds the position (index) of character in the given string + * + * @param szString Input string + * @param szString Input character + * @param szString Do we need the last index (Optional, default: false) + * @return Integer, index of the found character (returns -1 if the character was not found) + */ +stock int IndexOfChar(const char[] szText, const char cCharacter, bool bLast = false) +{ + int iTextLength = strlen(szText); + int iCharacter, iLastIndex = -1; + + for (iCharacter = 0; iCharacter < iTextLength; iCharacter++) + { + if (szText[iCharacter] == cCharacter) + { + iLastIndex = iCharacter; + + if (!bLast) + break; + } + } + + return iLastIndex; +} + +/** + * Finds the last position (index) of character in the given string + * + * @param szString Input string + * @param szString Input character + * @return Integer, index of the found character. (returns -1 if the character was not found) + */ +stock int LastIndexOfChar(const char[] szText, const char cCharacter) +{ + return IndexOfChar(szText, cCharacter, true); +} From f817b9e0837bfef89d91eeb06fa01848b8e6e9fb Mon Sep 17 00:00:00 2001 From: Dusan Milutinovic Date: Tue, 7 Apr 2020 18:05:43 +0200 Subject: [PATCH 2/4] Removed unnecessary temporary variables. Removed unnecessary temporary variables. --- plugins/include/string.inc | 50 +++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/plugins/include/string.inc b/plugins/include/string.inc index 9acb10d8d0..4f59ea2850 100644 --- a/plugins/include/string.inc +++ b/plugins/include/string.inc @@ -591,20 +591,17 @@ stock bool IsStringNumber(const char[] szString) */ stock void StringToLowerCase(char[] szInput) { - int iIterator = 0; - int iLength = strlen(szInput); - char[] szOutput = new char[iLength + 1]; - - while (szInput[iIterator] != EOS) - { - if (!IsCharLower(szInput[iIterator]))szOutput[iIterator] = CharToLower(szInput[iIterator]); - else szOutput[iIterator] = szInput[iIterator]; - - iIterator++; - } - - szOutput[iIterator + 1] = EOS; - strcopy(szInput, iLength + 1, szOutput); + int iIterator = 0; + + while (szInput[iIterator] != EOS) + { + if (!IsCharLower(szInput[iIterator])) szInput[iIterator] = CharToLower(szInput[iIterator]); + else szInput[iIterator] = szInput[iIterator]; + + iIterator++; + } + + szInput[iIterator + 1] = EOS; } /** @@ -615,20 +612,17 @@ stock void StringToLowerCase(char[] szInput) */ stock void StringToUpperCase(char[] szInput) { - int iIterator = 0; - int iLength = strlen(szInput); - char[] szOutput = new char[iLength + 1]; - - while (szInput[iIterator] != EOS) - { - if (!IsCharUpper(szInput[iIterator]))szOutput[iIterator] = CharToUpper(szInput[iIterator]); - else szOutput[iIterator] = szInput[iIterator]; - - iIterator++; - } - - szOutput[iIterator + 1] = EOS; - strcopy(szInput, iLength + 1, szOutput); + int iIterator = 0; + + while (szInput[iIterator] != EOS) + { + if (!IsCharUpper(szInput[iIterator])) szInput[iIterator] = CharToUpper(szInput[iIterator]); + else szInput[iIterator] = szInput[iIterator]; + + iIterator++; + } + + szInput[iIterator + 1] = EOS; } /** From 224de895cbd51aca54d3f1606f7add9c553b227a Mon Sep 17 00:00:00 2001 From: Dusan Milutinovic Date: Sat, 11 Apr 2020 01:03:17 +0200 Subject: [PATCH 3/4] Update string.inc Changed IsStringNumber and IsStringFloat to wrap StringToIntEx and StringToFloatEx. Changed IndexOfChar to wrap FindCharInString. Added CopyC --- plugins/include/string.inc | 104 +++++++++++++------------------------ 1 file changed, 37 insertions(+), 67 deletions(-) diff --git a/plugins/include/string.inc b/plugins/include/string.inc index 4f59ea2850..6a832f8af5 100644 --- a/plugins/include/string.inc +++ b/plugins/include/string.inc @@ -564,23 +564,22 @@ stock int ImplodeStrings(const char[][] strings, int numStrings, const char[] jo * @param szString Input string * @return Boolean */ -stock bool IsStringNumber(const char[] szString) +stock bool IsStringNumber(const char[] str, int nBase=10) { - int iIterator = 0; - int iLength = strlen(szString); - - char[] szTemporary = new char[iLength + 1]; - strcopy(szTemporary, iLength + 1, szString); - - TrimString(szTemporary); - - if (szTemporary[0] == '-' && iLength > 1) - ++iIterator; - - while (szTemporary[iIterator] && IsCharNumeric(szTemporary[iIterator])) - ++iIterator; - - return szTemporary[iIterator] == 0 && iIterator != 0; + int result; + return StringToIntEx(str, result, nBase) == strlen(str); +} + +/** + * Checks if the given string is a float (Supports negative values) + * + * @param szString Input string + * @return Boolean + */ +stock bool IsStringFloat(const char[] str) +{ + float result; + return StringToFloatEx(str, result) == strlen(str) && FindCharInString(str, '.') != -1; } /** @@ -626,41 +625,7 @@ stock void StringToUpperCase(char[] szInput) } /** - * Checks if the given string is a float (Supports negative values) - * - * @param szString Input string - * @return Boolean - */ -stock bool IsStringFloat(const char[] szString) -{ - char cCharacter; - int iIterator; - int iP; - int iLength = strlen(szString); - - while (0 < szString[iIterator] <= 255) { - if (szString[0] == '-' && iLength > 1) { - iIterator++; - continue; - } - - cCharacter = szString[iIterator]; - - if (!IsCharNumeric(cCharacter)) { - if (cCharacter != '.' || iP) - return false; - - iP = 1; - } - - iIterator++; - } - - return (iIterator > 2); -} - -/** - * Finds the position (index) of character in the given string + * Finds the position (index) of character in the given string (A wrapper around FindCharInString) * * @param szString Input string * @param szString Input character @@ -669,25 +634,11 @@ stock bool IsStringFloat(const char[] szString) */ stock int IndexOfChar(const char[] szText, const char cCharacter, bool bLast = false) { - int iTextLength = strlen(szText); - int iCharacter, iLastIndex = -1; - - for (iCharacter = 0; iCharacter < iTextLength; iCharacter++) - { - if (szText[iCharacter] == cCharacter) - { - iLastIndex = iCharacter; - - if (!bLast) - break; - } - } - - return iLastIndex; + return FindCharInString(szText, cCharacter, bLast); } /** - * Finds the last position (index) of character in the given string + * Finds the last position (index) of character in the given string (A wrapper around IndexOfChar) * * @param szString Input string * @param szString Input character @@ -697,3 +648,22 @@ stock int LastIndexOfChar(const char[] szText, const char cCharacter) { return IndexOfChar(szText, cCharacter, true); } + +/** + * Copies the input string into the output string until it reaches the given character + * + * @param szInput Input string + * @param szOutput Output string + * @param iOutputLength Output max length + * @param cCharacter Character + * + * @return void +*/ +stock void CopyC(const char[] szInput, char[] szOutput, int iOutputLength, char cCharacter) { + int iInputIterator, iOutputIterator; + + while(szInput[iInputIterator] != EOS && iOutputIterator < iOutputLength && szInput[iInputIterator] != cCharacter) + szOutput[iOutputIterator ++] = szInput[iInputIterator ++]; + + szOutput[iOutputIterator] = EOS; +} From 45ce1d664b5d4c35b31fb2857fcb70fae8512bc5 Mon Sep 17 00:00:00 2001 From: Kyle Sanderson Date: Sun, 16 Aug 2020 16:41:48 -0700 Subject: [PATCH 4/4] string: normalize strings for SP. If the string has a floating point value or not, we can still store it in a float. No need to check the additional stocks, they're built-in. CopyC already exists, that's simply strcopy. --- plugins/include/string.inc | 57 ++++++++++---------------------------- 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/plugins/include/string.inc b/plugins/include/string.inc index 6a832f8af5..b757a1b677 100644 --- a/plugins/include/string.inc +++ b/plugins/include/string.inc @@ -579,7 +579,7 @@ stock bool IsStringNumber(const char[] str, int nBase=10) stock bool IsStringFloat(const char[] str) { float result; - return StringToFloatEx(str, result) == strlen(str) && FindCharInString(str, '.') != -1; + return StringToFloatEx(str, result) == strlen(str); } /** @@ -590,17 +590,13 @@ stock bool IsStringFloat(const char[] str) */ stock void StringToLowerCase(char[] szInput) { - int iIterator = 0; - - while (szInput[iIterator] != EOS) - { - if (!IsCharLower(szInput[iIterator])) szInput[iIterator] = CharToLower(szInput[iIterator]); - else szInput[iIterator] = szInput[iIterator]; - - iIterator++; - } - - szInput[iIterator + 1] = EOS; + int iIterator = 0; + + while (szInput[iIterator] != EOS) + { + szInput[iIterator] = CharToLower(szInput[iIterator]); + ++iIterator; + } } /** @@ -611,17 +607,13 @@ stock void StringToLowerCase(char[] szInput) */ stock void StringToUpperCase(char[] szInput) { - int iIterator = 0; - - while (szInput[iIterator] != EOS) - { - if (!IsCharUpper(szInput[iIterator])) szInput[iIterator] = CharToUpper(szInput[iIterator]); - else szInput[iIterator] = szInput[iIterator]; - - iIterator++; - } - - szInput[iIterator + 1] = EOS; + int iIterator = 0; + + while (szInput[iIterator] != EOS) + { + szInput[iIterator] = CharToUpper(szInput[iIterator]); + ++iIterator; + } } /** @@ -648,22 +640,3 @@ stock int LastIndexOfChar(const char[] szText, const char cCharacter) { return IndexOfChar(szText, cCharacter, true); } - -/** - * Copies the input string into the output string until it reaches the given character - * - * @param szInput Input string - * @param szOutput Output string - * @param iOutputLength Output max length - * @param cCharacter Character - * - * @return void -*/ -stock void CopyC(const char[] szInput, char[] szOutput, int iOutputLength, char cCharacter) { - int iInputIterator, iOutputIterator; - - while(szInput[iInputIterator] != EOS && iOutputIterator < iOutputLength && szInput[iInputIterator] != cCharacter) - szOutput[iOutputIterator ++] = szInput[iInputIterator ++]; - - szOutput[iOutputIterator] = EOS; -}