Thread: [Winmerge-svn] SF.net SVN: winmerge:[5627] trunk/Src
Windows visual diff and merge for files and directories
Brought to you by:
christianlist,
grimmdp
From: <ki...@us...> - 2008-07-17 00:04:07
|
Revision: 5627 http://winmerge.svn.sourceforge.net/winmerge/?rev=5627&view=rev Author: kimmov Date: 2008-07-17 00:04:04 +0000 (Thu, 17 Jul 2008) Log Message: ----------- Convert UniFile to use String (remove rest of CStrings). Modified Paths: -------------- trunk/Src/Common/UniFile.cpp trunk/Src/Common/UniFile.h trunk/Src/ConflictFileParser.cpp trunk/Src/DiffTextBuffer.cpp trunk/Src/FileFilterMgr.cpp trunk/Src/MergeDoc.cpp Modified: trunk/Src/Common/UniFile.cpp =================================================================== --- trunk/Src/Common/UniFile.cpp 2008-07-16 08:24:27 UTC (rev 5626) +++ trunk/Src/Common/UniFile.cpp 2008-07-17 00:04:04 UTC (rev 5627) @@ -5,16 +5,29 @@ * @date Created: 2003-10 * @date Edited: 2006-12-07 (Kimmo Varis) * - * @brief Implementation of Unicode enabled file classes (Memory-mapped reader class, and Stdio replacement class) + * @brief Implementation of Unicode enabled file classes. + * Classes include memory-mapped reader class and Stdio replacement class. */ // ID line follows -- this is updated by SVN // $Id$ /* The MIT License Copyright (c) 2003 Perry Rapp -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #include "stdafx.h" @@ -31,6 +44,9 @@ static char THIS_FILE[] = __FILE__; #endif +static int Append(String &strBuffer, int cchHead, LPCTSTR pchTail, int cchTail, + int cchBufferMin = 1024); + /** * @brief The constructor. */ @@ -87,8 +103,8 @@ { m_statusFetched = 0; m_filesize = 0; - m_filepath = _T(""); - m_filename = _T(""); + m_filepath.clear(); + m_filename.clear(); m_lineno = -1; m_unicoding = ucr::NONE; m_charsize = 1; @@ -102,7 +118,7 @@ /** * @brief Get file status into member variables * - * Reads filestatus (size and full path) of a file. + * Reads file's status (size and full path). * @return true on success, false on failure. * @note Function sets filesize member to zero, and status as read * also when failing. That is needed so caller doesn't need to waste @@ -389,19 +405,28 @@ * @param [out] lossy TRUE if there were lossy encoding. * @return TRUE if there is more lines to read, TRUE when last line is read. */ -BOOL UniMemFile::ReadString(CString & line, bool * lossy) +BOOL UniMemFile::ReadString(String & line, bool * lossy) { - CString eol; + String eol; BOOL ok = ReadString(line, eol, lossy); return ok; } /** - * @brief Append characters to string and exponentially grow buffer as needed + * @brief Append characters to string. + * This function appends characters to the string. The storage for the string + * is grown exponentially to avoid unnecessary allocations and copying. + * @param [in, out] strBuffer A string to wich new characters are appended. + * @param [in] ccHead Index in the string where new chars are appended. + * @param [in] pchTa\xEDl Characters to append. + * @param [in] cchTail Amount of characters to append. + * @param [in] cchBufferMin Minimum size for the buffer. + * @return New length of the string. */ -static int Append(CString &strBuffer, int cchHead, LPCTSTR pchTail, int cchTail, int cchBufferMin = 1024) +static int Append(String &strBuffer, int cchHead, LPCTSTR pchTail, + int cchTail, int cchBufferMin) { - int cchBuffer = strBuffer.GetLength(); + int cchBuffer = strBuffer.length(); int cchLength = cchHead + cchTail; while (cchBuffer < cchLength) { @@ -409,7 +434,10 @@ if (cchBuffer < cchBufferMin) cchBuffer = cchBufferMin; } - CopyMemory(strBuffer.GetBufferSetLength(cchBuffer) + cchHead, pchTail, cchTail * sizeof(TCHAR)); + strBuffer.reserve(cchBuffer); + strBuffer.resize(cchLength); + LPTSTR pBuffer = &*strBuffer.begin() + cchHead; + CopyMemory(pBuffer, pchTail, cchTail * sizeof(TCHAR)); return cchLength; } @@ -431,14 +459,14 @@ * @param [out] lossy TRUE if there were lossy encoding. * @return TRUE if there is more lines to read, TRUE when last line is read. */ -BOOL UniMemFile::ReadString(CString & line, CString & eol, bool * lossy) +BOOL UniMemFile::ReadString(String & line, String & eol, bool * lossy) { - line = _T(""); - eol = _T(""); + line.clear(); + eol.clear(); int cchLine = 0; LPCTSTR pchLine = (LPCTSTR)m_current; - // shortcut methods in case file is in the same encoding as our CStrings + // shortcut methods in case file is in the same encoding as our Strings #ifdef _UNICODE if (m_unicoding == ucr::UCS2LE) @@ -473,7 +501,7 @@ ++m_txtstats.nlfs; } ++m_lineno; - CopyMemory(line.GetBufferSetLength(cchLine), pchLine, cchLine * sizeof(TCHAR)); + line.assign(pchLine, cchLine); return TRUE; } if (!wch) @@ -482,7 +510,7 @@ } ++cchLine; } - CopyMemory(line.GetBufferSetLength(cchLine), pchLine, cchLine * sizeof(TCHAR)); + line.assign(pchLine, cchLine); return TRUE; } #else @@ -518,7 +546,7 @@ ++m_txtstats.nlfs; } ++m_lineno; - CopyMemory(line.GetBufferSetLength(cchLine), pchLine, cchLine * sizeof(TCHAR)); + line.assign(pchLine, cchLine); return TRUE; } if (!ch) @@ -527,7 +555,7 @@ } ++cchLine; } - CopyMemory(line.GetBufferSetLength(cchLine), pchLine, cchLine * sizeof(TCHAR)); + line.assign(pchLine, cchLine); return TRUE; } #endif @@ -553,8 +581,7 @@ RecordZero(m_txtstats, offset); } } - String localLine = ucr::maketstring((LPCSTR)m_current, eolptr-m_current, m_codepage, lossy); - line = localLine.c_str(); + line = ucr::maketstring((LPCSTR)m_current, eolptr-m_current, m_codepage, lossy); if (lossy && *lossy) ++m_txtstats.nlosses; if (!eof) @@ -574,7 +601,7 @@ else ++m_txtstats.nlfs; } - m_current = eolptr + eol.GetLength(); + m_current = eolptr + eol.length(); // TODO: What do we do if save was lossy ? return !eof; } @@ -675,21 +702,19 @@ } if (doneline) { - if (!eol.IsEmpty()) + if (!eol.empty()) ++m_lineno; - line.ReleaseBuffer(cchLine); return TRUE; } cchLine = Append(line, cchLine, sch.c_str(), sch.length()); } - line.ReleaseBuffer(cchLine); return TRUE; } /** * @brief Write one line (doing any needed conversions) */ -BOOL UniMemFile::WriteString(const CString & line) +BOOL UniMemFile::WriteString(const String & line) { ASSERT(0); // unimplemented -- currently cannot write to a UniMemFile! return FALSE; @@ -887,13 +912,13 @@ } -BOOL UniStdioFile::ReadString(CString & line, bool * lossy) +BOOL UniStdioFile::ReadString(String & line, bool * lossy) { ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! return FALSE; } -BOOL UniStdioFile::ReadString(CString & line, CString & eol, bool * lossy) +BOOL UniStdioFile::ReadString(String & line, String & eol, bool * lossy) { ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! return FALSE; @@ -903,7 +928,7 @@ ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! return FALSE; } -BOOL UniStdioFile::ReadString(sbuffer & sline, CString & eol, bool * lossy) +BOOL UniStdioFile::ReadString(sbuffer & sline, String & eol, bool * lossy) { ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! return FALSE; @@ -943,7 +968,7 @@ /** * @brief Write one line (doing any needed conversions) */ -BOOL UniStdioFile::WriteString(const CString & line) +BOOL UniStdioFile::WriteString(const String & line) { // shortcut the easy cases #ifdef _UNICODE @@ -952,8 +977,8 @@ if (m_unicoding == ucr::NONE && EqualCodepages(m_codepage, getDefaultCodepage())) #endif { - unsigned int bytes = line.GetLength() * sizeof(TCHAR); - unsigned int wbytes = fwrite((LPCTSTR)line, 1, bytes, m_fp); + unsigned int bytes = line.length() * sizeof(TCHAR); + unsigned int wbytes = fwrite(line.c_str(), 1, bytes, m_fp); if (wbytes != bytes) return FALSE; return TRUE; @@ -962,9 +987,9 @@ ucr::buffer * buff = (ucr::buffer *)m_pucrbuff; ucr::UNICODESET unicoding1=ucr::NONE; int codepage1=0; - ucr::getInternalEncoding(&unicoding1, &codepage1); // What CString & TCHARs represent - const unsigned char * src = (const UCHAR *)(LPCTSTR)line; - int srcbytes = line.GetLength() * sizeof(TCHAR); + ucr::getInternalEncoding(&unicoding1, &codepage1); // What String & TCHARs represent + const unsigned char * src = (const UCHAR *)line.c_str(); + int srcbytes = line.length() * sizeof(TCHAR); bool lossy = ucr::convert(unicoding1, codepage1, src, srcbytes, (ucr::UNICODESET)m_unicoding, m_codepage, buff); // TODO: What to do about lossy conversion ? unsigned int wbytes = fwrite(buff->ptr, 1, buff->size, m_fp); Modified: trunk/Src/Common/UniFile.h =================================================================== --- trunk/Src/Common/UniFile.h 2008-07-16 08:24:27 UTC (rev 5626) +++ trunk/Src/Common/UniFile.h 2008-07-17 00:04:04 UTC (rev 5627) @@ -56,11 +56,11 @@ virtual void SetCodepage(int codepage) = 0; public: - virtual BOOL ReadString(CString & line, bool * lossy) = 0; - virtual BOOL ReadString(CString & line, CString & eol, bool * lossy) = 0; + virtual BOOL ReadString(String & line, bool * lossy) = 0; + virtual BOOL ReadString(String & line, String & eol, bool * lossy) = 0; virtual int GetLineNumber() const = 0; virtual __int64 GetPosition() const = 0; - virtual BOOL WriteString(const CString & line) = 0; + virtual BOOL WriteString(const String & line) = 0; struct txtstats { @@ -145,10 +145,10 @@ virtual void SetBom(bool bom); public: - virtual BOOL ReadString(CString & line, bool * lossy); - virtual BOOL ReadString(CString & line, CString & eol, bool * lossy); + virtual BOOL ReadString(String & line, bool * lossy); + virtual BOOL ReadString(String & line, String & eol, bool * lossy); virtual __int64 GetPosition() const { return m_current - m_base; } - virtual BOOL WriteString(const CString & line); + virtual BOOL WriteString(const String & line); // Implementation methods protected: @@ -189,16 +189,16 @@ virtual void SetBom(bool bom); protected: - virtual BOOL ReadString(CString & line, bool * lossy); - virtual BOOL ReadString(CString & line, CString & eol, bool * lossy); + virtual BOOL ReadString(String & line, bool * lossy); + virtual BOOL ReadString(String & line, String & eol, bool * lossy); public: virtual BOOL ReadString(sbuffer & line, bool * lossy); - virtual BOOL ReadString(sbuffer & line, CString & eol, bool * lossy); + virtual BOOL ReadString(sbuffer & line, String & eol, bool * lossy); virtual __int64 GetPosition() const; virtual int WriteBom(); - virtual BOOL WriteString(const CString & line); + virtual BOOL WriteString(const String & line); // Implementation methods protected: Modified: trunk/Src/ConflictFileParser.cpp =================================================================== --- trunk/Src/ConflictFileParser.cpp 2008-07-16 08:24:27 UTC (rev 5626) +++ trunk/Src/ConflictFileParser.cpp 2008-07-17 00:04:04 UTC (rev 5627) @@ -60,11 +60,10 @@ BOOL linesToRead = TRUE; while (linesToRead && startFound == FALSE) { - CString cline; + String line; bool lossy; - CString eol; - linesToRead = conflictFile.ReadString(cline, eol, &lossy); - String line = (LPCTSTR) cline; + String eol; + linesToRead = conflictFile.ReadString(line, eol, &lossy); std::string::size_type pos; pos = line.find(MineBegin); @@ -117,11 +116,9 @@ BOOL linesToRead = TRUE; do { - CString cline; bool lossy; - CString eol; - linesToRead = conflictFile.ReadString(cline, eol, &lossy); - line = (LPCTSTR) cline; + String eol; + linesToRead = conflictFile.ReadString(line, eol, &lossy); switch (state) { // in common section Modified: trunk/Src/DiffTextBuffer.cpp =================================================================== --- trunk/Src/DiffTextBuffer.cpp 2008-07-16 08:24:27 UTC (rev 5626) +++ trunk/Src/DiffTextBuffer.cpp 2008-07-17 00:04:04 UTC (rev 5627) @@ -394,8 +394,8 @@ if (encoding.m_unicoding == ucr::NONE || !pufile->IsUnicode()) pufile->SetCodepage(encoding.m_codepage); UINT lineno = 0; - CString eol, preveol; - CString sline; + String eol, preveol; + String sline; bool done = false; UINT next_line_report = 100; // for trace messages UINT next_line_multiple = 5; // for trace messages @@ -406,14 +406,14 @@ m_aLines.SetSize(arraysize); // preveol must be initialized for empty files - preveol = "\n"; + preveol = _T("\n"); do { - bool lossy=false; + bool lossy = false; done = !pufile->ReadString(sline, eol, &lossy); // if last line had no eol, we can quit - if (done && preveol.IsEmpty()) + if (done && preveol.empty()) break; // but if last line had eol, we add an extra (empty) line to buffer @@ -429,7 +429,7 @@ { // TODO: Should record lossy status of line } - AppendLine(lineno, sline, sline.GetLength()); + AppendLine(lineno, sline.c_str(), sline.length()); ++lineno; preveol = eol; @@ -600,7 +600,7 @@ CString sLine; CString sEol = GetStringEol(nCrlfStyle); int nLineCount = m_aLines.GetSize(); - for (int line=0; line<nLineCount; ++line) + for (int line = 0; line < nLineCount; ++line) { if (GetLineFlags(line) & LF_GHOST) continue; @@ -619,7 +619,8 @@ // last real line is never EOL terminated ASSERT (_tcslen(GetLineEol(line)) == 0); // write the line and exit loop - file.WriteString(sLine); + String tmpLine(sLine); + file.WriteString(tmpLine); break; } @@ -636,7 +637,8 @@ } // write this line to the file (codeset or unicode conversions are done there) - file.WriteString(sLine); + String tmpLine(sLine); + file.WriteString(tmpLine); } file.Close(); Modified: trunk/Src/FileFilterMgr.cpp =================================================================== --- trunk/Src/FileFilterMgr.cpp 2008-07-16 08:24:27 UTC (rev 5626) +++ trunk/Src/FileFilterMgr.cpp 2008-07-17 00:04:04 UTC (rev 5627) @@ -265,7 +265,9 @@ do { // Returns false when last line is read - bLinesLeft = file.ReadString(sLine, &lossy); + String tmpLine; + bLinesLeft = file.ReadString(tmpLine, &lossy); + sLine = tmpLine.c_str(); sLine.TrimLeft(); sLine.TrimRight(); Modified: trunk/Src/MergeDoc.cpp =================================================================== --- trunk/Src/MergeDoc.cpp 2008-07-16 08:24:27 UTC (rev 5626) +++ trunk/Src/MergeDoc.cpp 2008-07-17 00:04:04 UTC (rev 5627) @@ -2608,7 +2608,7 @@ file.SetCodepage(CP_UTF8); - file.WriteString( + String header = Fmt( _T("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n") _T("\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n") @@ -2628,8 +2628,9 @@ _T("<body>\n") _T("<table cellspacing=\"0\" cellpadding=\"0\" style=\"width: 100%%; margin: 0; border: none;\">\n") _T("<thead>\n") - _T("<tr>\n") - , nFontSize, m_pView[0]->GetHTMLStyles())); + _T("<tr>\n"), + nFontSize, m_pView[0]->GetHTMLStyles()); + file.WriteString(header); // Get paths // If archive, use archive path + folder + filename inside archive @@ -2654,10 +2655,12 @@ for (nBuffer = 0; nBuffer < 2; nBuffer++) { int nLineNumberColumnWidth = m_pView[nBuffer]->GetViewLineNumbers() ? 1 : 0; - file.WriteString(Fmt(_T("<th class=\"title\" style=\"width:%d%%\"></th>"), - nLineNumberColumnWidth)); - file.WriteString(Fmt(_T("<th class=\"title\" style=\"width:%f%%\">"), - (double)(100 - nLineNumberColumnWidth * 2) / 2)); + String data = Fmt(_T("<th class=\"title\" style=\"width:%d%%\"></th>"), + nLineNumberColumnWidth); + file.WriteString(data); + data = Fmt(_T("<th class=\"title\" style=\"width:%f%%\">"), + (double)(100 - nLineNumberColumnWidth * 2) / 2); + file.WriteString(data); if (nBuffer == 0) file.WriteString(left.c_str()); else @@ -2685,15 +2688,19 @@ // line number DWORD dwFlags = m_ptBuf[nBuffer]->GetLineFlags(idx[nBuffer]); if (!(dwFlags & LF_GHOST) && m_pView[nBuffer]->GetViewLineNumbers()) - file.WriteString(Fmt(_T("<td class=\"ln\">%d</td>"), m_ptBuf[nBuffer]->ComputeRealLine(idx[nBuffer]) + 1)); + { + String data = Fmt(_T("<td class=\"ln\">%d</td>"), + m_ptBuf[nBuffer]->ComputeRealLine(idx[nBuffer]) + 1); + file.WriteString(data); + } else file.WriteString(_T("<td class=\"ln\"></td>")); // write a line on left/right side - file.WriteString(m_pView[nBuffer]->GetHTMLLine(idx[nBuffer], _T("td"))); + file.WriteString((LPCTSTR)m_pView[nBuffer]->GetHTMLLine(idx[nBuffer], _T("td"))); idx[nBuffer]++; } else - file.WriteString("<td class=\"ln\"></td><td></td>"); + file.WriteString(_T("<td class=\"ln\"></td><td></td>")); file.WriteString(_T("\n")); } file.WriteString(_T("</tr>\n")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-18 19:22:31
|
Revision: 5636 http://winmerge.svn.sourceforge.net/winmerge/?rev=5636&view=rev Author: kimmov Date: 2008-07-18 19:22:29 +0000 (Fri, 18 Jul 2008) Log Message: ----------- Convert couple of CStrings to Strings in plugins code. Modified Paths: -------------- trunk/Src/Plugins.cpp trunk/Src/Plugins.h trunk/Src/SelectUnpackerDlg.cpp Modified: trunk/Src/Plugins.cpp =================================================================== --- trunk/Src/Plugins.cpp 2008-07-18 18:39:04 UTC (rev 5635) +++ trunk/Src/Plugins.cpp 2008-07-18 19:22:29 UTC (rev 5636) @@ -269,7 +269,7 @@ { m_filters = new vector<FileFilterElement*>; - CString sLine = m_filtersText; + CString sLine(m_filtersText.c_str()); CString sPiece; while(1) @@ -486,7 +486,7 @@ else { plugin.m_bAutomatic = FALSE; - plugin.m_filtersText = "."; + plugin.m_filtersText = _T("."); } VariantClear(&ret); Modified: trunk/Src/Plugins.h =================================================================== --- trunk/Src/Plugins.h 2008-07-18 18:39:04 UTC (rev 5635) +++ trunk/Src/Plugins.h 2008-07-18 19:22:29 UTC (rev 5636) @@ -32,8 +32,6 @@ #include <vector> #include "FileFilterMgr.h" -class CRegExp; - extern enum TRANSFORMATION_CATEGORY; const int NMAXTHREADS = 10; @@ -67,8 +65,8 @@ String m_filepath; LPDISPATCH m_lpDispatch; String m_name; // usually filename, except for special cases (like auto or no) - CString m_filtersText; - CString m_description; + String m_filtersText; + String m_description; BOOL m_bUnicodeMode; BOOL m_bAutomatic; std::vector<FileFilterElement*> *m_filters; Modified: trunk/Src/SelectUnpackerDlg.cpp =================================================================== --- trunk/Src/SelectUnpackerDlg.cpp 2008-07-18 18:39:04 UTC (rev 5635) +++ trunk/Src/SelectUnpackerDlg.cpp 2008-07-18 19:22:29 UTC (rev 5636) @@ -18,8 +18,12 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // ///////////////////////////////////////////////////////////////////////////// -// SelectUnpackerDlg.cpp : implementation file -// +/** + * @file SelectUnpackerDlg.cpp + * + * @brief Unpacker plugin selection dialog implementation. + */ +// ID line follows -- this is updated by SVN // $Id$ // @@ -56,8 +60,8 @@ automaticPlugin = new PluginInfo; automaticPlugin->m_lpDispatch = NULL; automaticPlugin->m_filters = NULL; - automaticPlugin->m_name = theApp.LoadString(IDS_USERCHOICE_AUTOMATIC); - automaticPlugin->m_description = theApp.LoadString(ID_UNPACK_AUTO).c_str(); + automaticPlugin->m_name = LoadResString(IDS_USERCHOICE_AUTOMATIC); + automaticPlugin->m_description = LoadResString(ID_UNPACK_AUTO); m_pPlugin = noPlugin; @@ -264,8 +268,8 @@ } m_strPluginName = m_pPlugin->m_name.c_str(); - m_strDescription = m_pPlugin->m_description; - m_strExtensions = m_pPlugin->m_filtersText; + m_strDescription = m_pPlugin->m_description.c_str(); + m_strExtensions = m_pPlugin->m_filtersText.c_str(); UpdateData (FALSE); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jt...@us...> - 2008-07-19 09:32:23
|
Revision: 5638 http://winmerge.svn.sourceforge.net/winmerge/?rev=5638&view=rev Author: jtuc Date: 2008-07-19 09:32:18 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Fix XML whitespace canonicalization (which got broken when converting UniFile from CString to String) Modified Paths: -------------- trunk/Src/UniMarkdownFile.cpp trunk/Src/UniMarkdownFile.h Modified: trunk/Src/UniMarkdownFile.cpp =================================================================== --- trunk/Src/UniMarkdownFile.cpp 2008-07-19 09:18:06 UTC (rev 5637) +++ trunk/Src/UniMarkdownFile.cpp 2008-07-19 09:32:18 UTC (rev 5638) @@ -73,33 +73,33 @@ * @brief Collapse whitespace characters from the given line. * @param [in, out] Line to handle. */ -static void CollapseWhitespace(CString &line) +static void CollapseWhitespace(String &line) { int nEatSpace = -2; - for (int i = line.GetLength() ; i-- ; ) + for (int i = line.length() ; i-- ; ) { - switch (line.GetAt(i)) + switch (line[i]) { case '\r': case '\n': case '\t': case ' ': - if (++nEatSpace < 0 || nEatSpace == 0 && line.GetAt(i + 1) == '<') + if (++nEatSpace < 0 || nEatSpace == 0 && line[i + 1] == '<') ++nEatSpace; - line.SetAt(i, ' '); + line[i] = ' '; break; case '>': - if (nEatSpace >= 0 && line.GetAt(i + 1 + nEatSpace) != '<') + if (nEatSpace >= 0 && line[i + 1 + nEatSpace] != '<') ++nEatSpace; default: if (nEatSpace > 0) - line.Delete(i + 1, nEatSpace); + line.erase(i + 1, nEatSpace); nEatSpace = -1; break; } } if (++nEatSpace > 0) - line.Delete(0, nEatSpace); + line.erase(0, nEatSpace); } void UniMarkdownFile::Move() @@ -133,19 +133,18 @@ } } -BOOL UniMarkdownFile::ReadString(CString &line, CString &eol, bool *lossy) +BOOL UniMarkdownFile::ReadString(String &line, String &eol, bool *lossy) { - line.ReleaseBuffer(0); - eol.ReleaseBuffer(0); + line.erase(); + eol.erase(); int nDepth = 0; bool bDone = false; if (m_current < (LPBYTE)m_pMarkdown->lower) { - String localLine = ucr::maketstring((const char *)m_current, m_pMarkdown->lower - + line = ucr::maketstring((const char *)m_current, m_pMarkdown->lower - (const char *)m_current, m_codepage, lossy); - line = localLine.c_str(); CollapseWhitespace(line); - bDone = !line.IsEmpty(); + bDone = !line.empty(); m_current = (LPBYTE)m_pMarkdown->lower; } while (m_current < m_base + m_filesize && !bDone) @@ -162,8 +161,7 @@ { ++m_current; } - String localLine = ucr::maketstring((const char *)current, m_current - current, m_codepage, lossy); - line = localLine.c_str(); + line = ucr::maketstring((const char *)current, m_current - current, m_codepage, lossy); if (m_current < m_transparent) { current = m_current; @@ -217,27 +215,25 @@ } if (bDone) { - String localLine = ucr::maketstring((const char *)m_current, m_pMarkdown->first - + line = ucr::maketstring((const char *)m_current, m_pMarkdown->first - (const char *)m_current, m_codepage, lossy); - line = localLine.c_str(); CollapseWhitespace(line); m_current = (LPBYTE)m_pMarkdown->first; } else if (m_current < m_base + m_filesize) { bDone = true; - String localLine = ucr::maketstring((const char *)m_current, m_base + m_filesize - + line = ucr::maketstring((const char *)m_current, m_base + m_filesize - m_current, m_codepage, lossy); - line = localLine.c_str(); CollapseWhitespace(line); m_current = m_base + m_filesize; } - bDone = !line.IsEmpty(); + bDone = !line.empty(); } } - ASSERT(line.FindOneOf(_T("\r\n")) == -1); + ASSERT(line.find_first_of(_T("\r\n")) == String::npos); if (nDepth > 0) - line.Insert(0, CString('\t', nDepth)); + line.insert(0U, nDepth, _T('\t')); if (bDone) eol = _T("\n"); return bDone; Modified: trunk/Src/UniMarkdownFile.h =================================================================== --- trunk/Src/UniMarkdownFile.h 2008-07-19 09:18:06 UTC (rev 5637) +++ trunk/Src/UniMarkdownFile.h 2008-07-19 09:32:18 UTC (rev 5638) @@ -17,7 +17,7 @@ { public: UniMarkdownFile(); - virtual BOOL ReadString(CString & line, CString & eol, bool * lossy); + virtual BOOL ReadString(String & line, String & eol, bool * lossy); virtual void Close(); virtual bool ReadBom(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-19 20:26:50
|
Revision: 5643 http://winmerge.svn.sourceforge.net/winmerge/?rev=5643&view=rev Author: kimmov Date: 2008-07-19 20:23:58 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Remove unused member variable (LONG m_nModifications). Modified Paths: -------------- trunk/Src/MergeEditView.cpp trunk/Src/MergeEditView.h Modified: trunk/Src/MergeEditView.cpp =================================================================== --- trunk/Src/MergeEditView.cpp 2008-07-19 20:12:14 UTC (rev 5642) +++ trunk/Src/MergeEditView.cpp 2008-07-19 20:23:58 UTC (rev 5643) @@ -73,7 +73,6 @@ , m_pLocationView(NULL) , m_hLocationview(NULL) , m_nThisPane(0) -, m_nModifications(0) , m_piMergeEditStatus(0) , m_bAutomaticRescan(FALSE) , fTimerWaitingForIdle(0) Modified: trunk/Src/MergeEditView.h =================================================================== --- trunk/Src/MergeEditView.h 2008-07-19 20:12:14 UTC (rev 5642) +++ trunk/Src/MergeEditView.h 2008-07-19 20:23:58 UTC (rev 5643) @@ -108,7 +108,6 @@ * then these indexes are changed. */ int m_nThisPane; - LONG m_nModifications; IMergeEditStatus * m_piMergeEditStatus; /**< interface to status bar */ protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-20 08:52:44
|
Revision: 5644 http://winmerge.svn.sourceforge.net/winmerge/?rev=5644&view=rev Author: kimmov Date: 2008-07-20 08:52:03 +0000 (Sun, 20 Jul 2008) Log Message: ----------- Don't store both handle and pointer to LocationView in MergeEditView. We can always get a handle from the pointer. Modified Paths: -------------- trunk/Src/LocationView.cpp trunk/Src/MergeEditView.cpp trunk/Src/MergeEditView.h Modified: trunk/Src/LocationView.cpp =================================================================== --- trunk/Src/LocationView.cpp 2008-07-19 20:23:58 UTC (rev 5643) +++ trunk/Src/LocationView.cpp 2008-07-20 08:52:03 UTC (rev 5644) @@ -155,8 +155,8 @@ m_view[MERGE_VIEW_RIGHT] = pDoc->GetRightView(); // Give pointer to MergeEditView - m_view[MERGE_VIEW_LEFT]->SetLocationView(GetSafeHwnd(), this); - m_view[MERGE_VIEW_RIGHT]->SetLocationView(GetSafeHwnd(), this); + m_view[MERGE_VIEW_LEFT]->SetLocationView(this); + m_view[MERGE_VIEW_RIGHT]->SetLocationView(this); m_bRecalculateBlocks = TRUE; Invalidate(); @@ -856,8 +856,8 @@ */ void CLocationView::OnClose() { - m_view[MERGE_VIEW_LEFT]->SetLocationView(NULL, NULL); - m_view[MERGE_VIEW_RIGHT]->SetLocationView(NULL, NULL); + m_view[MERGE_VIEW_LEFT]->SetLocationView(NULL); + m_view[MERGE_VIEW_RIGHT]->SetLocationView(NULL); CView::OnClose(); } Modified: trunk/Src/MergeEditView.cpp =================================================================== --- trunk/Src/MergeEditView.cpp 2008-07-19 20:23:58 UTC (rev 5643) +++ trunk/Src/MergeEditView.cpp 2008-07-20 08:52:03 UTC (rev 5644) @@ -71,7 +71,6 @@ CMergeEditView::CMergeEditView() : m_bCurrentLineIsDiff(FALSE) , m_pLocationView(NULL) -, m_hLocationview(NULL) , m_nThisPane(0) , m_piMergeEditStatus(0) , m_bAutomaticRescan(FALSE) @@ -3119,13 +3118,10 @@ * @brief Set LocationView pointer. * CLocationView calls this function to set pointer to itself, * so we can call locationview to update it. - * @param [in] hView Handle to CLocationView. * @param [in] pView Pointer to CLocationView. */ -void CMergeEditView::SetLocationView(HWND hView, - const CLocationView * pView /*=NULL*/) +void CMergeEditView::SetLocationView(const CLocationView * pView /*=NULL*/) { - m_hLocationview = hView; m_pLocationView = const_cast<CLocationView *>(pView); } @@ -3144,7 +3140,7 @@ if (m_pDocument == NULL) return; - if (m_hLocationview != NULL && IsWindow(m_hLocationview)) + if (m_pLocationView != NULL && IsWindow(m_pLocationView->GetSafeHwnd())) { m_pLocationView->UpdateVisiblePos(nTopLine, nBottomLine); } Modified: trunk/Src/MergeEditView.h =================================================================== --- trunk/Src/MergeEditView.h 2008-07-19 20:23:58 UTC (rev 5643) +++ trunk/Src/MergeEditView.h 2008-07-20 08:52:03 UTC (rev 5644) @@ -132,7 +132,6 @@ BOOL m_bCurrentLineIsDiff; /**< TRUE if cursor is in diff line */ CLocationView * m_pLocationView; /**< Pointer to locationview */ - HWND m_hLocationview; /**< Handle to locationview */ // Operations public: @@ -179,7 +178,7 @@ bool SetPredifferByName(const CString & prediffer); void SetPredifferByMenu(UINT nID); void DocumentsLoaded(); - void SetLocationView(HWND hView, const CLocationView * pView = NULL); + void SetLocationView(const CLocationView * pView = NULL); void UpdateLocationViewPosition(int nTopLine = -1, int nBottomLine = -1); virtual void RecalcPageLayouts(CDC * pdc, CPrintInfo * pInfo); virtual void GetPrintHeaderText(int nPageNum, CString & text); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-20 09:26:05
|
Revision: 5645 http://winmerge.svn.sourceforge.net/winmerge/?rev=5645&view=rev Author: kimmov Date: 2008-07-20 09:25:42 +0000 (Sun, 20 Jul 2008) Log Message: ----------- Write plugins enabled option to config log. Modified Paths: -------------- trunk/Src/ConfigLog.cpp trunk/Src/ConfigLog.h trunk/Src/MainFrm.cpp Modified: trunk/Src/ConfigLog.cpp =================================================================== --- trunk/Src/ConfigLog.cpp 2008-07-20 08:52:03 UTC (rev 5644) +++ trunk/Src/ConfigLog.cpp 2008-07-20 09:25:42 UTC (rev 5645) @@ -508,12 +508,13 @@ WriteLocaleSettings(m_file, LOCALE_SYSTEM_DEFAULT, _T("Locale (System)")); // Codepage settings - WriteItemYesNo(0, _T("Detect codepage automatically for RC and HTML files"), &m_cpSettings.bDetectCodepage); + WriteItemYesNo(1, _T("Detect codepage automatically for RC and HTML files"), &m_cpSettings.bDetectCodepage); WriteItem(m_file, 1, _T("unicoder codepage"), getDefaultCodepage()); // Plugins - FileWriteString(_T("\nPlugins: ")); - FileWriteString(_T("\n Unpackers: ")); + FileWriteString(_T("\nPlugins:\n")); + WriteItemYesNo(1, _T("Plugins enabled"), &m_miscSettings.bPluginsEnabled); + FileWriteString(_T(" Unpackers: ")); WritePluginsInLogFile(L"FILE_PACK_UNPACK", m_file); WritePluginsInLogFile(L"BUFFER_PACK_UNPACK", m_file); FileWriteString(_T("\n Prediffers: ")); Modified: trunk/Src/ConfigLog.h =================================================================== --- trunk/Src/ConfigLog.h 2008-07-20 08:52:03 UTC (rev 5644) +++ trunk/Src/ConfigLog.h 2008-07-20 09:25:42 UTC (rev 5645) @@ -19,7 +19,7 @@ * * @brief Declaration file ConfigLog class */ -// RCS ID line follows -- this is updated by CVS +// ID line follows -- this is updated by SVN // $Id$ #ifndef _CONFIGLOG_H_ @@ -67,6 +67,7 @@ BOOL bSyntaxHighlight; BOOL bInsertTabs; INT nTabSize; + BOOL bPluginsEnabled; }; /** Modified: trunk/Src/MainFrm.cpp =================================================================== --- trunk/Src/MainFrm.cpp 2008-07-20 08:52:03 UTC (rev 5644) +++ trunk/Src/MainFrm.cpp 2008-07-20 09:25:42 UTC (rev 5645) @@ -2356,6 +2356,7 @@ LoadConfigBoolSetting(&configLog.m_miscSettings.bSyntaxHighlight, options, OPT_SYNTAX_HIGHLIGHT, cfgdir); LoadConfigIntSetting(&configLog.m_miscSettings.bInsertTabs, options, OPT_TAB_TYPE, cfgdir); LoadConfigIntSetting(&configLog.m_miscSettings.nTabSize, options, OPT_TAB_SIZE, cfgdir); + LoadConfigBoolSetting(&configLog.m_miscSettings.bPluginsEnabled, options, OPT_PLUGINS_ENABLED, cfgdir); LoadConfigIntSetting(&configLog.m_cpSettings.nDefaultMode, options, OPT_CP_DEFAULT_MODE, cfgdir); LoadConfigIntSetting(&configLog.m_cpSettings.nDefaultCustomValue, options, OPT_CP_DEFAULT_CUSTOM, cfgdir); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-21 11:27:00
|
Revision: 5648 http://winmerge.svn.sourceforge.net/winmerge/?rev=5648&view=rev Author: kimmov Date: 2008-07-21 11:25:40 +0000 (Mon, 21 Jul 2008) Log Message: ----------- PATCH: [ 2017426 ] Rescan after filter change Rescan all file- and folder-compares, instead of current ones. Modified Paths: -------------- trunk/Src/Languages/English.pot trunk/Src/MainFrm.cpp trunk/Src/Merge.rc Modified: trunk/Src/Languages/English.pot =================================================================== --- trunk/Src/Languages/English.pot 2008-07-21 09:41:45 UTC (rev 5647) +++ trunk/Src/Languages/English.pot 2008-07-21 11:25:40 UTC (rev 5648) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: WinMerge\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?group_id=13216&atid=113216\n" -"POT-Creation-Date: 2008-07-19 14:03+0000\n" +"POT-Creation-Date: 2008-07-21 14:20+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: English <win...@li...>\n" @@ -3222,7 +3222,7 @@ #: Merge.rc:2035 #, c-format -msgid "Filters were updated.\n\nDo you want to rescan current folders?" +msgid "Filters were updated. Do you want to refresh all open folder compares?\n\nIf you do not want to refresh all compares now you can select No and refresh compares later." msgstr "" #: Merge.rc:2041 Modified: trunk/Src/MainFrm.cpp =================================================================== --- trunk/Src/MainFrm.cpp 2008-07-21 09:41:45 UTC (rev 5647) +++ trunk/Src/MainFrm.cpp 2008-07-21 11:25:40 UTC (rev 5648) @@ -2477,7 +2477,8 @@ theApp.m_globalFileFilter.GetFileFilters(&fileFilters, selectedFilter); fileFiltersDlg.SetFilterArray(&fileFilters); fileFiltersDlg.SetSelected(selectedFilter); - lineFiltersDlg.m_bIgnoreRegExp = GetOptionsMgr()->GetBool(OPT_LINEFILTER_ENABLED); + const BOOL lineFiltersEnabledOrig = GetOptionsMgr()->GetBool(OPT_LINEFILTER_ENABLED); + lineFiltersDlg.m_bIgnoreRegExp = lineFiltersEnabledOrig; lineFilters->CloneFrom(m_pLineFilters); lineFiltersDlg.SetList(lineFilters); @@ -2513,13 +2514,17 @@ FRAMETYPE frame = GetFrameType(pFrame); if (frame == FRAME_FILE) { - if (!m_pLineFilters->Compare(lineFilters)) + if (lineFiltersEnabledOrig != linefiltersEnabled || + !m_pLineFilters->Compare(lineFilters)) + { bFileCompareRescan = TRUE; + } } else if (frame == FRAME_FOLDER) { const CString newFilter = theApp.m_globalFileFilter.GetFilterNameOrMask(); - if (!m_pLineFilters->Compare(lineFilters) || origFilter != newFilter) + if (lineFiltersEnabledOrig != linefiltersEnabled || + !m_pLineFilters->Compare(lineFilters) || origFilter != newFilter) { int res = LangMessageBox(IDS_FILTERCHANGED, MB_ICONWARNING | MB_YESNO); if (res == IDYES) @@ -2533,13 +2538,23 @@ if (bFileCompareRescan) { - CMergeDoc *pDoc = (CMergeDoc *)pFrame->GetActiveDocument(); - pDoc->FlushAndRescan(TRUE); + const MergeDocList &docs = GetAllMergeDocs(); + POSITION pos = docs.GetHeadPosition(); + while (pos) + { + CMergeDoc * pMergeDoc = docs.GetNext(pos); + pMergeDoc->FlushAndRescan(TRUE); + } } else if (bFolderCompareRescan) { - CDirDoc * pDoc = (CDirDoc *)pFrame->GetActiveDocument(); - pDoc->Rescan(); + const DirDocList &dirDocs = GetAllDirDocs(); + POSITION pos = dirDocs.GetHeadPosition(); + while (pos) + { + CDirDoc * pDirDoc = dirDocs.GetNext(pos); + pDirDoc->Rescan(); + } } } delete lineFilters; Modified: trunk/Src/Merge.rc =================================================================== --- trunk/Src/Merge.rc 2008-07-21 09:41:45 UTC (rev 5647) +++ trunk/Src/Merge.rc 2008-07-21 11:25:40 UTC (rev 5648) @@ -2032,7 +2032,7 @@ // GENERAL FILTER STRINGS STRINGTABLE BEGIN - IDS_FILTERCHANGED "Filters were updated.\n\nDo you want to rescan current folders?" + IDS_FILTERCHANGED "Filters were updated. Do you want to refresh all open folder compares?\n\nIf you do not want to refresh all compares now you can select No and refresh compares later." END // VERSION CONTROL OPTIONS This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sdo...@us...> - 2008-07-22 14:27:12
|
Revision: 5654 http://winmerge.svn.sourceforge.net/winmerge/?rev=5654&view=rev Author: sdottaka Date: 2008-07-22 14:27:09 +0000 (Tue, 22 Jul 2008) Log Message: ----------- PATCH: [ 2023595 ] Structured DIFFITEM Modified Paths: -------------- trunk/Src/DiffItem.cpp trunk/Src/DiffItem.h trunk/Src/DiffItemList.cpp trunk/Src/DiffItemList.h trunk/Src/DiffThread.cpp trunk/Src/DirScan.cpp trunk/Src/DirScan.h trunk/Src/DirView.cpp Modified: trunk/Src/DiffItem.cpp =================================================================== --- trunk/Src/DiffItem.cpp 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DiffItem.cpp 2008-07-22 14:27:09 UTC (rev 5654) @@ -18,6 +18,17 @@ DIFFITEM DIFFITEM::emptyitem; +/** @brief DIFFITEM's destructor */ +DIFFITEM::~DIFFITEM() +{ + while (children.IsSibling(children.Flink)) + { + DIFFITEM *p = (DIFFITEM *)children.Flink; + p->RemoveSelf(); + delete p; + } +} + /** @brief Return path to left file, including all but file name */ String DIFFITEM::getLeftFilepath(const String &sLeftRoot) const { @@ -39,3 +50,35 @@ } return sPath; } + +/** @brief Return depth of path */ +int DIFFITEM::GetDepth() const +{ + const DIFFITEM *cur; + int depth; + for (depth = 0, cur = parent; cur; depth++, cur = cur->parent) + ; + return depth; +} + +/** + * @brief Return whether the specified item is an ancestor of the current item + */ +bool DIFFITEM::IsAncestor(const DIFFITEM *pdi) const +{ + const DIFFITEM *cur; + for (cur = this; cur; cur = cur->parent) + { + if (cur->parent == pdi) + return true; + } + return false; +} + +/** @brief Return whether the current item has children */ +bool DIFFITEM::HasChildren() const +{ + DIFFITEM *p = (DIFFITEM *)children.IsSibling(children.Flink); + return p ? true : false; +} + Modified: trunk/Src/DiffItem.h =================================================================== --- trunk/Src/DiffItem.h 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DiffItem.h 2008-07-22 14:27:09 UTC (rev 5654) @@ -126,6 +126,9 @@ */ struct DIFFITEM : ListEntry { + DIFFITEM *parent; /**< Parent of current item */ + ListEntry children; /**< Head of doubly linked list for chldren */ + DiffFileInfo left; /**< Fileinfo for left file */ DiffFileInfo right; /**< Fileinfo for right file */ int nsdiffs; /**< Amount of non-ignored differences */ @@ -136,11 +139,15 @@ static DIFFITEM emptyitem; /**< singleton to represent a diffitem that doesn't have any data */ - DIFFITEM() : nidiffs(-1), nsdiffs(-1), customFlags1(0) { } + DIFFITEM() : parent(NULL), nidiffs(-1), nsdiffs(-1), customFlags1(0) { } + ~DIFFITEM(); bool isEmpty() const { return this == &emptyitem; } String getLeftFilepath(const String &sLeftRoot) const; String getRightFilepath(const String &sRightRoot) const; + int GetDepth() const; + bool IsAncestor(const DIFFITEM *pdi) const; + bool HasChildren() const; }; #endif // _DIFF_ITEM_H_ Modified: trunk/Src/DiffItemList.cpp =================================================================== --- trunk/Src/DiffItemList.cpp 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DiffItemList.cpp 2008-07-22 14:27:09 UTC (rev 5654) @@ -19,7 +19,6 @@ * @brief Constructor */ DiffItemList::DiffItemList() -: m_count(0) { } @@ -32,30 +31,32 @@ } /** - * @brief Add new diffitem to CDiffContext array + * @brief Add new diffitem to structured DIFFITEM tree */ -DIFFITEM &DiffItemList::AddDiff() +DIFFITEM &DiffItemList::AddDiff(DIFFITEM *parent) { DIFFITEM *p = new DIFFITEM; - m_root.Append(p); - ++m_count; + if (parent) + parent->children.Append(p); + else + m_root.Append(p); + p->parent = parent; return *p; } /** - * @brief Remove diffitem from CDiffContext array + * @brief Remove diffitem from structured DIFFITEM tree * @param diffpos position of item to remove */ void DiffItemList::RemoveDiff(POSITION diffpos) { DIFFITEM *p = (DIFFITEM *)diffpos; p->RemoveSelf(); - --m_count; delete p; } /** - * @brief Empty CDiffContext array + * @brief Empty structured DIFFITEM tree */ void DiffItemList::RemoveAll() { @@ -64,7 +65,7 @@ } /** - * @brief Get position of first item in CDiffContext array + * @brief Get position of first item in structured DIFFITEM tree */ POSITION DiffItemList::GetFirstDiffPosition() const { @@ -72,30 +73,82 @@ } /** - * @brief Get position of next item in CDiffContext array + * @brief Get position of first child item in structured DIFFITEM tree + * @param parentdiffpos [in] Position of parent diff item + * @return Position of first child item + */ +POSITION DiffItemList::GetFirstChildDiffPosition(POSITION parentdiffpos) const +{ + DIFFITEM *parent = (DIFFITEM *)parentdiffpos; + if (parent) + return (POSITION)parent->children.IsSibling(parent->children.Flink); + else + return (POSITION)m_root.IsSibling(m_root.Flink); +} + +/** + * @brief Get position of next item in structured DIFFITEM tree * @param diffpos position of current item, updated to next item position * @return Diff Item in current position */ const DIFFITEM &DiffItemList::GetNextDiffPosition(POSITION & diffpos) const { DIFFITEM *p = (DIFFITEM *)diffpos; - diffpos = (POSITION)m_root.IsSibling(p->Flink); + if (p->HasChildren()) + { + diffpos = GetFirstChildDiffPosition(diffpos); + } + else + { + DIFFITEM *cur = p; + do + { + if (cur->parent) + diffpos = (POSITION)cur->parent->children.IsSibling(cur->Flink); + else + diffpos = (POSITION)m_root.IsSibling(cur->Flink); + cur = cur->parent; + } while (!diffpos && cur); + } return *p; } /** - * @brief Get position of next item in CDiffContext array + * @brief Get position of next item in structured DIFFITEM tree * @param diffpos position of current item, updated to next item position * @return Diff Item (by reference) in current position */ DIFFITEM &DiffItemList::GetNextDiffRefPosition(POSITION & diffpos) { + return (DIFFITEM &)GetNextDiffPosition(diffpos); +} + +/** + * @brief Get position of next sibling item in structured DIFFITEM tree + * @param diffpos position of current item, updated to next sibling item position + * @return Diff Item in current position + */ +const DIFFITEM &DiffItemList::GetNextSiblingDiffPosition(POSITION & diffpos) const +{ DIFFITEM *p = (DIFFITEM *)diffpos; - diffpos = (POSITION)m_root.IsSibling(p->Flink); + if (p->parent) + diffpos = (POSITION)p->parent->children.IsSibling(p->Flink); + else + diffpos = (POSITION)m_root.IsSibling(p->Flink); return *p; } /** + * @brief Get position of next sibling item in structured DIFFITEM tree + * @param diffpos position of current item, updated to next sibling item position + * @return Diff Item (by reference) in current position + */ +DIFFITEM &DiffItemList::GetNextSiblingDiffRefPosition(POSITION & diffpos) +{ + return (DIFFITEM &)GetNextSiblingDiffPosition(diffpos); +} + +/** * @brief Alter some bit flags of the diffcode. * * Examples: Modified: trunk/Src/DiffItemList.h =================================================================== --- trunk/Src/DiffItemList.h 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DiffItemList.h 2008-07-22 14:27:09 UTC (rev 5654) @@ -20,26 +20,26 @@ DiffItemList(); ~DiffItemList(); // add & remove differences - DIFFITEM &AddDiff(); + DIFFITEM &AddDiff(DIFFITEM *parent); void RemoveDiff(POSITION diffpos); void RemoveAll(); // to iterate over all differences on list POSITION GetFirstDiffPosition() const; + POSITION GetFirstChildDiffPosition(POSITION parentdiffpos) const; const DIFFITEM & GetNextDiffPosition(POSITION & diffpos) const; DIFFITEM & GetNextDiffRefPosition(POSITION & diffpos); + const DIFFITEM & GetNextSiblingDiffPosition(POSITION & diffpos) const; + DIFFITEM &GetNextSiblingDiffRefPosition(POSITION & diffpos); const DIFFITEM & GetDiffAt(POSITION diffpos) const; DIFFITEM & GetDiffRefAt(POSITION diffpos); - int GetDiffCount() const; - void SetDiffStatusCode(POSITION diffpos, UINT diffcode, UINT mask); void SetDiffCounts(POSITION diffpos, UINT diffs, UINT ignored); UINT GetCustomFlags1(POSITION diffpos) const; void SetCustomFlags1(POSITION diffpos, UINT flag); protected: - int m_count; ListEntry m_root; /**< Root of list of diffitems */ }; @@ -61,12 +61,4 @@ return *reinterpret_cast<DIFFITEM *>(diffpos); } -/** - * @brief Get number of items in CDiffContext array - */ -inline int DiffItemList::GetDiffCount() const -{ - return m_count; -} - #endif // _DIFF_ITEM_LIST_H_ Modified: trunk/Src/DiffThread.cpp =================================================================== --- trunk/Src/DiffThread.cpp 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DiffThread.cpp 2008-07-22 14:27:09 UTC (rev 5654) @@ -221,7 +221,7 @@ #endif // Build results list (except delaying file comparisons until below) - DirScan_GetItems(paths, subdir, subdir, myStruct, casesensitive, depth); + DirScan_GetItems(paths, subdir, subdir, myStruct, casesensitive, depth, NULL); #ifdef _DEBUG _CrtMemCheckpoint(&memStateAfter); Modified: trunk/Src/DirScan.cpp =================================================================== --- trunk/Src/DirScan.cpp 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DirScan.cpp 2008-07-22 14:27:09 UTC (rev 5654) @@ -32,8 +32,8 @@ void CompareDiffItem(DIFFITEM &di, CDiffContext * pCtxt); static void StoreDiffData(DIFFITEM &di, CDiffContext * pCtxt, const FolderCmp * pCmpData); -static void AddToList(const String &sLeftDir, const String &sRightDir, const DirItem * lent, const DirItem * rent, - UINT code, DiffFuncStruct *myStruct); +static DIFFITEM *AddToList(const String &sLeftDir, const String &sRightDir, const DirItem * lent, const DirItem * rent, + UINT code, DiffFuncStruct *myStruct, DIFFITEM *parent); static void UpdateDiffItem(DIFFITEM & di, BOOL & bExists, CDiffContext *pCtxt); /** @@ -66,11 +66,12 @@ * @param [in] casesensitive Is filename compare casesensitive? * @param [in] depth Levels of subdirectories to scan, -1 scans all * @param [in] pCtxt Compare context + * @param [in] parent Folder diff item to be scanned * @return 1 normally, -1 if compare was aborted */ int DirScan_GetItems(const PathContext &paths, const String &leftsubdir, const String &rightsubdir, DiffFuncStruct *myStruct, - bool casesensitive, int depth) + bool casesensitive, int depth, DIFFITEM *parent) { static const TCHAR backslash[] = _T("\\"); CDiffContext *pCtxt = myStruct->context; @@ -124,7 +125,7 @@ if (i<leftDirs.size() && (j == rightDirs.size() || collstr(leftDirs[i].filename, rightDirs[j].filename, casesensitive)<0)) { const UINT nDiffCode = DIFFCODE::LEFT | DIFFCODE::DIR; - AddToList(leftsubdir, rightsubdir, &leftDirs[i], 0, nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, &leftDirs[i], 0, nDiffCode, myStruct, parent); // Advance left pointer over left-only entry, and then retest with new pointers ++i; continue; @@ -132,7 +133,7 @@ if (j<rightDirs.size() && (i == leftDirs.size() || collstr(leftDirs[i].filename, rightDirs[j].filename, casesensitive)>0)) { const UINT nDiffCode = DIFFCODE::RIGHT | DIFFCODE::DIR; - AddToList(leftsubdir, rightsubdir, 0, &rightDirs[j], nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, 0, &rightDirs[j], nDiffCode, myStruct, parent); // Advance right pointer over right-only entry, and then retest with new pointers ++j; continue; @@ -147,7 +148,7 @@ // We are only interested about list of subdirectories to show - user can open them // TODO: scan one level deeper to see if directories are identical/different const UINT nDiffCode = DIFFCODE::BOTH | DIFFCODE::DIR; - AddToList(leftsubdir, rightsubdir, &leftDirs[i], &rightDirs[j], nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, &leftDirs[i], &rightDirs[j], nDiffCode, myStruct, parent); } else { @@ -164,13 +165,15 @@ if (!pCtxt->m_piFilterGlobal->includeDir(leftnewsub.c_str(), rightnewsub.c_str())) { const UINT nDiffCode = DIFFCODE::BOTH | DIFFCODE::DIR | DIFFCODE::SKIPPED; - AddToList(leftsubdir, rightsubdir, &leftDirs[i], &rightDirs[j], nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, &leftDirs[i], &rightDirs[j], nDiffCode, myStruct, parent); } else { + const UINT nDiffCode = DIFFCODE::BOTH | DIFFCODE::DIR; + DIFFITEM *me = AddToList(leftsubdir, rightsubdir, &leftDirs[i], &rightDirs[j], nDiffCode, myStruct, parent); // Scan recursively all subdirectories too, we are not adding folders if (DirScan_GetItems(paths, leftnewsub, rightnewsub, myStruct, casesensitive, - depth - 1) == -1) + depth - 1, me) == -1) { return -1; } @@ -198,7 +201,7 @@ collstr(leftFiles[i].filename, rightFiles[j].filename, casesensitive) < 0)) { const UINT nDiffCode = DIFFCODE::LEFT | DIFFCODE::FILE; - AddToList(leftsubdir, rightsubdir, &leftFiles[i], 0, nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, &leftFiles[i], 0, nDiffCode, myStruct, parent); // Advance left pointer over left-only entry, and then retest with new pointers ++i; continue; @@ -207,7 +210,7 @@ collstr(leftFiles[i].filename, rightFiles[j].filename, casesensitive) > 0)) { const UINT nDiffCode = DIFFCODE::RIGHT | DIFFCODE::FILE; - AddToList(leftsubdir, rightsubdir, 0, &rightFiles[j], nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, 0, &rightFiles[j], nDiffCode, myStruct, parent); // Advance right pointer over right-only entry, and then retest with new pointers ++j; continue; @@ -216,7 +219,7 @@ { ASSERT(j<rightFiles.size()); const UINT nDiffCode = DIFFCODE::BOTH | DIFFCODE::FILE; - AddToList(leftsubdir, rightsubdir, &leftFiles[i], &rightFiles[j], nDiffCode, myStruct); + AddToList(leftsubdir, rightsubdir, &leftFiles[i], &rightFiles[j], nDiffCode, myStruct, parent); ++i; ++j; continue; @@ -446,15 +449,16 @@ * @param [in] lent Left item data to add. * @param [in] rent Right item data to add. * @param [in] pCtxt Compare context. + * @param [in] parent Parent of item to be added */ -static void AddToList(const String &sLeftDir, const String &sRightDir, +static DIFFITEM *AddToList(const String &sLeftDir, const String &sRightDir, const DirItem * lent, const DirItem * rent, - UINT code, DiffFuncStruct *myStruct) + UINT code, DiffFuncStruct *myStruct, DIFFITEM *parent) { // We must store both paths - we cannot get paths later // and we need unique item paths for example when items // change to identical - DIFFITEM &di = myStruct->context->AddDiff(); + DIFFITEM &di = myStruct->context->AddDiff(parent); di.left.path = sLeftDir; di.right.path = sRightDir; @@ -499,6 +503,7 @@ ); myStruct->context->m_pCompareStats->IncreaseTotalItems(); ReleaseSemaphore(myStruct->hSemaphore, 1, 0); + return &di; } void // static Modified: trunk/Src/DirScan.h =================================================================== --- trunk/Src/DirScan.h 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DirScan.h 2008-07-22 14:27:09 UTC (rev 5654) @@ -13,10 +13,11 @@ class DiffItemList; class PathContext; class IAbortable; +struct DIFFITEM; struct DiffFuncStruct; int DirScan_GetItems(const PathContext &paths, const String &leftsubdir, const String &rightsubdir, DiffFuncStruct *myStruct, - bool casesensitive, int depth); + bool casesensitive, int depth, DIFFITEM *parent); int DirScan_CompareItems(DiffFuncStruct *); int DirScan_CompareRequestedItems(DiffFuncStruct *); Modified: trunk/Src/DirView.cpp =================================================================== --- trunk/Src/DirView.cpp 2008-07-21 19:28:48 UTC (rev 5653) +++ trunk/Src/DirView.cpp 2008-07-22 14:27:09 UTC (rev 5654) @@ -417,7 +417,7 @@ if (!di.diffcode.isResultSame()) ++alldiffs; - if (pDoc->IsShowable(di)) + if (pDoc->IsShowable(di) && (!pDoc->GetRecursive() || !di.diffcode.isDirectory() || di.diffcode.isSideLeftOnly() || di.diffcode.isSideRightOnly())) { AddNewItem(cnt, curdiffpos, I_IMAGECALLBACK); cnt++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jt...@us...> - 2008-07-22 16:31:45
|
Revision: 5657 http://winmerge.svn.sourceforge.net/winmerge/?rev=5657&view=rev Author: jtuc Date: 2008-07-22 16:31:42 +0000 (Tue, 22 Jul 2008) Log Message: ----------- VC6 issues Modified Paths: -------------- trunk/Src/DirView.cpp trunk/Src/LineFiltersList.cpp trunk/Src/LocationView.cpp trunk/Src/MainFrm.cpp trunk/Src/MergeEditView.cpp trunk/Src/MovedLines.cpp trunk/Src/PluginsListDlg.cpp Modified: trunk/Src/DirView.cpp =================================================================== --- trunk/Src/DirView.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/DirView.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -232,7 +232,7 @@ ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) - ON_COMMAND(ID_PLUGINS_LIST, &CDirView::OnPluginsList) + ON_COMMAND(ID_PLUGINS_LIST, OnPluginsList) //}}AFX_MSG_MAP ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick) ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemChanged) Modified: trunk/Src/LineFiltersList.cpp =================================================================== --- trunk/Src/LineFiltersList.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/LineFiltersList.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -6,6 +6,10 @@ // ID line follows -- this is updated by SVN // $Id$ +// Disable VC6's "identifier was truncated..." warning. It is meaningless. +#if _MSC_VER == 1200 + #pragma warning(disable: 4786) +#endif #include <windows.h> #include <vector> #include <assert.h> Modified: trunk/Src/LocationView.cpp =================================================================== --- trunk/Src/LocationView.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/LocationView.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -913,7 +913,8 @@ ::PostMessage(m_hwndFrame, MSG_STORE_PANESIZES, 0, 0); } - m_currentSize.SetSize(cx, cy); + m_currentSize.cx = cx; + m_currentSize.cy = cy; } /** Modified: trunk/Src/MainFrm.cpp =================================================================== --- trunk/Src/MainFrm.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/MainFrm.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -217,7 +217,7 @@ ON_COMMAND(ID_HELP_RELEASENOTES, OnHelpReleasenotes) ON_COMMAND(ID_HELP_TRANSLATIONS, OnHelpTranslations) ON_COMMAND(ID_FILE_OPENCONFLICT, OnFileOpenConflict) - ON_COMMAND(ID_PLUGINS_LIST, &CMainFrame::OnPluginsList) + ON_COMMAND(ID_PLUGINS_LIST, OnPluginsList) //}}AFX_MSG_MAP END_MESSAGE_MAP() Modified: trunk/Src/MergeEditView.cpp =================================================================== --- trunk/Src/MergeEditView.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/MergeEditView.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -202,7 +202,7 @@ ON_COMMAND(ID_VIEW_ZOOMNORMAL, OnViewZoomNormal) ON_UPDATE_COMMAND_UI(ID_STATUS_LEFTFILE_ENCODING, OnUpdateStatusLeftEncoding) ON_UPDATE_COMMAND_UI(ID_STATUS_RIGHTFILE_ENCODING, OnUpdateStatusRightEncoding) - ON_COMMAND(ID_PLUGINS_LIST, &CMergeEditView::OnPluginsList) + ON_COMMAND(ID_PLUGINS_LIST, OnPluginsList) //}}AFX_MSG_MAP END_MESSAGE_MAP() Modified: trunk/Src/MovedLines.cpp =================================================================== --- trunk/Src/MovedLines.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/MovedLines.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -4,6 +4,10 @@ * @brief Implementation of MovedLines class. */ +// Disable VC6's "identifier was truncated..." warning. It is meaningless. +#if _MSC_VER == 1200 + #pragma warning(disable: 4786) +#endif #include <map> #include "MovedLines.h" Modified: trunk/Src/PluginsListDlg.cpp =================================================================== --- trunk/Src/PluginsListDlg.cpp 2008-07-22 14:47:03 UTC (rev 5656) +++ trunk/Src/PluginsListDlg.cpp 2008-07-22 16:31:42 UTC (rev 5657) @@ -17,7 +17,7 @@ IMPLEMENT_DYNAMIC(PluginsListDlg, CDialog) BEGIN_MESSAGE_MAP(PluginsListDlg, CDialog) - ON_BN_CLICKED(IDOK, &PluginsListDlg::OnBnClickedOk) + ON_BN_CLICKED(IDOK, OnBnClickedOk) END_MESSAGE_MAP() /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-28 11:23:26
|
Revision: 5683 http://winmerge.svn.sourceforge.net/winmerge/?rev=5683&view=rev Author: kimmov Date: 2008-07-28 11:23:22 +0000 (Mon, 28 Jul 2008) Log Message: ----------- Trivial cleanups and commenting additions and fixes. Modified Paths: -------------- trunk/Src/GhostTextBuffer.cpp trunk/Src/GhostTextBuffer.h trunk/Src/editlib/ccrystaltextbuffer.cpp Modified: trunk/Src/GhostTextBuffer.cpp =================================================================== --- trunk/Src/GhostTextBuffer.cpp 2008-07-25 22:38:23 UTC (rev 5682) +++ trunk/Src/GhostTextBuffer.cpp 2008-07-28 11:23:22 UTC (rev 5683) @@ -51,23 +51,34 @@ IMPLEMENT_DYNCREATE (CGhostTextBuffer, CCrystalTextBuffer) +/** + * @brief Constructor. + */ CGhostTextBuffer::CGhostTextBuffer() { m_bUndoGroup = FALSE; CCrystalTextBuffer::m_bUndoBeginGroup = m_bUndoBeginGroup = FALSE; } -BOOL CGhostTextBuffer:: -InitNew (CRLFSTYLE nCrlfStyle /*= CRLF_STYLE_DOS*/ ) +/** + * @brief Initialize a new buffer. + * @param [in] nCrlfStyle EOL style for the buffer. + * @return TRUE if the initialization succeeded. + */ +BOOL CGhostTextBuffer::InitNew (CRLFSTYLE nCrlfStyle /*= CRLF_STYLE_DOS*/ ) { m_bUndoBeginGroup = FALSE; return CCrystalTextBuffer::InitNew(nCrlfStyle); } - -/** InternalInsertGhostLine accepts only apparent line numbers */ -BOOL CGhostTextBuffer:: -InternalInsertGhostLine (CCrystalTextView * pSource, int nLine) +/** + * @brief Insert a ghost line. + * @param [in] pSource View into which to insert the line. + * @param [in] nLine Line (apparent/screen) where to insert the ghost line. + * @return TRUE if the insertion succeeded, FALSE otherwise. + */ +BOOL CGhostTextBuffer:: InternalInsertGhostLine (CCrystalTextView * pSource, + int nLine) { ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! @@ -79,59 +90,67 @@ CInsertContext context; context.m_ptStart.x = 0; context.m_ptStart.y = nLine; + context.m_ptEnd.x = 0; + context.m_ptEnd.y = nLine + 1; CCrystalTextBuffer::InsertLine (_T(""), 0, nLine); - - context.m_ptEnd.x = 0; - context.m_ptEnd.y = nLine+1; - - if (pSource!=NULL) + if (pSource != NULL) UpdateViews (pSource, &context, UPDATE_HORZRANGE | UPDATE_VERTRANGE, nLine); if (!m_bModified) SetModified (TRUE); OnNotifyLineHasBeenEdited(nLine); - return TRUE; } - /** InternalDeleteGhostLine accepts only apparent line numbers */ -BOOL CGhostTextBuffer:: -InternalDeleteGhostLine (CCrystalTextView * pSource, int nLine, int nCount) +/** + * @brief Delete a ghost line. + * @param [in] pSource View into which to insert the line. + * @param [in] nLine Line index where to insert the ghost line. + * @return TRUE if the deletion succeeded, FALSE otherwise. + * @note @p nLine must be an apparent line number (ghost lines added). + */ +BOOL CGhostTextBuffer::InternalDeleteGhostLine (CCrystalTextView * pSource, + int nLine, int nCount) { ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! + ASSERT (nLine >= 0 && nLine <= m_aLines.GetSize ()); - ASSERT (nLine >= 0 && nLine <= m_aLines.GetSize ()); if (m_bReadOnly) return FALSE; - if (nCount == 0) return TRUE; CDeleteContext context; context.m_ptStart.y = nLine; context.m_ptStart.x = 0; - context.m_ptEnd.y = nLine+nCount; + context.m_ptEnd.y = nLine + nCount; context.m_ptEnd.x = 0; - for (int L = nLine ; L < nLine+nCount; L++) + for (int i = nLine ; i < nLine + nCount; i++) { - ASSERT (GetLineFlags(L) & LF_GHOST); - delete[] m_aLines[L].m_pcLine; + ASSERT (GetLineFlags(i) & LF_GHOST); + delete[] m_aLines[i].m_pcLine; } m_aLines.RemoveAt (nLine, nCount); - if (pSource!=NULL) + if (pSource != NULL) { - // the last parameter is just for speed : don't recompute lines before this one - // it must be a valid line number, so if we delete the last lines, we give the last of the remaining lines + // The last parameter is optimization - don't recompute lines preceeding + // the removed line. if (nLine == GetLineCount()) - UpdateViews (pSource, &context, UPDATE_HORZRANGE | UPDATE_VERTRANGE, GetLineCount()-1); + { + UpdateViews (pSource, &context, UPDATE_HORZRANGE | UPDATE_VERTRANGE, + GetLineCount() - 1); + } else - UpdateViews (pSource, &context, UPDATE_HORZRANGE | UPDATE_VERTRANGE, nLine); + { + UpdateViews (pSource, &context, UPDATE_HORZRANGE | UPDATE_VERTRANGE, + nLine); + } } if (!m_bModified) @@ -140,9 +159,6 @@ return TRUE; } - - - /** * @brief Get text of specified lines (ghost lines will not contribute to text). * @@ -171,32 +187,32 @@ // estimate size (upper bound) int nBufSize = 0; - int i=0; - for (i=nStartLine; i<=nEndLine; ++i) + int i = 0; + for (i = nStartLine; i <= nEndLine; ++i) nBufSize += (GetFullLineLength(i) + 2); // in case we insert EOLs LPTSTR pszBuf = text.GetBuffer(nBufSize); if (nCrlfStyle != CRLF_STYLE_AUTOMATIC) { // we must copy this EOL type only - CString sEol = GetStringEol (nCrlfStyle); + const CString sEol = GetStringEol (nCrlfStyle); - for (i=nStartLine; i<=nEndLine; ++i) + for (i = nStartLine; i <= nEndLine; ++i) { // exclude ghost lines if (GetLineFlags(i) & LF_GHOST) continue; // copy the line, excluding the EOL - int soffset = (i==nStartLine ? nStartChar : 0); - int eoffset = (i==nEndLine ? nEndChar : GetLineLength(i)); + int soffset = (i == nStartLine ? nStartChar : 0); + int eoffset = (i == nEndLine ? nEndChar : GetLineLength(i)); int chars = eoffset - soffset; LPCTSTR szLine = m_aLines[i].m_pcLine + soffset; CopyMemory(pszBuf, szLine, chars * sizeof(TCHAR)); pszBuf += chars; // copy the EOL of the requested type - if (i!=ApparentLastRealLine()) + if (i != ApparentLastRealLine()) { CopyMemory(pszBuf, sEol, sEol.GetLength() * sizeof(TCHAR)); pszBuf += sEol.GetLength(); @@ -205,22 +221,22 @@ } else { - for (i=nStartLine; i<=nEndLine; ++i) + for (i = nStartLine; i <= nEndLine; ++i) { // exclude ghost lines if (GetLineFlags(i) & LF_GHOST) continue; // copy the line including the EOL - int soffset = (i==nStartLine ? nStartChar : 0); - int eoffset = (i==nEndLine ? nEndChar : GetFullLineLength(i)); + int soffset = (i == nStartLine ? nStartChar : 0); + int eoffset = (i == nEndLine ? nEndChar : GetFullLineLength(i)); int chars = eoffset - soffset; LPCTSTR szLine = m_aLines[i].m_pcLine + soffset; CopyMemory(pszBuf, szLine, chars * sizeof(TCHAR)); pszBuf += chars; // check that we really have an EOL - if (i!=ApparentLastRealLine() && GetLineLength(i)==GetFullLineLength(i)) + if (i != ApparentLastRealLine() && GetLineLength(i) == GetFullLineLength(i)) { // Oops, real line lacks EOL // (If this happens, editor probably has bug) @@ -633,15 +649,27 @@ // edition functions /** - * - * @param nEndLine and nEndChar are the coordinates of the end od the inserted text - * They are valid as long as you do not call FlushUndoGroup - * If you need to call FlushUndoGroup, just store them in a variable which - * is preserved with real line number during Rescan (m_ptCursorPos, m_ptLastChange for example) + * @brief Insert text to the buffer. + * @param [in] pSource View into which to insert the text. + * @param [in] nLine Line number (apparent/screen) where the insertion starts. + * @param [in] nPos Character position where the insertion starts. + * @param [in] pszText The text to insert. + * @param [out] nEndLine Line number of last added line in the buffer. + * @param [out] nEndChar Character position of the end of the added text + * in the buffer. + * @param [in] nAction Edit action. + * @param [in] bHistory Save insertion for undo/redo? + * @return TRUE if the insertion succeeded, FALSE otherwise. + * @note Line numbers are apparent (screen) line numbers, not real + * line numbers in the file. + * @note @p nEndLine and @p nEndChar are valid as long as you do not call + * FlushUndoGroup. If you need to call FlushUndoGroup, just store them in a + * variable which is preserved with real line number during Rescan + * (m_ptCursorPos, m_ptLastChange for example). */ -BOOL CGhostTextBuffer:: -InsertText (CCrystalTextView * pSource, int nLine, int nPos, LPCTSTR pszText, int cchText, - int &nEndLine, int &nEndChar, int nAction, BOOL bHistory /*=TRUE*/) +BOOL CGhostTextBuffer::InsertText (CCrystalTextView * pSource, int nLine, + int nPos, LPCTSTR pszText, int cchText, int &nEndLine, int &nEndChar, + int nAction, BOOL bHistory /*=TRUE*/) { BOOL bGroupFlag = FALSE; if (bHistory) @@ -658,7 +686,8 @@ paSavedRevisonNumbers->SetSize(1); (*paSavedRevisonNumbers)[0] = m_aLines[nLine].m_dwRevisionNumber; - if (!CCrystalTextBuffer::InsertText (pSource, nLine, nPos, pszText, cchText, nEndLine, nEndChar, nAction, bHistory)) + if (!CCrystalTextBuffer::InsertText (pSource, nLine, nPos, pszText, + cchText, nEndLine, nEndChar, nAction, bHistory)) { delete paSavedRevisonNumbers; return FALSE; @@ -728,20 +757,17 @@ } RecomputeEOL (pSource, nLine, nEndLine); - - if (bHistory == false) { delete paSavedRevisonNumbers; return TRUE; } - // little trick as we share the m_nUndoPosition with the base class ASSERT ( m_nUndoPosition > 0); m_nUndoPosition --; AddUndoRecord (TRUE, CPoint (nPos, nLine), CPoint (nEndChar, nEndLine), - pszText, cchText, nRealLinesCreated, nAction, paSavedRevisonNumbers); + pszText, cchText, nRealLinesCreated, nAction, paSavedRevisonNumbers); if (bGroupFlag) FlushUndoGroup (pSource); @@ -752,9 +778,20 @@ return TRUE; } -BOOL CGhostTextBuffer:: -DeleteText (CCrystalTextView * pSource, int nStartLine, int nStartChar, - int nEndLine, int nEndChar, int nAction, BOOL bHistory /*=TRUE*/) +/** + * @brief Remove text from the buffer. + * @param [in] pSource View from which to remove the text. + * @param [in] nLine Line number (apparent/screen) where the deletion starts. + * @param [in] nPos Character position where the deletion starts. + * @param [in] nEndLine Line number (apparent/screen) where the deletion ends. + * @param [out] nEndChar Character position where the deletion ends. + * @param [in] nAction Edit action. + * @param [in] bHistory Save insertion for undo/redo? + * @return TRUE if the deletion succeeded, FALSE otherwise. + */ +BOOL CGhostTextBuffer::DeleteText (CCrystalTextView * pSource, int nStartLine, + int nStartChar, int nEndLine, int nEndChar, int nAction, + BOOL bHistory /*=TRUE*/) { BOOL bGroupFlag = FALSE; if (bHistory) @@ -781,14 +818,16 @@ // flags are going to be deleted so we store them now int bLastLineGhost = ((GetLineFlags(nEndLine) & LF_GHOST) != 0); int bFirstLineGhost = ((GetLineFlags(nStartLine) & LF_GHOST) != 0); - // count the number of real lines in the deleted block (for first/last line, include partial real lines) + // count the number of real lines in the deleted block (for first/last line, + // include partial real lines) int nRealLinesInDeletedBlock = ComputeRealLine(nEndLine) - ComputeRealLine(nStartLine); if (!bLastLineGhost) nRealLinesInDeletedBlock ++; CString sTextToDelete; GetTextWithoutEmptys (nStartLine, nStartChar, nEndLine, nEndChar, sTextToDelete); - if (!CCrystalTextBuffer::DeleteText (pSource, nStartLine, nStartChar, nEndLine, nEndChar, nAction, bHistory)) + if (!CCrystalTextBuffer::DeleteText (pSource, nStartLine, nStartChar, + nEndLine, nEndChar, nAction, bHistory)) { delete paSavedRevisonNumbers; return FALSE; @@ -821,8 +860,6 @@ } RecomputeEOL (pSource, nStartLine, nStartLine); - - if (bHistory == false) { delete paSavedRevisonNumbers; @@ -833,50 +870,58 @@ ASSERT ( m_nUndoPosition > 0); m_nUndoPosition --; AddUndoRecord (FALSE, CPoint (nStartChar, nStartLine), CPoint (0, -1), - sTextToDelete, sTextToDelete.GetLength(), nRealLinesInDeletedBlock, nAction, paSavedRevisonNumbers); + sTextToDelete, sTextToDelete.GetLength(), nRealLinesInDeletedBlock, + nAction, paSavedRevisonNumbers); if (bGroupFlag) FlushUndoGroup (pSource); return TRUE; } -BOOL CGhostTextBuffer:: -InsertGhostLine (CCrystalTextView * pSource, int nLine) +/** + * @brief Insert a ghost line to the buffer (and view). + * @param [in] pSource The view to which to add the ghost line. + * @param [in] Line index (apparent/screen) where to add the ghost line. + * @return TRUE if the addition succeeded, FALSE otherwise. + */ +BOOL CGhostTextBuffer::InsertGhostLine (CCrystalTextView * pSource, int nLine) { if (!InternalInsertGhostLine (pSource, nLine)) return FALSE; - // set WinMerge flags + // Set WinMerge flags SetLineFlag (nLine, LF_GHOST, TRUE, FALSE, FALSE); - RecomputeRealityMapping(); - // don't need to recompute EOL as real lines are unchanged - - // never AddUndoRecord as Rescan clears the ghost lines - + // Don't need to recompute EOL as real lines are unchanged. + // Never AddUndoRecord as Rescan clears the ghost lines. return TRUE; } -void CGhostTextBuffer:: -RemoveAllGhostLines() +/** + * @brief Remove all the ghost lines from the buffer. + */ +void CGhostTextBuffer::RemoveAllGhostLines() { int nlines = GetLineCount(); int newnl = 0; int ct; // Free the buffer of ghost lines - for(ct=0; ct < nlines; ct++) + for(ct = 0; ct < nlines; ct++) + { if (GetLineFlags(ct) & LF_GHOST) delete[] m_aLines[ct].m_pcLine; + } // Compact non-ghost lines // (we copy the buffer address, so the buffer don't move and we don't free it) - for(ct=0; ct < nlines; ct++) + for(ct = 0; ct < nlines; ct++) + { if ((GetLineFlags(ct) & LF_GHOST) == 0) m_aLines[newnl++] = m_aLines[ct]; + } // Discard unused entries in one shot m_aLines.SetSize(newnl); - RecomputeRealityMapping(); } @@ -884,31 +929,32 @@ // apparent <-> real line conversion /** -Return apparent line of highest real (file) line. -Return -1 if no lines. -*/ + * @brief Get last apparent (screen) line index. + * @return Last apparent line, or -1 if no lines in the buffer. + */ int CGhostTextBuffer::ApparentLastRealLine() const { int bmax = (int) m_RealityBlocks.GetUpperBound(); - if (bmax<0) return -1; + if (bmax < 0) + return -1; const RealityBlock & block = m_RealityBlocks[bmax]; return block.nStartApparent + block.nCount - 1; } /** -Return underlying real line. -For ghost lines, return NEXT HIGHER real line (for trailing ghost line, return last real line + 1). -If nApparentLine is greater than the last valid apparent line, ASSERT - -ie, lines 0->0, 1->2, 2->4, -for argument of 3, return 2 -*/ + * @brief Get a real line for the apparent (screen) line. + * This function returns the real line for the given apparent (screen) line. + * For ghost lines we return next real line. For trailing ghost line we return + * last real line + 1). Ie, lines 0->0, 1->2, 2->4, for argument of 3, + * return 2. + * @param [in] nApparentLine Apparent line for which to get the real line. + * @return The real line for the apparent line. + */ int CGhostTextBuffer::ComputeRealLine(int nApparentLine) const { int bmax = (int) m_RealityBlocks.GetUpperBound(); - // first get the degenerate cases out of the way - // empty file ? - if (bmax<0) + // Empty file? + if (bmax < 0) return 0; // after last apparent line ? @@ -920,16 +966,16 @@ return maxblock.nStartReal + maxblock.nCount; // binary search to find correct (or nearest block) - int blo=0, bhi=bmax; + int blo = 0, bhi = bmax; int i; - while (blo<=bhi) + while (blo <= bhi) { - i = (blo+bhi)/2; + i = (blo + bhi) / 2; const RealityBlock & block = m_RealityBlocks[i]; if (nApparentLine < block.nStartApparent) - bhi = i-1; + bhi = i - 1; else if (nApparentLine >= block.nStartApparent + block.nCount) - blo = i+1; + blo = i + 1; else // found it inside this block return (nApparentLine - block.nStartApparent) + block.nStartReal; } @@ -938,15 +984,17 @@ } /** -Return apparent line for this underlying real line. -If real line is out of bounds, return last valid apparent line + 1 -*/ + * @brief Get an apparent (screen) line for the real line. + * @param [in] nRealLine Real line for which to get the apparent line. + * @return The apparent line for the real line. If real line is out of bounds + * return last valid apparent line + 1. + */ int CGhostTextBuffer::ComputeApparentLine(int nRealLine) const { int bmax = (int) m_RealityBlocks.GetUpperBound(); // first get the degenerate cases out of the way // empty file ? - if (bmax<0) + if (bmax < 0) return 0; // after last block ? const RealityBlock & maxblock = m_RealityBlocks[bmax]; @@ -954,16 +1002,16 @@ return GetLineCount(); // binary search to find correct (or nearest block) - int blo=0, bhi=bmax; + int blo = 0, bhi = bmax; int i; - while (blo<=bhi) + while (blo <= bhi) { - i = (blo+bhi)/2; + i = (blo + bhi) / 2; const RealityBlock & block = m_RealityBlocks[i]; if (nRealLine < block.nStartReal) - bhi = i-1; + bhi = i - 1; else if (nRealLine >= block.nStartReal + block.nCount) - blo = i+1; + blo = i + 1; else return (nRealLine - block.nStartReal) + block.nStartApparent; } Modified: trunk/Src/GhostTextBuffer.h =================================================================== --- trunk/Src/GhostTextBuffer.h 2008-07-25 22:38:23 UTC (rev 5682) +++ trunk/Src/GhostTextBuffer.h 2008-07-28 11:23:22 UTC (rev 5683) @@ -220,8 +220,6 @@ // The array of reality blocks is kept in order CArray < RealityBlock, RealityBlock& > m_RealityBlocks; - - // Operations private: BOOL InternalInsertGhostLine (CCrystalTextView * pSource, int nLine); @@ -242,8 +240,12 @@ // Text modification functions - virtual BOOL InsertText (CCrystalTextView * pSource, int nLine, int nPos, LPCTSTR pszText, int cchText, int &nEndLine, int &nEndChar, int nAction = CE_ACTION_UNKNOWN, BOOL bHistory =TRUE); - virtual BOOL DeleteText (CCrystalTextView * pSource, int nStartLine, int nStartPos, int nEndLine, int nEndPos, int nAction = CE_ACTION_UNKNOWN, BOOL bHistory =TRUE); + virtual BOOL InsertText (CCrystalTextView * pSource, int nLine, int nPos, + LPCTSTR pszText, int cchText, int &nEndLine, int &nEndChar, + int nAction = CE_ACTION_UNKNOWN, BOOL bHistory = TRUE); + virtual BOOL DeleteText (CCrystalTextView * pSource, int nStartLine, + int nStartPos, int nEndLine, int nEndPos, + int nAction = CE_ACTION_UNKNOWN, BOOL bHistory = TRUE); BOOL InsertGhostLine (CCrystalTextView * pSource, int nLine); // Undo/Redo @@ -255,12 +257,14 @@ virtual void FlushUndoGroup (CCrystalTextView * pSource); public: - /** - Code for mapping between file line numbers (real line numbers) - and screen line numbers (apparent line numbers). - - This is needed to handle ghost lines (ones with no text or EOL chars) - which WinMerge uses for left-only or right-only lines. + //@{ + /** + * @name Real/apparent line number conversion functions. + * These functions convert line numbers between file line numbers + * (real line numbers) and screen line numbers (apparent line numbers). + * + * This mapping is needed to handle ghost lines (ones with no text or + * EOL chars) which WinMerge uses for left-only or right-only lines. */ int ApparentLastRealLine() const; int ComputeRealLine(int nApparentLine) const; @@ -269,6 +273,7 @@ int ComputeRealLineAndGhostAdjustment(int nApparentLine, int& decToReal) const; /** richer position information yApparent = apparent(yReal) - yGhost */ int ComputeApparentLine(int nRealLine, int decToReal) const; + //@} /** for loading file */ void FinishLoading(); Modified: trunk/Src/editlib/ccrystaltextbuffer.cpp =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-07-25 22:38:23 UTC (rev 5682) +++ trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-07-28 11:23:22 UTC (rev 5683) @@ -226,7 +226,8 @@ * * @param nPosition : not defined (or -1) = add lines at the end of array */ -void CCrystalTextBuffer::InsertLine (LPCTSTR pszLine, int nLength /*= -1*/ , int nPosition /*= -1*/, int nCount /*= 1*/ ) +void CCrystalTextBuffer::InsertLine (LPCTSTR pszLine, int nLength /*= -1*/ , + int nPosition /*= -1*/, int nCount /*= 1*/ ) { ASSERT(nLength != -1); @@ -1088,9 +1089,20 @@ } } -// InternalDeleteText uses only apparent line numbers +/** + * @brief Delete text from the buffer. + * @param [in] pSource A view from which the text is deleted. + * @param [in] nStartLine Starting line for the deletion. + * @param [in] nStartChar Starting char position for the deletion. + * @param [in] nEndLine Ending line for the deletion. + * @param [in] nEndChar Ending char position for the deletion. + * @return TRUE if the insertion succeeded, FALSE otherwise. + * @note Line numbers are apparent (screen) line numbers, not real + * line numbers in the file. + */ BOOL CCrystalTextBuffer:: -InternalDeleteText (CCrystalTextView * pSource, int nStartLine, int nStartChar, int nEndLine, int nEndChar) +InternalDeleteText (CCrystalTextView * pSource, int nStartLine, int nStartChar, + int nEndLine, int nEndChar) { ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! @@ -1180,9 +1192,25 @@ } -// InternalInsertText uses only apparent line numbers +/** + * @brief Insert text to the buffer. + * @param [in] pSource A view to which the text is added. + * @param [in] nLine Line to add the text. + * @param [in] nPos Position in the line to insert the text. + * @param [in] pszText The text to insert. + * @param [in] cchText The length of the text. + * @param [out] nEndLine Line number of last added line in the buffer. + * @param [out] nEndChar Character position of the end of the added text + * in the buffer. + * @param [in] nAction Edit action. + * @param [in] bHistory Save insertion for undo/redo? + * @return TRUE if the insertion succeeded, FALSE otherwise. + * @note Line numbers are apparent (screen) line numbers, not real + * line numbers in the file. + */ BOOL CCrystalTextBuffer:: -InternalInsertText (CCrystalTextView * pSource, int nLine, int nPos, LPCTSTR pszText, int cchText, int &nEndLine, int &nEndChar) +InternalInsertText (CCrystalTextView * pSource, int nLine, int nPos, + LPCTSTR pszText, int cchText, int &nEndLine, int &nEndChar) { ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! @@ -1195,6 +1223,8 @@ CInsertContext context; context.m_ptStart.x = nPos; context.m_ptStart.y = nLine; + nEndLine = 0; + nEndChar = 0; int nRestCount = GetFullLineLength(nLine) - nPos; CString sTail; @@ -1305,12 +1335,10 @@ if (!m_bModified) SetModified (TRUE); - //BEGIN SW + // remember current cursor position as last editing position m_ptLastChange.x = nEndChar; m_ptLastChange.y = nEndLine; - //END SW - return TRUE; } @@ -1560,10 +1588,11 @@ return TRUE; } -// [JRT] Support For Descriptions On Undo/Redo Actions // the CPoint parameters are apparent (on screen) line numbers void CCrystalTextBuffer:: -AddUndoRecord (BOOL bInsert, const CPoint & ptStartPos, const CPoint & ptEndPos, LPCTSTR pszText, int cchText, int nActionType, CDWordArray *paSavedRevisonNumbers) +AddUndoRecord (BOOL bInsert, const CPoint & ptStartPos, + const CPoint & ptEndPos, LPCTSTR pszText, int cchText, int nActionType, + CDWordArray *paSavedRevisonNumbers) { // Forgot to call BeginUndoGroup()? ASSERT (m_bUndoGroup); @@ -1651,9 +1680,26 @@ return GetStringEol(m_nCRLFMode); } +/** + * @brief Insert text to the buffer. + * @param [in] pSource A view to which the text is added. + * @param [in] nLine Line to add the text. + * @param [in] nPos Position in the line to insert the text. + * @param [in] pszText The text to insert. + * @param [in] cchText The length of the text. + * @param [out] nEndLine Line number of last added line in the buffer. + * @param [out] nEndChar Character position of the end of the added text + * in the buffer. + * @param [in] nAction Edit action. + * @param [in] bHistory Save insertion for undo/redo? + * @return TRUE if the insertion succeeded, FALSE otherwise. + * @note Line numbers are apparent (screen) line numbers, not real + * line numbers in the file. + */ BOOL CCrystalTextBuffer:: -InsertText (CCrystalTextView * pSource, int nLine, int nPos, LPCTSTR pszText, int cchText, - int &nEndLine, int &nEndChar, int nAction, BOOL bHistory /*=TRUE*/) +InsertText (CCrystalTextView * pSource, int nLine, int nPos, LPCTSTR pszText, + int cchText, int &nEndLine, int &nEndChar, int nAction, + BOOL bHistory /*=TRUE*/) { // save line revision numbers for undo CDWordArray *paSavedRevisonNumbers = new CDWordArray; @@ -1696,6 +1742,19 @@ return TRUE; } +/** + * @brief Delete text from the buffer. + * @param [in] pSource A view from which the text is deleted. + * @param [in] nStartLine Starting line for the deletion. + * @param [in] nStartChar Starting char position for the deletion. + * @param [in] nEndLine Ending line for the deletion. + * @param [in] nEndChar Ending char position for the deletion. + * @param [in] nAction Edit action. + * @param [in] bHistory Save insertion for undo/redo? + * @return TRUE if the insertion succeeded, FALSE otherwise. + * @note Line numbers are apparent (screen) line numbers, not real + * line numbers in the file. + */ BOOL CCrystalTextBuffer:: DeleteText (CCrystalTextView * pSource, int nStartLine, int nStartChar, int nEndLine, int nEndChar, int nAction, BOOL bHistory /*=TRUE*/) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-28 12:30:05
|
Revision: 5684 http://winmerge.svn.sourceforge.net/winmerge/?rev=5684&view=rev Author: kimmov Date: 2008-07-28 12:30:02 +0000 (Mon, 28 Jul 2008) Log Message: ----------- Convert apparent/real line mapping to use std::vector instead of CArray. Modified Paths: -------------- trunk/Src/GhostTextBuffer.cpp trunk/Src/GhostTextBuffer.h Modified: trunk/Src/GhostTextBuffer.cpp =================================================================== --- trunk/Src/GhostTextBuffer.cpp 2008-07-28 11:23:22 UTC (rev 5683) +++ trunk/Src/GhostTextBuffer.cpp 2008-07-28 12:30:02 UTC (rev 5684) @@ -32,6 +32,7 @@ // $Id$ #include "stdafx.h" +#include <vector> #include "GhostTextBuffer.h" #ifdef _DEBUG @@ -44,6 +45,8 @@ #define _ADVANCED_BUGCHECK 1 #endif +using namespace std; + BEGIN_MESSAGE_MAP (CGhostTextBuffer, CCrystalTextBuffer) //{{AFX_MSG_MAP(CGhostTextBuffer) //}}AFX_MSG_MAP @@ -934,10 +937,10 @@ */ int CGhostTextBuffer::ApparentLastRealLine() const { - int bmax = (int) m_RealityBlocks.GetUpperBound(); - if (bmax < 0) + const int size = m_RealityBlocks.size(); + if (size == 0) return -1; - const RealityBlock & block = m_RealityBlocks[bmax]; + const RealityBlock &block = m_RealityBlocks.back(); return block.nStartApparent + block.nCount - 1; } @@ -952,26 +955,26 @@ */ int CGhostTextBuffer::ComputeRealLine(int nApparentLine) const { - int bmax = (int) m_RealityBlocks.GetUpperBound(); - // Empty file? - if (bmax < 0) + const int size = m_RealityBlocks.size(); + if (size == 0) return 0; // after last apparent line ? ASSERT(nApparentLine < GetLineCount()); // after last block ? - const RealityBlock & maxblock = m_RealityBlocks[bmax]; + const RealityBlock &maxblock = m_RealityBlocks.back(); if (nApparentLine >= maxblock.nStartApparent + maxblock.nCount) return maxblock.nStartReal + maxblock.nCount; // binary search to find correct (or nearest block) - int blo = 0, bhi = bmax; + int blo = 0; + int bhi = size - 1; int i; while (blo <= bhi) { i = (blo + bhi) / 2; - const RealityBlock & block = m_RealityBlocks[i]; + const RealityBlock &block = m_RealityBlocks[i]; if (nApparentLine < block.nStartApparent) bhi = i - 1; else if (nApparentLine >= block.nStartApparent + block.nCount) @@ -991,18 +994,18 @@ */ int CGhostTextBuffer::ComputeApparentLine(int nRealLine) const { - int bmax = (int) m_RealityBlocks.GetUpperBound(); - // first get the degenerate cases out of the way - // empty file ? - if (bmax < 0) + const int size = m_RealityBlocks.size(); + if (size == 0) return 0; + // after last block ? - const RealityBlock & maxblock = m_RealityBlocks[bmax]; + const RealityBlock & maxblock = m_RealityBlocks.back(); if (nRealLine >= maxblock.nStartReal + maxblock.nCount) return GetLineCount(); // binary search to find correct (or nearest block) - int blo = 0, bhi = bmax; + int blo = 0; + int bhi = size - 1; int i; while (blo <= bhi) { @@ -1021,21 +1024,20 @@ } /** -Return underlying real line and ghost adjustment -as nApparentLine = apparent(nRealLine) - nGhostAdjustment - -nRealLine for ghost lines is the NEXT HIGHER real line (for trailing ghost line, last real line + 1). -If nApparentLine is greater than the last valid apparent line, ASSERT - -ie, lines 0->0, 1->2, 2->4, -for argument of 3, return 2, and decToReal = 1 -*/ -int CGhostTextBuffer::ComputeRealLineAndGhostAdjustment(int nApparentLine, int& decToReal) const + * @brief Get a real line for apparent (screen) line. + * This function returns the real line for the given apparent (screen) line. + * For ghost lines we return next real line. For trailing ghost line we return + * last real line + 1). Ie, lines 0->0, 1->2, 2->4, for argument of 3, + * return 2. And decToReal would be 1. + * @param [in] nApparentLine Apparent line for which to get the real line. + * @param [out] decToReal Difference of the apparent and real line. + * @return The real line for the apparent line. + */ +int CGhostTextBuffer::ComputeRealLineAndGhostAdjustment(int nApparentLine, + int& decToReal) const { - int bmax = (int) m_RealityBlocks.GetUpperBound(); - // first get the degenerate cases out of the way - // empty file ? - if (bmax<0) + const int size = m_RealityBlocks.size(); + if (size == 0) { decToReal = 0; return 0; @@ -1045,7 +1047,7 @@ ASSERT(nApparentLine < GetLineCount()); // after last block ? - const RealityBlock & maxblock = m_RealityBlocks[bmax]; + const RealityBlock & maxblock = m_RealityBlocks.back(); if (nApparentLine >= maxblock.nStartApparent + maxblock.nCount) { decToReal = GetLineCount() - nApparentLine; @@ -1053,16 +1055,17 @@ } // binary search to find correct (or nearest block) - int blo=0, bhi=bmax; + int blo = 0; + int bhi = size - 1; int i; - while (blo<=bhi) + while (blo <= bhi) { - i = (blo+bhi)/2; + i = (blo + bhi) / 2; const RealityBlock & block = m_RealityBlocks[i]; if (nApparentLine < block.nStartApparent) - bhi = i-1; + bhi = i - 1; else if (nApparentLine >= block.nStartApparent + block.nCount) - blo = i+1; + blo = i + 1; else // found it inside this block { decToReal = 0; @@ -1075,43 +1078,42 @@ } /** -Return apparent line for this underlying real line, with adjustment : -nApparent = apparent(nReal) - decToReal - -If the previous real line has apparent number apparent(nReal) - dec, with dec < decToReal, -return apparent(nReal) - dec + 1 -*/ + * @brief Get an apparent (screen) line for the real line. + * @param [in] nRealLine Real line for which to get the apparent line. + * @param [out] decToReal Difference of the apparent and real line. + * @return The apparent line for the real line. If real line is out of bounds + * return last valid apparent line + 1. + */ int CGhostTextBuffer::ComputeApparentLine(int nRealLine, int decToReal) const { - int blo, bhi; int nPreviousBlock; int nApparent; - int bmax = (int) m_RealityBlocks.GetUpperBound(); - // first get the degenerate cases out of the way - // empty file ? - if (bmax<0) + + const int size = (int) m_RealityBlocks.size(); + if (size == 0) return 0; + // after last block ? - const RealityBlock & maxblock = m_RealityBlocks[bmax]; + const RealityBlock & maxblock = m_RealityBlocks.back(); if (nRealLine >= maxblock.nStartReal + maxblock.nCount) { - nPreviousBlock = bmax; + nPreviousBlock = size - 1; nApparent = GetLineCount(); goto limitWithPreviousBlock; } // binary search to find correct (or nearest block) - blo=0; - bhi=bmax; + int blo = 0; + int bhi = size - 1; int i; - while (blo<=bhi) + while (blo <= bhi) { - i = (blo+bhi)/2; + i = (blo + bhi) / 2; const RealityBlock & block = m_RealityBlocks[i]; if (nRealLine < block.nStartReal) - bhi = i-1; + bhi = i - 1; else if (nRealLine >= block.nStartReal + block.nCount) - blo = i+1; + blo = i + 1; else { if (nRealLine > block.nStartReal) @@ -1141,7 +1143,7 @@ { nApparent --; if (nApparent == lastApparentInPreviousBlock) - return nApparent+1; + return nApparent + 1; } return nApparent; } @@ -1156,16 +1158,16 @@ /** Recompute the reality mapping (this is fairly naive) */ void CGhostTextBuffer::RecomputeRealityMapping() { - m_RealityBlocks.RemoveAll(); - int reality=-1; // last encountered real line - int i=0; // current line + m_RealityBlocks.clear(); + int reality = -1; // last encountered real line + int i = 0; // current line RealityBlock block; // current block being traversed (in state 2) // This is a state machine with 2 states // state 1, i-1 not real line passingGhosts: - if (i==GetLineCount()) + if (i == GetLineCount()) return; if (GetLineFlags(i) & LF_GHOST) { @@ -1174,22 +1176,22 @@ } // this is the first line of a reality block block.nStartApparent = i; - block.nStartReal = reality+1; + block.nStartReal = reality + 1; ++reality; ++i; // fall through to other state - // state 2, i-1 is real line + // state 2, i - 1 is real line inReality: - if (i==GetLineCount() || (GetLineFlags(i) & LF_GHOST)) + if (i == GetLineCount() || (GetLineFlags(i) & LF_GHOST)) { // i-1 is the last line of a reality block ASSERT(reality >= 0); block.nCount = i - block.nStartApparent; ASSERT(block.nCount > 0); - ASSERT(reality+1-block.nStartReal == block.nCount); - m_RealityBlocks.Add(block); - if (i==GetLineCount()) + ASSERT(reality + 1 - block.nStartReal == block.nCount); + m_RealityBlocks.push_back(block); + if (i == GetLineCount()) return; ++i; goto passingGhosts; @@ -1261,10 +1263,9 @@ */ void CGhostTextBuffer::checkFlagsFromReality(BOOL bFlag) const { - int bmax = (int) m_RealityBlocks.GetUpperBound(); - int b; + const int size = m_RealityBlocks.size(); int i = 0; - for (b = 0 ; b <= bmax ; b ++) + for (int b = 0 ; b < size ; b ++) { const RealityBlock & block = m_RealityBlocks[b]; for ( ; i < block.nStartApparent ; i++) Modified: trunk/Src/GhostTextBuffer.h =================================================================== --- trunk/Src/GhostTextBuffer.h 2008-07-28 11:23:22 UTC (rev 5683) +++ trunk/Src/GhostTextBuffer.h 2008-07-28 12:30:02 UTC (rev 5684) @@ -9,6 +9,7 @@ #ifndef __GHOSTTEXTBUFFER_H__ #define __GHOSTTEXTBUFFER_H__ +#include <vector> #include "ccrystaltextbuffer.h" @@ -215,10 +216,19 @@ LPCTSTR pszText, int cchText, int nRealLinesChanged, int nActionType = CE_ACTION_UNKNOWN, CDWordArray *paSavedRevisonNumbers = NULL); private: - // A RealityBlock is a block of lines with no ghost lines - struct RealityBlock { int nStartReal; int nStartApparent; int nCount; }; - // The array of reality blocks is kept in order - CArray < RealityBlock, RealityBlock& > m_RealityBlocks; + /** + * @brief A struct mapping real lines and apparent (screen) lines. + * This struct maps lines between real lines and apparent (screen) lines. + * The mapping records for each text block an apparent line and matching + * real line. + */ + struct RealityBlock + { + int nStartReal; /**< Start line of real block. */ + int nStartApparent; /**< Start line of apparent block. */ + int nCount; /**< Lines in the block. */ + }; + std::vector<RealityBlock> m_RealityBlocks; /**< Mapping of real and apparent lines. */ // Operations private: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-28 19:16:00
|
Revision: 5689 http://winmerge.svn.sourceforge.net/winmerge/?rev=5689&view=rev Author: kimmov Date: 2008-07-28 19:15:57 +0000 (Mon, 28 Jul 2008) Log Message: ----------- Convert SyntaxColors list to use std::vector. Modified Paths: -------------- trunk/Src/SyntaxColors.cpp trunk/Src/SyntaxColors.h Modified: trunk/Src/SyntaxColors.cpp =================================================================== --- trunk/Src/SyntaxColors.cpp 2008-07-28 14:56:09 UTC (rev 5688) +++ trunk/Src/SyntaxColors.cpp 2008-07-28 19:15:57 UTC (rev 5689) @@ -7,10 +7,14 @@ // $Id$ #include "stdafx.h" +#include <vector> +#include "UnicodeString.h" #include "SyntaxColors.h" #include "OptionsDef.h" #include "OptionsMgr.h" +using namespace std; + /** @brief Setting name for default colors. */ static const TCHAR DefColorsPath[] =_T("DefaultSyntaxColors"); /** @brief Setting name for user-defined custom colors. */ @@ -22,8 +26,8 @@ SyntaxColors::SyntaxColors() : m_pOptionsMgr(NULL) { - m_colors.SetSize(COLORINDEX_COUNT); - m_bolds.SetSize(COLORINDEX_COUNT); + m_colors.reserve(COLORINDEX_COUNT); + m_bolds.reserve(COLORINDEX_COUNT); SetDefaults(); } @@ -34,10 +38,10 @@ SyntaxColors::SyntaxColors(const SyntaxColors *pColors) : m_pOptionsMgr(NULL) { - m_colors.SetSize(COLORINDEX_COUNT); - m_bolds.SetSize(COLORINDEX_COUNT); - m_colors.Copy(pColors->m_colors); - m_bolds.Copy(pColors->m_bolds); + m_colors.reserve(COLORINDEX_COUNT); + m_bolds.reserve(COLORINDEX_COUNT); + m_colors = pColors->m_colors; + m_bolds = pColors->m_bolds; } /** @@ -46,10 +50,10 @@ */ void SyntaxColors::Clone(const SyntaxColors *pColors) { - m_colors.SetSize(COLORINDEX_COUNT); - m_bolds.SetSize(COLORINDEX_COUNT); - m_colors.Copy(pColors->m_colors); - m_bolds.Copy(pColors->m_bolds); + m_colors.reserve(COLORINDEX_COUNT); + m_bolds.reserve(COLORINDEX_COUNT); + m_colors = pColors->m_colors; + m_bolds = pColors->m_bolds; } /** @@ -164,12 +168,12 @@ color = RGB (128, 0, 0); break; } - m_colors.SetAt(i, color); + m_colors[i] = color; BOOL bBold = FALSE; if (i == COLORINDEX_KEYWORD) bBold = TRUE; - m_bolds.SetAt(i, (int)bBold); + m_bolds[i] = bBold; } } @@ -180,7 +184,7 @@ */ void SyntaxColors::SetColor(UINT index, COLORREF color) { - m_colors.SetAt(index, color); + m_colors[index] = color; } /** @@ -190,7 +194,7 @@ */ void SyntaxColors::SetBold(UINT index, BOOL bold) { - m_bolds.SetAt(index, bold); + m_bolds[index] = bold; } /** @@ -200,13 +204,13 @@ void SyntaxColors::Initialize(COptionsMgr *pOptionsMgr) { ASSERT(pOptionsMgr); - CString valuename(DefColorsPath); + String valuename(DefColorsPath); m_pOptionsMgr = pOptionsMgr; int count = COLORINDEX_COUNT; valuename += _T("/Values"); - m_pOptionsMgr->InitOption(valuename, count); + m_pOptionsMgr->InitOption(valuename.c_str(), count); for (unsigned int i = COLORINDEX_NONE; i < COLORINDEX_LAST; i++) { @@ -216,8 +220,10 @@ // from storage we must set that value to array we use. int color = 0; COLORREF ref; - valuename.Format(_T("%s/Color%02u"), DefColorsPath, i); - color = m_colors.GetAt(i); + valuename.reserve(30); + _sntprintf(&*valuename.begin(), 30, _T("%s/Color%02u"), + DefColorsPath, i); + color = m_colors[i]; // Special handling for themable colors // These are text colors which by default follow the current system colors @@ -228,21 +234,22 @@ if (m_pOptionsMgr->GetBool(OPT_CLR_DEFAULT_TEXT_COLORING)) serializable = false; } - m_pOptionsMgr->InitOption(valuename, color, serializable); - color = m_pOptionsMgr->GetInt(valuename); + m_pOptionsMgr->InitOption(valuename.c_str(), color, serializable); + color = m_pOptionsMgr->GetInt(valuename.c_str()); ref = color; - m_colors.SetAt(i, ref); + m_colors[i] = ref; int nBold = 0; BOOL bBold = FALSE; - valuename.Format(_T("%s/Bold%02u"), DefColorsPath, i); - bBold = m_bolds.GetAt(i); - m_pOptionsMgr->InitOption(valuename, (int) bBold); - nBold = m_pOptionsMgr->GetInt(valuename); + valuename.reserve(30); + _sntprintf(&*valuename.begin(), 30, _T("%s/Bold%02u"), + DefColorsPath, i); + bBold = m_bolds[i]; + m_pOptionsMgr->InitOption(valuename.c_str(), (int) bBold); + nBold = m_pOptionsMgr->GetInt(valuename.c_str()); bBold = nBold ? TRUE : FALSE; - m_bolds.SetAt(i, bBold); + m_bolds[i] = bBold; } - } /** @@ -251,20 +258,24 @@ void SyntaxColors::SaveToRegistry() { ASSERT(m_pOptionsMgr); - CString valuename(DefColorsPath); + String valuename(DefColorsPath); int count = COLORINDEX_COUNT; valuename += _T("/Values"); - m_pOptionsMgr->SetInt(valuename, count); + m_pOptionsMgr->SetInt(valuename.c_str(), count); for (unsigned int i = COLORINDEX_NONE; i < COLORINDEX_LAST; i++) { - valuename.Format(_T("%s/Color%02u"), DefColorsPath, i); - int color = m_colors.GetAt(i); - m_pOptionsMgr->SetInt(valuename, color); - valuename.Format(_T("%s/Bold%02u"), DefColorsPath, i); - BOOL bold = m_bolds.GetAt(i); - m_pOptionsMgr->SetInt(valuename, bold); + valuename.reserve(30); + _sntprintf(&*valuename.begin(), 30, _T("%s/Color%02u"), + DefColorsPath, i); + int color = m_colors[i]; + m_pOptionsMgr->SetInt(valuename.c_str(), color); + valuename.reserve(30); + _sntprintf(&*valuename.begin(), 30, _T("%s/Bold%02u"), + DefColorsPath, i); + BOOL bold = m_bolds[i]; + m_pOptionsMgr->SetInt(valuename.c_str(), bold); } } Modified: trunk/Src/SyntaxColors.h =================================================================== --- trunk/Src/SyntaxColors.h 2008-07-28 14:56:09 UTC (rev 5688) +++ trunk/Src/SyntaxColors.h 2008-07-28 19:15:57 UTC (rev 5689) @@ -11,6 +11,7 @@ #include "stdafx.h" #include <Windows.h> +#include <vector> class COptionsMgr; @@ -54,9 +55,6 @@ const int COLORINDEX_COUNT = COLORINDEX_LAST - COLORINDEX_NONE; -typedef CArray<COLORREF, COLORREF&> ColorArray; -typedef CArray<BOOL, BOOL&> BoolArray; - /** * @brief Wrapper for Syntax coloring colors. * @@ -88,8 +86,8 @@ // Implementation data private: - ColorArray m_colors; /**< Syntax highlight colors */ - BoolArray m_bolds; /**< Bold font enable/disable */ + std::vector<COLORREF> m_colors; /**< Syntax highlight colors */ + std::vector<BOOL> m_bolds; /**< Bold font enable/disable */ COptionsMgr * m_pOptionsMgr; /**< Options-manager for storage */ }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-29 05:48:38
|
Revision: 5693 http://winmerge.svn.sourceforge.net/winmerge/?rev=5693&view=rev Author: kimmov Date: 2008-07-29 05:48:35 +0000 (Tue, 29 Jul 2008) Log Message: ----------- PATCH: [ 2030109 ] Read-only menu description mentions dir Modified Paths: -------------- trunk/Src/Languages/English.pot trunk/Src/Merge.rc Modified: trunk/Src/Languages/English.pot =================================================================== --- trunk/Src/Languages/English.pot 2008-07-29 05:40:01 UTC (rev 5692) +++ trunk/Src/Languages/English.pot 2008-07-29 05:48:35 UTC (rev 5693) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: WinMerge\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?group_id=13216&atid=113216\n" -"POT-Creation-Date: 2008-07-25 00:38+0000\n" +"POT-Creation-Date: 2008-07-29 08:44+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: English <win...@li...>\n" @@ -4945,12 +4945,12 @@ #: Merge.rc:2637 #, c-format -msgid "Change left file/dir read-only status" +msgid "Change left side file/folder read-only status" msgstr "" #: Merge.rc:2638 #, c-format -msgid "Change right file/dir read-only status" +msgid "Change right side file/folder read-only status" msgstr "" #: Merge.rc:2639 Modified: trunk/Src/Merge.rc =================================================================== --- trunk/Src/Merge.rc 2008-07-29 05:40:01 UTC (rev 5692) +++ trunk/Src/Merge.rc 2008-07-29 05:48:35 UTC (rev 5693) @@ -2634,8 +2634,8 @@ ID_FILE_SAVE_RIGHT "Save the right file" ID_FILE_SAVEAS_LEFT "Save the left file with name..." ID_FILE_SAVEAS_RIGHT "Save the right file with name..." - ID_FILE_LEFT_READONLY "Change left file/dir read-only status" - ID_FILE_RIGHT_READONLY "Change right file/dir read-only status" + ID_FILE_LEFT_READONLY "Change left side file/folder read-only status" + ID_FILE_RIGHT_READONLY "Change right side file/folder read-only status" ID_EOL_TO_DOS "Convert EOL to Windows mode" ID_EOL_TO_UNIX "Convert EOL to Unix mode" ID_EOL_TO_MAC "Convert EOL to Mac mode" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-29 11:11:53
|
Revision: 5696 http://winmerge.svn.sourceforge.net/winmerge/?rev=5696&view=rev Author: kimmov Date: 2008-07-29 11:11:45 +0000 (Tue, 29 Jul 2008) Log Message: ----------- Cleanups for CDiffTextBuffer. Remove unused function, fix coding style, add/fix doxygen commenting. Modified Paths: -------------- trunk/Src/DiffTextBuffer.cpp trunk/Src/DiffTextBuffer.h Modified: trunk/Src/DiffTextBuffer.cpp =================================================================== --- trunk/Src/DiffTextBuffer.cpp 2008-07-29 06:05:12 UTC (rev 5695) +++ trunk/Src/DiffTextBuffer.cpp 2008-07-29 11:11:45 UTC (rev 5696) @@ -136,59 +136,70 @@ if (stats.ncrlfs >= stats.nlfs) { if (stats.ncrlfs >= stats.ncrs) - { return CRLF_STYLE_DOS; - } else - { return CRLF_STYLE_MAC; - } } else { if (stats.nlfs >= stats.ncrs) - { return CRLF_STYLE_UNIX; - } else - { return CRLF_STYLE_MAC; - } } } +/** + * @brief Constructor. + * @param [in] pDoc Owning CMergeDoc. + * @param [in] pane Pane number this buffer is associated with. + */ CDiffTextBuffer::CDiffTextBuffer(CMergeDoc * pDoc, int pane) : m_pOwnerDoc(pDoc) , m_nThisPane(pane) -, unpackerSubcode(0) +, m_unpackerSubcode(0) { } +/** + * @brief Get a line from the buffer. + * @param [in] nLineIndex Index of the line to get. + * @param [out] strLine Returns line text in the index. + */ BOOL CDiffTextBuffer::GetLine(int nLineIndex, CString &strLine) -{ - int nLineLength = CCrystalTextBuffer::GetLineLength - ( nLineIndex ); - - if( nLineLength < 0 ) - return FALSE; - else if( nLineLength == 0 ) - strLine.Empty(); - else - { - _tcsncpy ( strLine.GetBuffer( nLineLength + 1 ), - CCrystalTextBuffer::GetLineChars( nLineIndex ), - nLineLength ); - strLine.ReleaseBuffer( nLineLength ); - } - return TRUE; +{ + int nLineLength = CCrystalTextBuffer::GetLineLength(nLineIndex); + if (nLineLength < 0) + return FALSE; + else if (nLineLength == 0) + strLine.Empty(); + else + { + _tcsncpy(strLine.GetBuffer(nLineLength + 1), + CCrystalTextBuffer::GetLineChars(nLineIndex), nLineLength); + strLine.ReleaseBuffer(nLineLength); + } + return TRUE; } +/** + * @brief Set the buffer modified status. + * @param [in] bModified New modified status, TRUE if buffer has been + * modified since last saving. + */ void CDiffTextBuffer::SetModified(BOOL bModified /*= TRUE*/) { CCrystalTextBuffer::SetModified (bModified); m_pOwnerDoc->SetModifiedFlag (bModified); } +/** + * @brief Get a line (with EOL bytes) from the buffer. + * This function is like GetLine() but it also includes line's EOL to the + * returned string. + * @param [in] nLineIndex Index of the line to get. + * @param [out] strLine Returns line text in the index. + */ BOOL CDiffTextBuffer::GetFullLine(int nLineIndex, CString &strLine) { int cchText = GetFullLineLength(nLineIndex); @@ -199,9 +210,13 @@ return TRUE; } -void CDiffTextBuffer::AddUndoRecord(BOOL bInsert, const CPoint & ptStartPos, const CPoint & ptEndPos, LPCTSTR pszText, int cchText, int nLinesToValidate, int nActionType /*= CE_ACTION_UNKNOWN*/, CDWordArray *paSavedRevisonNumbers) +void CDiffTextBuffer::AddUndoRecord(BOOL bInsert, const CPoint & ptStartPos, + const CPoint & ptEndPos, LPCTSTR pszText, int cchText, + int nLinesToValidate, int nActionType /*= CE_ACTION_UNKNOWN*/, + CDWordArray *paSavedRevisonNumbers) { - CGhostTextBuffer::AddUndoRecord(bInsert, ptStartPos, ptEndPos, pszText, cchText, nLinesToValidate, nActionType, paSavedRevisonNumbers); + CGhostTextBuffer::AddUndoRecord(bInsert, ptStartPos, ptEndPos, pszText, + cchText, nLinesToValidate, nActionType, paSavedRevisonNumbers); if (m_aUndoBuf[m_nUndoPosition - 1].m_dwFlags & UNDO_BEGINGROUP) { m_pOwnerDoc->undoTgt.erase(m_pOwnerDoc->curUndo, m_pOwnerDoc->undoTgt.end()); @@ -220,7 +235,6 @@ return ((m_aLines[line].m_dwFlags & flag) == flag); } - /** Remove blank lines and clear winmerge flags (2003-06-21, Perry: I don't understand why this is necessary, but if this isn't @@ -231,7 +245,7 @@ void CDiffTextBuffer::prepareForRescan() { RemoveAllGhostLines(); - for(int ct=GetLineCount()-1; ct>=0; --ct) + for (int ct = GetLineCount() - 1; ct >= 0; --ct) { SetLineFlag(ct, LF_DIFF, FALSE, FALSE, FALSE); SetLineFlag(ct, LF_TRIVIAL, FALSE, FALSE, FALSE); @@ -239,6 +253,13 @@ } } +/** + * @brief Called when line has been edited. + * After editing a line, we don't know if there is a diff or not. + * So we clear the LF_DIFF flag (and it is more easy to read during edition). + * Rescan will set the proper color. + * @param [in] nLine Line that has been edited. + */ void CDiffTextBuffer::OnNotifyLineHasBeenEdited(int nLine) { @@ -249,63 +270,18 @@ } /** - * @brief Helper to determine the most used CRLF mode in the file - * Normal call : determine the CRLF mode of the current line - * Final call : parameter lpLineBegin = NULL, return the style of the file - * - * @note The lowest CRL_STYLE has the priority in case of equality + * @brief Set the folder for temp files. + * @param [in] path Temp files folder. */ -int CDiffTextBuffer::NoteCRLFStyleFromBuffer(TCHAR *lpLineBegin, DWORD dwLineLen /* =0 */) +void CDiffTextBuffer::SetTempPath(const String &path) { - static int count[3] = {0}; - int iStyle = -1; - - // give back the result when we ask for it - if (lpLineBegin == NULL) - { - iStyle = 0; - if (count[1] > count[iStyle]) - iStyle = 1; - if (count[2] > count[iStyle]) - iStyle = 2; - - // reset the counter for the next file - count[0] = count[1] = count[2] = 0; - - return iStyle; - } - - if (dwLineLen >= 1) - { - if (lpLineBegin[dwLineLen-1] == _T('\r')) - iStyle = CRLF_STYLE_MAC; - if (lpLineBegin[dwLineLen-1] == _T('\n')) - iStyle = CRLF_STYLE_UNIX; - } - if (dwLineLen >= 2) - { - if (lpLineBegin[dwLineLen-2] == _T('\r') && lpLineBegin[dwLineLen-1] == _T('\n')) - iStyle = CRLF_STYLE_DOS; - } - ASSERT (iStyle != -1); - count[iStyle] ++; - return iStyle; -} - -/// Reads one line from filebuffer and inserts to textbuffer -void CDiffTextBuffer::ReadLineFromBuffer(TCHAR *lpLineBegin, DWORD dwLineNum, DWORD dwLineLen /* =0 */) -{ - if (m_nSourceEncoding >= 0) - iconvert (lpLineBegin, m_nSourceEncoding, 1, m_nSourceEncoding == 15); - AppendLine(dwLineNum, lpLineBegin, dwLineLen); -} - -/// Sets path for temporary files -void CDiffTextBuffer::SetTempPath(String path) -{ m_strTempPath = path; } +/** + * @brief Is the buffer initialized? + * @return TRUE if the buffer is initialized, FALSE otherwise. + */ bool CDiffTextBuffer::IsInitialized() const { return !!m_bInit; @@ -336,10 +312,11 @@ ASSERT(m_aLines.GetSize() == 0); // Unpacking the file here, save the result in a temporary file - String sFileName = pszFileNameInit; + String sFileName(pszFileNameInit); if (infoUnpacker->bToBeScanned) { - if (!FileTransform_Unpacking(sFileName, sToFindUnpacker, infoUnpacker, &unpackerSubcode)) + if (!FileTransform_Unpacking(sFileName, sToFindUnpacker, infoUnpacker, + &m_unpackerSubcode)) { InitNew(); // leave crystal editor in valid, empty state return FileLoadResult::FRESULT_ERROR_UNPACK; @@ -347,7 +324,7 @@ } else { - if (!FileTransform_Unpacking(sFileName, infoUnpacker, &unpackerSubcode)) + if (!FileTransform_Unpacking(sFileName, infoUnpacker, &m_unpackerSubcode)) { InitNew(); // leave crystal editor in valid, empty state return FileLoadResult::FRESULT_ERROR_UNPACK; @@ -642,7 +619,6 @@ } file.Close(); - if (!bTempFile) { // If we are saving user files @@ -650,7 +626,7 @@ ASSERT(infoUnpacker != NULL); // repack the file here, overwrite the temporary file we did save in String csTempFileName = sIntermediateFilename; - infoUnpacker->subcode = unpackerSubcode; + infoUnpacker->subcode = m_unpackerSubcode; if (!FileTransform_Packing(csTempFileName, *infoUnpacker)) { if (!::DeleteFile(sIntermediateFilename.c_str())) @@ -716,8 +692,18 @@ return SAVE_FAILED; } -/// Replace text of line (no change to eol) -void CDiffTextBuffer::ReplaceLine(CCrystalTextView * pSource, int nLine, LPCTSTR pchText, int cchText, int nAction /*=CE_ACTION_UNKNOWN*/) +/** + * @brief Replace a line with new text. + * This function replaces line's text without changing the EOL style/bytes + * of the line. + * @param [in] pSource Editor view where text is changed. + * @param [in] nLine Index of the line to change. + * @param [in] pchText New text of the line. + * @param [in] cchText New length of the line (not inc. EOL bytes). + * @param [in] nAction Edit action to use. + */ +void CDiffTextBuffer::ReplaceLine(CCrystalTextView * pSource, int nLine, + LPCTSTR pchText, int cchText, int nAction /*=CE_ACTION_UNKNOWN*/) { if (GetLineLength(nLine)>0) DeleteText(pSource, nLine, 0, nLine, GetLineLength(nLine), nAction); @@ -727,6 +713,16 @@ } /// Replace line (removing any eol, and only including one if in strText) +/** + * @brief Replace a line with new text. + * This function replaces line's text including EOL bytes. If the @p strText + * does not include EOL bytes, the "line" does not get EOL bytes. + * @param [in] pSource Editor view where text is changed. + * @param [in] nLine Index of the line to change. + * @param [in] pchText New text of the line. + * @param [in] cchText New length of the line (not inc. EOL bytes). + * @param [in] nAction Edit action to use. + */ void CDiffTextBuffer::ReplaceFullLine(CCrystalTextView * pSource, int nLine, const CString &strText, int nAction /*=CE_ACTION_UNKNOWN*/) { @@ -741,17 +737,18 @@ } // we may need a last line as the DeleteText end is (x=0,y=line+1) - if (nLine+1 == GetLineCount()) + if (nLine + 1 == GetLineCount()) InsertGhostLine (pSource, GetLineCount()); if (GetFullLineLength(nLine)) - DeleteText(pSource, nLine, 0, nLine+1, 0, nAction); - int endl,endc; - if (int cchText = strText.GetLength()) - InsertText(pSource, nLine, 0, strText, cchText, endl,endc, nAction); + DeleteText(pSource, nLine, 0, nLine + 1, 0, nAction); + int endl, endc; + const int cchText = strText.GetLength(); + if (cchText) + InsertText(pSource, nLine, 0, strText, cchText, endl, endc, nAction); } bool CDiffTextBuffer::curUndoGroup() { - return (m_aUndoBuf.GetSize()!=0 && m_aUndoBuf[0].m_dwFlags&UNDO_BEGINGROUP); + return (m_aUndoBuf.GetSize() != 0 && m_aUndoBuf[0].m_dwFlags&UNDO_BEGINGROUP); } Modified: trunk/Src/DiffTextBuffer.h =================================================================== --- trunk/Src/DiffTextBuffer.h 2008-07-29 06:05:12 UTC (rev 5695) +++ trunk/Src/DiffTextBuffer.h 2008-07-29 11:11:45 UTC (rev 5696) @@ -25,30 +25,35 @@ private : CMergeDoc * m_pOwnerDoc; /**< Merge document owning this buffer. */ int m_nThisPane; /**< Left/Right side */ - BOOL FlagIsSet(UINT line, DWORD flag); String m_strTempPath; /**< Temporary files folder. */ - int unpackerSubcode; - /* - * @brief Unicode encoding from ucr::UNICODESET - * - * @note m_unicoding and m_codepage are indications of how the buffer is supposed to be saved on disk - * In memory, it is invariant, depending on build: - * ANSI: - * in memory it is CP_ACP/CP_THREAD_ACP 8-bit characters - * Unicode: - * in memory it is wchars - */ - FileTextEncoding m_encoding; /**< File's encoding information. */ + int m_unpackerSubcode; /**< Plugin information. */ - int NoteCRLFStyleFromBuffer(TCHAR *lpLineBegin, DWORD dwLineLen = 0); - void ReadLineFromBuffer(TCHAR *lpLineBegin, DWORD dwLineNum, DWORD dwLineLen = 0); + /** + * @brief Unicode encoding from ucr::UNICODESET. + * + * @note m_unicoding and m_codepage are indications of how the buffer is + * supposed to be saved on disk. In memory, it is invariant, depending on + * build: + * - ANSI: in memory it is CP_ACP/CP_THREAD_ACP 8-bit characters + * - Unicode: in memory it is wchars + */ + FileTextEncoding m_encoding; + + BOOL FlagIsSet(UINT line, DWORD flag); + public : - void SetTempPath(String path); - virtual void AddUndoRecord (BOOL bInsert, const CPoint & ptStartPos, const CPoint & ptEndPos, - LPCTSTR pszText, int cchText, int nLinesToValidate, int nActionType = CE_ACTION_UNKNOWN, CDWordArray *paSavedRevisonNumbers = NULL); + CDiffTextBuffer(CMergeDoc * pDoc, int pane); + + void SetTempPath(const String &path); + virtual void AddUndoRecord (BOOL bInsert, const CPoint & ptStartPos, + const CPoint & ptEndPos, LPCTSTR pszText, int cchText, + int nLinesToValidate, int nActionType = CE_ACTION_UNKNOWN, + CDWordArray *paSavedRevisonNumbers = NULL); bool curUndoGroup(); - void ReplaceLine(CCrystalTextView * pSource, int nLine, LPCTSTR pchText, int cchText, int nAction =CE_ACTION_UNKNOWN); - void ReplaceFullLine(CCrystalTextView * pSource, int nLine, const CString& strText, int nAction =CE_ACTION_UNKNOWN); + void ReplaceLine(CCrystalTextView * pSource, int nLine, LPCTSTR pchText, + int cchText, int nAction =CE_ACTION_UNKNOWN); + void ReplaceFullLine(CCrystalTextView * pSource, int nLine, + const CString& strText, int nAction = CE_ACTION_UNKNOWN); int LoadFromFile(LPCTSTR pszFileName, PackingInfo * infoUnpacker, LPCTSTR filteredFilenames, BOOL & readOnly, CRLFSTYLE nCrlfStyle, @@ -62,8 +67,6 @@ void setCodepage(int value) { m_encoding.m_codepage = value; } const FileTextEncoding & getEncoding() const { return m_encoding; } - CDiffTextBuffer(CMergeDoc * pDoc, int pane); - // If line has text (excluding eol), set strLine to text (excluding eol) BOOL GetLine(int nLineIndex, CString &strLine); @@ -71,16 +74,8 @@ BOOL GetFullLine(int nLineIndex, CString &strLine); virtual void SetModified (BOOL bModified = TRUE); - void prepareForRescan(); - - /** - After editing a line, we don't know if there is a diff or not. - So we clear the LF_DIFF flag (and it is more easy to read during edition). - Rescan will set the proper color - */ virtual void OnNotifyLineHasBeenEdited(int nLine); - bool IsInitialized() const; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-30 08:54:27
|
Revision: 5700 http://winmerge.svn.sourceforge.net/winmerge/?rev=5700&view=rev Author: kimmov Date: 2008-07-30 08:54:24 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Use std::vector instead of CList for DiffBlocks. Modified Paths: -------------- trunk/Src/LocationView.cpp trunk/Src/LocationView.h Modified: trunk/Src/LocationView.cpp =================================================================== --- trunk/Src/LocationView.cpp 2008-07-29 13:34:59 UTC (rev 5699) +++ trunk/Src/LocationView.cpp 2008-07-30 08:54:24 UTC (rev 5700) @@ -30,6 +30,7 @@ // $Id$ #include "stdafx.h" +#include <vector> #include "merge.h" #include "OptionsMgr.h" #include "MergeEditView.h" @@ -47,6 +48,8 @@ static char THIS_FILE[] = __FILE__; #endif +using namespace std; + /** @brief Size of empty frame above and below bars (in pixels). */ static const int Y_OFFSET = 5; /** @brief Size of y-margin for visible area indicator (in pixels). */ @@ -229,7 +232,7 @@ */ void CLocationView::CalculateBlocks() { - m_diffBlocks.RemoveAll(); + m_diffBlocks.clear(); CMergeDoc *pDoc = GetDocument(); const int nDiffs = pDoc->m_diffList.GetSize(); @@ -260,7 +263,7 @@ block.top_coord = nBeginY; block.bottom_coord = nEndY; block.diff_index = nDiff; - m_diffBlocks.AddTail(block); + m_diffBlocks.push_back(block); nDiff = pDoc->m_diffList.NextSignificantDiff(nDiff); } @@ -318,27 +321,25 @@ int nPrevEndY = -1; const int nCurDiff = pDoc->GetCurrentDiff(); - POSITION pos = m_diffBlocks.GetHeadPosition(); - - while (pos) + vector<DiffBlock>::const_iterator iter = m_diffBlocks.begin(); + while (iter != m_diffBlocks.end()) { - const DiffBlock &block = m_diffBlocks.GetNext(pos); CMergeEditView *pView = m_view[MERGE_VIEW_LEFT]; - const BOOL bInsideDiff = (nCurDiff == block.diff_index); + const BOOL bInsideDiff = (nCurDiff == (*iter).diff_index); - if ((nPrevEndY != block.bottom_coord) || bInsideDiff) + if ((nPrevEndY != (*iter).bottom_coord) || bInsideDiff) { // Draw left side block - m_view[MERGE_VIEW_LEFT]->GetLineColors2(block.top_line, 0, cr0, crt, bwh); - CRect r0(m_leftBar.left, block.top_coord, m_leftBar.right, block.bottom_coord); + m_view[MERGE_VIEW_LEFT]->GetLineColors2((*iter).top_line, 0, cr0, crt, bwh); + CRect r0(m_leftBar.left, (*iter).top_coord, m_leftBar.right, (*iter).bottom_coord); DrawRect(&dc, r0, cr0, bInsideDiff); // Draw right side block - m_view[MERGE_VIEW_RIGHT]->GetLineColors2(block.top_line, 0, cr1, crt, bwh); - CRect r1(m_rightBar.left, block.top_coord, m_rightBar.right, block.bottom_coord); + m_view[MERGE_VIEW_RIGHT]->GetLineColors2((*iter).top_line, 0, cr1, crt, bwh); + CRect r1(m_rightBar.left, (*iter).top_coord, m_rightBar.right, (*iter).bottom_coord); DrawRect(&dc, r1, cr1, bInsideDiff); } - nPrevEndY = block.bottom_coord; + nPrevEndY = (*iter).bottom_coord; // Test if we draw a connector BOOL bDisplayConnectorFromLeft = FALSE; @@ -364,9 +365,9 @@ if (bDisplayConnectorFromLeft) { - int apparent0 = block.top_line; + int apparent0 = (*iter).top_line; int apparent1 = pDoc->RightLineInMovedBlock(apparent0); - const int nBlockHeight = block.bottom_line - block.top_line; + const int nBlockHeight = (*iter).bottom_line - (*iter).top_line; if (apparent1 != -1) { MovedLine line; @@ -392,9 +393,9 @@ if (bDisplayConnectorFromRight) { - int apparent1 = block.top_line; + int apparent1 = (*iter).top_line; int apparent0 = pDoc->LeftLineInMovedBlock(apparent1); - const int nBlockHeight = block.bottom_line - block.top_line; + const int nBlockHeight = (*iter).bottom_line - (*iter).top_line; if (apparent0 != -1) { MovedLine line; @@ -417,6 +418,7 @@ m_movedLines.AddTail(line); } } + ++iter; } if (m_displayMovedBlocks != DISPLAY_MOVED_NONE) Modified: trunk/Src/LocationView.h =================================================================== --- trunk/Src/LocationView.h 2008-07-29 13:34:59 UTC (rev 5699) +++ trunk/Src/LocationView.h 2008-07-30 08:54:24 UTC (rev 5700) @@ -13,6 +13,7 @@ #ifndef __LOCATIONVIEW_H__ #define __LOCATIONVIEW_H__ +#include <vector> /** * @brief Status for display moved block @@ -50,9 +51,6 @@ unsigned diff_index; /**< Index of difference in the original diff list. */ }; -typedef CList<DiffBlock, DiffBlock&> DIFFBLOCK_LIST; - - /** * @brief Class showing map of files. * The location is a view showing two vertical bars. Each bar depicts one file @@ -109,7 +107,7 @@ HWND m_hwndFrame; //*< Frame window handle */ CBitmap *m_pSavedBackgroundBitmap; //*< Saved background */ bool m_bDrawn; //*< Is already drawn in location pane? */ - DIFFBLOCK_LIST m_diffBlocks; //*< List of pre-calculated diff blocks. + std::vector<DiffBlock> m_diffBlocks; //*< List of pre-calculated diff blocks. BOOL m_bRecalculateBlocks; //*< Recalculate diff blocks in next repaint. CSize m_currentSize; //*< Current size of the panel. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-30 12:09:32
|
Revision: 5703 http://winmerge.svn.sourceforge.net/winmerge/?rev=5703&view=rev Author: kimmov Date: 2008-07-30 12:09:30 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Remove unused (only usage was in unused code) sbuffer class. Modified Paths: -------------- trunk/Src/Common/UniFile.cpp trunk/Src/Common/UniFile.h trunk/Src/Merge.vcproj Removed Paths: ------------- trunk/Src/Common/sbuffer.h Modified: trunk/Src/Common/UniFile.cpp =================================================================== --- trunk/Src/Common/UniFile.cpp 2008-07-30 11:13:18 UTC (rev 5702) +++ trunk/Src/Common/UniFile.cpp 2008-07-30 12:09:30 UTC (rev 5703) @@ -923,16 +923,6 @@ ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! return FALSE; } -BOOL UniStdioFile::ReadString(sbuffer & sline, bool * lossy) -{ - ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! - return FALSE; -} -BOOL UniStdioFile::ReadString(sbuffer & sline, String & eol, bool * lossy) -{ - ASSERT(0); // unimplemented -- currently cannot read from a UniStdioFile! - return FALSE; -} /** @brief Write BOM (byte order mark) if Unicode file */ int UniStdioFile::WriteBom() Modified: trunk/Src/Common/UniFile.h =================================================================== --- trunk/Src/Common/UniFile.h 2008-07-30 11:13:18 UTC (rev 5702) +++ trunk/Src/Common/UniFile.h 2008-07-30 12:09:30 UTC (rev 5703) @@ -12,7 +12,6 @@ #ifndef UniFile_h_included #define UniFile_h_included -#include "sbuffer.h" #include "unicoder.h" /** @@ -191,10 +190,8 @@ protected: virtual BOOL ReadString(String & line, bool * lossy); virtual BOOL ReadString(String & line, String & eol, bool * lossy); -public: - virtual BOOL ReadString(sbuffer & line, bool * lossy); - virtual BOOL ReadString(sbuffer & line, String & eol, bool * lossy); +public: virtual __int64 GetPosition() const; virtual int WriteBom(); Deleted: trunk/Src/Common/sbuffer.h =================================================================== --- trunk/Src/Common/sbuffer.h 2008-07-30 11:13:18 UTC (rev 5702) +++ trunk/Src/Common/sbuffer.h 2008-07-30 12:09:30 UTC (rev 5703) @@ -1,88 +0,0 @@ -/** - * @file sbuffer.h - * - * @brief Declaration file for sbuffer class - * - * @date Created: 2003-10-09 (Perry Rapp) - */ -// RCS ID line follows -- this is updated by CVS -// $Id$ - -#ifndef sbuffer_h_included -#define sbuffer_h_included - - -/** - * @brief Primitive string that grows with exponential allocation - */ -class sbuffer -{ -public: - sbuffer(UINT init) - { - m_size = init; - m_buff = new TCHAR[m_size]; - m_len = 0; - } - ~sbuffer() - { - delete m_buff; - m_buff = 0; - } - void Append(LPCTSTR sz) - { - CString str = sz; - Append(str); - } - void Append(const CString & s) - { - if (s.GetLength() + m_len > m_size-1) - { - do - { - m_size = m_size * 2; - } - while (s.GetLength() + m_len > m_size-1); - TCHAR * newbuff = new TCHAR[m_size]; - _tcscpy(newbuff, m_buff); - delete[] m_buff; - m_buff = newbuff; - } - _tcscpy(&m_buff[m_len], s); - m_len += s.GetLength(); - } - void Clear() { m_buff[0] = 0; m_len = 0; } - void Set(LPCTSTR sztext) - { - Clear(); - Append(sztext); - } - BOOL StartsWithInsensitive(const CString & prefix) - { - return (0 == _tcsnicmp(GetData(), prefix, prefix.GetLength())); - } - CString Left(int len) - { - CString s; - LPTSTR sz = s.GetBuffer(len+1); - _tcsncpy(sz, GetData(), len); - sz[len] = 0; - s.ReleaseBuffer(); - return s; - } - // get data length - int GetLength() const { return m_len; } - - // TRUE if zero length - BOOL IsEmpty() const { return m_len==0; } - - LPCTSTR GetData() const { return m_buff; } - -// Implementation data -private: - TCHAR * m_buff; - UINT m_len; - UINT m_size; -}; - -#endif // sbuffer_h_included Modified: trunk/Src/Merge.vcproj =================================================================== --- trunk/Src/Merge.vcproj 2008-07-30 11:13:18 UTC (rev 5702) +++ trunk/Src/Merge.vcproj 2008-07-30 12:09:30 UTC (rev 5703) @@ -6392,9 +6392,6 @@ RelativePath="SaveClosingDlg.h"> </File> <File - RelativePath="Common\sbuffer.h"> - </File> - <File RelativePath="Common\scbarcf.h"> </File> <File This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-30 19:07:37
|
Revision: 5705 http://winmerge.svn.sourceforge.net/winmerge/?rev=5705&view=rev Author: kimmov Date: 2008-07-30 19:07:33 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Use std::vector for DiffList. Optimize memory allocations. Modified Paths: -------------- trunk/Src/DiffList.cpp trunk/Src/DiffList.h Modified: trunk/Src/DiffList.cpp =================================================================== --- trunk/Src/DiffList.cpp 2008-07-30 12:44:04 UTC (rev 5704) +++ trunk/Src/DiffList.cpp 2008-07-30 19:07:33 UTC (rev 5705) @@ -19,7 +19,7 @@ * * @brief Implementation file for DiffList class */ -// RCS ID line follows -- this is updated by CVS +// ID line follows -- this is updated by SVN // $Id$ #include "stdafx.h" @@ -27,14 +27,55 @@ #include "DiffWrapper.h" #include "coretools.h" +using namespace std; + +static void swap(int &a, int &b); +static void swap(UINT &a, UINT &b); + /** + * @brief Swap two integers. + * @param [in] a First integer. + * @param [in] b Second integer. + */ +static void swap(int &a, int &b) +{ + int tmp = a; + a = b; + b = tmp; +} + +/** + * @brief Swap two UINTs. + * @param [in] a First UINT. + * @param [in] b Second UINT. + */ +static void swap(UINT &a, UINT &b) +{ + UINT tmp = a; + a = b; + b = tmp; +} + +/** + * @brief Swap diff sides. + */ +void DIFFRANGE::swap_sides() +{ + swap(begin0, begin1); + swap(end0, end1); + swap(dbegin0, dbegin1); + swap(dend0, dend1); + swap(blank0, blank1); +} + +/** * @brief Default constructor, initialises difflist to 64 items. */ DiffList::DiffList() : m_firstSignificant(-1) , m_lastSignificant(-1) { - m_diffs.SetSize(64); + m_diffs.reserve(64); // Reserve some initial space to avoid allocations. } /** @@ -42,7 +83,7 @@ */ void DiffList::Clear() { - m_diffs.RemoveAll(); + m_diffs.clear(); m_firstSignificant = -1; m_lastSignificant = -1; } @@ -55,7 +96,7 @@ */ int DiffList::GetSize() const { - return (int) m_diffs.GetSize(); + return m_diffs.size(); } /** @@ -67,7 +108,7 @@ int DiffList::GetSignificantDiffs() const { int nSignificants = 0; - const int nDiffCount = (int) m_diffs.GetSize(); + const int nDiffCount = m_diffs.size(); for (int i = 0; i < nDiffCount; i++) { @@ -88,7 +129,11 @@ void DiffList::AddDiff(const DIFFRANGE & di) { DiffRangeInfo dri(di); - m_diffs.Add(dri); + + // Allocate memory for new items exponentially + if (m_diffs.size() == m_diffs.capacity()) + m_diffs.reserve(m_diffs.size() * 2); + m_diffs.push_back(dri); } /** @@ -132,10 +177,9 @@ */ const DIFFRANGE * DiffList::DiffRangeAt(int nDiff) const { - if (nDiff>=0 && nDiff < m_diffs.GetSize()) + if (nDiff >= 0 && nDiff < m_diffs.size()) { - DiffList * pThis = const_cast<DiffList *>(this); - return &pThis->m_diffs.ElementAt(nDiff).diffrange; + return &m_diffs[nDiff].diffrange; } else { @@ -152,7 +196,7 @@ */ BOOL DiffList::SetDiff(int nDiff, const DIFFRANGE & di) { - if (nDiff < m_diffs.GetSize()) + if (nDiff < m_diffs.size()) { m_diffs[nDiff] = di; return TRUE; @@ -201,7 +245,7 @@ */ int DiffList::LineToDiff(UINT nLine) const { - const int nDiffCount = (int) m_diffs.GetSize(); + const int nDiffCount = m_diffs.size(); if (nDiffCount == 0) return -1; @@ -255,7 +299,7 @@ if (nDiff == -1) { bInDiff = FALSE; - for (int i = (int) m_diffs.GetSize() - 1; i >= 0 ; i--) + for (int i = (int) m_diffs.size() - 1; i >= 0 ; i--) { if ((int)DiffRangeAt(i)->dend0 <= nLine) { @@ -286,7 +330,7 @@ if (numDiff == -1) { bInDiff = FALSE; - const int nDiffCount = (int) m_diffs.GetSize(); + const int nDiffCount = m_diffs.size(); for (int i = 0; i < nDiffCount; i++) { if ((int)DiffRangeAt(i)->dbegin0 >= nLine) @@ -320,7 +364,7 @@ { int nDiff = -1; - for (int i = (int) m_diffs.GetSize() - 1; i >= 0 ; i--) + for (int i = m_diffs.size() - 1; i >= 0 ; i--) { const DIFFRANGE * dfi = DiffRangeAt(i); if (dfi->op != OP_TRIVIAL && dfi->dend0 <= nLine) @@ -340,7 +384,7 @@ int DiffList::NextSignificantDiffFromLine(UINT nLine) const { int nDiff = -1; - const int nDiffCount = (int) m_diffs.GetSize(); + const int nDiffCount = m_diffs.size(); for (int i = 0; i < nDiffCount; i++) { @@ -363,7 +407,7 @@ m_lastSignificant = -1; int prev = -1; // must be called after diff list is entirely populated - for (int i = 0; i < m_diffs.GetSize(); ++i) + for (int i = 0; i < m_diffs.size(); ++i) { if (m_diffs[i].diffrange.op == OP_TRIVIAL) { @@ -442,17 +486,15 @@ } /** - * @brief Swap members of diffrange + * @brief Swap sides in diffrange. */ void DiffList::Swap() { - for (int i = 0; i < m_diffs.GetSize(); ++i) + vector<DiffRangeInfo>::iterator iter = m_diffs.begin(); + while (iter != m_diffs.end()) { - swap<UINT>(&m_diffs[i].diffrange.begin0, &m_diffs[i].diffrange.begin1); - swap<UINT>(&m_diffs[i].diffrange.end0, &m_diffs[i].diffrange.end1); - swap<UINT>(&m_diffs[i].diffrange.dbegin0, &m_diffs[i].diffrange.dbegin1); - swap<UINT>(&m_diffs[i].diffrange.dend0, &m_diffs[i].diffrange.dend1); - swap<int>(&m_diffs[i].diffrange.blank0, &m_diffs[i].diffrange.blank1); + (*iter).diffrange.swap_sides(); + ++iter; } } Modified: trunk/Src/DiffList.h =================================================================== --- trunk/Src/DiffList.h 2008-07-30 12:44:04 UTC (rev 5704) +++ trunk/Src/DiffList.h 2008-07-30 19:07:33 UTC (rev 5705) @@ -19,12 +19,14 @@ * * @brief Declaration file for DiffList class */ -// RCS ID line follows -- this is updated by CVS +// ID line follows -- this is updated by SVN // $Id$ #ifndef _DIFFLIST_H_ #define _DIFFLIST_H_ +#include <vector> + /** * @brief One difference defined by linenumbers. * @@ -50,6 +52,7 @@ int blank1; /**< Number of blank lines in file2 */ BYTE op; /**< Operation done with this diff */ DIFFRANGE() { memset(this, 0, sizeof(*this)); } + void swap_sides(); }; /** @@ -158,7 +161,7 @@ void GetExtraLinesCounts(int &nLeftLines, int &nRightLines); private: - CArray<DiffRangeInfo,DiffRangeInfo> m_diffs; /**< Difference list */ + std::vector<DiffRangeInfo> m_diffs; /**< Difference list. */ int m_firstSignificant; /**< Index of first significant diff in m_diffs */ int m_lastSignificant; /**< Index of last significant diff in m_diffs */ }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sdo...@us...> - 2008-07-30 19:23:17
|
Revision: 5706 http://winmerge.svn.sourceforge.net/winmerge/?rev=5706&view=rev Author: sdottaka Date: 2008-07-30 19:23:10 +0000 (Wed, 30 Jul 2008) Log Message: ----------- PATCH: [ 2018836 ] RFE:987590 hierarchical directory comparison result view (2) - Expand/Collapse folder item by double-clicking or enter key pressing. - Disable Compare-menu item when tree-mode is on and folder is selected - When expanding folder item, inserted items are sorted now. - When Tree-mode is on and non-recursive compare is selected, the space of list item state icon is removed. Modified Paths: -------------- trunk/Src/DirActions.cpp trunk/Src/DirDoc.h trunk/Src/DirView.cpp Modified: trunk/Src/DirActions.cpp =================================================================== --- trunk/Src/DirActions.cpp 2008-07-30 19:07:33 UTC (rev 5705) +++ trunk/Src/DirActions.cpp 2008-07-30 19:23:10 UTC (rev 5706) @@ -1153,11 +1153,22 @@ */ BOOL CDirView::IsItemOpenable(const DIFFITEM & di) const { - if (!di.diffcode.isDirectory() && - (di.diffcode.isSideRightOnly() || di.diffcode.isSideLeftOnly())) + if (m_bTreeMode && GetDocument()->GetRecursive()) { - return FALSE; + if (di.diffcode.isDirectory() || + (di.diffcode.isSideRightOnly() || di.diffcode.isSideLeftOnly())) + { + return FALSE; + } } + else + { + if (!di.diffcode.isDirectory() && + (di.diffcode.isSideRightOnly() || di.diffcode.isSideLeftOnly())) + { + return FALSE; + } + } return TRUE; } /// is it possible to compare these two items? Modified: trunk/Src/DirDoc.h =================================================================== --- trunk/Src/DirDoc.h 2008-07-30 19:07:33 UTC (rev 5705) +++ trunk/Src/DirDoc.h 2008-07-30 19:23:10 UTC (rev 5706) @@ -84,7 +84,7 @@ public: void InitCompare(const PathContext & paths, BOOL bRecursive, CTempPathContext *); void Rescan(); - BOOL GetRecursive() { return m_bRecursive; } + BOOL GetRecursive() const { return m_bRecursive; } BOOL GetReadOnly(BOOL bLeft) const; void SetReadOnly(BOOL bLeft, BOOL bReadOnly); BOOL HasDirView() { return m_pDirView != NULL; } Modified: trunk/Src/DirView.cpp =================================================================== --- trunk/Src/DirView.cpp 2008-07-30 19:07:33 UTC (rev 5705) +++ trunk/Src/DirView.cpp 2008-07-30 19:23:10 UTC (rev 5706) @@ -378,10 +378,21 @@ LVHITTESTINFO lvhti; lvhti.pt = point; m_pList->SubItemHitTest(&lvhti); - if (lvhti.flags != LVHT_ONITEMSTATEICON) + if (lvhti.iItem >= 0) { - WaitStatusCursor waitstatus(IDS_STATUS_OPENING_SELECTION); - OpenSelection(); + const DIFFITEM& di = GetDiffItem(lvhti.iItem); + if (m_bTreeMode && GetDocument()->GetRecursive() && di.diffcode.isDirectory()) + { + if (di.customFlags1 & ViewCustomFlags::COLLAPSED) + ExpandSubdir(lvhti.iItem); + else + CollapseSubdir(lvhti.iItem); + } + else + { + WaitStatusCursor waitstatus(IDS_STATUS_OPENING_SELECTION); + OpenSelection(); + } } CListView::OnLButtonDblClk(nFlags, point); } @@ -463,7 +474,7 @@ DeleteAllDisplayItems(); - m_pList->SetImageList(m_bTreeMode ? &m_imageState : NULL, LVSIL_STATE); + m_pList->SetImageList((m_bTreeMode && pDoc->GetRecursive()) ? &m_imageState : NULL, LVSIL_STATE); // If non-recursive compare, add special item(s) String leftParent, rightParent; @@ -913,8 +924,23 @@ { if(nChar==VK_RETURN) { - WaitStatusCursor waitstatus(IDS_STATUS_OPENING_SELECTION); - OpenSelection(); + int sel = GetFocusedItem(); + if (sel >= 0) + { + const DIFFITEM& di = GetDiffItem(sel); + if (m_bTreeMode && GetDocument()->GetRecursive() && di.diffcode.isDirectory()) + { + if (di.customFlags1 & ViewCustomFlags::COLLAPSED) + ExpandSubdir(sel); + else + CollapseSubdir(sel); + } + else + { + WaitStatusCursor waitstatus(IDS_STATUS_OPENING_SELECTION); + OpenSelection(); + } + } } CListView::OnChar(nChar, nRepCnt, nFlags); } @@ -1008,6 +1034,8 @@ int alldiffs; RedisplayChildren(diffpos, dip.GetDepth() + 1, indext, alldiffs); + SortColumnsAppropriately(); + m_pList->SetRedraw(TRUE); // Turn updating back on } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-07-30 19:24:30
|
Revision: 5707 http://winmerge.svn.sourceforge.net/winmerge/?rev=5707&view=rev Author: kimmov Date: 2008-07-30 19:24:23 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Optimize line replace. Don't bother clearing the string before setting new data to it. Modified Paths: -------------- trunk/Src/DiffTextBuffer.cpp trunk/Src/MergeDoc.cpp Modified: trunk/Src/DiffTextBuffer.cpp =================================================================== --- trunk/Src/DiffTextBuffer.cpp 2008-07-30 19:23:10 UTC (rev 5706) +++ trunk/Src/DiffTextBuffer.cpp 2008-07-30 19:24:23 UTC (rev 5707) @@ -198,7 +198,8 @@ * This function is like GetLine() but it also includes line's EOL to the * returned string. * @param [in] nLineIndex Index of the line to get. - * @param [out] strLine Returns line text in the index. + * @param [out] strLine Returns line text in the index. Existing content + * of this string is overwritten. */ BOOL CDiffTextBuffer::GetFullLine(int nLineIndex, CString &strLine) { Modified: trunk/Src/MergeDoc.cpp =================================================================== --- trunk/Src/MergeDoc.cpp 2008-07-30 19:23:10 UTC (rev 5706) +++ trunk/Src/MergeDoc.cpp 2008-07-30 19:24:23 UTC (rev 5707) @@ -904,8 +904,7 @@ // copy the selected text over for (int i=cd_dbegin; i <= limit; i++) { - // text exists on left side, so just replace - strLine = _T(""); + // text exists on other side, so just replace sbuf.GetFullLine(i, strLine); dbuf.ReplaceFullLine(dstView, i, strLine, CE_ACTION_MERGE); dbuf.FlushUndoGroup(dstView); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-08-01 14:36:04
|
Revision: 5716 http://winmerge.svn.sourceforge.net/winmerge/?rev=5716&view=rev Author: kimmov Date: 2008-08-01 14:35:59 +0000 (Fri, 01 Aug 2008) Log Message: ----------- Use std::vector for undo records. Optimize allocation of vector items. Should help with bug #1990085 Slow copying lots of differences. Modified Paths: -------------- trunk/Src/DiffTextBuffer.cpp trunk/Src/GhostTextBuffer.cpp trunk/Src/GhostTextBuffer.h trunk/Src/MergeDoc.cpp trunk/Src/editlib/ccrystaltextbuffer.cpp trunk/Src/editlib/ccrystaltextbuffer.h Modified: trunk/Src/DiffTextBuffer.cpp =================================================================== --- trunk/Src/DiffTextBuffer.cpp 2008-08-01 14:11:33 UTC (rev 5715) +++ trunk/Src/DiffTextBuffer.cpp 2008-08-01 14:35:59 UTC (rev 5716) @@ -461,7 +461,7 @@ m_bModified = FALSE; m_bUndoGroup = m_bUndoBeginGroup = FALSE; m_nSyncPosition = m_nUndoPosition = 0; - ASSERT(m_aUndoBuf.GetSize() == 0); + ASSERT(m_aUndoBuf.size() == 0); m_ptLastChange.x = m_ptLastChange.y = -1; FinishLoading(); @@ -750,5 +750,5 @@ bool CDiffTextBuffer::curUndoGroup() { - return (m_aUndoBuf.GetSize() != 0 && m_aUndoBuf[0].m_dwFlags&UNDO_BEGINGROUP); + return (m_aUndoBuf.size() != 0 && m_aUndoBuf[0].m_dwFlags&UNDO_BEGINGROUP); } Modified: trunk/Src/GhostTextBuffer.cpp =================================================================== --- trunk/Src/GhostTextBuffer.cpp 2008-08-01 14:11:33 UTC (rev 5715) +++ trunk/Src/GhostTextBuffer.cpp 2008-08-01 14:35:59 UTC (rev 5716) @@ -297,7 +297,7 @@ while (!failed) { - tmpPos--;; + --tmpPos; SUndoRecord ur = m_aUndoBuf[tmpPos]; // Undo records are stored in file line numbers // and must be converted to apparent (screen) line numbers for use @@ -458,7 +458,7 @@ // Not only can we not Redo the failed Undo, but the Undo // may have partially completed (if in a group) m_nUndoPosition = 0; - m_aUndoBuf.SetSize (m_nUndoPosition); + m_aUndoBuf.clear(); } else { @@ -521,7 +521,7 @@ ptCursorPos = apparent_ptStartPos; } m_nUndoPosition++; - if (m_nUndoPosition == m_aUndoBuf.GetSize ()) + if (m_nUndoPosition == m_aUndoBuf.size ()) break; if ((m_aUndoBuf[m_nUndoPosition].m_dwFlags & UNDO_BEGINGROUP) != 0) break; @@ -552,7 +552,7 @@ ASSERT (m_bUndoGroup); if (pSource != NULL) { - ASSERT (m_nUndoPosition == m_aUndoBuf.GetSize ()); + ASSERT (m_nUndoPosition == m_aUndoBuf.size ()); if (m_nUndoPosition > 0) { pSource->OnEditOperation (m_aUndoBuf[m_nUndoPosition - 1].m_nAction, @@ -570,13 +570,13 @@ { // Forgot to call BeginUndoGroup()? ASSERT (m_bUndoGroup); - ASSERT (m_aUndoBuf.GetSize () == 0 || (m_aUndoBuf[0].m_dwFlags & UNDO_BEGINGROUP) != 0); + ASSERT (m_aUndoBuf.size () == 0 || (m_aUndoBuf[0].m_dwFlags & UNDO_BEGINGROUP) != 0); // Strip unnecessary undo records (edit after undo wipes all potential redo records) - int nBufSize = (int) m_aUndoBuf.GetSize (); + int nBufSize = (int) m_aUndoBuf.size (); if (m_nUndoPosition < nBufSize) { - m_aUndoBuf.SetSize (m_nUndoPosition); + m_aUndoBuf.resize (m_nUndoPosition); } // Add new record @@ -599,8 +599,18 @@ ur.SetText (pszText, cchText); ur.m_paSavedRevisonNumbers = paSavedRevisonNumbers; - m_aUndoBuf.Add (ur); - m_nUndoPosition = (int) m_aUndoBuf.GetSize (); + // Optimize memory allocation + if (m_aUndoBuf.capacity() == m_aUndoBuf.size()) + { + if (m_aUndoBuf.size() == 0) + m_aUndoBuf.reserve(16); + else if (m_aUndoBuf.size() < 1025) + m_aUndoBuf.reserve(m_aUndoBuf.size() * 2); + else + m_aUndoBuf.reserve(m_aUndoBuf.size() + 1024); + } + m_aUndoBuf.push_back (ur); + m_nUndoPosition = (int) m_aUndoBuf.size (); } Modified: trunk/Src/GhostTextBuffer.h =================================================================== --- trunk/Src/GhostTextBuffer.h 2008-08-01 14:11:33 UTC (rev 5715) +++ trunk/Src/GhostTextBuffer.h 2008-08-01 14:35:59 UTC (rev 5716) @@ -204,7 +204,7 @@ We share m_bUndoGroup, its utility is to check we opened the UndoBeginGroup. We share m_nUndoBufSize which is the max buffer size. */ - CArray < SUndoRecord, SUndoRecord & >m_aUndoBuf; + std::vector<SUndoRecord> m_aUndoBuf; /** This one must be duplicated because the flag UNDO_BEGINGROUP needs to be set in both CGhostTextBuffer::m_aUndoBuf and CCrystalTextBuffer::m_aUndoBuf CArrays Modified: trunk/Src/MergeDoc.cpp =================================================================== --- trunk/Src/MergeDoc.cpp 2008-08-01 14:11:33 UTC (rev 5715) +++ trunk/Src/MergeDoc.cpp 2008-08-01 14:35:59 UTC (rev 5716) @@ -2114,8 +2114,8 @@ m_pDetailView[1]->DetachFromBuffer(); // clear undo buffers - m_ptBuf[0]->m_aUndoBuf.RemoveAll(); - m_ptBuf[1]->m_aUndoBuf.RemoveAll(); + m_ptBuf[0]->m_aUndoBuf.clear(); + m_ptBuf[1]->m_aUndoBuf.clear(); // free the buffers m_ptBuf[0]->FreeAll(); Modified: trunk/Src/editlib/ccrystaltextbuffer.cpp =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-01 14:11:33 UTC (rev 5715) +++ trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-01 14:35:59 UTC (rev 5716) @@ -54,8 +54,16 @@ // Editor won't crash any more i.e. by selecting whole buffer and // deleting it and then executing ID_EDIT_GOTO_LAST_CHANGE-command. //////////////////////////////////////////////////////////////////////////// +/** + * @file ccrystaltextbuffer.cpp + * + * @brief Code for CCrystalTextBuffer class + */ +// line follows -- this is updated by SVN +// $Id$ #include "stdafx.h" +#include <vector> #include <malloc.h> #include "editcmd.h" #include "ccrystaltextbuffer.h" @@ -75,6 +83,8 @@ static char THIS_FILE[] = __FILE__; #endif +using namespace std; + // Line allocation granularity #define CHAR_ALIGN 16 #define ALIGN_BUF_SIZE(size) ((size) / CHAR_ALIGN) * CHAR_ALIGN + CHAR_ALIGN; @@ -400,7 +410,7 @@ m_nTabSize = 4; m_nSyncPosition = m_nUndoPosition = 0; m_bUndoGroup = m_bUndoBeginGroup = FALSE; - ASSERT (m_aUndoBuf.GetSize () == 0); + ASSERT (m_aUndoBuf.size () == 0); UpdateViews (NULL, NULL, UPDATE_RESET); //BEGIN SW m_ptLastChange.x = m_ptLastChange.y = -1; @@ -568,7 +578,7 @@ m_bUndoGroup = m_bUndoBeginGroup = FALSE; m_nUndoBufSize = UNDO_BUF_SIZE; m_nSyncPosition = m_nUndoPosition = 0; - ASSERT (m_aUndoBuf.GetSize () == 0); + ASSERT (m_aUndoBuf.size () == 0); bSuccess = TRUE; RetypeViews (pszFileName); @@ -1342,15 +1352,15 @@ BOOL CCrystalTextBuffer:: CanUndo () { - ASSERT (m_nUndoPosition >= 0 && m_nUndoPosition <= m_aUndoBuf.GetSize ()); + ASSERT (m_nUndoPosition >= 0 && m_nUndoPosition <= m_aUndoBuf.size ()); return m_nUndoPosition > 0; } BOOL CCrystalTextBuffer:: CanRedo () { - ASSERT (m_nUndoPosition >= 0 && m_nUndoPosition <= m_aUndoBuf.GetSize ()); - return m_nUndoPosition < m_aUndoBuf.GetSize (); + ASSERT (m_nUndoPosition >= 0 && m_nUndoPosition <= m_aUndoBuf.size ()); + return m_nUndoPosition < m_aUndoBuf.size (); } POSITION CCrystalTextBuffer:: @@ -1375,11 +1385,15 @@ // Advance to next undo group nPosition--; - while ((m_aUndoBuf[nPosition].m_dwFlags & UNDO_BEGINGROUP) == 0) - nPosition--; + vector<SUndoRecord>::const_iterator iter = m_aUndoBuf.begin () + nPosition; + while (((*iter).m_dwFlags & UNDO_BEGINGROUP) == 0) + { + --iter; + --nPosition; + } // Get description - nAction = m_aUndoBuf[nPosition].m_nAction; + nAction = (*iter).m_nAction; // Now, if we stop at zero position, this will be the last action, // since we return (POSITION) nPosition @@ -1412,11 +1426,14 @@ // Advance to next undo group nPosition++; - while (nPosition < m_aUndoBuf.GetSize () && - (m_aUndoBuf[nPosition].m_dwFlags & UNDO_BEGINGROUP) == 0) - nPosition--; + vector<SUndoRecord>::const_iterator iter = m_aUndoBuf.begin () + nPosition; + while (iter != m_aUndoBuf.begin () && ((*iter).m_dwFlags & UNDO_BEGINGROUP) == 0) + { + --iter; + --nPosition; + } - if (nPosition >= m_aUndoBuf.GetSize ()) + if (nPosition >= m_aUndoBuf.size ()) return NULL; // No more redo actions! return (POSITION) nPosition; @@ -1458,8 +1475,8 @@ while (!failed) { - tmpPos--;; - SUndoRecord ur = m_aUndoBuf[tmpPos]; + --tmpPos; + const SUndoRecord ur = m_aUndoBuf[tmpPos]; // Undo records are stored in file line numbers // and must be converted to apparent (screen) line numbers for use CPoint apparent_ptStartPos = ur.m_ptStartPos; @@ -1513,8 +1530,8 @@ } // restore line revision numbers - int i, naSavedRevisonNumbersSize = (int) ur.m_paSavedRevisonNumbers->GetSize(); - for (i = 0; i < naSavedRevisonNumbersSize; i++) + int naSavedRevisonNumbersSize = (int) ur.m_paSavedRevisonNumbers->GetSize(); + for (int i = 0; i < naSavedRevisonNumbersSize; i++) m_aLines[ur.m_ptStartPos.y + i].m_dwRevisionNumber = (*ur.m_paSavedRevisonNumbers)[i]; if (ur.m_dwFlags & UNDO_BEGINGROUP) @@ -1530,7 +1547,7 @@ // Not only can we not Redo the failed Undo, but the Undo // may have partially completed (if in a group) m_nUndoPosition = 0; - m_aUndoBuf.SetSize (m_nUndoPosition); + m_aUndoBuf.clear (); } else { @@ -1548,7 +1565,7 @@ for (;;) { - SUndoRecord ur = m_aUndoBuf[m_nUndoPosition]; + const SUndoRecord ur = m_aUndoBuf[m_nUndoPosition]; CPoint apparent_ptStartPos = ur.m_ptStartPos; CPoint apparent_ptEndPos = ur.m_ptEndPos; @@ -1572,7 +1589,7 @@ ptCursorPos = apparent_ptStartPos; } m_nUndoPosition++; - if (m_nUndoPosition == m_aUndoBuf.GetSize ()) + if (m_nUndoPosition == m_aUndoBuf.size ()) break; if ((m_aUndoBuf[m_nUndoPosition].m_dwFlags & UNDO_BEGINGROUP) != 0) break; @@ -1593,13 +1610,13 @@ { // Forgot to call BeginUndoGroup()? ASSERT (m_bUndoGroup); - ASSERT (m_aUndoBuf.GetSize () == 0 || (m_aUndoBuf[0].m_dwFlags & UNDO_BEGINGROUP) != 0); + ASSERT (m_aUndoBuf.size () == 0 || (m_aUndoBuf[0].m_dwFlags & UNDO_BEGINGROUP) != 0); // Strip unnecessary undo records (edit after undo wipes all potential redo records) - int nBufSize = (int) m_aUndoBuf.GetSize (); + int nBufSize = (int) m_aUndoBuf.size (); if (m_nUndoPosition < nBufSize) { - m_aUndoBuf.SetSize (m_nUndoPosition); + m_aUndoBuf.resize (m_nUndoPosition); } // Add new record @@ -1616,8 +1633,18 @@ ur.SetText (pszText, cchText); ur.m_paSavedRevisonNumbers = paSavedRevisonNumbers; - m_aUndoBuf.Add (ur); - m_nUndoPosition = (int) m_aUndoBuf.GetSize (); + // Optimize memory allocation + if (m_aUndoBuf.capacity() == m_aUndoBuf.size()) + { + if (m_aUndoBuf.size() == 0) + m_aUndoBuf.reserve(16); + else if (m_aUndoBuf.size() < 1025) + m_aUndoBuf.reserve(m_aUndoBuf.size() * 2); + else + m_aUndoBuf.reserve(m_aUndoBuf.size() + 1024); + } + m_aUndoBuf.push_back (ur); + m_nUndoPosition = (int) m_aUndoBuf.size (); } LPCTSTR CCrystalTextBuffer::GetStringEol(CRLFSTYLE nCRLFMode) @@ -1855,7 +1882,7 @@ ASSERT (m_bUndoGroup); if (pSource != NULL) { - ASSERT (m_nUndoPosition == m_aUndoBuf.GetSize ()); + ASSERT (m_nUndoPosition == m_aUndoBuf.size ()); if (m_nUndoPosition > 0) { pSource->OnEditOperation (m_aUndoBuf[m_nUndoPosition - 1].m_nAction, m_aUndoBuf[m_nUndoPosition - 1].GetText ()); Modified: trunk/Src/editlib/ccrystaltextbuffer.h =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-01 14:11:33 UTC (rev 5715) +++ trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-01 14:35:59 UTC (rev 5716) @@ -23,14 +23,21 @@ // ... it's being edited very rapidly so sorry for non-commented // and maybe "ugly" code ... //////////////////////////////////////////////////////////////////////////// +/** + * @file ccrystaltextbuffer.h + * + * @brief Declaration file for CCrystalTextBuffer. + */ +// ID line follows -- this is updated by SVN +// $Id$ + #if !defined(AFX_CCRYSTALTEXTBUFFER_H__AD7F2F49_6CB3_11D2_8C32_0080ADB86836__INCLUDED_) #define AFX_CCRYSTALTEXTBUFFER_H__AD7F2F49_6CB3_11D2_8C32_0080ADB86836__INCLUDED_ -#if _MSC_VER >= 1000 #pragma once -#endif // _MSC_VER >= 1000 +#include <vector> #include "ccrystaltextview.h" #ifndef __AFXTEMPL_H__ @@ -250,7 +257,7 @@ CArray < SLineInfo, SLineInfo & >m_aLines; // Undo - CArray < SUndoRecord, SUndoRecord & >m_aUndoBuf; + std::vector<SUndoRecord> m_aUndoBuf; /**< Undo records. */ int m_nUndoPosition; int m_nSyncPosition; BOOL m_bUndoGroup, m_bUndoBeginGroup; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-08-02 15:42:23
|
Revision: 5720 http://winmerge.svn.sourceforge.net/winmerge/?rev=5720&view=rev Author: kimmov Date: 2008-08-02 15:42:20 +0000 (Sat, 02 Aug 2008) Log Message: ----------- Move SLineInfo struct definition to own header file. Modified Paths: -------------- trunk/Src/Merge.vcproj trunk/Src/editlib/ccrystaltextbuffer.cpp trunk/Src/editlib/ccrystaltextbuffer.h Added Paths: ----------- trunk/Src/editlib/LineInfo.h Modified: trunk/Src/Merge.vcproj =================================================================== --- trunk/Src/Merge.vcproj 2008-08-01 18:36:51 UTC (rev 5719) +++ trunk/Src/Merge.vcproj 2008-08-02 15:42:20 UTC (rev 5720) @@ -7654,6 +7654,9 @@ </FileConfiguration> </File> <File + RelativePath="editlib\LineInfo.h"> + </File> + <File RelativePath="editlib\lisp.cpp"> <FileConfiguration Name="UnicodeRelease|Win32"> Added: trunk/Src/editlib/LineInfo.h =================================================================== --- trunk/Src/editlib/LineInfo.h (rev 0) +++ trunk/Src/editlib/LineInfo.h 2008-08-02 15:42:20 UTC (rev 5720) @@ -0,0 +1,35 @@ +/** + * @file LineInfo.h + * + * @brief Declaration for SLineInfo structure. + * + */ +// ID line follows -- this is updated by SVN +// $Id$ + +#ifndef _EDITOR_LINEINFO_H_ +#define _EDITOR_LINEINFO_H_ + +/** + * @brief Line information. + * This structure presents one line in the editor. + */ +struct SLineInfo + { + TCHAR *m_pcLine; /**< Line data. */ + int m_nLength; /**< Line length (without EOL bytes). */ + int m_nMax; /**< Allocated space for line data. */ + int m_nEolChars; /**< # of EOL bytes. */ + DWORD m_dwFlags; /**< Line flags. */ + DWORD m_dwRevisionNumber; /**< Edit revision (for edit tracking). */ + + int FullLength() const { return m_nLength+m_nEolChars; } + int Length() const { return m_nLength; } + + SLineInfo () + { + memset (this, 0, sizeof (SLineInfo)); + }; + }; + +#endif // _EDITOR_LINEINFO_H_ Property changes on: trunk/Src/editlib/LineInfo.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/Src/editlib/ccrystaltextbuffer.cpp =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-01 18:36:51 UTC (rev 5719) +++ trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-02 15:42:20 UTC (rev 5720) @@ -66,6 +66,7 @@ #include <vector> #include <malloc.h> #include "editcmd.h" +#include "LineInfo.h" #include "ccrystaltextbuffer.h" #include "ccrystaltextview.h" #include "filesup.h" Modified: trunk/Src/editlib/ccrystaltextbuffer.h =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-01 18:36:51 UTC (rev 5719) +++ trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-02 15:42:20 UTC (rev 5720) @@ -38,6 +38,7 @@ #pragma once #include <vector> +#include "LineInfo.h" #include "ccrystaltextview.h" #ifndef __AFXTEMPL_H__ @@ -45,8 +46,6 @@ #include <afxtempl.h> #endif -#define UNDO_DESCRIP_BUF 32 - enum LINEFLAGS { LF_BOOKMARK_FIRST = 0x00000001L, @@ -132,23 +131,6 @@ protected : #pragma pack(push, 1) // Nested class declarations - struct SLineInfo - { - TCHAR *m_pcLine; - int m_nLength, m_nMax; - int m_nEolChars; // # of eolchars - DWORD m_dwFlags; - DWORD m_dwRevisionNumber; - - int FullLength() const { return m_nLength+m_nEolChars; } - int Length() const { return m_nLength; } - - SLineInfo () - { - memset (this, 0, sizeof (SLineInfo)); - }; - }; - enum { UNDO_INSERT = 0x0001, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-08-02 17:59:06
|
Revision: 5721 http://winmerge.svn.sourceforge.net/winmerge/?rev=5721&view=rev Author: kimmov Date: 2008-08-02 17:59:01 +0000 (Sat, 02 Aug 2008) Log Message: ----------- Move SUndoRecord struct code to own files. Modified Paths: -------------- trunk/Src/Merge.vcproj trunk/Src/editlib/ccrystaltextbuffer.cpp trunk/Src/editlib/ccrystaltextbuffer.h Added Paths: ----------- trunk/Src/editlib/UndoRecord.cpp trunk/Src/editlib/UndoRecord.h Modified: trunk/Src/Merge.vcproj =================================================================== --- trunk/Src/Merge.vcproj 2008-08-02 15:42:20 UTC (rev 5720) +++ trunk/Src/Merge.vcproj 2008-08-02 17:59:01 UTC (rev 5721) @@ -8409,6 +8409,46 @@ </FileConfiguration> </File> <File + RelativePath="editlib\UndoRecord.h"> + </File> + <File + RelativePath="editlib\UndoRecord.cpp"> + <FileConfiguration + Name="UnicodeRelease|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="1" + AdditionalIncludeDirectories="" + PreprocessorDefinitions=""/> + </FileConfiguration> + <FileConfiguration + Name="UnicodeDebug|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + BrowseInformation="1"/> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + BrowseInformation="1"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="1" + AdditionalIncludeDirectories="" + PreprocessorDefinitions=""/> + </FileConfiguration> + </File> + <File RelativePath="editlib\wispelld.h"> </File> <File Added: trunk/Src/editlib/UndoRecord.cpp =================================================================== --- trunk/Src/editlib/UndoRecord.cpp (rev 0) +++ trunk/Src/editlib/UndoRecord.cpp 2008-08-02 17:59:01 UTC (rev 5721) @@ -0,0 +1,41 @@ +/** + * @file UndoRecord.cpp + * + * @brief Implementation of UndoRecord struct. + */ +// ID line follows -- this is updated by SVN +// $Id$ + +#include "stdafx.h" +#include "UndoRecord.h" + +void SUndoRecord:: +SetText (LPCTSTR pszText, int nLength) +{ + FreeText(); + if (nLength) + { + if (nLength > 1) + { + m_pszText = (TextBuffer *)malloc(sizeof(TextBuffer) + nLength * sizeof(TCHAR)); + m_pszText->size = nLength; + memcpy(m_pszText->data, pszText, nLength * sizeof(TCHAR)); + m_pszText->data[nLength] = _T('?'); // debug sentinel + } + else + { + m_szText[0] = pszText[0]; + } + } +} + +void SUndoRecord:: +FreeText () +{ + // See the m_szText/m_pszText definition + // Check if m_pszText is a pointer by removing bits having + // possible char value + if (((INT_PTR)m_pszText >> 16) != 0) + free(m_pszText); + m_pszText = NULL; +} Property changes on: trunk/Src/editlib/UndoRecord.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/Src/editlib/UndoRecord.h =================================================================== --- trunk/Src/editlib/UndoRecord.h (rev 0) +++ trunk/Src/editlib/UndoRecord.h 2008-08-02 17:59:01 UTC (rev 5721) @@ -0,0 +1,98 @@ +/** + * @file UndoRecord.h + * + * @brief Declaration for SUndoRecord structure. + * + */ +// ID line follows -- this is updated by SVN +// $Id$ + +#ifndef _EDITOR_UNDO_RECORD_H_ +#define _EDITOR_UNDO_RECORD_H_ + +struct SUndoRecord +{ + DWORD m_dwFlags; + CPoint m_ptStartPos, m_ptEndPos; // Block of text participating + int m_nAction; // For information only: action type + CDWordArray *m_paSavedRevisonNumbers; + +private: + // TCHAR *m_pcText; + // Since in most cases we have 1 character here, + // we should invent a better way. Note: 2 * sizeof(WORD) <= sizeof(TCHAR*) + // + // Here we will use the following trick: on Win32 platforms high-order word + // of any pointer will be != 0. So we can store 1 character strings without + // allocating memory. + // + struct TextBuffer + { + int size; + TCHAR data[1]; + }; + + union + { + TextBuffer *m_pszText; // For cases when we have > 1 character strings + TCHAR m_szText[2]; // For single-character strings + }; + + public: + SUndoRecord () // default constructor + { + memset (this, 0, sizeof (SUndoRecord)); + } + + SUndoRecord (const SUndoRecord & src) // copy constructor + { + memset (this, 0, sizeof (SUndoRecord)); + (*this)=src; + } + + SUndoRecord & operator=(const SUndoRecord & src) // copy assignment + { + m_dwFlags = src.m_dwFlags; + m_ptStartPos = src.m_ptStartPos; + m_ptEndPos = src.m_ptEndPos; + m_nAction = src.m_nAction; + SetText(src.GetText(), src.GetTextLength()); + INT_PTR size = src.m_paSavedRevisonNumbers->GetSize(); + if (!m_paSavedRevisonNumbers) + m_paSavedRevisonNumbers = new CDWordArray(); + m_paSavedRevisonNumbers->SetSize(size); + INT_PTR i; + for (i = 0; i < size; i++) + (*m_paSavedRevisonNumbers)[i] = (*src.m_paSavedRevisonNumbers)[i]; + return *this; + } + + ~SUndoRecord () // destructor + { + FreeText(); + if (m_paSavedRevisonNumbers) + delete m_paSavedRevisonNumbers; + } + + void SetText (LPCTSTR pszText, int cchText); + void FreeText (); + + LPCTSTR GetText () const + { + // See the m_szText/m_pszText definition + // Check if m_pszText is a pointer by removing bits having + // possible char value + if (((INT_PTR)m_pszText >> 16) != 0) + return m_pszText->data; + return m_szText; + } + + int GetTextLength () const + { + if (((INT_PTR)m_pszText >> 16) != 0) + return m_pszText->size; + return 1; + } +}; + +#endif // _EDITOR_UNDO_RECORD_H_ Property changes on: trunk/Src/editlib/UndoRecord.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/Src/editlib/ccrystaltextbuffer.cpp =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-02 15:42:20 UTC (rev 5720) +++ trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-02 17:59:01 UTC (rev 5721) @@ -67,6 +67,7 @@ #include <malloc.h> #include "editcmd.h" #include "LineInfo.h" +#include "UndoRecord.h" #include "ccrystaltextbuffer.h" #include "ccrystaltextview.h" #include "filesup.h" @@ -98,41 +99,7 @@ int CCrystalTextBuffer::m_nDefaultEncoding = -1; -///////////////////////////////////////////////////////////////////////////// -// CCrystalTextBuffer::SUndoRecord -void CCrystalTextBuffer::SUndoRecord:: -SetText (LPCTSTR pszText, int nLength) -{ - FreeText(); - if (nLength) - { - if (nLength > 1) - { - m_pszText = (TextBuffer *)malloc(sizeof(TextBuffer) + nLength * sizeof(TCHAR)); - m_pszText->size = nLength; - memcpy(m_pszText->data, pszText, nLength * sizeof(TCHAR)); - m_pszText->data[nLength] = _T('?'); // debug sentinel - } - else - { - m_szText[0] = pszText[0]; - } - } -} - -void CCrystalTextBuffer::SUndoRecord:: -FreeText () -{ - // See the m_szText/m_pszText definition - // Check if m_pszText is a pointer by removing bits having - // possible char value - if (((INT_PTR)m_pszText >> 16) != 0) - free(m_pszText); - m_pszText = NULL; -} - - ///////////////////////////////////////////////////////////////////////////// // CCrystalTextBuffer::CUpdateContext Modified: trunk/Src/editlib/ccrystaltextbuffer.h =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-02 15:42:20 UTC (rev 5720) +++ trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-02 17:59:01 UTC (rev 5721) @@ -39,6 +39,7 @@ #include <vector> #include "LineInfo.h" +#include "UndoRecord.h" #include "ccrystaltextview.h" #ifndef __AFXTEMPL_H__ @@ -129,98 +130,12 @@ int FindLineWithFlag (DWORD dwFlag); protected : -#pragma pack(push, 1) - // Nested class declarations enum { UNDO_INSERT = 0x0001, UNDO_BEGINGROUP = 0x0100 }; - // [JRT] Support For Descriptions On Undo/Redo Actions - struct SUndoRecord - { - DWORD m_dwFlags; - - CPoint m_ptStartPos, m_ptEndPos; // Block of text participating - int m_nAction; // For information only: action type - CDWordArray *m_paSavedRevisonNumbers; - -private : - // TCHAR *m_pcText; - // Since in most cases we have 1 character here, - // we should invent a better way. Note: 2 * sizeof(WORD) <= sizeof(TCHAR*) - // - // Here we will use the following trick: on Win32 platforms high-order word - // of any pointer will be != 0. So we can store 1 character strings without - // allocating memory. - // - struct TextBuffer - { - int size; - TCHAR data[1]; - }; - union - { - TextBuffer *m_pszText; // For cases when we have > 1 character strings - TCHAR m_szText[2]; // For single-character strings - }; - -public : - SUndoRecord () // default constructor - { - memset (this, 0, sizeof (SUndoRecord)); - } - SUndoRecord (const SUndoRecord & src) // copy constructor - { - memset (this, 0, sizeof (SUndoRecord)); - (*this)=src; - } - SUndoRecord & operator=(const SUndoRecord & src) // copy assignment - { - m_dwFlags = src.m_dwFlags; - m_ptStartPos = src.m_ptStartPos; - m_ptEndPos = src.m_ptEndPos; - m_nAction = src.m_nAction; - SetText(src.GetText(), src.GetTextLength()); - INT_PTR size = src.m_paSavedRevisonNumbers->GetSize(); - if (!m_paSavedRevisonNumbers) - m_paSavedRevisonNumbers = new CDWordArray(); - m_paSavedRevisonNumbers->SetSize(size); - INT_PTR i; - for (i = 0; i < size; i++) - (*m_paSavedRevisonNumbers)[i] = (*src.m_paSavedRevisonNumbers)[i]; - return *this; - } - ~SUndoRecord () // destructor - { - FreeText(); - if (m_paSavedRevisonNumbers) - delete m_paSavedRevisonNumbers; - } - - void SetText (LPCTSTR pszText, int cchText); - void FreeText (); - - LPCTSTR GetText () const - { - // See the m_szText/m_pszText definition - // Check if m_pszText is a pointer by removing bits having - // possible char value - if (((INT_PTR)m_pszText >> 16) != 0) - return m_pszText->data; - return m_szText; - } - int GetTextLength () const - { - if (((INT_PTR)m_pszText >> 16) != 0) - return m_pszText->size; - return 1; - } - }; - -#pragma pack(pop) - class EDITPADC_CLASS CInsertContext : public CUpdateContext { public : This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-08-04 20:54:56
|
Revision: 5735 http://winmerge.svn.sourceforge.net/winmerge/?rev=5735&view=rev Author: kimmov Date: 2008-08-04 20:54:49 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Rename SLineInfo to LineInfo and make it a class. Add LineInfo methods Create(), CreateEmpty() and Append(). Modified Paths: -------------- trunk/Src/Merge.vcproj trunk/Src/editlib/LineInfo.h trunk/Src/editlib/ccrystaltextbuffer.cpp trunk/Src/editlib/ccrystaltextbuffer.h Added Paths: ----------- trunk/Src/editlib/LineInfo.cpp Modified: trunk/Src/Merge.vcproj =================================================================== --- trunk/Src/Merge.vcproj 2008-08-04 15:38:15 UTC (rev 5734) +++ trunk/Src/Merge.vcproj 2008-08-04 20:54:49 UTC (rev 5735) @@ -7654,6 +7654,43 @@ </FileConfiguration> </File> <File + RelativePath=".\editlib\LineInfo.cpp"> + <FileConfiguration + Name="UnicodeRelease|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="1" + AdditionalIncludeDirectories="" + PreprocessorDefinitions=""/> + </FileConfiguration> + <FileConfiguration + Name="UnicodeDebug|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + BrowseInformation="1"/> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + BrowseInformation="1"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="1" + AdditionalIncludeDirectories="" + PreprocessorDefinitions=""/> + </FileConfiguration> + </File> + <File RelativePath="editlib\LineInfo.h"> </File> <File @@ -8409,9 +8446,6 @@ </FileConfiguration> </File> <File - RelativePath="editlib\UndoRecord.h"> - </File> - <File RelativePath="editlib\UndoRecord.cpp"> <FileConfiguration Name="UnicodeRelease|Win32"> @@ -8449,6 +8483,9 @@ </FileConfiguration> </File> <File + RelativePath="editlib\UndoRecord.h"> + </File> + <File RelativePath="editlib\wispelld.h"> </File> <File Added: trunk/Src/editlib/LineInfo.cpp =================================================================== --- trunk/Src/editlib/LineInfo.cpp (rev 0) +++ trunk/Src/editlib/LineInfo.cpp 2008-08-04 20:54:49 UTC (rev 5735) @@ -0,0 +1,91 @@ +/** + * @file LineInfo.cpp + * + * @brief Implementation of LineInfo class. + */ +// ID line follows -- this is updated by SVN +// $Id$ + +#include "stdafx.h" +#include "LineInfo.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +/** + * @brief Create a line. + * @param [in] pszLine Line data. + * @param [in] nLength Line length. + */ +void LineInfo::Create(LPCTSTR pszLine, int nLength) +{ + m_nLength = nLength; + m_nMax = ALIGN_BUF_SIZE (m_nLength + 1); + ASSERT (m_nMax >= m_nLength + 1); + m_pcLine = new TCHAR[m_nMax]; + if (m_nLength > 0) + { + DWORD dwLen = sizeof (TCHAR) * m_nLength; + CopyMemory (m_pcLine, pszLine, dwLen); + } + m_pcLine[m_nLength] = '\0'; + + int nEols = 0; + if (nLength > 1 && IsDosEol(&pszLine[nLength - 2])) + nEols = 2; + else if (nLength && IsEol(pszLine[nLength - 1])) + nEols = 1; + m_nLength -= nEols; + m_nEolChars = nEols; +} + +/** + * @brief Create an empty line. + */ +void LineInfo::CreateEmpty() +{ + m_nLength = 0; + m_nEolChars = 0; + m_nMax = ALIGN_BUF_SIZE (m_nLength + 1); + m_pcLine = new TCHAR[m_nMax]; + m_pcLine[0] = '\0'; +} + +/** + * @brief Append a text to the line. + * @param [in] pszChars String to append to the line. + * @param [in] nLength Length of the string to append. + */ +void LineInfo::Append(LPCTSTR pszChars, int nLength) +{ + int nBufNeeded = m_nLength + nLength + 1; + if (nBufNeeded > m_nMax) + { + m_nMax = ALIGN_BUF_SIZE (nBufNeeded); + ASSERT (m_nMax >= m_nLength + nLength); + TCHAR *pcNewBuf = new TCHAR[m_nMax]; + if (FullLength() > 0) + memcpy (pcNewBuf, m_pcLine, sizeof (TCHAR) * (FullLength() + 1)); + delete[] m_pcLine; + m_pcLine = pcNewBuf; + } + + memcpy (m_pcLine + m_nLength, pszChars, sizeof (TCHAR) * nLength); + m_nLength += nLength; + m_pcLine[m_nLength] = '\0'; + + // Did line gain eol ? (We asserted above that it had none at start) + if (nLength > 1 && IsDosEol(&m_pcLine[m_nLength - 2])) + { + m_nEolChars = 2; + } + else if (LineInfo::IsEol(m_pcLine[m_nLength - 1])) + { + m_nEolChars = 1; + } + m_nLength -= m_nEolChars; + ASSERT (m_nLength + m_nEolChars <= m_nMax); +} Property changes on: trunk/Src/editlib/LineInfo.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/Src/editlib/LineInfo.h =================================================================== --- trunk/Src/editlib/LineInfo.h 2008-08-04 15:38:15 UTC (rev 5734) +++ trunk/Src/editlib/LineInfo.h 2008-08-04 20:54:49 UTC (rev 5735) @@ -1,7 +1,7 @@ /** * @file LineInfo.h * - * @brief Declaration for SLineInfo structure. + * @brief Declaration for LineInfo class. * */ // ID line follows -- this is updated by SVN @@ -10,12 +10,17 @@ #ifndef _EDITOR_LINEINFO_H_ #define _EDITOR_LINEINFO_H_ +// Line allocation granularity +#define CHAR_ALIGN 16 +#define ALIGN_BUF_SIZE(size) ((size) / CHAR_ALIGN) * CHAR_ALIGN + CHAR_ALIGN; + /** * @brief Line information. - * This structure presents one line in the editor. + * This class presents one line in the editor. */ -struct SLineInfo +class LineInfo { +public: // All public as this used to be a struct. TCHAR *m_pcLine; /**< Line data. */ int m_nLength; /**< Line length (without EOL bytes). */ int m_nMax; /**< Allocated space for line data. */ @@ -25,11 +30,24 @@ int FullLength() const { return m_nLength+m_nEolChars; } int Length() const { return m_nLength; } + void Create(LPCTSTR pszLine, int nLength); + void CreateEmpty(); + void Append(LPCTSTR pszChars, int nLength); - SLineInfo () + LineInfo () { - memset (this, 0, sizeof (SLineInfo)); + memset (this, 0, sizeof (LineInfo)); }; + + static bool IsEol(TCHAR ch) + { + return ch=='\r' || ch=='\n'; + }; + + static bool IsDosEol(LPCTSTR sz) + { + return sz[0]=='\r' && sz[1]=='\n'; + }; }; #endif // _EDITOR_LINEINFO_H_ Modified: trunk/Src/editlib/ccrystaltextbuffer.cpp =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-04 15:38:15 UTC (rev 5734) +++ trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-04 20:54:49 UTC (rev 5735) @@ -87,10 +87,6 @@ using namespace std; -// Line allocation granularity -#define CHAR_ALIGN 16 -#define ALIGN_BUF_SIZE(size) ((size) / CHAR_ALIGN) * CHAR_ALIGN + CHAR_ALIGN; - const TCHAR crlf[] = _T ("\r\n"); #ifdef _DEBUG @@ -187,16 +183,6 @@ ///////////////////////////////////////////////////////////////////////////// // CCrystalTextBuffer message handlers -static bool iseol(TCHAR ch) -{ - return ch=='\r' || ch=='\n'; -} - -static bool isdoseol(LPCTSTR sz) -{ - return sz[0]=='\r' && sz[1]=='\n'; -} - /** * @brief Insert the same line once or several times * @@ -207,26 +193,9 @@ { ASSERT(nLength != -1); - SLineInfo li; - li.m_nLength = nLength; - li.m_nMax = ALIGN_BUF_SIZE (li.m_nLength + 1); - ASSERT (li.m_nMax >= li.m_nLength + 1); - li.m_pcLine = new TCHAR[li.m_nMax]; - if (li.m_nLength > 0) - { - DWORD dwLen = sizeof (TCHAR) * li.m_nLength; - CopyMemory (li.m_pcLine, pszLine, dwLen); - } - li.m_pcLine[li.m_nLength] = '\0'; + LineInfo li; + li.Create(pszLine, nLength); - int nEols = 0; - if (nLength>1 && isdoseol(&pszLine[nLength-2])) - nEols = 2; - else if (nLength && iseol(pszLine[nLength-1])) - nEols = 1; - li.m_nLength -= nEols; - li.m_nEolChars = nEols; - // nPosition not defined ? Insert at end of array if (nPosition == -1) nPosition = (int) m_aLines.GetSize(); @@ -260,33 +229,8 @@ if (nLength == 0) return; - SLineInfo & li = m_aLines[nLineIndex]; - ASSERT(!li.m_nEolChars); - int nBufNeeded = li.m_nLength + nLength+1; - if (nBufNeeded > li.m_nMax) - { - li.m_nMax = ALIGN_BUF_SIZE (nBufNeeded); - ASSERT (li.m_nMax >= li.m_nLength + nLength); - TCHAR *pcNewBuf = new TCHAR[li.m_nMax]; - if (li.FullLength() > 0) - memcpy (pcNewBuf, li.m_pcLine, sizeof (TCHAR) * (li.FullLength()+1)); - delete[] li.m_pcLine; - li.m_pcLine = pcNewBuf; - } - memcpy (li.m_pcLine + li.m_nLength, pszChars, sizeof (TCHAR) * nLength); - li.m_nLength += nLength; - li.m_pcLine[li.m_nLength] = '\0'; - // Did line gain eol ? (We asserted above that it had none at start) - if (nLength>1 && isdoseol(&li.m_pcLine[li.m_nLength-2])) - { - li.m_nEolChars = 2; - } - else if (iseol(li.m_pcLine[li.m_nLength-1])) - { - li.m_nEolChars = 1; - } - li.m_nLength -= li.m_nEolChars; - ASSERT (li.m_nLength + li.m_nEolChars <= li.m_nMax); + LineInfo & li = m_aLines[nLineIndex]; + li.Append(pszChars, nLength); } /** @@ -329,18 +273,12 @@ void CCrystalTextBuffer::SetEmptyLine (int nPosition, int nCount /*= 1*/ ) { - if (nCount > 0) { - SLineInfo li; - li.m_nLength = 0; - li.m_nEolChars = 0; - li.m_nMax = ALIGN_BUF_SIZE (li.m_nLength + 1); - for (int ic = 0; ic < nCount; ic++) - { - m_aLines[nPosition+ic] = li; - m_aLines[nPosition+ic].m_pcLine = new TCHAR[li.m_nMax]; - m_aLines[nPosition+ic].m_pcLine[0] = _T('\0'); - } - } + for (int i = 0; i < nCount; i++) + { + LineInfo li; + li.CreateEmpty(); + m_aLines[nPosition + i] = li; + } } void CCrystalTextBuffer:: @@ -775,7 +713,7 @@ BOOL CCrystalTextBuffer:: ChangeLineEol (int nLine, LPCTSTR lpEOL) { - SLineInfo & li = m_aLines[nLine]; + LineInfo & li = m_aLines[nLine]; int nNewEolChars = (int) _tcslen(lpEOL); if (nNewEolChars == li.m_nEolChars) if (_tcscmp(li.m_pcLine + li.Length(), lpEOL) == 0) @@ -1101,7 +1039,7 @@ if (nStartLine == nEndLine) { // delete part of one line - SLineInfo & li = m_aLines[nStartLine]; + LineInfo & li = m_aLines[nStartLine]; if (nEndChar < li.Length() || li.m_nEolChars) { // preserve characters after deleted range by shifting up @@ -1153,7 +1091,7 @@ CString CCrystalTextBuffer:: StripTail (int i, int bytes) { - SLineInfo & li = m_aLines[i]; + LineInfo & li = m_aLines[i]; // Must at least take off the EOL characters ASSERT(bytes >= li.FullLength() - li.Length()); @@ -1218,7 +1156,7 @@ int haseol = 0; nTextPos = 0; // advance to end of line - while (nTextPos < cchText && !iseol(pszText[nTextPos])) + while (nTextPos < cchText && !LineInfo::IsEol(pszText[nTextPos])) nTextPos++; // advance after EOL of line if (nTextPos < cchText) @@ -1226,7 +1164,7 @@ haseol = 1; LPCTSTR eol = &pszText[nTextPos]; nTextPos++; - if (nTextPos < cchText && isdoseol(eol)) + if (nTextPos < cchText && LineInfo::IsDosEol(eol)) nTextPos++; } Modified: trunk/Src/editlib/ccrystaltextbuffer.h =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-04 15:38:15 UTC (rev 5734) +++ trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-04 20:54:49 UTC (rev 5735) @@ -151,7 +151,7 @@ }; // Lines of text - CArray < SLineInfo, SLineInfo & >m_aLines; + CArray < LineInfo, LineInfo & >m_aLines; // Undo std::vector<SUndoRecord> m_aUndoBuf; /**< Undo records. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ki...@us...> - 2008-08-05 20:30:06
|
Revision: 5738 http://winmerge.svn.sourceforge.net/winmerge/?rev=5738&view=rev Author: kimmov Date: 2008-08-05 20:30:02 +0000 (Tue, 05 Aug 2008) Log Message: ----------- PATCH: [ 2039263 ] Refactor editor linebuf code to class Modified Paths: -------------- trunk/Src/GhostTextBuffer.cpp trunk/Src/editlib/LineInfo.cpp trunk/Src/editlib/LineInfo.h trunk/Src/editlib/ccrystaltextbuffer.cpp trunk/Src/editlib/ccrystaltextbuffer.h Modified: trunk/Src/GhostTextBuffer.cpp =================================================================== --- trunk/Src/GhostTextBuffer.cpp 2008-08-05 19:15:34 UTC (rev 5737) +++ trunk/Src/GhostTextBuffer.cpp 2008-08-05 20:30:02 UTC (rev 5738) @@ -136,7 +136,7 @@ for (int i = nLine ; i < nLine + nCount; i++) { ASSERT (GetLineFlags(i) & LF_GHOST); - delete[] m_aLines[i].m_pcLine; + m_aLines[i].Clear(); } m_aLines.RemoveAt (nLine, nCount); @@ -210,7 +210,7 @@ int soffset = (i == nStartLine ? nStartChar : 0); int eoffset = (i == nEndLine ? nEndChar : GetLineLength(i)); int chars = eoffset - soffset; - LPCTSTR szLine = m_aLines[i].m_pcLine + soffset; + LPCTSTR szLine = m_aLines[i].GetLine(soffset); CopyMemory(pszBuf, szLine, chars * sizeof(TCHAR)); pszBuf += chars; @@ -234,7 +234,7 @@ int soffset = (i == nStartLine ? nStartChar : 0); int eoffset = (i == nEndLine ? nEndChar : GetFullLineLength(i)); int chars = eoffset - soffset; - LPCTSTR szLine = m_aLines[i].m_pcLine + soffset; + LPCTSTR szLine = m_aLines[i].GetLine(soffset); CopyMemory(pszBuf, szLine, chars * sizeof(TCHAR)); pszBuf += chars; @@ -340,9 +340,9 @@ int bLastLineGhost = ((GetLineFlags(apparent_ptEndPos.y) & LF_GHOST) != 0); if ((apparent_ptStartPos.y < m_aLines.GetSize ()) && - (apparent_ptStartPos.x <= m_aLines[apparent_ptStartPos.y].m_nLength) && + (apparent_ptStartPos.x <= m_aLines[apparent_ptStartPos.y].Length()) && (apparent_ptEndPos.y < m_aLines.GetSize ()) && - (apparent_ptEndPos.x <= m_aLines[apparent_ptEndPos.y].m_nLength)) + (apparent_ptEndPos.x <= m_aLines[apparent_ptEndPos.y].Length())) { GetTextWithoutEmptys (apparent_ptStartPos.y, apparent_ptStartPos.x, apparent_ptEndPos.y, apparent_ptEndPos.x, text); if (text.GetLength() == ur.GetTextLength() && memcmp(text, ur.GetText(), text.GetLength() * sizeof(TCHAR)) == 0) @@ -884,7 +884,7 @@ for(ct = 0; ct < nlines; ct++) { if (GetLineFlags(ct) & LF_GHOST) - delete[] m_aLines[ct].m_pcLine; + m_aLines[ct].FreeBuffer(); } // Compact non-ghost lines // (we copy the buffer address, so the buffer don't move and we don't free it) @@ -1203,34 +1203,32 @@ if (bLastRealLine) { bLastRealLine = 0; - if (m_aLines[i].m_nEolChars != 0) + if (m_aLines[i].HasEol()) { // if the last real line has an EOL, remove it - m_aLines[i].m_pcLine[m_aLines[i].m_nLength] = '\0'; - m_aLines[i].m_nEolChars = 0; - if (pSource!=NULL) + m_aLines[i].RemoveEol(); + if (pSource != NULL) UpdateViews (pSource, NULL, UPDATE_HORZRANGE | UPDATE_SINGLELINE, i); } } else { - if (m_aLines[i].m_nEolChars == 0) + if (!m_aLines[i].HasEol()) { // if a real line (not the last) has no EOL, add one AppendLine (i, GetDefaultEol(), (int) _tcslen(GetDefaultEol())); - if (pSource!=NULL) + if (pSource != NULL) UpdateViews (pSource, NULL, UPDATE_HORZRANGE | UPDATE_SINGLELINE, i); } } } else { - if (m_aLines[i].m_nEolChars != 0) + if (m_aLines[i].HasEol()) { // if a ghost line has an EOL, remove it - m_aLines[i].m_pcLine[m_aLines[i].m_nLength] = '\0'; - m_aLines[i].m_nEolChars = 0; - if (pSource!=NULL) + m_aLines[i].RemoveEol(); + if (pSource != NULL) UpdateViews (pSource, NULL, UPDATE_HORZRANGE | UPDATE_SINGLELINE, i); } } Modified: trunk/Src/editlib/LineInfo.cpp =================================================================== --- trunk/Src/editlib/LineInfo.cpp 2008-08-05 19:15:34 UTC (rev 5737) +++ trunk/Src/editlib/LineInfo.cpp 2008-08-05 20:30:02 UTC (rev 5738) @@ -16,21 +16,74 @@ #endif /** + @brief Constructor. + */ +LineInfo::LineInfo() +: m_pcLine(NULL) +, m_nLength(0) +, m_nMax(0) +, m_nEolChars(0) +, m_dwFlags(0) +, m_dwRevisionNumber(0) +{ +}; + +/** + * @brief Clear item. + * Frees buffer, sets members to initial values. + */ +void LineInfo::Clear() +{ + if (m_pcLine != NULL) + { + delete[] m_pcLine; + m_pcLine = NULL; + m_nLength = 0; + m_nMax = 0; + m_nEolChars = 0; + m_dwFlags = 0; + m_dwRevisionNumber = 0; + } +} + +/** + * @brief Free reserved memory. + * Frees reserved memory, but does not clear flags. + */ +void LineInfo::FreeBuffer() +{ + if (m_pcLine != NULL) + { + delete[] m_pcLine; + m_pcLine = NULL; + m_nLength = 0; + m_nMax = 0; + m_nEolChars = 0; + } +} + +/** * @brief Create a line. * @param [in] pszLine Line data. * @param [in] nLength Line length. */ void LineInfo::Create(LPCTSTR pszLine, int nLength) { + if (nLength == 0) + { + CreateEmpty(); + return; + } + m_nLength = nLength; m_nMax = ALIGN_BUF_SIZE (m_nLength + 1); ASSERT (m_nMax >= m_nLength + 1); + if (m_pcLine != NULL) + delete[] m_pcLine; m_pcLine = new TCHAR[m_nMax]; - if (m_nLength > 0) - { - DWORD dwLen = sizeof (TCHAR) * m_nLength; - CopyMemory (m_pcLine, pszLine, dwLen); - } + ZeroMemory(m_pcLine, m_nMax * sizeof(TCHAR)); + const DWORD dwLen = sizeof (TCHAR) * m_nLength; + CopyMemory (m_pcLine, pszLine, dwLen); m_pcLine[m_nLength] = '\0'; int nEols = 0; @@ -50,8 +103,10 @@ m_nLength = 0; m_nEolChars = 0; m_nMax = ALIGN_BUF_SIZE (m_nLength + 1); + if (m_pcLine != NULL) + delete [] m_pcLine; m_pcLine = new TCHAR[m_nMax]; - m_pcLine[0] = '\0'; + ZeroMemory(m_pcLine, m_nMax * sizeof(TCHAR)); } /** @@ -89,3 +144,121 @@ m_nLength -= m_nEolChars; ASSERT (m_nLength + m_nEolChars <= m_nMax); } + +/** + * @brief Has the line EOL? + * @return TRUE if the line has EOL bytes. + */ +BOOL LineInfo::HasEol() const +{ + if (m_nEolChars) + return TRUE; + else + return FALSE; +} + +/** + * @brief Get line's EOL bytes. + * @return EOL bytes, or NULL if no EOL bytes. + */ +LPCTSTR LineInfo::GetEol() const +{ + if (HasEol()) + return &m_pcLine[Length()]; + else + return NULL; +} + +/** + * @brief Change line's EOL. + * @param [in] lpEOL New EOL bytes. + * @return TRUE if succeeded, FALSE if failed (nothing to change). + */ +BOOL LineInfo::ChangeEol(LPCTSTR lpEOL) +{ + const int nNewEolChars = (int) _tcslen(lpEOL); + + // Check if we really are changing EOL. + if (nNewEolChars == m_nEolChars) + if (_tcscmp(m_pcLine + Length(), lpEOL) == 0) + return FALSE; + + int nBufNeeded = m_nLength + nNewEolChars+1; + if (nBufNeeded > m_nMax) + { + m_nMax = ALIGN_BUF_SIZE (nBufNeeded); + ASSERT (m_nMax >= nBufNeeded); + TCHAR *pcNewBuf = new TCHAR[m_nMax]; + if (FullLength() > 0) + memcpy (pcNewBuf, m_pcLine, sizeof (TCHAR) * (FullLength() + 1)); + delete[] m_pcLine; + m_pcLine = pcNewBuf; + } + + // copy also the 0 to zero-terminate the line + memcpy (m_pcLine + m_nLength, lpEOL, sizeof (TCHAR) * (nNewEolChars + 1)); + m_nEolChars = nNewEolChars; + return TRUE; +} + +/** + * @brief Delete part of the line. + * @param [in] nStartChar Start position for removal. + * @param [in] nEndChar End position for removal. + */ +void LineInfo::Delete(int nStartChar, int nEndChar) +{ + if (nEndChar < Length() || m_nEolChars) + { + // preserve characters after deleted range by shifting up + memcpy (m_pcLine + nStartChar, m_pcLine + nEndChar, + sizeof (TCHAR) * (FullLength() - nEndChar)); + } + m_nLength -= (nEndChar - nStartChar); + m_pcLine[FullLength()] = '\0'; +} + +/** + * @brief Delete line contents from given index to the end. + * @param [in] Index of first character to remove. + */ +void LineInfo::DeleteEnd(int nStartChar) +{ + m_nLength = nStartChar; + m_pcLine[nStartChar] = 0; + m_nEolChars = 0; +} + +/** + * @brief Copy contents from another LineInfo item. + * @param [in] li Item to copy. + */ +void LineInfo::CopyFrom(const LineInfo &li) +{ + if (m_pcLine != NULL) + delete [] m_pcLine; + m_pcLine = new TCHAR[li.m_nMax]; + memcpy(m_pcLine, li.m_pcLine, li.m_nMax * sizeof(TCHAR)); +} + +/** + * @brief Remove EOL from line. + */ +void LineInfo::RemoveEol() +{ + if (HasEol()) + { + m_pcLine[m_nLength] = '\0'; + m_nEolChars = 0; + } +} + +/** + * @brief Get line contents. + * @param [in] index Index of first character to get. + * @note Make a copy from returned string, as it can get reallocated. + */ +LPCTSTR LineInfo::GetLine(int index) const +{ + return &m_pcLine[index]; +} Modified: trunk/Src/editlib/LineInfo.h =================================================================== --- trunk/Src/editlib/LineInfo.h 2008-08-05 19:15:34 UTC (rev 5737) +++ trunk/Src/editlib/LineInfo.h 2008-08-05 20:30:02 UTC (rev 5738) @@ -20,34 +20,47 @@ */ class LineInfo { -public: // All public as this used to be a struct. - TCHAR *m_pcLine; /**< Line data. */ - int m_nLength; /**< Line length (without EOL bytes). */ - int m_nMax; /**< Allocated space for line data. */ - int m_nEolChars; /**< # of EOL bytes. */ +public: DWORD m_dwFlags; /**< Line flags. */ DWORD m_dwRevisionNumber; /**< Edit revision (for edit tracking). */ - int FullLength() const { return m_nLength+m_nEolChars; } - int Length() const { return m_nLength; } + LineInfo(); + void Clear(); + void FreeBuffer(); void Create(LPCTSTR pszLine, int nLength); void CreateEmpty(); void Append(LPCTSTR pszChars, int nLength); + void Delete(int nStartChar, int nEndChar); + void DeleteEnd(int nStartChar); + void CopyFrom(const LineInfo &li); + BOOL HasEol() const; + LPCTSTR GetEol() const; + BOOL ChangeEol(LPCTSTR lpEOL); + void RemoveEol(); + LPCTSTR GetLine(int index = 0) const; - LineInfo () - { - memset (this, 0, sizeof (LineInfo)); - }; + /** @brief Return full line length (including EOL bytes). */ + int FullLength() const { return m_nLength + m_nEolChars; } + /** @brief Return line length. */ + int Length() const { return m_nLength; } + /** @brief Is the char an EOL char? */ static bool IsEol(TCHAR ch) { return ch=='\r' || ch=='\n'; }; + /** @brief Are the characters DOS EOL bytes? */ static bool IsDosEol(LPCTSTR sz) { return sz[0]=='\r' && sz[1]=='\n'; }; + +private: + TCHAR *m_pcLine; /**< Line data. */ + int m_nMax; /**< Allocated space for line data. */ + int m_nLength; /**< Line length (without EOL bytes). */ + int m_nEolChars; /**< # of EOL bytes. */ }; #endif // _EDITOR_LINEINFO_H_ Modified: trunk/Src/editlib/ccrystaltextbuffer.cpp =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-05 19:15:34 UTC (rev 5737) +++ trunk/Src/editlib/ccrystaltextbuffer.cpp 2008-08-05 20:30:02 UTC (rev 5738) @@ -206,8 +206,7 @@ // duplicate the text data for lines after the first one for (int ic = 1; ic < nCount; ic++) { - m_aLines[nPosition+ic].m_pcLine = new TCHAR[li.m_nMax]; - memcpy(m_aLines[nPosition+ic].m_pcLine, li.m_pcLine, li.m_nMax * sizeof(TCHAR)); + m_aLines[nPosition+ic].CopyFrom(li); } #ifdef _DEBUG @@ -285,11 +284,10 @@ FreeAll () { // Free text - int nCount = (int) m_aLines.GetSize (); + const int nCount = (int) m_aLines.GetSize (); for (int I = 0; I < nCount; I++) { - if (m_aLines[I].m_nMax > 0) - delete[] m_aLines[I].m_pcLine; + m_aLines[I].Clear(); } m_aLines.RemoveAll (); @@ -659,7 +657,7 @@ for (i = 0 ; i < m_aLines.GetSize () ; i++) { // the last real line has no EOL - if (m_aLines[i].m_nEolChars == 0) + if (!m_aLines[i].HasEol()) continue; bChanged |= ChangeLineEol(i, lpEOLtoApply); } @@ -686,7 +684,7 @@ ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! - return m_aLines[nLine].m_nLength; + return m_aLines[nLine].Length(); } // number of characters in line (including any trailing eol characters) @@ -696,7 +694,7 @@ ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! - return m_aLines[nLine].m_nLength + m_aLines[nLine].m_nEolChars; + return m_aLines[nLine].FullLength(); } // get pointer to any trailing eol characters (pointer to empty string if none) @@ -704,8 +702,8 @@ GetLineEol (int nLine) const { ASSERT (m_bInit); // Text buffer not yet initialized. - if (m_aLines[nLine].m_nEolChars) - return &m_aLines[nLine].m_pcLine[m_aLines[nLine].Length()]; + if (m_aLines[nLine].HasEol()) + return m_aLines[nLine].GetEol(); else return _T(""); } @@ -714,38 +712,16 @@ ChangeLineEol (int nLine, LPCTSTR lpEOL) { LineInfo & li = m_aLines[nLine]; - int nNewEolChars = (int) _tcslen(lpEOL); - if (nNewEolChars == li.m_nEolChars) - if (_tcscmp(li.m_pcLine + li.Length(), lpEOL) == 0) - return FALSE; - - int nBufNeeded = li.m_nLength + nNewEolChars+1; - if (nBufNeeded > li.m_nMax) - { - li.m_nMax = ALIGN_BUF_SIZE (nBufNeeded); - ASSERT (li.m_nMax >= nBufNeeded); - TCHAR *pcNewBuf = new TCHAR[li.m_nMax]; - if (li.FullLength() > 0) - memcpy (pcNewBuf, li.m_pcLine, sizeof (TCHAR) * (li.FullLength()+1)); - delete[] li.m_pcLine; - li.m_pcLine = pcNewBuf; - } - - // copy also the 0 to zero-terminate the line - memcpy (li.m_pcLine + li.m_nLength, lpEOL, sizeof (TCHAR) * (nNewEolChars+1)); - li.m_nEolChars = nNewEolChars; - - // modified - return TRUE; + return li.ChangeEol(lpEOL); } -LPTSTR CCrystalTextBuffer:: +LPCTSTR CCrystalTextBuffer:: GetLineChars (int nLine) const { ASSERT (m_bInit); // Text buffer not yet initialized. // You must call InitNew() or LoadFromFile() first! - return m_aLines[nLine].m_pcLine; + return m_aLines[nLine].GetLine(); } DWORD CCrystalTextBuffer:: @@ -895,9 +871,9 @@ // You must call InitNew() or LoadFromFile() first! ASSERT (nStartLine >= 0 && nStartLine < m_aLines.GetSize ()); - ASSERT (nStartChar >= 0 && nStartChar <= m_aLines[nStartLine].m_nLength); + ASSERT (nStartChar >= 0 && nStartChar <= m_aLines[nStartLine].Length()); ASSERT (nEndLine >= 0 && nEndLine < m_aLines.GetSize ()); - ASSERT (nEndChar >= 0 && nEndChar <= m_aLines[nEndLine].m_nLength); + ASSERT (nEndChar >= 0 && nEndChar <= m_aLines[nEndLine].Length()); ASSERT (nStartLine < nEndLine || nStartLine == nEndLine && nStartChar <= nEndChar); // some edit functions (copy...) should do nothing when there is no selection. // assert to be sure to catch these 'do nothing' cases. @@ -911,7 +887,7 @@ int nBufSize = 0; for (int L = nStartLine; L <= nEndLine; L++) { - nBufSize += m_aLines[L].m_nLength; + nBufSize += m_aLines[L].Length(); nBufSize += nCRLFLength; } @@ -919,20 +895,20 @@ if (nStartLine < nEndLine) { - int nCount = m_aLines[nStartLine].m_nLength - nStartChar; + int nCount = m_aLines[nStartLine].Length() - nStartChar; if (nCount > 0) { - memcpy (pszBuf, m_aLines[nStartLine].m_pcLine + nStartChar, sizeof (TCHAR) * nCount); + memcpy (pszBuf, m_aLines[nStartLine].GetLine(nStartChar), sizeof (TCHAR) * nCount); pszBuf += nCount; } memcpy (pszBuf, pszCRLF, sizeof (TCHAR) * nCRLFLength); pszBuf += nCRLFLength; for (int I = nStartLine + 1; I < nEndLine; I++) { - nCount = m_aLines[I].m_nLength; + nCount = m_aLines[I].Length(); if (nCount > 0) { - memcpy (pszBuf, m_aLines[I].m_pcLine, sizeof (TCHAR) * nCount); + memcpy (pszBuf, m_aLines[I].GetLine(), sizeof (TCHAR) * nCount); pszBuf += nCount; } memcpy (pszBuf, pszCRLF, sizeof (TCHAR) * nCRLFLength); @@ -940,14 +916,14 @@ } if (nEndChar > 0) { - memcpy (pszBuf, m_aLines[nEndLine].m_pcLine, sizeof (TCHAR) * nEndChar); + memcpy (pszBuf, m_aLines[nEndLine].GetLine(), sizeof (TCHAR) * nEndChar); pszBuf += nEndChar; } } else { int nCount = nEndChar - nStartChar; - memcpy (pszBuf, m_aLines[nStartLine].m_pcLine + nStartChar, sizeof (TCHAR) * nCount); + memcpy (pszBuf, m_aLines[nStartLine].GetLine(nStartChar), sizeof (TCHAR) * nCount); pszBuf += nCount; } text.ReleaseBuffer (pszBuf - text); @@ -1021,9 +997,9 @@ // You must call InitNew() or LoadFromFile() first! ASSERT (nStartLine >= 0 && nStartLine < m_aLines.GetSize ()); - ASSERT (nStartChar >= 0 && nStartChar <= m_aLines[nStartLine].m_nLength); + ASSERT (nStartChar >= 0 && nStartChar <= m_aLines[nStartLine].Length()); ASSERT (nEndLine >= 0 && nEndLine < m_aLines.GetSize ()); - ASSERT (nEndChar >= 0 && nEndChar <= m_aLines[nEndLine].m_nLength); + ASSERT (nEndChar >= 0 && nEndChar <= m_aLines[nEndLine].Length()); ASSERT (nStartLine < nEndLine || nStartLine == nEndLine && nStartChar <= nEndChar); // some edit functions (delete...) should do nothing when there is no selection. // assert to be sure to catch these 'do nothing' cases. @@ -1040,14 +1016,7 @@ { // delete part of one line LineInfo & li = m_aLines[nStartLine]; - if (nEndChar < li.Length() || li.m_nEolChars) - { - // preserve characters after deleted range by shifting up - memcpy (li.m_pcLine + nStartChar, li.m_pcLine + nEndChar, - sizeof (TCHAR) * (li.FullLength() - nEndChar)); - } - li.m_nLength -= (nEndChar - nStartChar); - li.m_pcLine[li.FullLength()] = '\0'; + li.Delete(nStartChar, nEndChar); if (pSource!=NULL) UpdateViews (pSource, &context, UPDATE_SINGLELINE | UPDATE_HORZRANGE, nStartLine); @@ -1056,17 +1025,15 @@ { // delete multiple lines int nRestCount = m_aLines[nEndLine].FullLength() - nEndChar; - CString sTail(m_aLines[nEndLine].m_pcLine + nEndChar, nRestCount); + CString sTail(m_aLines[nEndLine].GetLine(nEndChar), nRestCount); int nDelCount = nEndLine - nStartLine; for (int L = nStartLine + 1; L <= nEndLine; L++) - delete[] m_aLines[L].m_pcLine; + m_aLines[L].Clear(); m_aLines.RemoveAt (nStartLine + 1, nDelCount); // nEndLine is no more valid - m_aLines[nStartLine].m_nLength = nStartChar; - m_aLines[nStartLine].m_pcLine[nStartChar] = 0; - m_aLines[nStartLine].m_nEolChars = 0; + m_aLines[nStartLine].DeleteEnd(nStartChar); if (nRestCount > 0) { AppendLine (nStartLine, sTail, sTail.GetLength()); @@ -1099,9 +1066,9 @@ // Must not take off more than exist ASSERT(offset >= 0); - li.m_nLength = offset; - li.m_nEolChars = 0; - return CString(li.m_pcLine + offset, bytes); + CString ret(li.GetLine(offset), bytes); + li.DeleteEnd(offset); + return ret; } @@ -1129,7 +1096,7 @@ // You must call InitNew() or LoadFromFile() first! ASSERT (nLine >= 0 && nLine < m_aLines.GetSize ()); - ASSERT (nPos >= 0 && nPos <= m_aLines[nLine].m_nLength); + ASSERT (nPos >= 0 && nPos <= m_aLines[nLine].Length()); if (m_bReadOnly) return FALSE; @@ -1398,9 +1365,9 @@ CString text; if ((apparent_ptStartPos.y < m_aLines.GetSize ()) && - (apparent_ptStartPos.x <= m_aLines[apparent_ptStartPos.y].m_nLength) && + (apparent_ptStartPos.x <= m_aLines[apparent_ptStartPos.y].Length()) && (apparent_ptEndPos.y < m_aLines.GetSize ()) && - (apparent_ptEndPos.x <= m_aLines[apparent_ptEndPos.y].m_nLength)) + (apparent_ptEndPos.x <= m_aLines[apparent_ptEndPos.y].Length())) { GetTextWithoutEmptys (apparent_ptStartPos.y, apparent_ptStartPos.x, apparent_ptEndPos.y, apparent_ptEndPos.x, text); if (_tcscmp(text, ur.GetText()) == 0) @@ -1911,7 +1878,7 @@ void CCrystalTextBuffer::DeleteLine(int line, int nCount /*=1*/) { for (int ic = 0; ic < nCount; ic++) - delete[] m_aLines[line+ic].m_pcLine; + m_aLines[line + ic].Clear(); m_aLines.RemoveAt(line, nCount); } Modified: trunk/Src/editlib/ccrystaltextbuffer.h =================================================================== --- trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-05 19:15:34 UTC (rev 5737) +++ trunk/Src/editlib/ccrystaltextbuffer.h 2008-08-05 20:30:02 UTC (rev 5738) @@ -221,7 +221,7 @@ int GetFullLineLength (int nLine) const; // including EOLs LPCTSTR GetLineEol (int nLine) const; BOOL ChangeLineEol (int nLine, LPCTSTR lpEOL); - LPTSTR GetLineChars (int nLine) const; + LPCTSTR GetLineChars (int nLine) const; DWORD GetLineFlags (int nLine) const; DWORD GetLineRevisionNumber (int nLine) const; int GetLineWithFlag (DWORD dwFlag); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2008-08-08 02:11:53
|
Revision: 5754 http://winmerge.svn.sourceforge.net/winmerge/?rev=5754&view=rev Author: marcelgosselin Date: 2008-08-08 02:11:51 +0000 (Fri, 08 Aug 2008) Log Message: ----------- Use std::swap instead of home-made swap Modified Paths: -------------- trunk/Src/Common/coretools.h trunk/Src/DiffList.cpp trunk/Src/MergeDoc.cpp Modified: trunk/Src/Common/coretools.h =================================================================== --- trunk/Src/Common/coretools.h 2008-08-07 23:19:10 UTC (rev 5753) +++ trunk/Src/Common/coretools.h 2008-08-08 02:11:51 UTC (rev 5754) @@ -47,15 +47,6 @@ /******** function protos ********/ template <class T> -void swap(T *a,T *b) -{ - T tmp; - tmp=*a; - *a=*b; - *b=tmp; -} - -template <class T> void selection_sort(T *ary, UINT cnt) { register int i,j,smallest; Modified: trunk/Src/DiffList.cpp =================================================================== --- trunk/Src/DiffList.cpp 2008-08-07 23:19:10 UTC (rev 5753) +++ trunk/Src/DiffList.cpp 2008-08-08 02:11:51 UTC (rev 5754) @@ -22,41 +22,15 @@ // ID line follows -- this is updated by SVN // $Id$ -#include "stdafx.h" +#include "StdAfx.h" #include "DiffList.h" #include "DiffWrapper.h" #include "coretools.h" -using namespace std; +using std::swap; +using std::vector; -static void swap(int &a, int &b); -static void swap(UINT &a, UINT &b); - /** - * @brief Swap two integers. - * @param [in] a First integer. - * @param [in] b Second integer. - */ -static void swap(int &a, int &b) -{ - int tmp = a; - a = b; - b = tmp; -} - -/** - * @brief Swap two UINTs. - * @param [in] a First UINT. - * @param [in] b Second UINT. - */ -static void swap(UINT &a, UINT &b) -{ - UINT tmp = a; - a = b; - b = tmp; -} - -/** * @brief Swap diff sides. */ void DIFFRANGE::swap_sides() Modified: trunk/Src/MergeDoc.cpp =================================================================== --- trunk/Src/MergeDoc.cpp 2008-08-07 23:19:10 UTC (rev 5753) +++ trunk/Src/MergeDoc.cpp 2008-08-08 02:11:51 UTC (rev 5754) @@ -27,23 +27,23 @@ // ID line follows -- this is updated by SVN // $Id$ -#include "stdafx.h" -#include <Shlwapi.h> // PathCompactPathEx() +#include "StdAfx.h" +#include <shlwapi.h> // PathCompactPathEx() #include "UnicodeString.h" #include "Merge.h" #include "MainFrm.h" #include "DiffTextBuffer.h" #include "Environment.h" #include "Ucs2Utf8.h" -#include "diffcontext.h" // FILE_SAME +#include "DiffContext.h" // FILE_SAME #include "MovedLines.h" -#include "getopt.h" -#include "fnmatch.h" +#include "GETOPT.H" +#include "FNMATCH.H" #include "coretools.h" #include "MergeEditView.h" #include "MergeDiffDetailView.h" -#include "childFrm.h" -#include "dirdoc.h" +#include "ChildFrm.h" +#include "DirDoc.h" #include "files.h" #include "WaitStatusCursor.h" #include "FileTransform.h" @@ -69,6 +69,8 @@ static char THIS_FILE[] = __FILE__; #endif +using std::swap; + /** @brief Max len of path in caption. */ static const UINT CAPTION_PATH_MAX = 50; @@ -2528,13 +2530,13 @@ m_pDetailView[1]->SetDlgCtrlID(nLeftDetailViewId); // Swap buffers and so on - swap<CDiffTextBuffer *>(&m_ptBuf[0], &m_ptBuf[1]); - swap<CMergeEditView *>(&m_pView[0], &m_pView[1]); - swap<CMergeDiffDetailView *>(&m_pDetailView[0], &m_pDetailView[1]); - swap<DiffFileInfo *>(&m_pSaveFileInfo[0], &m_pSaveFileInfo[1]); - swap<DiffFileInfo *>(&m_pRescanFileInfo[0], &m_pRescanFileInfo[1]); - swap<BUFFERTYPE>(&m_nBufferType[0], &m_nBufferType[1]); - swap<BOOL>(&m_bEditAfterRescan[0], &m_bEditAfterRescan[1]); + swap(m_ptBuf[0], m_ptBuf[1]); + swap(m_pView[0], m_pView[1]); + swap(m_pDetailView[0], m_pDetailView[1]); + swap(m_pSaveFileInfo[0], m_pSaveFileInfo[1]); + swap(m_pRescanFileInfo[0], m_pRescanFileInfo[1]); + swap(m_nBufferType[0], m_nBufferType[1]); + swap(m_bEditAfterRescan[0], m_bEditAfterRescan[1]); m_strDesc[0].swap(m_strDesc[1]); m_filePaths.Swap(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |