Salome HOME
Merge branch 'V9_7_BR'
[modules/kernel.git] / src / Basics / Basics_Utils.cxx
index cd18da5fa8b631cd754d49e961e9afa80fb2273c..1d8fd16e0f7f6091deb400f0e953f76d1539deeb 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -83,13 +83,24 @@ namespace Kernel_Utils
 
   Localizer::Localizer()
   {
-    myCurLocale = setlocale(LC_NUMERIC, 0);
-    setlocale(LC_NUMERIC, "C");
+    init(LC_NUMERIC, "C");
+  }
+
+  Localizer::Localizer(int category, const char* locale)
+  {
+    init(category, locale);
+  }
+
+  void Localizer::init(int category, const char* locale)
+  {
+    myCategory = category;
+    myOriginalLocale = setlocale(category, NULL);
+    setlocale(category, locale);
   }
 
   Localizer::~Localizer()
   {
-    setlocale(LC_NUMERIC, myCurLocale.c_str());
+    setlocale(myCategory, myOriginalLocale.c_str());
   }
 
   std::string GetGUID( GUIDtype type )
@@ -108,7 +119,7 @@ namespace Kernel_Utils
 
   const wchar_t* decode(const char* encoded)
   {
-    setlocale(LC_ALL, "");
+    Localizer loc(LC_CTYPE, "");
     size_t length = strlen(encoded) + sizeof(char);
     wchar_t* decoded = new wchar_t[length];
     memset( decoded, '\0', length);
@@ -123,7 +134,7 @@ namespace Kernel_Utils
 
   const char* encode(const wchar_t* decoded)
   {
-    setlocale(LC_ALL, "");
+    Localizer loc(LC_CTYPE, "");
     size_t length = std::wcslen(decoded) + sizeof(wchar_t);
     char* encoded = new char[length];
     memset( encoded, '\0', length);
@@ -173,9 +184,9 @@ namespace Kernel_Utils
   char* utf8_encode(const wchar_t* encoded)
   {
          if (encoded == NULL) return NULL;
-         int size_needed = WideCharToMultiByte(CP_UTF8, 0, encoded, std::wcslen(encoded), NULL, 0, NULL, NULL);
+    auto size_needed = WideCharToMultiByte(CP_UTF8, 0, encoded, (int)std::wcslen(encoded), NULL, 0, NULL, NULL);
          char* strTo = new char[ size_needed + 1 ];
-         WideCharToMultiByte(CP_UTF8, 0, encoded, std::wcslen(encoded), strTo, size_needed, NULL, NULL);
+         WideCharToMultiByte(CP_UTF8, 0, encoded, (int)std::wcslen(encoded), strTo, size_needed, NULL, NULL);
          strTo[size_needed] = '\0';
          return strTo;
   }
@@ -183,9 +194,9 @@ namespace Kernel_Utils
   wchar_t* utf8_decode(const char* decoded)
   {
          if (decoded == NULL) return NULL;
-         int size_needed = MultiByteToWideChar(CP_UTF8, 0, decoded, strlen(decoded), NULL, 0);
+    auto size_needed = MultiByteToWideChar(CP_UTF8, 0, decoded, (int)strlen(decoded), NULL, 0);
          wchar_t* wstrTo = new wchar_t[ size_needed + 1 ];
-         MultiByteToWideChar(CP_UTF8, 0, decoded, strlen(decoded), wstrTo, size_needed);
+         MultiByteToWideChar(CP_UTF8, 0, decoded, (int)strlen(decoded), wstrTo, size_needed);
          wstrTo[size_needed] = '\0';
          return wstrTo;
   }