[Groonga-commit] groonga/grnxx at 06b56c0 [master] Update grnxx::OS.

Back to archive index

susumu.yata null+****@clear*****
Thu May 9 18:45:09 JST 2013


susumu.yata	2013-05-09 18:45:09 +0900 (Thu, 09 May 2013)

  New Revision: 06b56c0de49f4a6de0db82d72d026678dd7f9f9f
  https://github.com/groonga/grnxx/commit/06b56c0de49f4a6de0db82d72d026678dd7f9f9f

  Message:
    Update grnxx::OS.

  Modified files:
    lib/grnxx/os.cpp
    lib/grnxx/os.hpp
    test/test_os.cpp

  Modified: lib/grnxx/os.cpp (+27 -10)
===================================================================
--- lib/grnxx/os.cpp    2013-05-07 18:21:59 +0900 (8b66c9f)
+++ lib/grnxx/os.cpp    2013-05-09 18:45:09 +0900 (37300d2)
@@ -18,10 +18,10 @@
 #include "grnxx/os.hpp"
 
 #include <cstdlib>
+#include <cstring>
 #include <cerrno>
 
 #include "grnxx/error.hpp"
-#include "grnxx/exception.hpp"
 #include "grnxx/lock.hpp"
 #include "grnxx/logger.hpp"
 
@@ -36,28 +36,45 @@ uint64_t OS::get_page_size() {
   return page_size;
 }
 
-String OS::get_environment_variable(const char *name) {
+char *OS::get_environment_variable(const char *name) {
   if (!name) {
-    GRNXX_ERROR() << "invalid argument: name = " << name;
-    GRNXX_THROW();
+    GRNXX_ERROR() << "invalid argument: name = nullptr";
+    return nullptr;
   }
-
   static Mutex mutex(MUTEX_UNLOCKED);
   Lock lock(&mutex);
-
 #ifdef GRNXX_MSC
   char *value;
   size_t value_size;
   if (::_dupenv_s(&value, &value_size, name) != 0) {
     GRNXX_ERROR() << "failed to get environment variable: name = " << name
-                  << "'::_dupenv_s' " << Error(errno);
-    GRNXX_THROW();
+                  << ": '::_dupenv_s' " << Error(errno);
+    return nullptr;
+  }
+  char * const result = new (std::nothrow) char[value_size + 1];
+  if (!result) {
+    GRNXX_ERROR() << "new char[] failed: size = " << (value_size + 1);
+    std::free(value);
+    return nullptr;
   }
-  String result(value, value_size);
+  std::memcpy(result, value, value_size);
+  result[value_size] = '\0';
   std::free(value);
   return result;
 #else  // GRNXX_MSC
-  return std::getenv(name);
+  char * const value = std::getenv(name);
+  if (!value) {
+    return nullptr;
+  }
+  const size_t value_size = std::strlen(value);
+  char * const result = new (std::nothrow) char[value_size + 1];
+  if (!result) {
+    GRNXX_ERROR() << "new char[] failed: size = " << (value_size + 1);
+    return nullptr;
+  }
+  std::memcpy(result, value, value_size);
+  result[value_size] = '\0';
+  return result;
 #endif  // GRNXX_MSC
 }
 

  Modified: lib/grnxx/os.hpp (+2 -9)
===================================================================
--- lib/grnxx/os.hpp    2013-05-07 18:21:59 +0900 (53cf493)
+++ lib/grnxx/os.hpp    2013-05-09 18:45:09 +0900 (ee52c15)
@@ -19,21 +19,14 @@
 #define GRNXX_OS_HPP
 
 #include "grnxx/basic.hpp"
-#include "grnxx/string.hpp"
 
 namespace grnxx {
 
 class OS {
  public:
+  // Get the page size.
   static uint64_t get_page_size();
-
-  static String get_environment_variable(const char *name);
-
- private:
-  OS();
-
-  OS(const OS &);
-  OS &operator=(const OS &);
+  static char *get_environment_variable(const char *name);
 };
 
 }  // namespace grnxx

  Modified: test/test_os.cpp (+4 -4)
===================================================================
--- test/test_os.cpp    2013-05-07 18:21:59 +0900 (2e72db5)
+++ test/test_os.cpp    2013-05-09 18:45:09 +0900 (41ac09b)
@@ -27,10 +27,10 @@ int main() {
 
   GRNXX_NOTICE() << "page_size = " << grnxx::OS::get_page_size();
 
-  GRNXX_NOTICE() << "getenv(PATH) = "
-                 << grnxx::OS::get_environment_variable("PATH");
-  GRNXX_NOTICE() << "getenv(NO_SUCH_NAME) = "
-                 << grnxx::OS::get_environment_variable("NO_SUCH_NAME");
+  std::unique_ptr<char[]> env(grnxx::OS::get_environment_variable("PATH"));
+  GRNXX_NOTICE() << "getenv(PATH) = " << env.get();
+  env.reset(grnxx::OS::get_environment_variable("NO_SUCH_NAME"));
+  GRNXX_NOTICE() << "getenv(NO_SUCH_NAME) = " << env.get();
 
   return 0;
 }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index