Thread: [Winmerge-svn] SF.net SVN: winmerge:[6640] trunk/Src/stringdiffs.cpp
Windows visual diff and merge for files and directories
Brought to you by:
christianlist,
grimmdp
From: <ki...@us...> - 2009-04-04 13:44:07
|
Revision: 6640 http://winmerge.svn.sourceforge.net/winmerge/?rev=6640&view=rev Author: kimmov Date: 2009-04-04 13:41:40 +0000 (Sat, 04 Apr 2009) Log Message: ----------- Use own #define for stringdiff logging. Stringdiff logging is verbose and slows down debug builds so it should be enabled only when debugging strindiff code. Idea from Matthias Mayer. Modified Paths: -------------- trunk/Src/stringdiffs.cpp Modified: trunk/Src/stringdiffs.cpp =================================================================== --- trunk/Src/stringdiffs.cpp 2009-04-04 11:49:06 UTC (rev 6639) +++ trunk/Src/stringdiffs.cpp 2009-04-04 13:41:40 UTC (rev 6640) @@ -18,6 +18,10 @@ using std::vector; +// Uncomment this to see stringdiff log messages +// We don't use _DEBUG since stringdiff logging is verbose and slows down WinMerge +// #define STRINGDIFF_LOGGING + static bool Initialized; static bool CustomChars; static TCHAR *BreakChars; @@ -382,13 +386,13 @@ } } // Remove empty records on both side -#ifdef _DEBUG +#ifdef Process32First OutputDebugString(_T("remove empty records on both side \n")); #endif i = 0; while ((i < m_words1.size()) && (i < m_words2.size())) { -#ifdef _DEBUG +#ifdef STRINGDIFF_LOGGING wsprintf(buf, _T("left=%d, op=%d, right=%d, op=%d\n"), m_words1[i]->hash, m_words1[i]->bBreak, m_words2[i]->hash, m_words2[i]->bBreak); OutputDebugString(buf); @@ -490,7 +494,7 @@ } // Final run create diff -#ifdef _DEBUG +#ifdef STRINGDIFF_LOGGING OutputDebugString(_T("final run create diff \n")); wsprintf(buf, _T("left= %d, right= %d \n"), m_str1.length(), m_str2.length()); @@ -510,7 +514,7 @@ int e2 = m_words2[i]->end ; int len2 = e2 - s2 + 1; -#ifdef _DEBUG +#ifdef STRINGDIFF_LOGGING if (IsInsert(*m_words1[i])) str1.clear(); else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2009-04-04 14:17:51
|
Revision: 6641 http://winmerge.svn.sourceforge.net/winmerge/?rev=6641&view=rev Author: kimmov Date: 2009-04-04 14:17:42 +0000 (Sat, 04 Apr 2009) Log Message: ----------- Fix copy/paste error when renaming _DEBUG to STRINGDIFF_LOGGING in previous commit. Modified Paths: -------------- trunk/Src/stringdiffs.cpp Modified: trunk/Src/stringdiffs.cpp =================================================================== --- trunk/Src/stringdiffs.cpp 2009-04-04 13:41:40 UTC (rev 6640) +++ trunk/Src/stringdiffs.cpp 2009-04-04 14:17:42 UTC (rev 6641) @@ -386,7 +386,7 @@ } } // Remove empty records on both side -#ifdef Process32First +#ifdef STRINGDIFF_LOGGING OutputDebugString(_T("remove empty records on both side \n")); #endif i = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2009-07-23 15:11:47
|
Revision: 6920 http://winmerge.svn.sourceforge.net/winmerge/?rev=6920&view=rev Author: kimmov Date: 2009-07-23 15:11:41 +0000 (Thu, 23 Jul 2009) Log Message: ----------- PATCH: [ 2824173 ] Stringdiffs Optimize loops Submitted by Matthias Mayer Modified Paths: -------------- trunk/Src/stringdiffs.cpp Modified: trunk/Src/stringdiffs.cpp =================================================================== --- trunk/Src/stringdiffs.cpp 2009-07-22 11:15:45 UTC (rev 6919) +++ trunk/Src/stringdiffs.cpp 2009-07-23 15:11:41 UTC (rev 6920) @@ -566,7 +566,9 @@ // Be aware, do not create more wdiffs as shortest line has chars! int imaxcount = min(m_str1.length(), m_str2.length()); i = 0; - while ((i < (int)m_words1.size()) && (i < (int)m_words2.size()) && ((int)m_wdiffs.size() <= imaxcount)) + const int iSize1 = (int)m_words1.size(); + const int iSize2 = (int)m_words2.size(); + while ((i < iSize1) && (i < iSize2) && ((int)m_wdiffs.size() <= imaxcount)) { if (!AreWordsSame(*m_words1[i], *m_words2[i])) { @@ -579,7 +581,7 @@ int len1 = e1 - s1 + 1; int len2 = e2 - s2 + 1; - if (IsInsert(*m_words1[i])) + if (IsInsert(*m_words1[i])) str1.clear(); else { @@ -622,7 +624,8 @@ int stringdiffs::FindNextMatchInWords1(const word & needword2, int bw1) const { - while (bw1 < (int) m_words1.size()) + const int iSize = (int) m_words1.size(); + while (bw1 < iSize) { if (AreWordsSame(*m_words1[bw1], needword2)) return bw1; @@ -637,7 +640,8 @@ int stringdiffs::FindNextMatchInWords2(const word & needword1, int bw2) const { - while (bw2 < (int)m_words2.size()) + const int iSize = (int) m_words2.size(); + while (bw2 < iSize) { if (AreWordsSame(needword1, *m_words2[bw2])) return bw2; @@ -652,7 +656,8 @@ int stringdiffs::FindNextSpaceInWords1(int bw1) const { - while (bw1 < (int) m_words1.size()) + const int iSize = (int) m_words1.size(); + while (bw1 < iSize) { if (IsSpace(*m_words1[bw1])) return bw1; @@ -666,7 +671,8 @@ int stringdiffs::FindNextSpaceInWords2(int bw2) const { - while (bw2 < (int) m_words2.size()) + const int iSize = (int) m_words2.size(); + while (bw2 < iSize) { if (IsSpace(*m_words2[bw2])) return bw2; @@ -1084,17 +1090,17 @@ pen2 = CharPrev(py2, pen2); } } - //check for excaption of empty string on one side - //In that case display all as a diff - if (!equal && ((py1 == pen1) && isSafeWhitespace(*pen1) ) - || ((py2 == pen2) && isSafeWhitespace(*pen2) )) - { - begin1 = 0; - begin2 = 0; - end1 =len1 - 1; - end2 =len2 - 1; - return; - } + //check for excaption of empty string on one side + //In that case display all as a diff + if (!equal && (((py1 == pen1) && isSafeWhitespace(*pen1)) || + ((py2 == pen2) && isSafeWhitespace(*pen2)))) + { + begin1 = 0; + begin2 = 0; + end1 =len1 - 1; + end2 =len2 - 1; + return; + } bool alldone = false; bool found = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2010-05-03 17:08:26
|
Revision: 7149 http://winmerge.svn.sourceforge.net/winmerge/?rev=7149&view=rev Author: kimmov Date: 2010-05-03 17:08:20 +0000 (Mon, 03 May 2010) Log Message: ----------- BUG: #2991932 delete[] applied to memory allocated by _tcsdup() Spotted by Jochen. Modified Paths: -------------- trunk/Src/stringdiffs.cpp Modified: trunk/Src/stringdiffs.cpp =================================================================== --- trunk/Src/stringdiffs.cpp 2010-04-29 16:43:09 UTC (rev 7148) +++ trunk/Src/stringdiffs.cpp 2010-05-03 17:08:20 UTC (rev 7149) @@ -49,7 +49,7 @@ { if (CustomChars) { - delete [] BreakChars; + free(BreakChars); BreakChars = NULL; CustomChars = false; } @@ -61,7 +61,7 @@ assert(Initialized); if (CustomChars) - delete [] BreakChars; + free(BreakChars); CustomChars = true; BreakChars = _tcsdup(breakChars); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ge...@us...> - 2010-11-22 13:06:34
|
Revision: 7443 http://winmerge.svn.sourceforge.net/winmerge/?rev=7443&view=rev Author: gerundt Date: 2010-11-22 13:06:28 +0000 (Mon, 22 Nov 2010) Log Message: ----------- PATCH: [ 3114642 ] Drop IsLeadByte() function Modified Paths: -------------- trunk/Src/stringdiffs.cpp Modified: trunk/Src/stringdiffs.cpp =================================================================== --- trunk/Src/stringdiffs.cpp 2010-11-22 12:43:49 UTC (rev 7442) +++ trunk/Src/stringdiffs.cpp 2010-11-22 13:06:28 UTC (rev 7443) @@ -1212,20 +1212,13 @@ return _totupper(ch1)==_totupper(ch2); } - -/** Does character introduce a multicharacter character? */ -static inline bool IsLeadByte(TCHAR ch) -{ - return false; -} - /** * @brief Is it whitespace (excludes all lead & trail bytes)? */ static bool isSafeWhitespace(TCHAR ch) { - return xisspace(ch) && !IsLeadByte(ch); + return xisspace(ch); } /** @@ -1264,7 +1257,7 @@ if (prev == psz) psz++; } - if (psz==lastValid && !IsLeadByte(*psz)) + if (psz==lastValid) return psz; else // last character was multibyte or broken multibyte return prev; @@ -1440,71 +1433,34 @@ } // Now do real character match - if (IsLeadByte(*py1)) + if (!equal) { - if (!IsLeadByte(*py2)) + if (!matchchar(py1[0], py2[0], casitive)) break; // done with forward search - // DBCS (we assume if a lead byte, then character is 2-byte) - if (!equal) - { - if (!(py1[0] == py2[0] && py1[1] == py2[1])) - break; // done with forward search - } - else - { - if ((py1[0] == py2[0] && py1[1] == py2[1])) - { - // check at least two chars are identical - if (!found) - { - found = true; - } - else - { - break; // done with forward search - } - } - else - { - found = false; - } - } - py1 += 2; // DBCS specific - py2 += 2; // DBCS specific } - else + else { - if (IsLeadByte(*py2)) - break; // done with forward search - if (!equal) + if (matchchar(py1[0], py2[0], casitive)) { - if (!matchchar(py1[0], py2[0], casitive)) - break; // done with forward search - } - else - { - if (matchchar(py1[0], py2[0], casitive)) + // check at least two chars are identical + if (!found) { - // check at least two chars are identical - if (!found) - { - found = true; - } - else - { - py1 = CharPrev(pbeg1, py1); - py2 = CharPrev(pbeg2, py2); - break; // done with forward search - } + found = true; } else { - found = false; + py1 = CharPrev(pbeg1, py1); + py2 = CharPrev(pbeg2, py2); + break; // done with forward search } } - ++py1; // DBCS safe b/c we checked above - ++py2; // DBCS safe b/c we checked above + else + { + found = false; + } } + ++py1; + ++py2; } // Potential difference extends from py1 to pen1 and py2 to pen2 @@ -1582,72 +1538,34 @@ } // Now do real character match - if (IsLeadByte(*pz1)) + if (!equal) { - if (!IsLeadByte(*pz2)) - break; // done with forward search - // DBCS (we assume if a lead byte, then character is 2-byte) - if (!equal) + if (!matchchar(pz1[0], pz2[0], casitive)) { - if (!(pz1[0] == pz2[0] && pz1[1] == pz2[1])) - { - found = true; - break; // done with forward search - } + found = true; + break; // done with forward search } - else - { - if ((pz1[0] == pz2[0] && pz1[1] == pz2[1])) - { - // check at least two chars are identical - if (!found) - { - found = true; - } - else - { - break; // done with forward search - } - } - else - { - found = false; - } - } } - else + else { - if (IsLeadByte(*pz2)) - break; // done with forward search - if (!equal) + if (matchchar(pz1[0], pz2[0], casitive)) { - if (!matchchar(pz1[0], pz2[0], casitive)) + // check at least two chars are identical + if (!found) { found = true; - break; // done with forward search } - } - else - { - if (matchchar(pz1[0], pz2[0], casitive)) - { - // check at least two chars are identical - if (!found) - { - found = true; - } - else - { - pz1++; - pz2++; - break; // done with forward search - } - } else { - found = false; + pz1++; + pz2++; + break; // done with forward search } } + else + { + found = false; + } } // decrement pz1 and pz2 if (pz1 == pbeg1) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |