2 * @file CompareOptions.cpp
4 * @brief Compare options implementation.
8 #include "CompareOptions.h"
11 // Global defined in diffutils code
12 extern DECL_TLS int recursive;
15 * @brief Default constructor.
17 CompareOptions::CompareOptions()
18 : m_ignoreWhitespace(WHITESPACE_COMPARE_ALL)
19 , m_bIgnoreBlankLines(false)
20 , m_bIgnoreCase(false)
21 , m_bIgnoreEOLDifference(false)
26 * @brief Copy constructor.
28 CompareOptions::CompareOptions(const CompareOptions & options)
29 : m_ignoreWhitespace(options.m_ignoreWhitespace)
30 , m_bIgnoreBlankLines(options.m_bIgnoreBlankLines)
31 , m_bIgnoreCase(options.m_bIgnoreCase)
32 , m_bIgnoreEOLDifference(options.m_bIgnoreEOLDifference)
37 * @brief Sets options from DiffutilsOptions structure.
38 * @param [in] options Diffutils options.
40 DiffutilsOptions::DiffutilsOptions(const DiffutilsOptions& options)
41 : CompareOptions(options)
42 , m_contextLines(options.m_contextLines)
43 , m_filterCommentsLines(options.m_filterCommentsLines)
44 , m_diffAlgorithm(options.m_diffAlgorithm)
45 , m_bIndentHeuristic(options.m_bIndentHeuristic)
46 , m_bCompletelyBlankOutIgnoredDiffereneces(options.m_bCompletelyBlankOutIgnoredDiffereneces)
47 , m_outputStyle(options.m_outputStyle)
52 * @brief Sets options from DIFFOPTIONS structure.
53 * @param [in] options Diffutils options.
55 void CompareOptions::SetFromDiffOptions(const DIFFOPTIONS &options)
57 switch (options.nIgnoreWhitespace)
60 m_ignoreWhitespace = WHITESPACE_COMPARE_ALL;
63 m_ignoreWhitespace = WHITESPACE_IGNORE_CHANGE;
66 m_ignoreWhitespace = WHITESPACE_IGNORE_ALL;
69 throw "Unknown whitespace ignore value!";
72 m_bIgnoreBlankLines = options.bIgnoreBlankLines;
73 m_bIgnoreCase = options.bIgnoreCase;
74 m_bIgnoreEOLDifference = options.bIgnoreEol;
78 * @brief Default constructor.
80 QuickCompareOptions::QuickCompareOptions()
81 : m_bStopAfterFirstDiff(false)
87 * @brief Default constructor.
89 DiffutilsOptions::DiffutilsOptions()
90 : m_outputStyle(DIFF_OUTPUT_NORMAL)
92 , m_filterCommentsLines(false)
93 , m_bCompletelyBlankOutIgnoredDiffereneces(false)
94 , m_bIndentHeuristic(true)
95 , m_diffAlgorithm(DIFF_ALGORITHM_DEFAULT)
100 * @brief Constructor cloning CompareOptions.
101 * @param [in] options CompareOptions instance to clone.
103 DiffutilsOptions::DiffutilsOptions(const CompareOptions& options)
104 : CompareOptions(options)
105 , m_outputStyle(DIFF_OUTPUT_NORMAL)
107 , m_filterCommentsLines(false)
108 , m_bCompletelyBlankOutIgnoredDiffereneces(false)
109 , m_bIndentHeuristic(true)
110 , m_diffAlgorithm(DIFF_ALGORITHM_DEFAULT)
115 * @brief Sets options from DIFFOPTIONS structure.
116 * @param [in] options Diffutils options.
118 void DiffutilsOptions::SetFromDiffOptions(const DIFFOPTIONS & options)
120 CompareOptions::SetFromDiffOptions(options);
121 m_bCompletelyBlankOutIgnoredDiffereneces = options.bCompletelyBlankOutIgnoredChanges;
122 m_filterCommentsLines = options.bFilterCommentsLines;
123 m_bIndentHeuristic = options.bIndentHeuristic;
124 switch (options.nDiffAlgorithm)
127 m_diffAlgorithm = DIFF_ALGORITHM_DEFAULT;
130 m_diffAlgorithm = DIFF_ALGORITHM_MINIMAL;
133 m_diffAlgorithm = DIFF_ALGORITHM_PATIENCE;
136 m_diffAlgorithm = DIFF_ALGORITHM_HISTOGRAM;
139 throw "Unknown diff algorithm value!";
145 * @brief Set options to diffutils.
146 * Diffutils uses options from global variables we must set. Those variables
147 * aren't most logically named, and most are just int's, with some magic
148 * values and meanings, with fancy combinations? So not easy to setup. This
149 * function maps our easier to handle compare options to diffutils globals.
151 void DiffutilsOptions::SetToDiffUtils()
153 switch (m_outputStyle)
155 case DIFF_OUTPUT_NORMAL:
156 output_style = OUTPUT_NORMAL;
158 case DIFF_OUTPUT_CONTEXT:
159 output_style = OUTPUT_CONTEXT;
161 case DIFF_OUTPUT_UNIFIED:
162 output_style = OUTPUT_UNIFIED;
164 case DIFF_OUTPUT_HTML:
165 output_style = OUTPUT_HTML;
168 throw "Unknown output style!";
172 context = m_contextLines;
174 if (m_ignoreWhitespace == WHITESPACE_IGNORE_CHANGE)
175 ignore_space_change_flag = 1;
177 ignore_space_change_flag = 0;
179 if (m_ignoreWhitespace == WHITESPACE_IGNORE_ALL)
180 ignore_all_space_flag = 1;
182 ignore_all_space_flag = 0;
184 if (m_bIgnoreBlankLines)
185 ignore_blank_lines_flag = 1;
187 ignore_blank_lines_flag = 0;
190 ignore_case_flag = 1;
192 ignore_case_flag = 0;
194 if (m_bIgnoreEOLDifference)
199 if (m_ignoreWhitespace != WHITESPACE_COMPARE_ALL || m_bIgnoreCase ||
200 m_bIgnoreBlankLines || m_bIgnoreEOLDifference)
201 ignore_some_changes = 1;
203 ignore_some_changes = 0;
205 if (m_ignoreWhitespace != WHITESPACE_COMPARE_ALL)
210 // We have no interest changing these values, hard-code them.
211 always_text_flag = 0; // diffutils needs to detect binary files
218 * @brief Gets options to DIFFOPTIONS structure.
219 * @param [out] options Diffutils options.
221 void DiffutilsOptions::GetAsDiffOptions(DIFFOPTIONS &options) const
223 options.bCompletelyBlankOutIgnoredChanges = m_bCompletelyBlankOutIgnoredDiffereneces;
224 options.bFilterCommentsLines = m_filterCommentsLines;
225 options.bIgnoreBlankLines = m_bIgnoreBlankLines;
226 options.bIgnoreCase = m_bIgnoreCase;
227 options.bIgnoreEol = m_bIgnoreEOLDifference;
229 switch (m_ignoreWhitespace)
231 case WHITESPACE_COMPARE_ALL:
232 options.nIgnoreWhitespace = 0;
234 case WHITESPACE_IGNORE_CHANGE:
235 options.nIgnoreWhitespace = 1;
237 case WHITESPACE_IGNORE_ALL:
238 options.nIgnoreWhitespace = 2;
241 throw "Unknown whitespace ignore value!";
246 QuickCompareOptions::QuickCompareOptions(const CompareOptions& options)
247 : CompareOptions(options)
248 , m_bStopAfterFirstDiff(false)