OSDN Git Service

Add the alternative functions of _fstat() and _wstat() for the bug https://connect...
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 2 Jul 2017 08:46:22 +0000 (17:46 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 2 Jul 2017 08:46:22 +0000 (17:46 +0900)
12 files changed:
Src/DiffFileData.cpp
Src/DiffWrapper.cpp
Src/Merge.vcxproj
Src/Merge.vcxproj.filters
Src/Merge.vs2015.vcxproj
Src/diffutils/src/diff.h
Src/diffutils/src/mystat.cpp [new file with mode: 0644]
Testing/GoogleTest/UnitTests/UnitTests.vcxproj
Testing/GoogleTest/UnitTests/UnitTests.vcxproj.filters [new file with mode: 0644]
Testing/GoogleTest/UnitTests/UnitTests.vs2015.vcxproj
Testing/GoogleTest/UnitTests/UnitTests.vs2015.vcxproj.filters
Testing/GoogleTest/diffutils/mystat_test.cpp [new file with mode: 0644]

index b1c44b7..4f2bb9c 100644 (file)
@@ -92,7 +92,7 @@ bool DiffFileData::DoOpenFiles()
 
                // Get file stats (diffutils uses these)
 #ifdef _WIN32
-               if (_fstat(m_inf[i].desc, &m_inf[i].stat) != 0)
+               if (myfstat(m_inf[i].desc, &m_inf[i].stat) != 0)
 #else
                if (fstat(m_inf[i].desc, &m_inf[i].stat) != 0)
 #endif
index ea09382..60a5fbf 100644 (file)
@@ -1543,8 +1543,8 @@ void CDiffWrapper::WritePatchFile(struct change * script, file_data * inf)
        // If not, then we can't help it, and hence assert that this won't happen.
        if (!m_bPathsAreTemp)
        {
-               _tstat(m_files[0].c_str(), &inf_patch[0].stat);
-               _tstat(m_files[1].c_str(), &inf_patch[1].stat);
+               mywstat(m_files[0].c_str(), &inf_patch[0].stat);
+               mywstat(m_files[1].c_str(), &inf_patch[1].stat);
        }
        else
        {
index f35c8c5..59e0412 100644 (file)
     <ClCompile Include="diffutils\src\util.c">\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
+    <ClCompile Include="diffutils\src\mystat.cpp">\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+    </ClCompile>\r
     <ClCompile Include="CompareEngines\ByteComparator.cpp">\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
index 5cf1788..323b41c 100644 (file)
     <ClCompile Include="VSSHelper.cpp">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\ANALYZE.C">\r
+    <ClCompile Include="diffutils\src\analyze.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\lib\CMPBUF.C">\r
+    <ClCompile Include="diffutils\lib\cmpbuf.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\CONTEXT.C">\r
+    <ClCompile Include="diffutils\src\context.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
     <ClCompile Include="diffutils\src\Diff.cpp">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\ED.C">\r
+    <ClCompile Include="diffutils\src\ed.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
     <ClCompile Include="diffutils\GnuVersion.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\IFDEF.C">\r
+    <ClCompile Include="diffutils\src\ifdef.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\IO.C">\r
+    <ClCompile Include="diffutils\src\io.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\NORMAL.C">\r
+    <ClCompile Include="diffutils\src\normal.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\SIDE.C">\r
+    <ClCompile Include="diffutils\src\side.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="diffutils\src\UTIL.C">\r
+    <ClCompile Include="diffutils\src\util.c">\r
       <Filter>DiffEngine</Filter>\r
     </ClCompile>\r
     <ClCompile Include="CompareEngines\ByteComparator.cpp">\r
     <ClCompile Include="TestMain.cpp">\r
       <Filter>MFCGui\Source Files</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="diffutils\src\mystat.cpp">\r
+      <Filter>DiffEngine</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="charsets.h">\r
index 7565f83..bc14974 100644 (file)
     <ClCompile Include="TempFile.cpp">
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
     </ClCompile>
+    <ClCompile Include="Test.cpp" />
     <ClCompile Include="TestFilterDlg.cpp" />
     <ClCompile Include="Common\unicoder.cpp">
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
     <ClCompile Include="Common\UniFile.cpp">
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
     </ClCompile>
+    <ClCompile Include="TestMain.cpp" />
     <ClCompile Include="TrDialogs.cpp" />
     <ClCompile Include="UniMarkdownFile.cpp">
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
     <ClCompile Include="diffutils\src\util.c">
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
     </ClCompile>
+    <ClCompile Include="diffutils\src\mystat.cpp">
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+    </ClCompile>
     <ClCompile Include="CompareEngines\ByteComparator.cpp">
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
     </ClCompile>
     <ClInclude Include="stringdiffsi.h" />
     <ClInclude Include="Common\SuperComboBox.h" />
     <ClInclude Include="TempFile.h" />
+    <ClInclude Include="TestMain.h" />
     <ClInclude Include="TestFilterDlg.h" />
     <ClInclude Include="Common\unicoder.h" />
     <ClInclude Include="Common\UnicodeString.h" />
index 9ae8e82..405e2fd 100644 (file)
@@ -231,7 +231,7 @@ struct file_data {
     int             desc;      /* File descriptor  */
     char const      *name;     /* File name  */
 #ifdef _WIN32
-    struct _stat    stat;      /* File status from fstat()  */
+    struct _stat64  stat;      /* File status from fstat()  */
 #else
     struct stat     stat;      /* File status from fstat()  */
 #endif
@@ -375,6 +375,12 @@ int FileIsBinary(int fd);
 /* version.c */
 extern char const version_string[];
 
+#ifdef _WIN32
+/* mystat.cpp */
+int myfstat(int fd, struct _stat64 *buf);
+int mywstat(const wchar_t *filename, struct _stat64 *buf);
+#endif
+
 #ifdef __cplusplus
 #undef HUGE
 }
diff --git a/Src/diffutils/src/mystat.cpp b/Src/diffutils/src/mystat.cpp
new file mode 100644 (file)
index 0000000..0e89507
--- /dev/null
@@ -0,0 +1,90 @@
+// my own _fstat() and _wstat() implementation for the bug https://connect.microsoft.com/VisualStudio/feedback/details/1600505/stat-not-working-on-windows-xp-using-v14-xp-platform-toolset-vs2015\r
+#include <sys/stat.h>\r
+#include <io.h>\r
+#include <cstdint>\r
+#include <cerrno>\r
+#include <Windows.h>\r
+\r
+inline time_t filetime_to_time_t(const FILETIME& ft)\r
+{\r
+       return ((static_cast<int64_t>(ft.dwHighDateTime) << 32) + ft.dwLowDateTime) / 10000000ULL - 11644473600ULL;\r
+}\r
+\r
+template<typename FileInfo>\r
+inline void set_statbuf(const FileInfo& hfi, struct _stat64& buf)\r
+{\r
+       buf.st_size = (static_cast<int64_t>(hfi.nFileSizeHigh) << 32) | hfi.nFileSizeLow;\r
+       buf.st_atime = filetime_to_time_t(hfi.ftLastAccessTime);\r
+       buf.st_mtime = filetime_to_time_t(hfi.ftLastWriteTime);\r
+       buf.st_ctime = filetime_to_time_t(hfi.ftCreationTime);\r
+       buf.st_mode = \r
+               ((hfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? _S_IFDIR : _S_IFREG) |\r
+               ((hfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY ) ? \r
+                        (_S_IREAD              | ( _S_IREAD              >> 3) | ( _S_IREAD              >> 6)) : \r
+                       ((_S_IREAD | _S_IWRITE) | ((_S_IREAD | _S_IWRITE) >> 3) | ((_S_IREAD | _S_IWRITE) >> 6)));\r
+}\r
+\r
+extern "C" int myfstat(int fd, struct _stat64 *buf)\r
+{\r
+       if (!buf)\r
+       {\r
+               errno = EINVAL;\r
+               return -1;\r
+       }\r
+       HANDLE hFile = reinterpret_cast<HANDLE>(_get_osfhandle(fd));\r
+       if (hFile == INVALID_HANDLE_VALUE)\r
+       {\r
+               errno = EBADF;\r
+               return -1;\r
+       }\r
+       memset(buf, 0, sizeof(*buf));\r
+       switch (GetFileType(hFile) & ~FILE_TYPE_REMOTE)\r
+       {\r
+       case FILE_TYPE_CHAR:\r
+               buf->st_mode = _S_IFCHR;\r
+               return 0;\r
+       case FILE_TYPE_PIPE:\r
+               buf->st_mode = _S_IFIFO;\r
+               DWORD nBufferSize;\r
+               if (PeekNamedPipe(hFile, NULL, 0, NULL, &nBufferSize, NULL))\r
+                       buf->st_size = nBufferSize;\r
+               return 0;\r
+       case FILE_TYPE_DISK:\r
+               BY_HANDLE_FILE_INFORMATION hfi;\r
+               if (!GetFileInformationByHandle(hFile, &hfi))\r
+               {\r
+                       errno = EBADF;\r
+                       return -1;\r
+               }\r
+               set_statbuf(hfi, *buf);\r
+               return 0;\r
+       default:\r
+               errno = EBADF;\r
+               return -1;\r
+       }\r
+}\r
+\r
+extern "C" int mywstat(const wchar_t *filename, struct _stat64 *buf)\r
+{\r
+       if (!buf)\r
+       {\r
+               errno = EINVAL;\r
+               return -1;\r
+       }\r
+       if (wcspbrk(filename, L"*?"))\r
+       {\r
+               errno = ENOENT;\r
+               return -1;\r
+       }\r
+       WIN32_FIND_DATAW ffd;\r
+       HANDLE hFindFile = FindFirstFileW(filename, &ffd);\r
+       if (hFindFile == INVALID_HANDLE_VALUE)\r
+       {\r
+               errno = ENOENT;\r
+               return -1;\r
+       }\r
+       FindClose(hFindFile);\r
+       memset(buf, 0, sizeof(*buf));\r
+       set_statbuf(ffd, *buf);\r
+       return 0;\r
+}\r
index a371f8d..6dfa024 100644 (file)
     <ClCompile Include="..\..\..\Src\DiffFileInfo.cpp" />\r
     <ClCompile Include="..\..\..\Src\DiffItem.cpp" />\r
     <ClCompile Include="..\..\..\Src\diffutils\src\Diff.cpp" />\r
+    <ClCompile Include="..\..\..\Src\diffutils\src\mystat.cpp" />\r
     <ClCompile Include="..\..\..\Src\DirItem.cpp" />\r
     <ClCompile Include="..\..\..\Src\Environment.cpp" />\r
     <ClCompile Include="..\..\..\Src\Common\ExConverter.cpp" />\r
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ClCompile Include="..\BinaryCompare\BinaryCompare_test.cpp" />\r
+    <ClCompile Include="..\diffutils\mystat_test.cpp" />\r
     <ClCompile Include="..\ShellFileOperations\ShellFileOperations_test.cpp" />\r
     <ClCompile Include="..\TimeSizeCompare\TimeSizeCompare_test.cpp" />\r
     <ClCompile Include="misc.cpp" />\r
diff --git a/Testing/GoogleTest/UnitTests/UnitTests.vcxproj.filters b/Testing/GoogleTest/UnitTests/UnitTests.vcxproj.filters
new file mode 100644 (file)
index 0000000..11e5de2
--- /dev/null
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+    </Filter>
+    <Filter Include="Tests">
+      <UniqueIdentifier>{4b87ff85-2ba4-475b-823e-af42e45a3098}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="gtest">
+      <UniqueIdentifier>{20eb57d2-cf08-44a2-b9e0-c7f267013211}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\..\Src\CompareEngines\ByteComparator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\CompareEngines\ByteCompare.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\charsets.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\codepage_detect.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\CompareOptions.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\coretools.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\diffutils\src\Diff.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\DirItem.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Environment.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\ExConverter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FileFilter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FileFilterHelper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FileFilterMgr.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FileTextEncoding.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FileTransform.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FileVersion.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\FilterList.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\lwdisp.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\markdown.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\MergeCmdLineInfo.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="misc.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\multiformatText.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\OptionsMgr.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\PathContext.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\paths.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\PluginManager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Plugins.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\ProjectFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\RegKey.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\RegOptionsMgr.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\stringdiffs.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\unicoder.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\UnicodeString.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\UniFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\UniMarkdownFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\varprop.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ByteCompare\ByteCompare_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Encoding\charsets_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Encoding\codepage_detect_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\DirItem\DirItem_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Environment\Environemt_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FileFilter\FileFilterHelper_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FileVersion\FileVersion_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\markdown\markdown_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\CmdLine\MergeCmdLine_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\multiformatText\multiformatText_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Paths\paths_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Plugins\Plugins_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ProjectFile\ProjectFile_test_LeftAndRight.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ProjectFile\ProjectFile_test_LeftAndRightNonRecursive.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ProjectFile\ProjectFile_test_LeftAndRightRecursive.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ProjectFile\ProjectFile_test_PathsAndFilter.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ProjectFile\ProjectFile_test_SimpleLeft.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ProjectFile\ProjectFile_test_SimpleRight.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\OptionsMgr\RegOptionsMgr_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\StringDiffs\stringdiffs_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\StringDiffs\stringdiffs_test_adds.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\StringDiffs\stringdiffs_test_bugs.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\StringDiffs\stringdiffs_test_bytelevel.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="test_main.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\unicoder\unicoder_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\UnicodeString\UnicodeString_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\OptionsMgr\VariantValue_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\ShellFileOperations\ShellFileOperations_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\Common\ShellFileOperations.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Externals\gtest\src\gtest-all.cc">
+      <Filter>gtest</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\CompareEngines\BinaryCompare.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\BinaryCompare\BinaryCompare_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\DiffItem.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\TimeSizeCompare\TimeSizeCompare_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\CompareEngines\TimeSizeCompare.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\OptionsDef.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\DiffFileInfo.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\diffutils\src\mystat.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\diffutils\mystat_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\..\Src\CompareEngines\ByteComparator.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\CompareEngines\ByteCompare.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\charsets.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\codepage_detect.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\CompareOptions.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\coretools.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\CompareEngines\DiffUtils.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\DirItem.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Environment.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\ExConverter.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FileFilter.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FileFilterHelper.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FileFilterMgr.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FileTextEncoding.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FileTransform.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FileVersion.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\FilterList.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\LogFile.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\lwdisp.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\markdown.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\MergeCmdLineInfo.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\multiformatText.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\OptionsMgr.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\PathContext.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\paths.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\PluginManager.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Plugins.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\ProjectFile.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\RegKey.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\RegOptionsMgr.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\stringdiffs.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\stringdiffsi.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\unicoder.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\UnicodeString.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\UniMarkdownFile.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\varprop.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\Common\ShellFileOperations.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\CompareEngines\BinaryCompare.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\DiffItem.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Src\CompareEngines\TimeSizeCompare.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>
\ No newline at end of file
index 4e58417..b5ae582 100644 (file)
     <ClCompile Include="..\..\..\Src\DiffFileInfo.cpp" />
     <ClCompile Include="..\..\..\Src\DiffItem.cpp" />
     <ClCompile Include="..\..\..\Src\diffutils\src\Diff.cpp" />
+    <ClCompile Include="..\..\..\Src\diffutils\src\mystat.cpp" />
     <ClCompile Include="..\..\..\Src\DirItem.cpp" />
     <ClCompile Include="..\..\..\Src\Environment.cpp" />
     <ClCompile Include="..\..\..\Src\Common\ExConverter.cpp" />
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
     </ClCompile>
     <ClCompile Include="..\BinaryCompare\BinaryCompare_test.cpp" />
+    <ClCompile Include="..\diffutils\mystat_test.cpp" />
     <ClCompile Include="..\ShellFileOperations\ShellFileOperations_test.cpp" />
     <ClCompile Include="..\TimeSizeCompare\TimeSizeCompare_test.cpp" />
     <ClCompile Include="misc.cpp" />
index fca369a..11e5de2 100644 (file)
     <ClCompile Include="..\..\..\Src\DiffFileInfo.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\Src\diffutils\src\mystat.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\diffutils\mystat_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\Src\CompareEngines\ByteComparator.h">
diff --git a/Testing/GoogleTest/diffutils/mystat_test.cpp b/Testing/GoogleTest/diffutils/mystat_test.cpp
new file mode 100644 (file)
index 0000000..a3472da
--- /dev/null
@@ -0,0 +1,63 @@
+#include <gtest/gtest.h>
+#include <sys/stat.h>
+#include "Environment.h"
+#include "paths.h"
+#include "diff.h"
+#include <Windows.h>
+
+TEST(diffutils, stat)
+{
+       struct _stat64 buf, buf2, buf3, buf4, buf5;
+       String filename  = paths::ConcatPath(env::GetProgPath(), _T("../TestData/_tmp_test.txt"));
+       String filename2 = paths::ConcatPath(env::GetProgPath(), _T("../TestData/LeftAndRight.WinMerge"));
+       int fd;
+       EXPECT_EQ(0, _tsopen_s(&fd, filename.c_str(), _O_RDWR | _O_CREAT, _SH_DENYNO, _S_IREAD | _S_IWRITE));
+       _write(fd, "0123456789", 10);
+       time_t t = time(&t);
+
+       EXPECT_EQ(0, myfstat(fd, &buf));
+       EXPECT_EQ(buf.st_size, 10);
+       EXPECT_EQ(t, buf.st_mtime);
+       EXPECT_NE(0, buf.st_mode & _S_IFREG);
+       EXPECT_NE(0, buf.st_mode & _S_IREAD);
+       EXPECT_NE(0, buf.st_mode & _S_IWRITE);
+       _close(fd);
+
+       mywstat(filename.c_str(), &buf2);
+       EXPECT_EQ(buf2.st_size, 10);
+       EXPECT_EQ(t, buf2.st_mtime);
+       EXPECT_NE(0, buf2.st_mode & _S_IFREG);
+       EXPECT_NE(0, buf2.st_mode & _S_IREAD);
+       EXPECT_NE(0, buf2.st_mode & _S_IWRITE);
+       _tremove(filename.c_str());
+
+       int fds[2];
+       char data[256];
+       EXPECT_EQ(0, _pipe(fds, 256, O_BINARY));
+       _write(fds[1], "0123456789", 10);
+       EXPECT_EQ(0, myfstat(fds[0], &buf3));
+       EXPECT_EQ(10, buf3.st_size);
+       EXPECT_NE(0, buf3.st_mode & _S_IFIFO);
+       _read(fds[0], data, sizeof(data));
+       _close(fds[0]);
+       _close(fds[1]);
+
+       _tsopen_s(&fd, _T("CON"), _O_TEXT, _SH_DENYNO, _S_IWRITE);
+       EXPECT_EQ(0, myfstat(fd, &buf4));
+       EXPECT_NE(0, buf4.st_mode & _S_IFCHR);
+       _close(fd);
+
+       _tsopen_s(&fd, _T("NUL"), _O_TEXT, _SH_DENYNO, _S_IWRITE);
+       EXPECT_EQ(0, myfstat(fd, &buf5));
+       EXPECT_NE(0, buf5.st_mode & _S_IFCHR);
+       _close(fd);
+
+       //EXPECT_EQ(-1, myfstat(999, &buf));
+       EXPECT_EQ(-1, myfstat(1, NULL));
+       EXPECT_EQ(-1, mywstat(L"aaaa", NULL));
+       EXPECT_EQ(-1, mywstat(L"aaaa", &buf2));
+       EXPECT_EQ(-1, mywstat(filename2.c_str(), NULL));
+
+       EXPECT_EQ(0, mywstat(L"CON", &buf2));
+       
+}