Merge branch 'upstream-kwsys' into update-kwsys

This commit is contained in:
Brad King 2013-11-25 11:19:42 -05:00
commit f668112039
15 changed files with 982 additions and 171 deletions

View File

@ -115,6 +115,7 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
SET(KWSYS_USE_Base64 1) SET(KWSYS_USE_Base64 1)
SET(KWSYS_USE_Directory 1) SET(KWSYS_USE_Directory 1)
SET(KWSYS_USE_DynamicLoader 1) SET(KWSYS_USE_DynamicLoader 1)
SET(KWSYS_USE_Encoding 1)
SET(KWSYS_USE_Glob 1) SET(KWSYS_USE_Glob 1)
SET(KWSYS_USE_MD5 1) SET(KWSYS_USE_MD5 1)
SET(KWSYS_USE_Process 1) SET(KWSYS_USE_Process 1)
@ -125,6 +126,7 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
SET(KWSYS_USE_FundamentalType 1) SET(KWSYS_USE_FundamentalType 1)
SET(KWSYS_USE_Terminal 1) SET(KWSYS_USE_Terminal 1)
SET(KWSYS_USE_IOStream 1) SET(KWSYS_USE_IOStream 1)
SET(KWSYS_USE_FStream 1)
SET(KWSYS_USE_String 1) SET(KWSYS_USE_String 1)
SET(KWSYS_USE_SystemInformation 1) SET(KWSYS_USE_SystemInformation 1)
SET(KWSYS_USE_CPU 1) SET(KWSYS_USE_CPU 1)
@ -133,18 +135,32 @@ ENDIF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
# Enforce component dependencies. # Enforce component dependencies.
IF(KWSYS_USE_SystemTools) IF(KWSYS_USE_SystemTools)
SET(KWSYS_USE_Directory 1) SET(KWSYS_USE_Directory 1)
SET(KWSYS_USE_FStream 1)
SET(KWSYS_USE_Encoding 1)
ENDIF(KWSYS_USE_SystemTools) ENDIF(KWSYS_USE_SystemTools)
IF(KWSYS_USE_Glob) IF(KWSYS_USE_Glob)
SET(KWSYS_USE_Directory 1) SET(KWSYS_USE_Directory 1)
SET(KWSYS_USE_SystemTools 1) SET(KWSYS_USE_SystemTools 1)
SET(KWSYS_USE_RegularExpression 1) SET(KWSYS_USE_RegularExpression 1)
SET(KWSYS_USE_FStream 1)
SET(KWSYS_USE_Encoding 1)
ENDIF(KWSYS_USE_Glob) ENDIF(KWSYS_USE_Glob)
IF(KWSYS_USE_Process) IF(KWSYS_USE_Process)
SET(KWSYS_USE_System 1) SET(KWSYS_USE_System 1)
SET(KWSYS_USE_Encoding 1)
ENDIF(KWSYS_USE_Process) ENDIF(KWSYS_USE_Process)
IF(KWSYS_USE_SystemInformation) IF(KWSYS_USE_SystemInformation)
SET(KWSYS_USE_Process 1) SET(KWSYS_USE_Process 1)
ENDIF(KWSYS_USE_SystemInformation) ENDIF(KWSYS_USE_SystemInformation)
IF(KWSYS_USE_System)
SET(KWSYS_USE_Encoding 1)
ENDIF(KWSYS_USE_System)
IF(KWSYS_USE_Directory)
SET(KWSYS_USE_Encoding 1)
ENDIF(KWSYS_USE_Directory)
IF(KWSYS_USE_FStream)
SET(KWSYS_USE_Encoding 1)
ENDIF(KWSYS_USE_FStream)
# Setup the large file support default. # Setup the large file support default.
IF(KWSYS_LFS_DISABLE) IF(KWSYS_LFS_DISABLE)
@ -153,6 +169,11 @@ ELSE(KWSYS_LFS_DISABLE)
SET(KWSYS_LFS_REQUESTED 1) SET(KWSYS_LFS_REQUESTED 1)
ENDIF(KWSYS_LFS_DISABLE) ENDIF(KWSYS_LFS_DISABLE)
# Specify default 8 bit encoding for Windows
IF(NOT KWSYS_ENCODING_DEFAULT_CODEPAGE)
SET(KWSYS_ENCODING_DEFAULT_CODEPAGE CP_ACP)
ENDIF(NOT KWSYS_ENCODING_DEFAULT_CODEPAGE)
# Enable testing if building standalone. # Enable testing if building standalone.
IF(KWSYS_STANDALONE) IF(KWSYS_STANDALONE)
INCLUDE(Dart) INCLUDE(Dart)
@ -509,6 +530,12 @@ IF(KWSYS_USE_FundamentalType)
"Checking whether char is signed" DIRECT) "Checking whether char is signed" DIRECT)
ENDIF(KWSYS_USE_FundamentalType) ENDIF(KWSYS_USE_FundamentalType)
IF(KWSYS_USE_Encoding)
# Look for type size helper macros.
KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_WSTRING
"Checking whether wstring is available" DIRECT)
ENDIF(KWSYS_USE_Encoding)
IF(KWSYS_USE_IOStream) IF(KWSYS_USE_IOStream)
# Determine whether iostreams support long long. # Determine whether iostreams support long long.
SET(KWSYS_PLATFORM_CXX_TEST_DEFINES SET(KWSYS_PLATFORM_CXX_TEST_DEFINES
@ -864,8 +891,8 @@ SET(KWSYS_HXX_FILES Configure String
# Add selected C++ classes. # Add selected C++ classes.
SET(cppclasses SET(cppclasses
Directory DynamicLoader Glob RegularExpression SystemTools Directory DynamicLoader Encoding Glob RegularExpression SystemTools
CommandLineArguments IOStream SystemInformation CommandLineArguments IOStream FStream SystemInformation
) )
FOREACH(cpp ${cppclasses}) FOREACH(cpp ${cppclasses})
IF(KWSYS_USE_${cpp}) IF(KWSYS_USE_${cpp})
@ -881,7 +908,7 @@ ENDFOREACH(cpp)
# Add selected C components. # Add selected C components.
FOREACH(c FOREACH(c
Process Base64 FundamentalType MD5 Terminal System String CPU Process Base64 Encoding FundamentalType MD5 Terminal System String CPU
) )
IF(KWSYS_USE_${c}) IF(KWSYS_USE_${c})
# Use the corresponding header file. # Use the corresponding header file.
@ -912,16 +939,24 @@ IF(KWSYS_USE_Process)
ENDIF(KWSYS_USE_Process) ENDIF(KWSYS_USE_Process)
# Add selected C sources. # Add selected C sources.
FOREACH(c Base64 MD5 Terminal System String) FOREACH(c Base64 Encoding MD5 Terminal System String)
IF(KWSYS_USE_${c}) IF(KWSYS_USE_${c})
SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ${c}.c) IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}C.c)
LIST(APPEND KWSYS_C_SRCS ${c}C.c)
ELSE()
LIST(APPEND KWSYS_C_SRCS ${c}.c)
ENDIF()
ENDIF(KWSYS_USE_${c}) ENDIF(KWSYS_USE_${c})
ENDFOREACH(c) ENDFOREACH(c)
# Configure headers of C++ classes and construct the list of sources. # Configure headers of C++ classes and construct the list of sources.
FOREACH(c ${KWSYS_CLASSES}) FOREACH(c ${KWSYS_CLASSES})
# Add this source to the list of source files for the library. # Add this source to the list of source files for the library.
SET(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${c}.cxx) IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}CXX.cxx)
LIST(APPEND KWSYS_CXX_SRCS ${c}CXX.cxx)
ELSEIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}.cxx)
LIST(APPEND KWSYS_CXX_SRCS ${c}.cxx)
ENDIF()
# Configure the header for this class. # Configure the header for this class.
CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx
@ -1047,6 +1082,12 @@ IF(KWSYS_USE_String)
COMPILE_FLAGS "-DKWSYS_STRING_C") COMPILE_FLAGS "-DKWSYS_STRING_C")
ENDIF(KWSYS_USE_String) ENDIF(KWSYS_USE_String)
IF(KWSYS_USE_Encoding)
# Set default 8 bit encoding in "EndcodingC.c".
SET_PROPERTY(SOURCE EncodingC.c APPEND PROPERTY COMPILE_DEFINITIONS
KWSYS_ENCODING_DEFAULT_CODEPAGE=${KWSYS_ENCODING_DEFAULT_CODEPAGE})
ENDIF(KWSYS_USE_Encoding)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Setup testing if not being built as part of another project. # Setup testing if not being built as part of another project.
IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR) IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
@ -1090,6 +1131,11 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
testCommandLineArguments testCommandLineArguments
testCommandLineArguments1 testCommandLineArguments1
) )
IF(KWSYS_STL_HAS_WSTRING)
SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
testEncoding
)
ENDIF(KWSYS_STL_HAS_WSTRING)
IF(KWSYS_USE_SystemInformation) IF(KWSYS_USE_SystemInformation)
SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testSystemInformation) SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testSystemInformation)
ENDIF(KWSYS_USE_SystemInformation) ENDIF(KWSYS_USE_SystemInformation)

View File

@ -36,6 +36,9 @@
/* Whether STL is in std namespace. */ /* Whether STL is in std namespace. */
#define @KWSYS_NAMESPACE@_STL_HAVE_STD @KWSYS_STL_HAVE_STD@ #define @KWSYS_NAMESPACE@_STL_HAVE_STD @KWSYS_STL_HAVE_STD@
/* Whether wstring is available. */
#define @KWSYS_NAMESPACE@_STL_HAS_WSTRING @KWSYS_STL_HAS_WSTRING@
/* Whether the STL string has operator<< for ostream. */ /* Whether the STL string has operator<< for ostream. */
#define @KWSYS_NAMESPACE@_STL_STRING_HAVE_OSTREAM @KWSYS_STL_STRING_HAVE_OSTREAM@ #define @KWSYS_NAMESPACE@_STL_STRING_HAVE_OSTREAM @KWSYS_STL_STRING_HAVE_OSTREAM@
@ -170,6 +173,7 @@
# define KWSYS_STL_HAS_ALLOCATOR_TEMPLATE @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_TEMPLATE # define KWSYS_STL_HAS_ALLOCATOR_TEMPLATE @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_TEMPLATE
# define KWSYS_STL_HAS_ALLOCATOR_NONTEMPLATE @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_NONTEMPLATE # define KWSYS_STL_HAS_ALLOCATOR_NONTEMPLATE @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_NONTEMPLATE
# define KWSYS_STL_HAS_ALLOCATOR_OBJECTS @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_OBJECTS # define KWSYS_STL_HAS_ALLOCATOR_OBJECTS @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_OBJECTS
# define KWSYS_STL_HAS_WSTRING @KWSYS_NAMESPACE@_STL_HAS_WSTRING
#endif #endif
#endif #endif

View File

@ -14,6 +14,8 @@
#include KWSYS_HEADER(Configure.hxx) #include KWSYS_HEADER(Configure.hxx)
#include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(stl/string) #include KWSYS_HEADER(stl/string)
#include KWSYS_HEADER(stl/vector) #include KWSYS_HEADER(stl/vector)
@ -22,6 +24,7 @@
#if 0 #if 0
# include "Directory.hxx.in" # include "Directory.hxx.in"
# include "Configure.hxx.in" # include "Configure.hxx.in"
# include "Encoding.hxx.in"
# include "kwsys_stl.hxx.in" # include "kwsys_stl.hxx.in"
# include "kwsys_stl_string.hxx.in" # include "kwsys_stl_string.hxx.in"
# include "kwsys_stl_vector.hxx.in" # include "kwsys_stl_vector.hxx.in"
@ -120,10 +123,10 @@ bool Directory::Load(const char* name)
buf = new char[n + 2 + 1]; buf = new char[n + 2 + 1];
sprintf(buf, "%s/*", name); sprintf(buf, "%s/*", name);
} }
struct _finddata_t data; // data of current file struct _wfinddata_t data; // data of current file
// Now put them into the file array // Now put them into the file array
srchHandle = _findfirst(buf, &data); srchHandle = _wfindfirst((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
delete [] buf; delete [] buf;
if ( srchHandle == -1 ) if ( srchHandle == -1 )
@ -134,9 +137,9 @@ bool Directory::Load(const char* name)
// Loop through names // Loop through names
do do
{ {
this->Internal->Files.push_back(data.name); this->Internal->Files.push_back(Encoding::ToNarrow(data.name));
} }
while ( _findnext(srchHandle, &data) != -1 ); while ( _wfindnext(srchHandle, &data) != -1 );
this->Internal->Path = name; this->Internal->Path = name;
return _findclose(srchHandle) != -1; return _findclose(srchHandle) != -1;
} }
@ -160,10 +163,10 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
buf = new char[n + 2 + 1]; buf = new char[n + 2 + 1];
sprintf(buf, "%s/*", name); sprintf(buf, "%s/*", name);
} }
struct _finddata_t data; // data of current file struct _wfinddata_t data; // data of current file
// Now put them into the file array // Now put them into the file array
srchHandle = _findfirst(buf, &data); srchHandle = _wfindfirst((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
delete [] buf; delete [] buf;
if ( srchHandle == -1 ) if ( srchHandle == -1 )
@ -177,7 +180,7 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
{ {
count++; count++;
} }
while ( _findnext(srchHandle, &data) != -1 ); while ( _wfindnext(srchHandle, &data) != -1 );
_findclose(srchHandle); _findclose(srchHandle);
return count; return count;
} }

View File

@ -186,13 +186,12 @@ namespace KWSYS_NAMESPACE
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const char* libname) DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const char* libname)
{ {
DynamicLoader::LibraryHandle lh; DynamicLoader::LibraryHandle lh;
#ifdef UNICODE int length = MultiByteToWideChar(CP_UTF8, 0, libname, -1, NULL, 0);
wchar_t libn[MB_CUR_MAX]; wchar_t* wchars = new wchar_t[length+1];
mbstowcs(libn, libname, MB_CUR_MAX); wchars[0] = '\0';
lh = LoadLibrary(libn); MultiByteToWideChar(CP_UTF8, 0, libname, -1, wchars, length);
#else lh = LoadLibraryW(wchars);
lh = LoadLibrary(libname); delete [] wchars;
#endif
return lh; return lh;
} }
@ -238,13 +237,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
#else #else
const char *rsym = sym; const char *rsym = sym;
#endif #endif
#ifdef UNICODE
wchar_t wsym[MB_CUR_MAX];
mbstowcs(wsym, rsym, MB_CUR_MAX);
result = GetProcAddress(lib, wsym);
#else
result = (void*)GetProcAddress(lib, rsym); result = (void*)GetProcAddress(lib, rsym);
#endif
#if defined(__BORLANDC__) || defined(__WATCOMC__) #if defined(__BORLANDC__) || defined(__WATCOMC__)
delete[] rsym; delete[] rsym;
#endif #endif

View File

@ -0,0 +1,79 @@
/*============================================================================
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.
============================================================================*/
#ifndef @KWSYS_NAMESPACE@_Encoding_h
#define @KWSYS_NAMESPACE@_Encoding_h
#include <@KWSYS_NAMESPACE@/Configure.h>
#include <wchar.h>
/* Redefine all public interface symbol names to be in the proper
namespace. These macros are used internally to kwsys only, and are
not visible to user code. Use kwsysHeaderDump.pl to reproduce
these macros after making changes to the interface. */
#if !defined(KWSYS_NAMESPACE)
# define kwsys_ns(x) @KWSYS_NAMESPACE@##x
# define kwsysEXPORT @KWSYS_NAMESPACE@_EXPORT
#endif
#if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# define kwsysEncoding kwsys_ns(Encoding)
# define kwsysEncoding_mbstowcs kwsys_ns(Encoding_mbstowcs)
# define kwsysEncoding_DupToWide kwsys_ns(Encoding_DupToWide)
# define kwsysEncoding_wcstombs kwsys_ns(Encoding_wcstombs)
# define kwsysEncoding_DupToNarrow kwsys_ns(Encoding_DupToNarrow)
#endif
#if defined(__cplusplus)
extern "C"
{
#endif
/* Convert a narrow string to a wide string.
On Windows, UTF-8 is assumed, and on other platforms,
the current locale is assumed.
*/
kwsysEXPORT size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* src, size_t n);
/* Convert a narrow string to a wide string.
This can return NULL if the conversion fails. */
kwsysEXPORT wchar_t* kwsysEncoding_DupToWide(const char* src);
/* Convert a wide string to a narrow string.
On Windows, UTF-8 is assumed, and on other platforms,
the current locale is assumed. */
kwsysEXPORT size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* src, size_t n);
/* Convert a wide string to a narrow string.
This can return NULL if the conversion fails. */
kwsysEXPORT char* kwsysEncoding_DupToNarrow(const wchar_t* str);
#if defined(__cplusplus)
} /* extern "C" */
#endif
/* If we are building a kwsys .c or .cxx file, let it use these macros.
Otherwise, undefine them to keep the namespace clean. */
#if !defined(KWSYS_NAMESPACE)
# undef kwsys_ns
# undef kwsysEXPORT
# if !defined(KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# undef kwsysEncoding
# undef kwsysEncoding_mbstowcs
# undef kwsysEncoding_DupToWide
# undef kwsysEncoding_wcstombs
# undef kwsysEncoding_DupToNarrow
# endif
#endif
#endif

View File

@ -0,0 +1,56 @@
/*============================================================================
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.
============================================================================*/
#ifndef @KWSYS_NAMESPACE@_Encoding_hxx
#define @KWSYS_NAMESPACE@_Encoding_hxx
#include <@KWSYS_NAMESPACE@/Configure.hxx>
#include <@KWSYS_NAMESPACE@/stl/string>
/* Define these macros temporarily to keep the code readable. */
#if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# define kwsys_stl @KWSYS_NAMESPACE@_stl
#endif
namespace @KWSYS_NAMESPACE@
{
class @KWSYS_NAMESPACE@_EXPORT Encoding
{
public:
/**
* Convert between char and wchar_t
*/
#if @KWSYS_NAMESPACE@_STL_HAS_WSTRING
// Convert a narrow string to a wide string.
// On Windows, UTF-8 is assumed, and on other platforms,
// the current locale is assumed.
static kwsys_stl::wstring ToWide(const kwsys_stl::string& str);
static kwsys_stl::wstring ToWide(const char* str);
// Convert a wide string to a narrow string.
// On Windows, UTF-8 is assumed, and on other platforms,
// the current locale is assumed.
static kwsys_stl::string ToNarrow(const kwsys_stl::wstring& str);
static kwsys_stl::string ToNarrow(const wchar_t* str);
#endif // @KWSYS_NAMESPACE@_STL_HAS_WSTRING
}; // class Encoding
} // namespace @KWSYS_NAMESPACE@
/* Undefine temporary macros. */
#if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# undef kwsys_stl
#endif
#endif

79
Source/kwsys/EncodingC.c Normal file
View File

@ -0,0 +1,79 @@
/*============================================================================
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.
============================================================================*/
#include "kwsysPrivate.h"
#include KWSYS_HEADER(Encoding.h)
/* Work-around CMake dependency scanning limitation. This must
duplicate the above list of headers. */
#if 0
# include "Encoding.h.in"
#endif
#include <stdlib.h>
#ifdef _WIN32
#include <windows.h>
#endif
size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* str, size_t n)
{
if(str == 0)
{
return (size_t)-1;
}
#ifdef _WIN32
return MultiByteToWideChar(KWSYS_ENCODING_DEFAULT_CODEPAGE, 0,
str, -1, dest, (int)n) - 1;
#else
return mbstowcs(dest, str, n);
#endif
}
wchar_t* kwsysEncoding_DupToWide(const char* str)
{
wchar_t* ret = NULL;
size_t length = kwsysEncoding_mbstowcs(NULL, str, 0) + 1;
if(length > 0)
{
ret = malloc((length)*sizeof(wchar_t));
ret[0] = 0;
kwsysEncoding_mbstowcs(ret, str, length);
}
return ret;
}
size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n)
{
if(str == 0)
{
return (size_t)-1;
}
#ifdef _WIN32
return WideCharToMultiByte(KWSYS_ENCODING_DEFAULT_CODEPAGE, 0, str, -1,
dest, (int)n, NULL, NULL) - 1;
#else
return wcstombs(dest, str, n);
#endif
}
char* kwsysEncoding_DupToNarrow(const wchar_t* str)
{
char* ret = NULL;
size_t length = kwsysEncoding_wcstombs(0, str, 0);
if(length > 0)
{
ret = malloc(length);
ret[0] = 0;
kwsysEncoding_wcstombs(ret, str, length);
}
return ret;
}

View File

@ -0,0 +1,88 @@
/*============================================================================
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>
#ifdef _MSC_VER
# pragma warning (disable: 4786)
#endif
// Windows API.
#if defined(_WIN32)
# include <windows.h>
#endif
namespace KWSYS_NAMESPACE
{
#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

172
Source/kwsys/FStream.hxx.in Normal file
View File

@ -0,0 +1,172 @@
/*============================================================================
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.
============================================================================*/
#ifndef @KWSYS_NAMESPACE@_FStream_hxx
#define @KWSYS_NAMESPACE@_FStream_hxx
#include <@KWSYS_NAMESPACE@/ios/fstream>
#include <@KWSYS_NAMESPACE@/Encoding.hxx>
namespace @KWSYS_NAMESPACE@
{
#if defined(_MSC_VER) && _MSC_VER >= 1400
template<typename CharType,typename Traits>
class basic_filebuf : public std::basic_filebuf<CharType,Traits>
{
public:
typedef std::basic_filebuf<CharType,Traits> my_base_type;
basic_filebuf *open(char const *s,std::ios_base::openmode mode)
{
my_base_type::open(Encoding::ToWide(s).c_str(), mode);
return this;
}
};
template<typename CharType,typename Traits = std::char_traits<CharType> >
class basic_ifstream : public std::basic_istream<CharType,Traits>
{
public:
typedef basic_filebuf<CharType,Traits> internal_buffer_type;
typedef std::basic_istream<CharType,Traits> internal_stream_type;
basic_ifstream() : internal_stream_type(new internal_buffer_type())
{
buf_ = static_cast<internal_buffer_type *>(internal_stream_type::rdbuf());
}
explicit basic_ifstream(char const *file_name,
std::ios_base::openmode mode = std::ios_base::in)
: internal_stream_type(new internal_buffer_type())
{
buf_ = static_cast<internal_buffer_type *>(internal_stream_type::rdbuf());
open(file_name,mode);
}
void open(char const *file_name,std::ios_base::openmode mode = std::ios_base::in)
{
if(!buf_->open(file_name,mode | std::ios_base::in))
{
this->setstate(std::ios_base::failbit);
}
else
{
this->clear();
}
}
bool is_open()
{
return buf_->is_open();
}
bool is_open() const
{
return buf_->is_open();
}
void close()
{
if(!buf_->close())
{
this->setstate(std::ios_base::failbit);
}
else
{
this->clear();
}
}
internal_buffer_type *rdbuf() const
{
return buf_.get();
}
~basic_ifstream()
{
buf_->close();
delete buf_;
}
private:
internal_buffer_type* buf_;
};
template<typename CharType,typename Traits = std::char_traits<CharType> >
class basic_ofstream : public std::basic_ostream<CharType,Traits>
{
public:
typedef basic_filebuf<CharType,Traits> internal_buffer_type;
typedef std::basic_ostream<CharType,Traits> internal_stream_type;
basic_ofstream() : internal_stream_type(new internal_buffer_type())
{
buf_ = static_cast<internal_buffer_type *>(internal_stream_type::rdbuf());
}
explicit basic_ofstream(char const *file_name,std::ios_base::openmode mode = std::ios_base::out) :
internal_stream_type(new internal_buffer_type())
{
buf_ = static_cast<internal_buffer_type *>(internal_stream_type::rdbuf());
open(file_name,mode);
}
void open(char const *file_name,std::ios_base::openmode mode = std::ios_base::out)
{
if(!buf_->open(file_name,mode | std::ios_base::out))
{
this->setstate(std::ios_base::failbit);
}
else
{
this->clear();
}
}
bool is_open()
{
return buf_->is_open();
}
bool is_open() const
{
return buf_->is_open();
}
void close()
{
if(!buf_->close())
{
this->setstate(std::ios_base::failbit);
}
else
{
this->clear();
}
}
internal_buffer_type *rdbuf() const
{
return buf_.get();
}
~basic_ofstream()
{
buf_->close();
delete buf_;
}
private:
internal_buffer_type* buf_;
};
typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
#else
using @KWSYS_NAMESPACE@_ios_namespace::basic_filebuf;
using @KWSYS_NAMESPACE@_ios_namespace::ofstream;
using @KWSYS_NAMESPACE@_ios_namespace::ifstream;
#endif
}
#endif

View File

@ -12,12 +12,14 @@
#include "kwsysPrivate.h" #include "kwsysPrivate.h"
#include KWSYS_HEADER(Process.h) #include KWSYS_HEADER(Process.h)
#include KWSYS_HEADER(System.h) #include KWSYS_HEADER(System.h)
#include KWSYS_HEADER(Encoding.h)
/* Work-around CMake dependency scanning limitation. This must /* Work-around CMake dependency scanning limitation. This must
duplicate the above list of headers. */ duplicate the above list of headers. */
#if 0 #if 0
# include "Process.h.in" # include "Process.h.in"
# include "System.h.in" # include "System.h.in"
# include "Encoding_c.h.in"
#endif #endif
/* /*
@ -88,9 +90,10 @@ typedef LARGE_INTEGER kwsysProcessTime;
typedef struct kwsysProcessCreateInformation_s typedef struct kwsysProcessCreateInformation_s
{ {
/* Windows child startup control data. */ /* Windows child startup control data. */
STARTUPINFO StartupInfo; STARTUPINFOW StartupInfo;
} kwsysProcessCreateInformation; } kwsysProcessCreateInformation;
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
typedef struct kwsysProcessPipeData_s kwsysProcessPipeData; typedef struct kwsysProcessPipeData_s kwsysProcessPipeData;
static DWORD WINAPI kwsysProcessPipeThreadRead(LPVOID ptd); static DWORD WINAPI kwsysProcessPipeThreadRead(LPVOID ptd);
@ -197,14 +200,14 @@ struct kwsysProcess_s
int State; int State;
/* The command lines to execute. */ /* The command lines to execute. */
char** Commands; wchar_t** Commands;
int NumberOfCommands; int NumberOfCommands;
/* The exit code of each command. */ /* The exit code of each command. */
DWORD* CommandExitCodes; DWORD* CommandExitCodes;
/* The working directory for the child process. */ /* The working directory for the child process. */
char* WorkingDirectory; wchar_t* WorkingDirectory;
/* Whether to create the child as a detached process. */ /* Whether to create the child as a detached process. */
int OptionDetach; int OptionDetach;
@ -299,7 +302,7 @@ struct kwsysProcess_s
/* Real working directory of our own process. */ /* Real working directory of our own process. */
DWORD RealWorkingDirectoryLength; DWORD RealWorkingDirectoryLength;
char* RealWorkingDirectory; wchar_t* RealWorkingDirectory;
}; };
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@ -546,7 +549,7 @@ int kwsysProcess_SetCommand(kwsysProcess* cp, char const* const* command)
int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command) int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
{ {
int newNumberOfCommands; int newNumberOfCommands;
char** newCommands; wchar_t** newCommands;
/* Make sure we have a command to add. */ /* Make sure we have a command to add. */
if(!cp || !command || !*command) if(!cp || !command || !*command)
@ -554,9 +557,10 @@ int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
return 0; return 0;
} }
/* Allocate a new array for command pointers. */ /* Allocate a new array for command pointers. */
newNumberOfCommands = cp->NumberOfCommands + 1; newNumberOfCommands = cp->NumberOfCommands + 1;
if(!(newCommands = (char**)malloc(sizeof(char*) * newNumberOfCommands))) if(!(newCommands = (wchar_t**)malloc(sizeof(wchar_t*) * newNumberOfCommands)))
{ {
/* Out of memory. */ /* Out of memory. */
return 0; return 0;
@ -585,8 +589,8 @@ int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
/* Allocate enough space for the command. We do not need an extra /* Allocate enough space for the command. We do not need an extra
byte for the terminating null because we allocated a space for byte for the terminating null because we allocated a space for
the first argument that we will not use. */ the first argument that we will not use. */
newCommands[cp->NumberOfCommands] = (char*)malloc(length); char* new_cmd = malloc(length);
if(!newCommands[cp->NumberOfCommands]) if(!new_cmd)
{ {
/* Out of memory. */ /* Out of memory. */
free(newCommands); free(newCommands);
@ -595,9 +599,13 @@ int kwsysProcess_AddCommand(kwsysProcess* cp, char const* const* command)
/* Construct the command line in the allocated buffer. */ /* Construct the command line in the allocated buffer. */
kwsysProcessComputeCommandLine(cp, command, kwsysProcessComputeCommandLine(cp, command,
newCommands[cp->NumberOfCommands]); new_cmd);
newCommands[cp->NumberOfCommands] = kwsysEncoding_DupToWide(new_cmd);
free(new_cmd);
} }
/* Save the new array of commands. */ /* Save the new array of commands. */
free(cp->Commands); free(cp->Commands);
cp->Commands = newCommands; cp->Commands = newCommands;
@ -633,22 +641,26 @@ int kwsysProcess_SetWorkingDirectory(kwsysProcess* cp, const char* dir)
} }
if(dir && dir[0]) if(dir && dir[0])
{ {
wchar_t* wdir = kwsysEncoding_DupToWide(dir);
/* We must convert the working directory to a full path. */ /* We must convert the working directory to a full path. */
DWORD length = GetFullPathName(dir, 0, 0, 0); DWORD length = GetFullPathNameW(wdir, 0, 0, 0);
if(length > 0) if(length > 0)
{ {
cp->WorkingDirectory = (char*)malloc(length); wchar_t* work_dir = malloc(length*sizeof(wchar_t));
if(!cp->WorkingDirectory) if(!work_dir)
{ {
free(wdir);
return 0; return 0;
} }
if(!GetFullPathName(dir, length, cp->WorkingDirectory, 0)) if(!GetFullPathNameW(wdir, length, work_dir, 0))
{ {
free(cp->WorkingDirectory); free(work_dir);
cp->WorkingDirectory = 0; free(wdir);
return 0; return 0;
} }
cp->WorkingDirectory = work_dir;
} }
free(wdir);
} }
return 1; return 1;
} }
@ -879,13 +891,13 @@ void kwsysProcess_Execute(kwsysProcess* cp)
to make pipe file paths evaluate correctly. */ to make pipe file paths evaluate correctly. */
if(cp->WorkingDirectory) if(cp->WorkingDirectory)
{ {
if(!GetCurrentDirectory(cp->RealWorkingDirectoryLength, if(!GetCurrentDirectoryW(cp->RealWorkingDirectoryLength,
cp->RealWorkingDirectory)) cp->RealWorkingDirectory))
{ {
kwsysProcessCleanup(cp, 1); kwsysProcessCleanup(cp, 1);
return; return;
} }
SetCurrentDirectory(cp->WorkingDirectory); SetCurrentDirectoryW(cp->WorkingDirectory);
} }
/* Initialize startup info data. */ /* Initialize startup info data. */
@ -1003,7 +1015,7 @@ void kwsysProcess_Execute(kwsysProcess* cp)
/* Restore the working directory. */ /* Restore the working directory. */
if(cp->RealWorkingDirectory) if(cp->RealWorkingDirectory)
{ {
SetCurrentDirectory(cp->RealWorkingDirectory); SetCurrentDirectoryW(cp->RealWorkingDirectory);
free(cp->RealWorkingDirectory); free(cp->RealWorkingDirectory);
cp->RealWorkingDirectory = 0; cp->RealWorkingDirectory = 0;
} }
@ -1507,10 +1519,10 @@ int kwsysProcessInitialize(kwsysProcess* cp)
/* Allocate space to save the real working directory of this process. */ /* Allocate space to save the real working directory of this process. */
if(cp->WorkingDirectory) if(cp->WorkingDirectory)
{ {
cp->RealWorkingDirectoryLength = GetCurrentDirectory(0, 0); cp->RealWorkingDirectoryLength = GetCurrentDirectoryW(0, 0);
if(cp->RealWorkingDirectoryLength > 0) if(cp->RealWorkingDirectoryLength > 0)
{ {
cp->RealWorkingDirectory = (char*)malloc(cp->RealWorkingDirectoryLength); cp->RealWorkingDirectory = malloc(cp->RealWorkingDirectoryLength * sizeof(wchar_t));
if(!cp->RealWorkingDirectory) if(!cp->RealWorkingDirectory)
{ {
return 0; return 0;
@ -1547,9 +1559,11 @@ int kwsysProcessCreate(kwsysProcess* cp, int index,
else if(cp->PipeFileSTDIN) else if(cp->PipeFileSTDIN)
{ {
/* Create a handle to read a file for stdin. */ /* Create a handle to read a file for stdin. */
HANDLE fin = CreateFile(cp->PipeFileSTDIN, GENERIC_READ|GENERIC_WRITE, wchar_t* wstdin = kwsysEncoding_DupToWide(cp->PipeFileSTDIN);
HANDLE fin = CreateFileW(wstdin, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
0, OPEN_EXISTING, 0, 0); 0, OPEN_EXISTING, 0, 0);
free(wstdin);
if(fin == INVALID_HANDLE_VALUE) if(fin == INVALID_HANDLE_VALUE)
{ {
return 0; return 0;
@ -1655,7 +1669,7 @@ int kwsysProcessCreate(kwsysProcess* cp, int index,
/* Create the child in a suspended state so we can wait until all /* Create the child in a suspended state so we can wait until all
children have been created before running any one. */ children have been created before running any one. */
if(!CreateProcess(0, cp->Commands[index], 0, 0, TRUE, CREATE_SUSPENDED, 0, if(!CreateProcessW(0, cp->Commands[index], 0, 0, TRUE, CREATE_SUSPENDED, 0,
0, &si->StartupInfo, &cp->ProcessInformation[index])) 0, &si->StartupInfo, &cp->ProcessInformation[index]))
{ {
return 0; return 0;
@ -1729,6 +1743,7 @@ void kwsysProcessDestroy(kwsysProcess* cp, int event)
int kwsysProcessSetupOutputPipeFile(PHANDLE phandle, const char* name) int kwsysProcessSetupOutputPipeFile(PHANDLE phandle, const char* name)
{ {
HANDLE fout; HANDLE fout;
wchar_t* wname;
if(!name) if(!name)
{ {
return 1; return 1;
@ -1738,8 +1753,10 @@ int kwsysProcessSetupOutputPipeFile(PHANDLE phandle, const char* name)
kwsysProcessCleanupHandle(phandle); kwsysProcessCleanupHandle(phandle);
/* Create a handle to write a file for the pipe. */ /* Create a handle to write a file for the pipe. */
fout = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, 0, wname = kwsysEncoding_DupToWide(name);
fout = CreateFileW(wname, GENERIC_WRITE, FILE_SHARE_READ, 0,
CREATE_ALWAYS, 0, 0); CREATE_ALWAYS, 0, 0);
free(wname);
if(fout == INVALID_HANDLE_VALUE) if(fout == INVALID_HANDLE_VALUE)
{ {
return 0; return 0;
@ -1883,10 +1900,13 @@ void kwsysProcessCleanup(kwsysProcess* cp, int error)
{ {
/* Format the error message. */ /* Format the error message. */
DWORD original = GetLastError(); DWORD original = GetLastError();
DWORD length = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | wchar_t err_msg[KWSYSPE_PIPE_BUFFER_SIZE];
DWORD length = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, 0, original, FORMAT_MESSAGE_IGNORE_INSERTS, 0, original,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
cp->ErrorMessage, KWSYSPE_PIPE_BUFFER_SIZE, 0); err_msg, KWSYSPE_PIPE_BUFFER_SIZE, 0);
WideCharToMultiByte(CP_UTF8, 0, err_msg, -1, cp->ErrorMessage,
KWSYSPE_PIPE_BUFFER_SIZE, NULL, NULL);
if(length < 1) if(length < 1)
{ {
/* FormatMessage failed. Use a default message. */ /* FormatMessage failed. Use a default message. */
@ -1924,7 +1944,7 @@ void kwsysProcessCleanup(kwsysProcess* cp, int error)
/* Restore the working directory. */ /* Restore the working directory. */
if(cp->RealWorkingDirectory) if(cp->RealWorkingDirectory)
{ {
SetCurrentDirectory(cp->RealWorkingDirectory); SetCurrentDirectoryW(cp->RealWorkingDirectory);
} }
} }
@ -2222,7 +2242,7 @@ static void kwsysProcessSetExitException(kwsysProcess* cp, int code)
case STATUS_NO_MEMORY: case STATUS_NO_MEMORY:
default: default:
cp->ExitException = kwsysProcess_Exception_Other; cp->ExitException = kwsysProcess_Exception_Other;
sprintf(cp->ExitExceptionString, "Exit code 0x%x\n", code); _snprintf(cp->ExitExceptionString, KWSYSPE_PIPE_BUFFER_SIZE, "Exit code 0x%x\n", code);
break; break;
} }
} }
@ -2430,7 +2450,7 @@ static int kwsysProcess_List__New_NT4(kwsysProcess_List* self)
loaded in this program. This does not actually increment the loaded in this program. This does not actually increment the
reference count to the module so we do not need to close the reference count to the module so we do not need to close the
handle. */ handle. */
HMODULE hNT = GetModuleHandle("ntdll.dll"); HMODULE hNT = GetModuleHandleW(L"ntdll.dll");
if(hNT) if(hNT)
{ {
/* Get pointers to the needed API functions. */ /* Get pointers to the needed API functions. */
@ -2534,7 +2554,7 @@ static int kwsysProcess_List__New_Snapshot(kwsysProcess_List* self)
loaded in this program. This does not actually increment the loaded in this program. This does not actually increment the
reference count to the module so we do not need to close the reference count to the module so we do not need to close the
handle. */ handle. */
HMODULE hKernel = GetModuleHandle("kernel32.dll"); HMODULE hKernel = GetModuleHandleW(L"kernel32.dll");
if(hKernel) if(hKernel)
{ {
self->P_CreateToolhelp32Snapshot = self->P_CreateToolhelp32Snapshot =

View File

@ -253,7 +253,7 @@ static bool call_cpuid(int select, int result[4])
_asm { _asm {
#ifdef CPUID_AWARE_COMPILER #ifdef CPUID_AWARE_COMPILER
; we must push/pop the registers <<CPUID>> writes to, as the ; we must push/pop the registers <<CPUID>> writes to, as the
; optimiser doesn't know about <<CPUID>>, and so doesn't expect ; optimiser does not know about <<CPUID>>, and so does not expect
; these registers to change. ; these registers to change.
push eax push eax
push ebx push ebx
@ -2454,8 +2454,8 @@ bool SystemInformationImplementation::RetrieveCPUClockSpeed()
if (!retrieved) if (!retrieved)
{ {
HKEY hKey = NULL; HKEY hKey = NULL;
LONG err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, LONG err = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0,
KEY_READ, &hKey); KEY_READ, &hKey);
if (ERROR_SUCCESS == err) if (ERROR_SUCCESS == err)
@ -2464,7 +2464,7 @@ bool SystemInformationImplementation::RetrieveCPUClockSpeed()
DWORD data = 0; DWORD data = 0;
DWORD dwSize = sizeof(DWORD); DWORD dwSize = sizeof(DWORD);
err = RegQueryValueEx(hKey, "~MHz", 0, err = RegQueryValueExW(hKey, L"~MHz", 0,
&dwType, (LPBYTE) &data, &dwSize); &dwType, (LPBYTE) &data, &dwSize);
if (ERROR_SUCCESS == err) if (ERROR_SUCCESS == err)
@ -5017,19 +5017,19 @@ bool SystemInformationImplementation::QueryOSInformation()
this->OSName = "Windows"; this->OSName = "Windows";
OSVERSIONINFOEX osvi; OSVERSIONINFOEXW osvi;
BOOL bIsWindows64Bit; BOOL bIsWindows64Bit;
BOOL bOsVersionInfoEx; BOOL bOsVersionInfoEx;
char operatingSystem[256]; char operatingSystem[256];
// Try calling GetVersionEx using the OSVERSIONINFOEX structure. // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
ZeroMemory (&osvi, sizeof (OSVERSIONINFOEX)); ZeroMemory (&osvi, sizeof (OSVERSIONINFOEXW));
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXW);
bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi); bOsVersionInfoEx = GetVersionExW ((OSVERSIONINFOW*)&osvi);
if (!bOsVersionInfoEx) if (!bOsVersionInfoEx)
{ {
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOW);
if (!GetVersionEx ((OSVERSIONINFO *) &osvi)) if (!GetVersionExW((OSVERSIONINFOW*)&osvi))
{ {
return false; return false;
} }
@ -5115,19 +5115,19 @@ bool SystemInformationImplementation::QueryOSInformation()
#endif // VER_NT_WORKSTATION #endif // VER_NT_WORKSTATION
{ {
HKEY hKey; HKEY hKey;
char szProductType[80]; wchar_t szProductType[80];
DWORD dwBufLen; DWORD dwBufLen;
// Query the registry to retrieve information. // Query the registry to retrieve information.
RegOpenKeyEx (HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey); RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx (hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); RegQueryValueExW(hKey, L"ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen);
RegCloseKey (hKey); RegCloseKey (hKey);
if (lstrcmpi ("WINNT", szProductType) == 0) if (lstrcmpiW(L"WINNT", szProductType) == 0)
{ {
this->OSRelease += " Professional"; this->OSRelease += " Professional";
} }
if (lstrcmpi ("LANMANNT", szProductType) == 0) if (lstrcmpiW(L"LANMANNT", szProductType) == 0)
{ {
// Decide between Windows 2000 Advanced Server and Windows .NET Enterprise Server. // Decide between Windows 2000 Advanced Server and Windows .NET Enterprise Server.
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
@ -5139,7 +5139,7 @@ bool SystemInformationImplementation::QueryOSInformation()
this->OSRelease += " Server"; this->OSRelease += " Server";
} }
} }
if (lstrcmpi ("SERVERNT", szProductType) == 0) if (lstrcmpiW(L"SERVERNT", szProductType) == 0)
{ {
// Decide between Windows 2000 Advanced Server and Windows .NET Enterprise Server. // Decide between Windows 2000 Advanced Server and Windows .NET Enterprise Server.
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
@ -5172,7 +5172,7 @@ bool SystemInformationImplementation::QueryOSInformation()
LPFNPROC DLLProc; LPFNPROC DLLProc;
// Load the Kernel32 DLL. // Load the Kernel32 DLL.
hKernelDLL = LoadLibrary ("kernel32"); hKernelDLL = LoadLibraryW(L"kernel32");
if (hKernelDLL != NULL) { if (hKernelDLL != NULL) {
// Only XP and .NET Server support IsWOW64Process so... Load dynamically! // Only XP and .NET Server support IsWOW64Process so... Load dynamically!
DLLProc = (LPFNPROC) GetProcAddress (hKernelDLL, "IsWow64Process"); DLLProc = (LPFNPROC) GetProcAddress (hKernelDLL, "IsWow64Process");

View File

@ -20,6 +20,8 @@
#include KWSYS_HEADER(RegularExpression.hxx) #include KWSYS_HEADER(RegularExpression.hxx)
#include KWSYS_HEADER(SystemTools.hxx) #include KWSYS_HEADER(SystemTools.hxx)
#include KWSYS_HEADER(Directory.hxx) #include KWSYS_HEADER(Directory.hxx)
#include KWSYS_HEADER(FStream.hxx)
#include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(ios/iostream) #include KWSYS_HEADER(ios/iostream)
#include KWSYS_HEADER(ios/fstream) #include KWSYS_HEADER(ios/fstream)
@ -32,6 +34,8 @@
#if 0 #if 0
# include "SystemTools.hxx.in" # include "SystemTools.hxx.in"
# include "Directory.hxx.in" # include "Directory.hxx.in"
# include "FStream.hxx.in"
# include "Encoding.hxx.in"
# include "kwsys_ios_iostream.h.in" # include "kwsys_ios_iostream.h.in"
# include "kwsys_ios_fstream.h.in" # include "kwsys_ios_fstream.h.in"
# include "kwsys_ios_sstream.h.in" # include "kwsys_ios_sstream.h.in"
@ -75,6 +79,9 @@
// Windows API. // Windows API.
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# ifndef INVALID_FILE_ATTRIBUTES
# define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
# endif
#elif defined (__CYGWIN__) #elif defined (__CYGWIN__)
# include <windows.h> # include <windows.h>
# undef _WIN32 # undef _WIN32
@ -183,22 +190,25 @@ static inline char *realpath(const char *path, char *resolved_path)
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__MINGW32__)) #if defined(_WIN32) && (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__MINGW32__))
inline int Mkdir(const char* dir) inline int Mkdir(const char* dir)
{ {
return _mkdir(dir); return _wmkdir(KWSYS_NAMESPACE::Encoding::ToWide(dir).c_str());
} }
inline int Rmdir(const char* dir) inline int Rmdir(const char* dir)
{ {
return _rmdir(dir); return _wrmdir(KWSYS_NAMESPACE::Encoding::ToWide(dir).c_str());
} }
inline const char* Getcwd(char* buf, unsigned int len) inline const char* Getcwd(char* buf, unsigned int len)
{ {
if(const char* ret = _getcwd(buf, len)) std::vector<wchar_t> w_buf(len);
if(const wchar_t* ret = _wgetcwd(&w_buf[0], len))
{ {
// make sure the drive letter is capital // make sure the drive letter is capital
if(strlen(buf) > 1 && buf[1] == ':') if(wcslen(&w_buf[0]) > 1 && w_buf[1] == L':')
{ {
buf[0] = toupper(buf[0]); w_buf[0] = towupper(w_buf[0]);
} }
return ret; std::string tmp = KWSYS_NAMESPACE::Encoding::ToNarrow(&w_buf[0]);
strcpy(buf, tmp.c_str());
return buf;
} }
return 0; return 0;
} }
@ -207,16 +217,18 @@ inline int Chdir(const char* dir)
#if defined(__BORLANDC__) #if defined(__BORLANDC__)
return chdir(dir); return chdir(dir);
#else #else
return _chdir(dir); return _wchdir(KWSYS_NAMESPACE::Encoding::ToWide(dir).c_str());
#endif #endif
} }
inline void Realpath(const char *path, kwsys_stl::string & resolved_path) inline void Realpath(const char *path, kwsys_stl::string & resolved_path)
{ {
char *ptemp; kwsys_stl::wstring tmp = KWSYS_NAMESPACE::Encoding::ToWide(path);
char fullpath[MAX_PATH]; wchar_t *ptemp;
if( GetFullPathName(path, sizeof(fullpath), fullpath, &ptemp) ) wchar_t fullpath[MAX_PATH];
if( GetFullPathNameW(tmp.c_str(), sizeof(fullpath)/sizeof(fullpath[0]),
fullpath, &ptemp) )
{ {
resolved_path = fullpath; resolved_path = KWSYS_NAMESPACE::Encoding::ToNarrow(fullpath);
KWSYS_NAMESPACE::SystemTools::ConvertToUnixSlashes(resolved_path); KWSYS_NAMESPACE::SystemTools::ConvertToUnixSlashes(resolved_path);
} }
else else
@ -591,6 +603,15 @@ const char* SystemTools::GetExecutableExtension()
#endif #endif
} }
FILE* SystemTools::Fopen(const char* file, const char* mode)
{
#ifdef _WIN32
return _wfopen(Encoding::ToWide(file).c_str(),
Encoding::ToWide(mode).c_str());
#else
return fopen(file, mode);
#endif
}
bool SystemTools::MakeDirectory(const char* path) bool SystemTools::MakeDirectory(const char* path)
{ {
@ -740,7 +761,7 @@ static DWORD SystemToolsMakeRegistryMode(DWORD mode,
SystemTools::KeyWOW64 view) SystemTools::KeyWOW64 view)
{ {
// only add the modes when on a system that supports Wow64. // only add the modes when on a system that supports Wow64.
static FARPROC wow64p = GetProcAddress(GetModuleHandle("kernel32"), static FARPROC wow64p = GetProcAddress(GetModuleHandleW(L"kernel32"),
"IsWow64Process"); "IsWow64Process");
if(wow64p == NULL) if(wow64p == NULL)
{ {
@ -774,8 +795,8 @@ SystemTools::GetRegistrySubKeys(const char *key,
} }
HKEY hKey; HKEY hKey;
if(RegOpenKeyEx(primaryKey, if(RegOpenKeyExW(primaryKey,
second.c_str(), Encoding::ToWide(second).c_str(),
0, 0,
SystemToolsMakeRegistryMode(KEY_READ, view), SystemToolsMakeRegistryMode(KEY_READ, view),
&hKey) != ERROR_SUCCESS) &hKey) != ERROR_SUCCESS)
@ -784,13 +805,13 @@ SystemTools::GetRegistrySubKeys(const char *key,
} }
else else
{ {
char name[1024]; wchar_t name[1024];
DWORD dwNameSize = sizeof(name)/sizeof(name[0]); DWORD dwNameSize = sizeof(name)/sizeof(name[0]);
DWORD i = 0; DWORD i = 0;
while (RegEnumKey(hKey, i, name, dwNameSize) == ERROR_SUCCESS) while (RegEnumKeyW(hKey, i, name, dwNameSize) == ERROR_SUCCESS)
{ {
subkeys.push_back(name); subkeys.push_back(Encoding::ToNarrow(name));
++i; ++i;
} }
@ -829,8 +850,8 @@ bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value,
} }
HKEY hKey; HKEY hKey;
if(RegOpenKeyEx(primaryKey, if(RegOpenKeyExW(primaryKey,
second.c_str(), Encoding::ToWide(second).c_str(),
0, 0,
SystemToolsMakeRegistryMode(KEY_READ, view), SystemToolsMakeRegistryMode(KEY_READ, view),
&hKey) != ERROR_SUCCESS) &hKey) != ERROR_SUCCESS)
@ -841,9 +862,9 @@ bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value,
{ {
DWORD dwType, dwSize; DWORD dwType, dwSize;
dwSize = 1023; dwSize = 1023;
char data[1024]; wchar_t data[1024];
if(RegQueryValueEx(hKey, if(RegQueryValueExW(hKey,
(LPTSTR)valuename.c_str(), Encoding::ToWide(valuename).c_str(),
NULL, NULL,
&dwType, &dwType,
(BYTE *)data, (BYTE *)data,
@ -851,16 +872,17 @@ bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value,
{ {
if (dwType == REG_SZ) if (dwType == REG_SZ)
{ {
value = data; value = Encoding::ToNarrow(data);
valueset = true; valueset = true;
} }
else if (dwType == REG_EXPAND_SZ) else if (dwType == REG_EXPAND_SZ)
{ {
char expanded[1024]; wchar_t expanded[1024];
DWORD dwExpandedSize = sizeof(expanded)/sizeof(expanded[0]); DWORD dwExpandedSize = sizeof(expanded)/sizeof(expanded[0]);
if(ExpandEnvironmentStrings(data, expanded, dwExpandedSize)) if(ExpandEnvironmentStringsW(data, expanded,
dwExpandedSize))
{ {
value = expanded; value = Encoding::ToNarrow(expanded);
valueset = true; valueset = true;
} }
} }
@ -901,9 +923,9 @@ bool SystemTools::WriteRegistryValue(const char *key, const char *value,
HKEY hKey; HKEY hKey;
DWORD dwDummy; DWORD dwDummy;
char lpClass[] = ""; wchar_t lpClass[] = L"";
if(RegCreateKeyEx(primaryKey, if(RegCreateKeyExW(primaryKey,
second.c_str(), Encoding::ToWide(second).c_str(),
0, 0,
lpClass, lpClass,
REG_OPTION_NON_VOLATILE, REG_OPTION_NON_VOLATILE,
@ -915,12 +937,13 @@ bool SystemTools::WriteRegistryValue(const char *key, const char *value,
return false; return false;
} }
if(RegSetValueEx(hKey, std::wstring wvalue = Encoding::ToWide(value);
(LPTSTR)valuename.c_str(), if(RegSetValueExW(hKey,
Encoding::ToWide(valuename).c_str(),
0, 0,
REG_SZ, REG_SZ,
(CONST BYTE *)value, (CONST BYTE *)wvalue.c_str(),
(DWORD)(strlen(value) + 1)) == ERROR_SUCCESS) (DWORD)(sizeof(wchar_t) * (wvalue.size() + 1))) == ERROR_SUCCESS)
{ {
return true; return true;
} }
@ -952,8 +975,8 @@ bool SystemTools::DeleteRegistryValue(const char *key, KeyWOW64 view)
} }
HKEY hKey; HKEY hKey;
if(RegOpenKeyEx(primaryKey, if(RegOpenKeyExW(primaryKey,
second.c_str(), Encoding::ToWide(second).c_str(),
0, 0,
SystemToolsMakeRegistryMode(KEY_WRITE, view), SystemToolsMakeRegistryMode(KEY_WRITE, view),
&hKey) != ERROR_SUCCESS) &hKey) != ERROR_SUCCESS)
@ -983,7 +1006,7 @@ bool SystemTools::SameFile(const char* file1, const char* file2)
#ifdef _WIN32 #ifdef _WIN32
HANDLE hFile1, hFile2; HANDLE hFile1, hFile2;
hFile1 = CreateFile( file1, hFile1 = CreateFileW( Encoding::ToWide(file1).c_str(),
GENERIC_READ, GENERIC_READ,
FILE_SHARE_READ , FILE_SHARE_READ ,
NULL, NULL,
@ -991,7 +1014,7 @@ bool SystemTools::SameFile(const char* file1, const char* file2)
FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_BACKUP_SEMANTICS,
NULL NULL
); );
hFile2 = CreateFile( file2, hFile2 = CreateFileW( Encoding::ToWide(file2).c_str(),
GENERIC_READ, GENERIC_READ,
FILE_SHARE_READ, FILE_SHARE_READ,
NULL, NULL,
@ -1039,15 +1062,6 @@ bool SystemTools::SameFile(const char* file1, const char* file2)
#endif #endif
} }
//----------------------------------------------------------------------------
#if defined(_WIN32) || defined(__CYGWIN__)
static bool WindowsFileExists(const char* filename)
{
WIN32_FILE_ATTRIBUTE_DATA fd;
return GetFileAttributesExA(filename, GetFileExInfoStandard, &fd) != 0;
}
#endif
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool SystemTools::FileExists(const char* filename) bool SystemTools::FileExists(const char* filename)
{ {
@ -1060,11 +1074,12 @@ bool SystemTools::FileExists(const char* filename)
char winpath[MAX_PATH]; char winpath[MAX_PATH];
if(SystemTools::PathCygwinToWin32(filename, winpath)) if(SystemTools::PathCygwinToWin32(filename, winpath))
{ {
return WindowsFileExists(winpath); return (GetFileAttributesA(winpath) != INVALID_FILE_ATTRIBUTES);
} }
return access(filename, R_OK) == 0; return access(filename, R_OK) == 0;
#elif defined(_WIN32) #elif defined(_WIN32)
return WindowsFileExists(filename); return (GetFileAttributesW(Encoding::ToWide(filename).c_str())
!= INVALID_FILE_ATTRIBUTES);
#else #else
return access(filename, R_OK) == 0; return access(filename, R_OK) == 0;
#endif #endif
@ -1107,7 +1122,7 @@ bool SystemTools::Touch(const char* filename, bool create)
{ {
if(create && !SystemTools::FileExists(filename)) if(create && !SystemTools::FileExists(filename))
{ {
FILE* file = fopen(filename, "a+b"); FILE* file = Fopen(filename, "a+b");
if(file) if(file)
{ {
fclose(file); fclose(file);
@ -1116,7 +1131,8 @@ bool SystemTools::Touch(const char* filename, bool create)
return false; return false;
} }
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
HANDLE h = CreateFile(filename, FILE_WRITE_ATTRIBUTES, HANDLE h = CreateFileW(Encoding::ToWide(filename).c_str(),
FILE_WRITE_ATTRIBUTES,
FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_SHARE_WRITE, 0, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, 0); FILE_FLAG_BACKUP_SEMANTICS, 0);
if(!h) if(!h)
@ -1220,11 +1236,13 @@ bool SystemTools::FileTimeCompare(const char* f1, const char* f2,
// Windows version. Get the modification time from extended file attributes. // Windows version. Get the modification time from extended file attributes.
WIN32_FILE_ATTRIBUTE_DATA f1d; WIN32_FILE_ATTRIBUTE_DATA f1d;
WIN32_FILE_ATTRIBUTE_DATA f2d; WIN32_FILE_ATTRIBUTE_DATA f2d;
if(!GetFileAttributesEx(f1, GetFileExInfoStandard, &f1d)) if(!GetFileAttributesExW(Encoding::ToWide(f1).c_str(),
GetFileExInfoStandard, &f1d))
{ {
return false; return false;
} }
if(!GetFileAttributesEx(f2, GetFileExInfoStandard, &f2d)) if(!GetFileAttributesExW(Encoding::ToWide(f2).c_str(),
GetFileExInfoStandard, &f2d))
{ {
return false; return false;
} }
@ -1932,6 +1950,39 @@ bool SystemTools::CopyFileIfDifferent(const char* source,
bool SystemTools::FilesDiffer(const char* source, bool SystemTools::FilesDiffer(const char* source,
const char* destination) const char* destination)
{ {
#if defined(_WIN32)
WIN32_FILE_ATTRIBUTE_DATA statSource;
if (GetFileAttributesExW(Encoding::ToWide(source).c_str(),
GetFileExInfoStandard,
&statSource) == 0)
{
return true;
}
WIN32_FILE_ATTRIBUTE_DATA statDestination;
if (GetFileAttributesExW(Encoding::ToWide(destination).c_str(),
GetFileExInfoStandard,
&statDestination) == 0)
{
return true;
}
if(statSource.nFileSizeHigh != statDestination.nFileSizeHigh ||
statSource.nFileSizeLow != statDestination.nFileSizeLow)
{
return true;
}
if(statSource.nFileSizeHigh == 0 && statSource.nFileSizeLow == 0)
{
return false;
}
off_t nleft = ((__int64)statSource.nFileSizeHigh << 32) +
statSource.nFileSizeLow;
#else
struct stat statSource; struct stat statSource;
if (stat(source, &statSource) != 0) if (stat(source, &statSource) != 0)
{ {
@ -1953,15 +2004,19 @@ bool SystemTools::FilesDiffer(const char* source,
{ {
return false; return false;
} }
off_t nleft = statSource.st_size;
#endif
#if defined(_WIN32) || defined(__CYGWIN__) #if defined(_WIN32)
kwsys_ios::ifstream finSource(source, (kwsys_ios::ios::binary | kwsys::ifstream finSource(source,
(kwsys_ios::ios::binary |
kwsys_ios::ios::in)); kwsys_ios::ios::in));
kwsys_ios::ifstream finDestination(destination, (kwsys_ios::ios::binary | kwsys::ifstream finDestination(destination,
(kwsys_ios::ios::binary |
kwsys_ios::ios::in)); kwsys_ios::ios::in));
#else #else
kwsys_ios::ifstream finSource(source); kwsys::ifstream finSource(source);
kwsys_ios::ifstream finDestination(destination); kwsys::ifstream finDestination(destination);
#endif #endif
if(!finSource || !finDestination) if(!finSource || !finDestination)
{ {
@ -1971,7 +2026,6 @@ bool SystemTools::FilesDiffer(const char* source,
// Compare the files a block at a time. // Compare the files a block at a time.
char source_buf[KWSYS_ST_BUFFER]; char source_buf[KWSYS_ST_BUFFER];
char dest_buf[KWSYS_ST_BUFFER]; char dest_buf[KWSYS_ST_BUFFER];
off_t nleft = statSource.st_size;
while(nleft > 0) while(nleft > 0)
{ {
// Read a block from each file. // Read a block from each file.
@ -2044,10 +2098,10 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
// Open files // Open files
#if defined(_WIN32) || defined(__CYGWIN__) #if defined(_WIN32) || defined(__CYGWIN__)
kwsys_ios::ifstream fin(source, kwsys::ifstream fin(source,
kwsys_ios::ios::binary | kwsys_ios::ios::in); kwsys_ios::ios::binary | kwsys_ios::ios::in);
#else #else
kwsys_ios::ifstream fin(source); kwsys::ifstream fin(source);
#endif #endif
if(!fin) if(!fin)
{ {
@ -2344,7 +2398,11 @@ bool SystemTools::RemoveFile(const char* source)
/* Win32 unlink is stupid --- it fails if the file is read-only */ /* Win32 unlink is stupid --- it fails if the file is read-only */
SystemTools::SetPermissions(source, S_IWRITE); SystemTools::SetPermissions(source, S_IWRITE);
#endif #endif
#ifdef _WIN32
bool res = _wunlink(Encoding::ToWide(source).c_str()) != 0 ? false : true;
#else
bool res = unlink(source) != 0 ? false : true; bool res = unlink(source) != 0 ? false : true;
#endif
#ifdef _WIN32 #ifdef _WIN32
if ( !res ) if ( !res )
{ {
@ -2789,12 +2847,15 @@ bool SystemTools::FileIsDirectory(const char* name)
} }
// Now check the file node type. // Now check the file node type.
#if defined( _WIN32 )
DWORD attr = GetFileAttributesW(Encoding::ToWide(name).c_str());
if (attr != INVALID_FILE_ATTRIBUTES)
{
return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0;
#else
struct stat fs; struct stat fs;
if(stat(name, &fs) == 0) if(stat(name, &fs) == 0)
{ {
#if defined( _WIN32 ) && !defined(__CYGWIN__)
return ((fs.st_mode & _S_IFDIR) != 0);
#else
return S_ISDIR(fs.st_mode); return S_ISDIR(fs.st_mode);
#endif #endif
} }
@ -3279,11 +3340,12 @@ static int GetCasePathName(const kwsys_stl::string & pathIn,
kwsys_stl::string test_str = casePath; kwsys_stl::string test_str = casePath;
test_str += path_components[idx]; test_str += path_components[idx];
WIN32_FIND_DATA findData; WIN32_FIND_DATAW findData;
HANDLE hFind = ::FindFirstFile(test_str.c_str(), &findData); HANDLE hFind = ::FindFirstFileW(Encoding::ToWide(test_str).c_str(),
&findData);
if (INVALID_HANDLE_VALUE != hFind) if (INVALID_HANDLE_VALUE != hFind)
{ {
casePath += findData.cFileName; casePath += Encoding::ToNarrow(findData.cFileName);
::FindClose(hFind); ::FindClose(hFind);
} }
else else
@ -3733,8 +3795,7 @@ bool SystemTools::FileHasSignature(const char *filename,
return false; return false;
} }
FILE *fp; FILE *fp = Fopen(filename, "rb");
fp = fopen(filename, "rb");
if (!fp) if (!fp)
{ {
return false; return false;
@ -3767,8 +3828,7 @@ SystemTools::DetectFileType(const char *filename,
return SystemTools::FileTypeUnknown; return SystemTools::FileTypeUnknown;
} }
FILE *fp; FILE *fp = Fopen(filename, "rb");
fp = fopen(filename, "rb");
if (!fp) if (!fp)
{ {
return SystemTools::FileTypeUnknown; return SystemTools::FileTypeUnknown;
@ -3958,9 +4018,8 @@ bool SystemTools::GetShortPath(const char* path, kwsys_stl::string& shortPath)
{ {
#if defined(WIN32) && !defined(__CYGWIN__) #if defined(WIN32) && !defined(__CYGWIN__)
const int size = int(strlen(path)) +1; // size of return const int size = int(strlen(path)) +1; // size of return
char *buffer = new char[size]; // create a buffer
char *tempPath = new char[size]; // create a buffer char *tempPath = new char[size]; // create a buffer
int ret; DWORD ret;
// if the path passed in has quotes around it, first remove the quotes // if the path passed in has quotes around it, first remove the quotes
if (path[0] == '"' && path[strlen(path)-1] == '"') if (path[0] == '"' && path[strlen(path)-1] == '"')
@ -3973,19 +4032,20 @@ bool SystemTools::GetShortPath(const char* path, kwsys_stl::string& shortPath)
strcpy(tempPath,path); strcpy(tempPath,path);
} }
kwsys_stl::wstring wtempPath = Encoding::ToWide(tempPath);
kwsys_stl::vector<wchar_t> buffer(wtempPath.size()+1);
buffer[0] = 0; buffer[0] = 0;
ret = GetShortPathName(tempPath, buffer, size); ret = GetShortPathNameW(Encoding::ToWide(tempPath).c_str(),
&buffer[0], static_cast<DWORD>(wtempPath.size()));
if(buffer[0] == 0 || ret > size) if(buffer[0] == 0 || ret > wtempPath.size())
{ {
delete [] buffer;
delete [] tempPath; delete [] tempPath;
return false; return false;
} }
else else
{ {
shortPath = buffer; shortPath = Encoding::ToNarrow(&buffer[0]);
delete [] buffer;
delete [] tempPath; delete [] tempPath;
return true; return true;
} }
@ -4212,12 +4272,45 @@ bool SystemTools::GetPermissions(const char* file, mode_t& mode)
return false; return false;
} }
#if defined(_WIN32)
DWORD attr = GetFileAttributesW(Encoding::ToWide(file).c_str());
if(attr == INVALID_FILE_ATTRIBUTES)
{
return false;
}
if((attr & FILE_ATTRIBUTE_READONLY) != 0)
{
mode = (_S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6));
}
else
{
mode = (_S_IWRITE | (_S_IWRITE >> 3) | (_S_IWRITE >> 6)) |
(_S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6));
}
if((attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
{
mode |= S_IFDIR | (_S_IEXEC | (_S_IEXEC >> 3) | (_S_IEXEC >> 6));
}
else
{
mode |= S_IFREG;
}
const char* ext = strrchr(file, '.');
if(ext && (Strucmp(ext, ".exe") == 0 ||
Strucmp(ext, ".com") == 0 ||
Strucmp(ext, ".cmd") == 0 ||
Strucmp(ext, ".bat") == 0))
{
mode |= (_S_IEXEC | (_S_IEXEC >> 3) | (_S_IEXEC >> 6));
}
#else
struct stat st; struct stat st;
if ( stat(file, &st) < 0 ) if ( stat(file, &st) < 0 )
{ {
return false; return false;
} }
mode = st.st_mode; mode = st.st_mode;
#endif
return true; return true;
} }
@ -4231,7 +4324,11 @@ bool SystemTools::SetPermissions(const char* file, mode_t mode)
{ {
return false; return false;
} }
#ifdef _WIN32
if ( _wchmod(Encoding::ToWide(file).c_str(), mode) < 0 )
#else
if ( chmod(file, mode) < 0 ) if ( chmod(file, mode) < 0 )
#endif
{ {
return false; return false;
} }
@ -4336,7 +4433,9 @@ void SystemTools::ConvertWindowsCommandLineToUnixArguments(
(*argv)[0] = new char [1024]; (*argv)[0] = new char [1024];
#ifdef _WIN32 #ifdef _WIN32
::GetModuleFileName(0, (*argv)[0], 1024); wchar_t tmp[1024];
::GetModuleFileNameW(0, tmp, 1024);
strcpy((*argv)[0], Encoding::ToNarrow(tmp).c_str());
#else #else
(*argv)[0][0] = '\0'; (*argv)[0][0] = '\0';
#endif #endif
@ -4396,14 +4495,14 @@ kwsys_stl::string SystemTools::GetOperatingSystemNameAndVersion()
#ifdef _WIN32 #ifdef _WIN32
char buffer[256]; char buffer[256];
OSVERSIONINFOEX osvi; OSVERSIONINFOEXA osvi;
BOOL bOsVersionInfoEx; BOOL bOsVersionInfoEx;
// Try calling GetVersionEx using the OSVERSIONINFOEX structure. // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
// If that fails, try using the OSVERSIONINFO structure. // If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXA));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi); bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi);
if (!bOsVersionInfoEx) if (!bOsVersionInfoEx)
@ -4546,20 +4645,20 @@ kwsys_stl::string SystemTools::GetOperatingSystemNameAndVersion()
{ {
HKEY hKey; HKEY hKey;
#define BUFSIZE 80 #define BUFSIZE 80
char szProductType[BUFSIZE]; wchar_t szProductType[BUFSIZE];
DWORD dwBufLen=BUFSIZE; DWORD dwBufLen=BUFSIZE;
LONG lRet; LONG lRet;
lRet = RegOpenKeyEx( lRet = RegOpenKeyExW(
HKEY_LOCAL_MACHINE, HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Control\\ProductOptions", L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
0, KEY_QUERY_VALUE, &hKey); 0, KEY_QUERY_VALUE, &hKey);
if (lRet != ERROR_SUCCESS) if (lRet != ERROR_SUCCESS)
{ {
return 0; return 0;
} }
lRet = RegQueryValueEx(hKey, "ProductType", NULL, NULL, lRet = RegQueryValueExW(hKey, L"ProductType", NULL, NULL,
(LPBYTE) szProductType, &dwBufLen); (LPBYTE) szProductType, &dwBufLen);
if ((lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE)) if ((lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE))
@ -4569,15 +4668,15 @@ kwsys_stl::string SystemTools::GetOperatingSystemNameAndVersion()
RegCloseKey(hKey); RegCloseKey(hKey);
if (lstrcmpi("WINNT", szProductType) == 0) if (lstrcmpiW(L"WINNT", szProductType) == 0)
{ {
res += " Workstation"; res += " Workstation";
} }
if (lstrcmpi("LANMANNT", szProductType) == 0) if (lstrcmpiW(L"LANMANNT", szProductType) == 0)
{ {
res += " Server"; res += " Server";
} }
if (lstrcmpi("SERVERNT", szProductType) == 0) if (lstrcmpiW(L"SERVERNT", szProductType) == 0)
{ {
res += " Advanced Server"; res += " Advanced Server";
} }
@ -4593,16 +4692,16 @@ kwsys_stl::string SystemTools::GetOperatingSystemNameAndVersion()
// Display service pack (if any) and build number. // Display service pack (if any) and build number.
if (osvi.dwMajorVersion == 4 && if (osvi.dwMajorVersion == 4 &&
lstrcmpi(osvi.szCSDVersion, "Service Pack 6") == 0) lstrcmpiA(osvi.szCSDVersion, "Service Pack 6") == 0)
{ {
HKEY hKey; HKEY hKey;
LONG lRet; LONG lRet;
// Test for SP6 versus SP6a. // Test for SP6 versus SP6a.
lRet = RegOpenKeyEx( lRet = RegOpenKeyExW(
HKEY_LOCAL_MACHINE, HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009", L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
0, KEY_QUERY_VALUE, &hKey); 0, KEY_QUERY_VALUE, &hKey);
if (lRet == ERROR_SUCCESS) if (lRet == ERROR_SUCCESS)

View File

@ -24,6 +24,8 @@
// Required for va_list // Required for va_list
#include <stdarg.h> #include <stdarg.h>
// Required for FILE*
#include <stdio.h>
#if @KWSYS_NAMESPACE@_STL_HAVE_STD && !defined(va_list) #if @KWSYS_NAMESPACE@_STL_HAVE_STD && !defined(va_list)
// Some compilers move va_list into the std namespace and there is no way to // Some compilers move va_list into the std namespace and there is no way to
// tell that this has been done. Playing with things being included before or // tell that this has been done. Playing with things being included before or
@ -42,10 +44,6 @@ namespace @KWSYS_NAMESPACE@
} }
#endif // va_list #endif // va_list
#if defined( _MSC_VER )
typedef unsigned short mode_t;
#endif
/* Define these macros temporarily to keep the code readable. */ /* Define these macros temporarily to keep the code readable. */
#if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS #if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# define kwsys_stl @KWSYS_NAMESPACE@_stl # define kwsys_stl @KWSYS_NAMESPACE@_stl
@ -496,6 +494,11 @@ public:
* ----------------------------------------------------------------- * -----------------------------------------------------------------
*/ */
/**
* Open a file considering unicode.
*/
static FILE* Fopen(const char* file, const char* mode);
/** /**
* Make a new directory if it is not there. This function * Make a new directory if it is not there. This function
* can make a full path even if none of the directories existed * can make a full path even if none of the directories existed
@ -684,6 +687,10 @@ public:
*/ */
static long int CreationTime(const char* filename); static long int CreationTime(const char* filename);
#if defined( _MSC_VER )
typedef unsigned short mode_t;
#endif
/** /**
* Get and set permissions of the file. * Get and set permissions of the file.
*/ */

View File

@ -674,3 +674,9 @@ int main()
return a; return a;
} }
#endif #endif
#ifdef TEST_KWSYS_STL_HAS_WSTRING
#include <string>
void f(std ::wstring*) {}
int main() { return 0; }
#endif

View File

@ -0,0 +1,159 @@
/*============================================================================
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.
============================================================================*/
#include "kwsysPrivate.h"
#if defined(_MSC_VER)
# pragma warning (disable:4786)
#endif
#include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(ios/iostream)
#include <locale.h>
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
#if 0
# include "Encoding.hxx.in"
# include "kwsys_ios_iostream.h.in"
#endif
//----------------------------------------------------------------------------
static const unsigned char helloWorldStrings[][32] =
{
// English
{'H','e','l','l','o',' ','W','o','r','l','d',0},
// Japanese
{0xE3, 0x81, 0x93, 0xE3, 0x82, 0x93, 0xE3, 0x81, 0xAB, 0xE3,
0x81, 0xA1, 0xE3, 0x81, 0xAF, 0xE4, 0xB8, 0x96, 0xE7, 0x95,
0x8C, 0},
// Arabic
{0xD9, 0x85, 0xD8, 0xB1, 0xD8, 0xAD, 0xD8, 0xA8, 0xD8, 0xA7,
0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD8, 0xB9, 0xD8, 0xA7, 0xD9,
0x84, 0xD9, 0x85, 0},
// Yiddish
{0xD7, 0x94, 0xD7, 0xA2, 0xD7, 0x9C, 0xD7, 0x90, 0x20, 0xD7,
0x95, 0xD7, 0x95, 0xD7, 0xA2, 0xD7, 0x9C, 0xD7, 0x98, 0},
// Russian
{0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5,
0xD1, 0x82, 0x20, 0xD0, 0xBC, 0xD0, 0xB8, 0xD1, 0x80, 0},
// Latin
{0x4D, 0x75, 0x6E, 0x64, 0x75, 0x73, 0x20, 0x73, 0x61, 0x6C,
0x76, 0x65, 0},
// Swahili
{0x68, 0x75, 0x6A, 0x61, 0x6D, 0x62, 0x6F, 0x20, 0x44, 0x75,
0x6E, 0x69, 0x61, 0},
// Icelandic
{0x48, 0x61, 0x6C, 0x6C, 0xC3, 0xB3, 0x20, 0x68, 0x65, 0x69,
0x6D, 0x75, 0x72, 0},
{0}
};
//----------------------------------------------------------------------------
static int testHelloWorldEncoding()
{
int ret = 0;
for(int i=0; helloWorldStrings[i][0] != 0; i++)
{
std::string str = reinterpret_cast<const char*>(helloWorldStrings[i]);
std::cout << str << std::endl;
std::wstring wstr = kwsys::Encoding::ToWide(str);
std::string str2 = kwsys::Encoding::ToNarrow(wstr);
if(!wstr.empty() && str != str2)
{
std::cout << "converted string was different: " << str2 << std::endl;
ret++;
}
}
return ret;
}
static int testRobustEncoding()
{
// test that the conversion functions handle invalid
// unicode correctly/gracefully
int ret = 0;
char cstr[] = {(char)-1, 0};
// this conversion could fail
std::wstring wstr = kwsys::Encoding::ToWide(cstr);
wstr = kwsys::Encoding::ToWide(NULL);
if(wstr != L"")
{
const wchar_t* wcstr = wstr.c_str();
std::cout << "ToWide(NULL) returned";
for(size_t i=0; i<wstr.size(); i++)
{
std::cout << " " << std::hex << (int)wcstr[i];
}
std::cout << std::endl;
ret++;
}
wstr = kwsys::Encoding::ToWide("");
if(wstr != L"")
{
const wchar_t* wcstr = wstr.c_str();
std::cout << "ToWide(\"\") returned";
for(size_t i=0; i<wstr.size(); i++)
{
std::cout << " " << std::hex << (int)wcstr[i];
}
std::cout << std::endl;
ret++;
}
#ifdef WIN32
// 16 bit wchar_t - we make an invalid surrogate pair
wchar_t cwstr[] = {0xD801, 0xDA00, 0};
// this conversion could fail
std::string win_str = kwsys::Encoding::ToNarrow(cwstr);
#endif
std::string str = kwsys::Encoding::ToNarrow(NULL);
if(str != "")
{
std::cout << "ToNarrow(NULL) returned " << str << std::endl;
ret++;
}
str = kwsys::Encoding::ToNarrow(L"");
if(wstr != L"")
{
std::cout << "ToNarrow(\"\") returned " << str << std::endl;
ret++;
}
return ret;
}
//----------------------------------------------------------------------------
int testEncoding(int, char*[])
{
const char* loc = setlocale(LC_ALL, "");
if(loc)
{
std::cout << "Locale: " << loc << std::endl;
}
else
{
std::cout << "Locale: None" << std::endl;
}
int ret = 0;
ret |= testHelloWorldEncoding();
ret |= testRobustEncoding();
return ret;
}