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)
22 , m_bIgnoreNumbers(false)
27 * @brief Sets options from DIFFOPTIONS structure.
28 * @param [in] options Diffutils options.
30 void CompareOptions::SetFromDiffOptions(const DIFFOPTIONS &options)
32 switch (options.nIgnoreWhitespace)
35 m_ignoreWhitespace = WHITESPACE_COMPARE_ALL;
38 m_ignoreWhitespace = WHITESPACE_IGNORE_CHANGE;
41 m_ignoreWhitespace = WHITESPACE_IGNORE_ALL;
44 throw "Unknown whitespace ignore value!";
47 m_bIgnoreBlankLines = options.bIgnoreBlankLines;
48 m_bIgnoreCase = options.bIgnoreCase;
49 m_bIgnoreEOLDifference = options.bIgnoreEol;
50 m_bIgnoreNumbers = options.bIgnoreNumbers;
54 * @brief Default constructor.
56 QuickCompareOptions::QuickCompareOptions()
57 : m_bStopAfterFirstDiff(false)
62 * @brief Default constructor.
64 DiffutilsOptions::DiffutilsOptions()
65 : m_outputStyle(DIFF_OUTPUT_NORMAL)
66 , m_diffAlgorithm(DIFF_ALGORITHM_DEFAULT)
68 , m_filterCommentsLines(false)
69 , m_bCompletelyBlankOutIgnoredDiffereneces(false)
70 , m_bIndentHeuristic(true)
75 * @brief Constructor cloning CompareOptions.
76 * @param [in] options CompareOptions instance to clone.
78 DiffutilsOptions::DiffutilsOptions(const CompareOptions& options)
79 : CompareOptions(options)
80 , m_outputStyle(DIFF_OUTPUT_NORMAL)
81 , m_diffAlgorithm(DIFF_ALGORITHM_DEFAULT)
83 , m_filterCommentsLines(false)
84 , m_bCompletelyBlankOutIgnoredDiffereneces(false)
85 , m_bIndentHeuristic(true)
90 * @brief Sets options from DIFFOPTIONS structure.
91 * @param [in] options Diffutils options.
93 void DiffutilsOptions::SetFromDiffOptions(const DIFFOPTIONS & options)
95 CompareOptions::SetFromDiffOptions(options);
96 m_bCompletelyBlankOutIgnoredDiffereneces = options.bCompletelyBlankOutIgnoredChanges;
97 m_filterCommentsLines = options.bFilterCommentsLines;
98 m_bIndentHeuristic = options.bIndentHeuristic;
99 switch (options.nDiffAlgorithm)
102 m_diffAlgorithm = DIFF_ALGORITHM_DEFAULT;
105 m_diffAlgorithm = DIFF_ALGORITHM_MINIMAL;
108 m_diffAlgorithm = DIFF_ALGORITHM_PATIENCE;
111 m_diffAlgorithm = DIFF_ALGORITHM_HISTOGRAM;
114 m_diffAlgorithm = DIFF_ALGORITHM_NONE;
117 throw "Unknown diff algorithm value!";
122 * @brief Set options to diffutils.
123 * Diffutils uses options from global variables we must set. Those variables
124 * aren't most logically named, and most are just int's, with some magic
125 * values and meanings, with fancy combinations? So not easy to setup. This
126 * function maps our easier to handle compare options to diffutils globals.
128 void DiffutilsOptions::SetToDiffUtils()
130 switch (m_outputStyle)
132 case DIFF_OUTPUT_NORMAL:
133 output_style = OUTPUT_NORMAL;
135 case DIFF_OUTPUT_CONTEXT:
136 output_style = OUTPUT_CONTEXT;
138 case DIFF_OUTPUT_UNIFIED:
139 output_style = OUTPUT_UNIFIED;
141 case DIFF_OUTPUT_HTML:
142 output_style = OUTPUT_HTML;
145 throw "Unknown output style!";
149 context = m_contextLines;
151 ignore_space_change_flag = (m_ignoreWhitespace == WHITESPACE_IGNORE_CHANGE);
152 ignore_all_space_flag = (m_ignoreWhitespace == WHITESPACE_IGNORE_ALL);
153 ignore_blank_lines_flag = m_bIgnoreBlankLines;
154 ignore_case_flag = m_bIgnoreCase;
155 ignore_numbers_flag = m_bIgnoreNumbers;
156 ignore_eol_diff = m_bIgnoreEOLDifference;
157 ignore_some_changes = (m_ignoreWhitespace != WHITESPACE_COMPARE_ALL || m_bIgnoreCase || m_bIgnoreBlankLines || m_bIgnoreEOLDifference);
158 length_varies = (m_ignoreWhitespace != WHITESPACE_COMPARE_ALL);
160 // We have no interest changing these values, hard-code them.
161 always_text_flag = 0; // diffutils needs to detect binary files
166 no_diff_means_no_output = 0;
168 line_end_char = '\n';
172 switch_string = NULL;
173 file_label[0] = NULL;
174 file_label[1] = NULL;
178 * @brief Gets options to DIFFOPTIONS structure.
179 * @param [out] options Diffutils options.
181 void DiffutilsOptions::GetAsDiffOptions(DIFFOPTIONS &options) const
183 options.bCompletelyBlankOutIgnoredChanges = m_bCompletelyBlankOutIgnoredDiffereneces;
184 options.bFilterCommentsLines = m_filterCommentsLines;
185 options.bIgnoreBlankLines = m_bIgnoreBlankLines;
186 options.bIgnoreCase = m_bIgnoreCase;
187 options.bIgnoreEol = m_bIgnoreEOLDifference;
188 options.bIgnoreNumbers = m_bIgnoreNumbers;
189 options.nDiffAlgorithm = m_diffAlgorithm;
191 switch (m_ignoreWhitespace)
193 case WHITESPACE_COMPARE_ALL:
194 options.nIgnoreWhitespace = 0;
196 case WHITESPACE_IGNORE_CHANGE:
197 options.nIgnoreWhitespace = 1;
199 case WHITESPACE_IGNORE_ALL:
200 options.nIgnoreWhitespace = 2;
203 throw "Unknown whitespace ignore value!";
208 QuickCompareOptions::QuickCompareOptions(const CompareOptions& options)
209 : CompareOptions(options)
210 , m_bStopAfterFirstDiff(false)