{
RESULT res = GetResultFromCode(code);
int index = static_cast<int>(res);
- m_counts[index] += 1;
+ m_counts[index]++;
}
++m_nComparedItems;
assert(m_nComparedItems <= m_nTotalItems);
{
DIFFCODE di(diffcode);
+ bool is_dir = di.isDirectory();
// Test first for skipped so we pick all skipped items as such
if (di.isResultFiltered())
{
// skipped
- return di.isDirectory() ? RESULT_DIRSKIP : RESULT_SKIP;
+ return is_dir ? RESULT_DIRSKIP : RESULT_SKIP;
}
else if (di.isSideFirstOnly())
{
// left-only
- return di.isDirectory() ? RESULT_LDIRUNIQUE : RESULT_LUNIQUE;
+ return is_dir ? RESULT_LDIRUNIQUE : RESULT_LUNIQUE;
}
else if (di.isSideSecondOnly())
{
// right-only
- if (di.isDirectory())
+ if (is_dir)
return (m_nDirs < 3) ? RESULT_RDIRUNIQUE : RESULT_MDIRUNIQUE;
else
return (m_nDirs < 3) ? RESULT_RUNIQUE : RESULT_MUNIQUE;
else if (di.isSideThirdOnly())
{
// right-only
- return di.isDirectory() ? RESULT_RDIRUNIQUE : RESULT_RUNIQUE;
+ return is_dir ? RESULT_RDIRUNIQUE : RESULT_RUNIQUE;
}
- else if (m_nDirs > 2 && !di.exists(0) && di.exists(1) && di.exists(2))
- return di.isDirectory() ? RESULT_LDIRMISSING : RESULT_LMISSING;
- else if (m_nDirs > 2 && di.exists(0) && !di.exists(1) && di.exists(2))
- return di.isDirectory() ? RESULT_MDIRMISSING : RESULT_MMISSING;
- else if (m_nDirs > 2 && di.exists(0) && di.exists(1) && !di.exists(2))
- return di.isDirectory() ? RESULT_RDIRMISSING : RESULT_RMISSING;
- else if (di.isResultError())
+ else if (m_nDirs > 2)
+ {
+ switch (diffcode & DIFFCODE::ALL)
+ {
+ case (DIFFCODE::SECOND | DIFFCODE::THIRD) : return is_dir ? RESULT_LDIRMISSING : RESULT_LMISSING;
+ case (DIFFCODE::FIRST | DIFFCODE::THIRD) : return is_dir ? RESULT_MDIRMISSING : RESULT_MMISSING;
+ case (DIFFCODE::FIRST | DIFFCODE::SECOND): return is_dir ? RESULT_RDIRMISSING : RESULT_RMISSING;
+ }
+ }
+ if (di.isResultError())
{
// could be directory error ?
return RESULT_ERROR;
else if (di.isResultSame())
{
// same
- if (di.isDirectory())
+ if (is_dir)
{
return RESULT_DIRSAME;
}
}
else
{
- if (di.isDirectory())
+ if (is_dir)
{
return RESULT_DIRDIFF;
}
: m_inf(new file_data[2]{})
, m_used(false)
{
- Reset();
+ //Reset(); //this call not needed because memset implicitly used in line 26
}
/** @brief deallocate member data */
m_sDisplayFilepath[1] = szTrueFilepath2;
}
-
/** @brief Open file descriptors in the inf structure (return false if failure) */
bool DiffFileData::DoOpenFiles()
{
Reset();
+ const bool same_file = !strutils::compare_nocase(m_FileLocation[0].filepath, m_FileLocation[1].filepath);
+
for (int i = 0; i < 2; ++i)
{
// Fill in 8-bit versions of names for diffutils (WinMerge doesn't use these)
{
_tsopen_s(&m_inf[i].desc, TFile(m_FileLocation[i].filepath).wpath().c_str(),
O_RDONLY | O_BINARY, _SH_DENYNO, _S_IREAD);
- }
- if (m_inf[i].desc < 0)
- return false;
- // Get file stats (diffutils uses these)
- if (myfstat(m_inf[i].desc, &m_inf[i].stat) != 0)
- {
- return false;
+ if (m_inf[i].desc < 0)
+ return false;
+
+ // Get file stats (diffutils uses these)
+ if (myfstat(m_inf[i].desc, &m_inf[i].stat) != 0)
+ return false;
}
- if (strutils::compare_nocase(m_FileLocation[0].filepath,
- m_FileLocation[1].filepath) == 0)
+ if (same_file)
{
m_inf[1].desc = m_inf[0].desc;
+ m_inf[1].stat = m_inf[0].stat;
}
}
}
// clean up any open file handles, and zero stuff out
// open file handles might be leftover from a failure in DiffFileData::OpenFiles
+ if (m_inf[1].desc == m_inf[0].desc)
+ {
+ m_inf[1].desc = 0;
+ }
for (int i = 0; i < 2; ++i)
{
- if (m_inf[1].desc == m_inf[0].desc)
- {
- m_inf[1].desc = 0;
- }
free((void *)m_inf[i].name);
- m_inf[i].name = nullptr;
if (m_inf[i].desc > 0)
{
_close(m_inf[i].desc);
}
- m_inf[i].desc = 0;
m_inf[i] = {};
}
}
}
bool existAll() const
{
- if ((diffcode & DIFFCODE::THREEWAY) == 0)
- return (existsFirst() && existsSecond());
- else
- return (existsFirst() && existsSecond() && existsThird());
+ return ((diffcode & DIFFCODE::THREEWAY) ? DIFFCODE::ALL : DIFFCODE::BOTH) == (diffcode & DIFFCODE::ALL);
}
// compare result