diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/llsingleton.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/llstring.cpp | 59 | ||||
| -rw-r--r-- | indra/llcommon/llstring.h | 29 | ||||
| -rw-r--r-- | indra/llcommon/tests/llsingleton_test.cpp | 6 | 
6 files changed, 95 insertions, 5 deletions
| diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index fa9c6eaa79..7ba937a909 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -3,6 +3,7 @@  project(llcommon)  include(00-Common) +include(ICU4C)  include(LLCommon)  include(bugsplat)  include(Linking) @@ -276,6 +277,7 @@ target_link_libraries(          ll::uriparser          ll::oslibraries          ll::tracy +        ll::icu4c      )  target_include_directories(llcommon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 966ce03296..fd878f20ad 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -92,7 +92,7 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>      LLSINGLETON(LLCoros);      ~LLCoros(); -    void cleanupSingleton(); +    void cleanupSingleton() override;  public:      /// The viewer's use of the term "coroutine" became deeply embedded before      /// the industry term "fiber" emerged to distinguish userland threads from diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 51ef514cf7..cbe5ab6406 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -802,7 +802,7 @@ public:  private:                                                                \      /* implement LLSingleton pure virtual method whose sole purpose */  \      /* is to remind people to use this macro */                         \ -    virtual void you_must_use_LLSINGLETON_macro() {}                    \ +    virtual void you_must_use_LLSINGLETON_macro() override {}                    \      friend class LLSingleton<DERIVED_CLASS>;                            \      DERIVED_CLASS(__VA_ARGS__) diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index f6629803ee..81b0207038 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -30,6 +30,7 @@  #include "llerror.h"  #include "llfasttimer.h"  #include "llsd.h" +#include <unicode/uchar.h>  #include <vector>  #if LL_WINDOWS @@ -364,6 +365,30 @@ S32 wchar_utf8_length(const llwchar wc)  	}  } +std::string wchar_utf8_preview(const llwchar wc) +{ +    std::ostringstream oss; +    oss << std::hex << std::uppercase << (U32)wc; + +    U8 out_bytes[8]; +    U32 size = (U32)wchar_to_utf8chars(wc, (char*)out_bytes); + +    if (size > 1) +    { +        oss << " ["; +        for (U32 i = 0; i < size; ++i) +        { +            if (i) +            { +                oss << ", "; +            } +            oss << (int)out_bytes[i]; +        } +        oss << "]"; +    } + +    return oss.str(); +}  S32 wstring_utf8_length(const LLWString& wstr)  { @@ -833,6 +858,40 @@ std::string LLStringOps::sDayFormat;  std::string LLStringOps::sAM;  std::string LLStringOps::sPM; +// static +bool LLStringOps::isEmoji(llwchar wch) +{ +	int ublock = ublock_getCode(wch); +	switch (ublock) +	{ +		case UBLOCK_GENERAL_PUNCTUATION: +		case UBLOCK_LETTERLIKE_SYMBOLS: +		case UBLOCK_ARROWS: +		case UBLOCK_MISCELLANEOUS_TECHNICAL: +		case UBLOCK_ENCLOSED_ALPHANUMERICS: +		case UBLOCK_GEOMETRIC_SHAPES: +		case UBLOCK_MISCELLANEOUS_SYMBOLS: +		case UBLOCK_DINGBATS: +		case UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION: +		case UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS: +		case UBLOCK_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS: +		case UBLOCK_EMOTICONS: +		case UBLOCK_TRANSPORT_AND_MAP_SYMBOLS: +#if U_ICU_VERSION_MAJOR_NUM > 56 +		// Boost uses ICU so we can't update it independently +		case UBLOCK_SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS: +#endif // U_ICU_VERSION_MAJOR_NUM > 56 +			return true; +		default: +#if U_ICU_VERSION_MAJOR_NUM > 56 +			return false; +#else +			// See https://en.wikipedia.org/wiki/Supplemental_Symbols_and_Pictographs +			return wch >= 0x1F900 && wch <= 0x1F9FF; +#endif // U_ICU_VERSION_MAJOR_NUM > 56 +	} +} +  S32	LLStringOps::collate(const llwchar* a, const llwchar* b)  {  diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 1fd6cac14a..8def59ed7f 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -189,6 +189,8 @@ public:  	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }  	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; } +	static bool isEmoji(llwchar wch); +  	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }  	static S32	collate(const llwchar* a, const llwchar* b); @@ -355,6 +357,8 @@ public:  	static void	replaceNonstandardASCII( string_type& string, T replacement );  	static void	replaceChar( string_type& string, T target, T replacement );  	static void replaceString( string_type& string, string_type target, string_type replacement ); +	static string_type capitalize(const string_type& str); +	static void capitalize(string_type& str);  	static BOOL	containsNonprintable(const string_type& string);  	static void	stripNonprintable(string_type& string); @@ -678,6 +682,8 @@ LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr);  // Length in bytes of this wide char in a UTF8 string  LL_COMMON_API S32 wchar_utf8_length(const llwchar wc);  +LL_COMMON_API std::string wchar_utf8_preview(const llwchar wc); +  LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);  // Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string. @@ -1594,6 +1600,29 @@ void LLStringUtilBase<T>::replaceTabsWithSpaces( string_type& str, size_type spa  }  //static +template<class T> +std::basic_string<T> LLStringUtilBase<T>::capitalize(const string_type& str) +{ +	string_type result(str); +	capitalize(result); +	return result; +} + +//static +template<class T> +void LLStringUtilBase<T>::capitalize(string_type& str) +{ +	if (str.size()) +	{ +		auto last = str[0] = toupper(str[0]); +		for (U32 i = 1; i < str.size(); ++i) +		{ +			last = (last == ' ' || last == '-' || last == '_') ? str[i] = toupper(str[i]) : str[i]; +		} +	} +} + +//static  template<class T>   BOOL LLStringUtilBase<T>::containsNonprintable(const string_type& string)  { diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp index 15ffe68e67..6f8aaaa0cb 100644 --- a/indra/llcommon/tests/llsingleton_test.cpp +++ b/indra/llcommon/tests/llsingleton_test.cpp @@ -47,8 +47,8 @@ public:                                             \          DEP_INIT  /* dependency in initSingleton */ \      } sDepFlag;                                     \                                                      \ -    void initSingleton();                           \ -    void cleanupSingleton();                        \ +    void initSingleton() override;                  \ +    void cleanupSingleton() override;               \  };                                                  \                                                      \  CLS::dep_flag CLS::sDepFlag = DEP_NONE @@ -300,7 +300,7 @@ namespace tut      {          LLSINGLETON_EMPTY_CTOR(CircularPInit);      public: -        virtual void initSingleton() +        virtual void initSingleton() override          {              // never mind indirection, just go straight for the circularity              CircularPInit *pt = getInstance(); | 
