From 1c147abbe9c20a2df1f3b5f18cedbf6809ef51c3 Mon Sep 17 00:00:00 2001
From: James Johnston <johnstonj.public@codenest.com>
Date: Wed, 6 Jul 2016 22:12:12 +0300
Subject: [PATCH] Directory: Use Windows API wherever possible and port to
 Embarcadero

Otherwise on e.g. MinGW or Embarcadero it would use POSIX functions
which works only for ASCII paths.

Change-Id: Ib95c79f0bc649e3befb646c6820380ef86108c8a
---
 Directory.cxx | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/Directory.cxx b/Directory.cxx
index c549792..15480e1 100644
--- a/Directory.cxx
+++ b/Directory.cxx
@@ -84,9 +84,9 @@ void Directory::Clear()
 
 } // namespace KWSYS_NAMESPACE
 
-// First microsoft compilers
+// First Windows platforms
 
-#if defined(_MSC_VER) || defined(__WATCOMC__)
+#if defined(_WIN32) && !defined(__CYGWIN__)
 #include <windows.h>
 #include <io.h>
 #include <ctype.h>
@@ -97,15 +97,25 @@ void Directory::Clear()
 #include <sys/stat.h>
 #include <sys/types.h>
 
+// Wide function names can vary depending on compiler:
+#ifdef __BORLANDC__
+# define _wfindfirst_func __wfindfirst
+# define _wfindnext_func __wfindnext
+#else
+# define _wfindfirst_func _wfindfirst
+# define _wfindnext_func _wfindnext
+#endif
+
 namespace KWSYS_NAMESPACE
 {
 
 bool Directory::Load(const std::string& name)
 {
   this->Clear();
-#if _MSC_VER < 1300
+#if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__)
+  // Older Visual C++ and Embarcadero compilers.
   long srchHandle;
-#else
+#else // Newer Visual C++
   intptr_t srchHandle;
 #endif
   char* buf;
@@ -132,7 +142,7 @@ bool Directory::Load(const std::string& name)
   struct _wfinddata_t data;      // data of current file
 
   // Now put them into the file array
-  srchHandle = _wfindfirst((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
+  srchHandle = _wfindfirst_func((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
   delete [] buf;
 
   if ( srchHandle == -1 )
@@ -145,16 +155,17 @@ bool Directory::Load(const std::string& name)
     {
     this->Internal->Files.push_back(Encoding::ToNarrow(data.name));
     }
-  while ( _wfindnext(srchHandle, &data) != -1 );
+  while ( _wfindnext_func(srchHandle, &data) != -1 );
   this->Internal->Path = name;
   return _findclose(srchHandle) != -1;
 }
 
 unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
 {
-#if _MSC_VER < 1300
+#if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__)
+  // Older Visual C++ and Embarcadero compilers.
   long srchHandle;
-#else
+#else // Newer Visual C++
   intptr_t srchHandle;
 #endif
   char* buf;
@@ -172,7 +183,7 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
   struct _wfinddata_t data;      // data of current file
 
   // Now put them into the file array
-  srchHandle = _wfindfirst((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
+  srchHandle = _wfindfirst_func((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
   delete [] buf;
 
   if ( srchHandle == -1 )
@@ -186,7 +197,7 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
     {
     count++;
     }
-  while ( _wfindnext(srchHandle, &data) != -1 );
+  while ( _wfindnext_func(srchHandle, &data) != -1 );
   _findclose(srchHandle);
   return count;
 }
-- 
GitLab