Salome HOME
Merge Python 3 porting: additional chnages.
[modules/kernel.git] / src / Basics / Basics_Utils.cxx
index 77eaacc1962a41feb31412974193eead9eccebee..97d6c0b5fbb247d508ded5b24980f8caebaa6e4f 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  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
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -35,6 +35,7 @@
 
 namespace Kernel_Utils
 {
+  // threadsafe
   std::string GetHostname()
   {
     int ls = 100, r = 1;
@@ -44,7 +45,7 @@ namespace Kernel_Utils
       {
         ls *= 2;
         s = new char[ls];
-        r = gethostname(s, ls-1);
+        r = gethostname(s, ls-1);//threadsafe see man 7 pthread
         switch (r) 
           {
           case 0:
@@ -105,6 +106,36 @@ namespace Kernel_Utils
     return guid;
   }
 
+  const wchar_t* decode(const char* encoded)
+  {
+    setlocale(LC_ALL, "");
+    size_t length = strlen(encoded) + sizeof(char);
+    wchar_t* decoded = new wchar_t[length];
+    memset( decoded, '\0', length);
+    mbstowcs(decoded, encoded, length);
+    return decoded;
+  }
+
+  const wchar_t* decode_s(std::string encoded)
+  {
+    return decode(encoded.c_str());
+  }
+
+  const char* encode(const wchar_t* decoded)
+  {
+    setlocale(LC_ALL, "");
+    size_t length = std::wcslen(decoded) + sizeof(wchar_t);
+    char* encoded = new char[length];
+    memset( encoded, '\0', length);
+    wcstombs(encoded, decoded, length);
+    return encoded;
+  }
+
+  std::string encode_s(const wchar_t* decoded)
+  {
+    return std::string(encode(decoded));
+  }
+
 #ifndef WIN32
   void print_traceback()
   {
@@ -123,6 +154,18 @@ namespace Kernel_Utils
 
     free (strings);
   }
+#else
+  #if (_MSC_VER >= 1400) // Visual Studio 2005
+  #include <sstream>
+  int setenv(const char *name, const char *value, int rewrite)\r
+  {\r
+    std::stringstream sstr;\r
+    sstr<<name<<'='<<value;\r
+    if(rewrite || std::string(getenv(name)).length() == 0)\r
+      return _putenv(sstr.str().c_str());\r
+    else return -1;\r
+  }
+  #endif
 #endif
 
 }