ICU_String.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "stdafx.h"
  2. #include "ICU_String.h"
  3. #include "Misc.h"
  4. CICU_String::CICU_String()
  5. {
  6. m_dllHandle = NULL;
  7. u_isUUppercase = NULL;
  8. u_tolower = NULL;
  9. u_toupper = NULL;
  10. u_strToLower = NULL;
  11. u_strToUpper = NULL;
  12. }
  13. CICU_String::~CICU_String()
  14. {
  15. if (m_dllHandle)
  16. {
  17. ::FreeLibrary(m_dllHandle);
  18. m_dllHandle = NULL;
  19. }
  20. }
  21. bool CICU_String::Load()
  22. {
  23. bool loaded = false;
  24. m_dllHandle = ::LoadLibrary(_T("icu.dll"));
  25. if (m_dllHandle != NULL)
  26. {
  27. u_isUUppercase = (bool(__cdecl*)(wchar_t c))GetProcAddress(m_dllHandle, "u_isUUppercase");
  28. u_tolower = (wchar_t(__cdecl*)(wchar_t c))GetProcAddress(m_dllHandle, "u_tolower");
  29. u_toupper = (wchar_t(__cdecl*)(wchar_t c))GetProcAddress(m_dllHandle, "u_toupper");
  30. u_strToLower = (int(__cdecl*)(wchar_t* dest, int destCapacity, const wchar_t* src, int srcLength, const char* locale, int* pErrorCode))GetProcAddress(m_dllHandle, "u_strToLower");
  31. u_strToUpper = (int(__cdecl*)(wchar_t* dest, int destCapacity, const wchar_t* src, int srcLength, const char* locale, int* pErrorCode))GetProcAddress(m_dllHandle, "u_strToUpper");
  32. Log(_T("Loaded icu.dll, this will be used for upper/lower case calls"));
  33. loaded = true;
  34. }
  35. else
  36. {
  37. Log(StrF(_T("Error loading icu.dll, LastError: %d"), ::GetLastError()));
  38. }
  39. return loaded;
  40. }
  41. bool CICU_String::IsUpperEx(wchar_t c)
  42. {
  43. if (m_dllHandle == NULL || u_tolower == NULL)
  44. {
  45. return ::isupper(c);
  46. }
  47. return u_isUUppercase(c);
  48. }
  49. wchar_t CICU_String::ToLowerEx(wchar_t c)
  50. {
  51. if (m_dllHandle == NULL || u_tolower == NULL)
  52. {
  53. return ::tolower(c);
  54. }
  55. return u_tolower(c);
  56. }
  57. wchar_t CICU_String::ToUpperEx(wchar_t c)
  58. {
  59. if (m_dllHandle == NULL || u_tolower == NULL)
  60. {
  61. return ::toupper(c);
  62. }
  63. return u_toupper(c);
  64. }
  65. CString CICU_String::ToLowerStringEx(CString source)
  66. {
  67. if (m_dllHandle == NULL || u_tolower == NULL)
  68. {
  69. return CString(source).MakeLower();
  70. }
  71. CString dest;
  72. int length = source.GetLength();
  73. int errorCode = 0;
  74. u_strToLower(dest.GetBufferSetLength((int)(length * 1.2)), (int)(length * 1.2), source.GetBuffer(), length, NULL, &errorCode);
  75. source.ReleaseBuffer();
  76. dest.ReleaseBuffer();
  77. return dest;
  78. }
  79. CString CICU_String::ToUpperStringEx(CString source)
  80. {
  81. if (m_dllHandle == NULL || u_tolower == NULL)
  82. {
  83. return CString(source).MakeUpper();
  84. }
  85. CString dest;
  86. int length = source.GetLength();
  87. int errorCode = 0;
  88. u_strToUpper(dest.GetBufferSetLength((int)(length * 1.2)), (int)(length * 1.2), source.GetBuffer(), length, NULL, &errorCode);
  89. source.ReleaseBuffer();
  90. dest.ReleaseBuffer();
  91. return dest;
  92. }