// 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
// 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
{
<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
<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
<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" />
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
/* 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
}
--- /dev/null
+// 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
<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
--- /dev/null
+<?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
<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" />
<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">
--- /dev/null
+#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));
+
+}