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