| /*============================================================================ |
| KWSys - Kitware System Library |
| Copyright 2000-2009 Kitware, Inc., Insight Software Consortium |
| |
| Distributed under the OSI-approved BSD License (the "License"); |
| see accompanying file Copyright.txt for details. |
| |
| This software is distributed WITHOUT ANY WARRANTY; without even the |
| implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the License for more information. |
| ============================================================================*/ |
| |
| #ifdef __osf__ |
| # define _OSF_SOURCE |
| # define _POSIX_C_SOURCE 199506L |
| # define _XOPEN_SOURCE_EXTENDED |
| #endif |
| |
| #include "kwsysPrivate.h" |
| #include KWSYS_HEADER(Encoding.hxx) |
| #include KWSYS_HEADER(Encoding.h) |
| #include KWSYS_HEADER(stl/vector) |
| |
| // Work-around CMake dependency scanning limitation. This must |
| // duplicate the above list of headers. |
| #if 0 |
| # include "Encoding.hxx.in" |
| # include "Encoding.h.in" |
| #endif |
| |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #ifdef _MSC_VER |
| # pragma warning (disable: 4786) |
| #endif |
| |
| // Windows API. |
| #if defined(_WIN32) |
| # include <windows.h> |
| #endif |
| |
| namespace KWSYS_NAMESPACE |
| { |
| |
| Encoding::CommandLineArguments |
| Encoding::CommandLineArguments::Main(int argc, char const* const* argv) |
| { |
| #ifdef _WIN32 |
| (void) argc; |
| (void) argv; |
| |
| int ac; |
| LPWSTR* w_av = CommandLineToArgvW(GetCommandLineW(), &ac); |
| |
| std::vector<std::string> av1(ac); |
| std::vector<char const*> av2(ac); |
| for(int i=0; i<ac; i++) |
| { |
| av1[i] = ToNarrow(w_av[i]); |
| av2[i] = av1[i].c_str(); |
| } |
| LocalFree(w_av); |
| return CommandLineArguments(ac, &av2[0]); |
| #else |
| return CommandLineArguments(argc, argv); |
| #endif |
| } |
| |
| Encoding::CommandLineArguments::CommandLineArguments(int ac, |
| char const* const* av) |
| { |
| this->argv_.resize(ac+1); |
| for(int i=0; i<ac; i++) |
| { |
| this->argv_[i] = strdup(av[i]); |
| } |
| this->argv_[ac] = 0; |
| } |
| |
| Encoding::CommandLineArguments::CommandLineArguments(int ac, |
| wchar_t const* const* av) |
| { |
| this->argv_.resize(ac+1); |
| for(int i=0; i<ac; i++) |
| { |
| this->argv_[i] = kwsysEncoding_DupToNarrow(av[i]); |
| } |
| this->argv_[ac] = 0; |
| } |
| |
| Encoding::CommandLineArguments::~CommandLineArguments() |
| { |
| for(size_t i=0; i<this->argv_.size(); i++) |
| { |
| free(argv_[i]); |
| } |
| } |
| |
| Encoding::CommandLineArguments:: |
| CommandLineArguments(const CommandLineArguments& other) |
| { |
| this->argv_.resize(other.argv_.size()); |
| for(size_t i=0; i<this->argv_.size(); i++) |
| { |
| this->argv_[i] = other.argv_[i] ? strdup(other.argv_[i]) : 0; |
| } |
| } |
| |
| Encoding::CommandLineArguments& |
| Encoding::CommandLineArguments::operator=(const CommandLineArguments& other) |
| { |
| size_t i; |
| for(i=0; i<this->argv_.size(); i++) |
| { |
| free(this->argv_[i]); |
| } |
| |
| this->argv_.resize(other.argv_.size()); |
| for(i=0; i<this->argv_.size(); i++) |
| { |
| this->argv_[i] = other.argv_[i] ? strdup(other.argv_[i]) : 0; |
| } |
| |
| return *this; |
| } |
| |
| int Encoding::CommandLineArguments::argc() const |
| { |
| return static_cast<int>(this->argv_.size() - 1); |
| } |
| |
| char const* const* Encoding::CommandLineArguments::argv() const |
| { |
| return &this->argv_[0]; |
| } |
| |
| #if KWSYS_STL_HAS_WSTRING |
| |
| kwsys_stl::wstring Encoding::ToWide(const kwsys_stl::string& str) |
| { |
| return ToWide(str.c_str()); |
| } |
| |
| kwsys_stl::string Encoding::ToNarrow(const kwsys_stl::wstring& str) |
| { |
| return ToNarrow(str.c_str()); |
| } |
| |
| kwsys_stl::wstring Encoding::ToWide(const char* cstr) |
| { |
| kwsys_stl::wstring wstr; |
| size_t length = kwsysEncoding_mbstowcs(0, cstr, 0) + 1; |
| if(length > 0) |
| { |
| kwsys_stl::vector<wchar_t> wchars(length); |
| if(kwsysEncoding_mbstowcs(&wchars[0], cstr, length) > 0) |
| { |
| wstr = &wchars[0]; |
| } |
| } |
| return wstr; |
| } |
| |
| kwsys_stl::string Encoding::ToNarrow(const wchar_t* wcstr) |
| { |
| kwsys_stl::string str; |
| size_t length = kwsysEncoding_wcstombs(0, wcstr, 0) + 1; |
| if(length > 0) |
| { |
| std::vector<char> chars(length); |
| if(kwsysEncoding_wcstombs(&chars[0], wcstr, length) > 0) |
| { |
| str = &chars[0]; |
| } |
| } |
| return str; |
| } |
| #endif // KWSYS_STL_HAS_WSTRING |
| |
| } // namespace KWSYS_NAMESPACE |