diff --git a/common/simpcfg.hpp b/common/simpcfg.hpp index 4358483a3..538c2f9b9 100644 --- a/common/simpcfg.hpp +++ b/common/simpcfg.hpp @@ -33,6 +33,7 @@ #include #include #include +#include #define SC_DEBUG @@ -74,6 +75,14 @@ size_t mbs_to_wcs(std::wstring &wDest, const std::string &sSrc) { return std::mbsrtowcs(wDest.data(), &sSrcP, wDest.length(), &mbState); } +void dumphex_string(const std::string &sIn, const std::string &msgTag){ + std::cout << msgTag << "[ "; + for(auto c: sIn) { + std::cout << std::format("{:02x}, ", (uint8_t)c); + } + std::cout << " ]" << std::endl; +} + // Remove chars from begin and end of the passed string, provided the char belongs // to one of the chars in trimChars. // NOTE: Chars being trimmed (ie trimChars) needs to be 1byte encoded chars. @@ -81,7 +90,10 @@ size_t mbs_to_wcs(std::wstring &wDest, const std::string &sSrc) { // trimmed are made up of 1byte encoded chars including in utf8 encoding space. // If the string being trimmed includes multibyte encoded characters at the end, // then trimming can mess things up. -std::string str_trim_dumb(std::string sin, const std::string &trimChars=" \t\n") { +template +TString str_trim_dumb(TString sin, const TString &trimChars=" \t\n") { + dumphex_string(sin, "DBUG:TrimDumb:Str:"); + dumphex_string(trimChars, "DBUG:TrimDumb:Tim:"); sin.erase(sin.find_last_not_of(trimChars)+1); sin.erase(0, sin.find_first_not_of(trimChars)); return sin; @@ -353,7 +365,7 @@ public: key = str_trim_single(key, "\""); std::string value = curL.substr(dPos+1); value = str_trim(value); - value = str_trim(value, ","); + value = str_trim(value, {","}); std::string vtype = "bool"; auto valueLower = str_tolower(value); if ((valueLower.compare("true") == 0) || (valueLower == "false")) { @@ -381,8 +393,6 @@ public: #ifdef SC_TEST_PRG -#include - void check_string() { std::vector vStandard = { "123", "1अ3" }; std::cout << "**** string **** " << vStandard.size() << std::endl; @@ -445,6 +455,21 @@ void check_wstring_cout() { } } +void check_nonenglish() { + std::vector vTest1 = { "\n\tAഅअಅ\n\t", "\n\tAഅअಅ " }; + for (auto sTest: vTest1) { + std::string sGotDumb = str_trim_dumb(sTest, {" \n\t"}); + std::string sGotOSmart = str_trim_oversmart(sTest, {" \n\t"}); + std::cout << std::format("{}: Test1[{}] Dumb[{}] OverSmart[{}]", __func__, sTest, sGotDumb, sGotOSmart) << std::endl; + } + std::vector vTest2 = { "\n\t this र remove 0s at end 000 ", "\n\tthis र remove 0s and अs at end 000रअ0अ "}; + for (auto sTest: vTest2) { + std::string sGotDumb = str_trim_dumb(sTest, {" \n\t0अ"}); + std::string sGotOSmart = str_trim_oversmart(sTest, {" \n\t0अ"}); + std::cout << std::format("{}: Test2[{}] Dumb[{}] OverSmart[{}]", __func__, sTest, sGotDumb, sGotOSmart) << std::endl; + } +} + void check_strings() { std::string sSavedLocale; SimpCfg::locale_prepare(sSavedLocale); @@ -452,6 +477,7 @@ void check_strings() { check_u8string(); //check_wstring_wcout(); check_wstring_cout(); + check_nonenglish(); SimpCfg::locale_restore(sSavedLocale); }