@@ -69,10 +69,9 @@ static int compare_files(const String& file1, const String& file2, const IAborta
6969
7070/* *
7171 * @brief Compare two specified files, byte-by-byte
72- * @param [in] di Diffitem info.
73- * @return DIFFCODE
72+ * @param [in,out] di Diffitem info. Results are written to di.diffcode.
7473 */
75- int BinaryCompare::CompareFiles (const DIFFITEM & di) const
74+ void BinaryCompare::CompareFiles (DIFFITEM& di) const
7675{
7776 PathContext files;
7877 m_ctxt.GetComparePaths (di, files);
@@ -90,31 +89,65 @@ int BinaryCompare::CompareFiles(const DIFFITEM &di) const
9089 return DIFFCODE::DIFF;
9190 return compare_files (files[p1], files[p2], m_ctxt.GetAbortable ());
9291 };
92+
93+ int result = DIFFCODE::CMPERR;
94+
9395 switch (files.GetSize ())
9496 {
9597 case 2 :
96- return cmp (0 , 1 );
98+ result = cmp (0 , 1 );
99+ break ;
100+
97101 case 3 :
98- unsigned code10 = cmp (1 , 0 );
99- unsigned code12 = cmp (1 , 2 );
100- unsigned code02 = DIFFCODE::SAME;
101- if (code10 == DIFFCODE::SAME && code12 == DIFFCODE::SAME)
102- return DIFFCODE::SAME;
103- else if (code10 == DIFFCODE::SAME && code12 == DIFFCODE::DIFF)
104- return DIFFCODE::DIFF | DIFFCODE::DIFF3RDONLY;
105- else if (code10 == DIFFCODE::DIFF && code12 == DIFFCODE::SAME)
106- return DIFFCODE::DIFF | DIFFCODE::DIFF1STONLY;
107- else if (code10 == DIFFCODE::DIFF && code12 == DIFFCODE::DIFF)
108102 {
109- code02 = cmp (0 , 2 );
110- if (code02 == DIFFCODE::SAME)
111- return DIFFCODE::DIFF | DIFFCODE::DIFF2NDONLY;
103+ unsigned code10 = cmp (1 , 0 );
104+ unsigned code12 = cmp (1 , 2 );
105+ unsigned code02 = DIFFCODE::SAME;
106+ // Propagate user aborts from pairwise comparisons
107+ if (code10 == DIFFCODE::CMPABORT || code12 == DIFFCODE::CMPABORT)
108+ {
109+ result = DIFFCODE::CMPABORT;
110+ }
111+ else if (code10 == DIFFCODE::SAME && code12 == DIFFCODE::SAME)
112+ {
113+ result = DIFFCODE::SAME;
114+ }
115+ else if (code10 == DIFFCODE::SAME && code12 == DIFFCODE::DIFF)
116+ {
117+ result = DIFFCODE::DIFF | DIFFCODE::DIFF3RDONLY;
118+ }
119+ else if (code10 == DIFFCODE::DIFF && code12 == DIFFCODE::SAME)
120+ {
121+ result = DIFFCODE::DIFF | DIFFCODE::DIFF1STONLY;
122+ }
123+ else if (code10 == DIFFCODE::DIFF && code12 == DIFFCODE::DIFF)
124+ {
125+ code02 = cmp (0 , 2 );
126+ if (code02 == DIFFCODE::CMPABORT)
127+ {
128+ result = DIFFCODE::CMPABORT;
129+ }
130+ else if (code02 == DIFFCODE::SAME)
131+ {
132+ result = DIFFCODE::DIFF | DIFFCODE::DIFF2NDONLY;
133+ }
134+ else
135+ {
136+ result = DIFFCODE::DIFF;
137+ }
138+ }
139+ // Propagate comparison errors, but do not override an abort result
140+ if (result != DIFFCODE::CMPABORT &&
141+ (code10 == DIFFCODE::CMPERR || code12 == DIFFCODE::CMPERR || code02 == DIFFCODE::CMPERR))
142+ {
143+ result = DIFFCODE::CMPERR;
144+ }
112145 }
113- if (code10 == DIFFCODE::CMPERR || code12 == DIFFCODE::CMPERR || code02 == DIFFCODE::CMPERR)
114- return DIFFCODE::CMPERR;
115- return DIFFCODE::DIFF;
146+ break ;
116147 }
117- return DIFFCODE::CMPERR;
148+
149+ di.diffcode .diffcode &= ~(DIFFCODE::TEXTFLAGS | DIFFCODE::TYPEFLAGS | DIFFCODE::COMPAREFLAGS | DIFFCODE::COMPAREFLAGS3WAY);
150+ di.diffcode .diffcode |= DIFFCODE::FILE | result;
118151}
119152
120153} // namespace CompareEngines
0 commit comments