OSDN Git Service

word level diff dit not work if the text contains NUL characters
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Thu, 14 Mar 2019 04:53:37 +0000 (13:53 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Thu, 14 Mar 2019 04:53:37 +0000 (13:53 +0900)
Src/MergeDoc.cpp
Src/MergeDocLineDiffs.cpp

index fd56b93..41dc4a0 100644 (file)
@@ -1286,9 +1286,9 @@ bool CMergeDoc::WordListCopy(int srcPane, int dstPane, int nDiff, int firstWordD
                int srcEnd   = nSrcOffsets[worddiffs[i].endline[srcPane] - ptSrcStart.y] + worddiffs[i].end[srcPane];
                int dstBegin = nDstOffsets[worddiffs[i].beginline[dstPane] - ptDstStart.y] + worddiffs[i].begin[dstPane];
                int dstEnd   = nDstOffsets[worddiffs[i].endline[dstPane] - ptDstStart.y] + worddiffs[i].end[dstPane];
-               CString text = srcText.Mid(srcBegin - ptSrcStart.x, srcEnd - srcBegin);
-               dstText.Delete(dstBegin - ptDstStart.x, dstEnd - dstBegin);
-               dstText.Insert(dstBegin - ptDstStart.x, text);
+               dstText = dstText.Mid(0, dstBegin - ptDstStart.x)\r
+                       + srcText.Mid(srcBegin - ptSrcStart.x, srcEnd - srcBegin)\r
+                       + dstText.Mid(dstEnd - ptDstStart.x);\r
        }
 
        dbuf.DeleteText(pSource, ptDstStart.y, ptDstStart.x, ptDstEnd.y, ptDstEnd.x, CE_ACTION_MERGE);
index 8078faa..4b23e6d 100644 (file)
@@ -194,7 +194,7 @@ void CMergeDoc::GetWordDiffArray(int nLineIndex, vector<WordDiff> *pWordDiffs)
                if (nLineBegin != nLineEnd || m_ptBuf[file]->GetLineLength(nLineEnd) > 0)
                        m_ptBuf[file]->GetTextWithoutEmptys(nLineBegin, 0, nLineEnd, m_ptBuf[file]->GetLineLength(nLineEnd), strText);
                strText += m_ptBuf[file]->GetLineEol(nLineEnd);
-               str[file] = strText;
+               str[file].assign(strText, strText.GetLength());
 
                nOffsets[file][0] = 0;
                for (int nLine = nLineBegin; nLine < nLineEnd; nLine++)