#ifndef __LUNA_STRINGUILTS_H #define __LUNA_STRINGUILTS_H enum { VNR_TEXT_CAPACITY = 1500 }; // estimated max number of bytes allowed in VNR, slightly larger than VNR's text limit (1000) template StringT stolower(StringT s) { std::transform(s.begin(), s.end(), s.begin(), tolower); return s; } LPCSTR reverse_search_begin(const char *s, int maxsize = VNR_TEXT_CAPACITY); bool all_ascii(const char *s, int maxsize = VNR_TEXT_CAPACITY); bool all_ascii(const wchar_t *s, int maxsize = VNR_TEXT_CAPACITY); void strReplace(std::string &str, const std::string &oldStr, const std::string &newStr); void strReplace(std::wstring &str, const std::wstring &oldStr, const std::wstring &newStr); std::vector strSplit(const std::string &s, const std::string &delim); std::vector strSplit(const std::wstring &s, const std::wstring &delim); bool startWith(const std::string &s, const std::string &s2); bool startWith(const std::wstring &s, const std::wstring &s2); bool endWith(const std::string &s, const std::string &s2); bool endWith(const std::wstring &s, const std::wstring &s2); std::wstring utf32_to_utf16(uint32_t *u32str, size_t size); std::basic_string utf16_to_utf32(const wchar_t *u16str, size_t size); std::string WideStringToString(const std::wstring &text, UINT cp = CP_UTF8); std::wstring StringToWideString(const std::string &text); std::optional StringToWideString(const std::string &text, UINT encoding); std::string wcasta(const std::wstring& x); std::wstring acastw(const std::string& x); size_t u32strlen(uint32_t *data); int utf8charlen(char *data); inline bool disable_mbwc = false; inline bool disable_wcmb = false; template inline void Trim(ST &text) { text.erase(text.begin(), std::find_if_not(text.begin(), text.end(), iswspace)); text.erase(std::find_if_not(text.rbegin(), text.rend(), iswspace).base(), text.end()); } template inline auto FormatArg(T arg) { return arg; } template inline auto FormatArg(const std::basic_string &arg) { return arg.c_str(); } #pragma warning(push) #pragma warning(disable : 4996) template inline std::string FormatString(const char *format, const Args &...args) { std::string buffer(snprintf(nullptr, 0, format, FormatArg(args)...), '\0'); sprintf(buffer.data(), format, FormatArg(args)...); return buffer; } template inline std::wstring FormatString(const wchar_t *format, const Args &...args) { std::wstring buffer(_snwprintf(nullptr, 0, format, FormatArg(args)...), L'\0'); _swprintf(buffer.data(), format, FormatArg(args)...); return buffer; } std::optional commonparsestring(void *, size_t, void *, DWORD); #pragma warning(pop) #endif