OSDN Git Service

PATCH: [ 1398959 ] Implement GuessEncoding in QuickCompare
authorPerry Rapp <elsapo@users.sourceforge.net>
Sat, 7 Jan 2006 18:26:28 +0000 (18:26 +0000)
committerPerry Rapp <elsapo@users.sourceforge.net>
Sat, 7 Jan 2006 18:26:28 +0000 (18:26 +0000)
  Src: codepage_detect.cpp DiffWrapper.cpp DiffWrapper.h

Src/Changes.txt
Src/DiffWrapper.cpp
Src/DiffWrapper.h
Src/codepage_detect.cpp

index b0d4cfa..7446605 100644 (file)
@@ -2,6 +2,8 @@
  PATCH: [ 1398064 ] Catalan translation update
  By Jordi Vilar
   Src/Languages/Catalan: MergeCatalan.rc
+ PATCH: [ 1398959 ] Implement GuessEncoding in QuickCompare
+  Src: codepage_detect.cpp DiffWrapper.cpp DiffWrapper.h
 
 2006-01-05 WinMerge experimental release 2.5.0.5 (cvs)
 
index 285c140..f898b97 100644 (file)
@@ -799,9 +799,9 @@ void DiffFileData::Reset()
 }
 
 /**
- * @brief Try to deduce encoding for this file
+ * @brief Try to deduce encoding for this file (given copy in memory)
  */
-void DiffFileData::Filepath_GuessEncoding(FileLocation & fpenc, const char **data, int count)
+void DiffFileData::GuessEncoding_from_buffer(FileLocation & fpenc, const char **data, int count)
 {
        if (fpenc.unicoding == 0)
        {
@@ -810,16 +810,23 @@ void DiffFileData::Filepath_GuessEncoding(FileLocation & fpenc, const char **dat
        }
 }
 
-/** @brief Guess encoding for one file */
-void DiffFileData::GuessEncoding(int side, CDiffContext * pCtxt)
+/** @brief Guess encoding for one file (in DiffContext memory buffer) */
+void DiffFileData::GuessEncoding_from_buffer_in_DiffContext(int side, CDiffContext * pCtxt)
 {
-       if (!pCtxt->m_bGuessEncoding)
-               return;
-
-       Filepath_GuessEncoding(m_FileLocation[side], m_inf[side].linbuf + m_inf[side].linbuf_base, 
+       GuessEncoding_from_buffer(m_FileLocation[side], m_inf[side].linbuf + m_inf[side].linbuf_base, 
                                        m_inf[side].valid_lines - m_inf[side].linbuf_base);
 }
 
+/** @brief Guess encoding for one file (in DiffContext memory buffer) */
+void DiffFileData::GuessEncoding_from_FileLocation(FileLocation & fpenc)
+{
+       if (fpenc.unicoding == 0)
+       {
+               BOOL bGuess = TRUE;
+               GuessCodepageEncoding(fpenc.filepath, &fpenc.unicoding, &fpenc.codepage, bGuess);
+       }
+}
+
 /** @brief Compare two specified files */
 int DiffFileData::diffutils_compare_files(int depth)
 {
@@ -1457,6 +1464,15 @@ int DiffFileData::prepAndCompareTwoFiles(CDiffContext * pCtxt, DIFFITEM &di)
                code = diffutils_compare_files(0);
                if (DIFFCODE::isResultError(code))
                        di.errorDesc = _T("DiffUtils Error");
+
+               if (!DIFFCODE::isResultError(code) && pCtxt->m_bGuessEncoding)
+               {
+                       // entire file is in memory in the diffutils buffers
+                       // inside the diff context, so may as well use in-memory copy
+                       GuessEncoding_from_buffer_in_DiffContext(0, pCtxt);
+                       GuessEncoding_from_buffer_in_DiffContext(1, pCtxt);
+               }
+       
        }
        else if (nCompMethod == CMP_QUICK_CONTENT)
        {
@@ -1466,6 +1482,12 @@ int DiffFileData::prepAndCompareTwoFiles(CDiffContext * pCtxt, DIFFITEM &di)
                // Set to special value to indicate invalid
                m_ndiffs = DIFFS_UNKNOWN_QUICKCOMPARE;
                m_ntrivialdiffs = DIFFS_UNKNOWN_QUICKCOMPARE;
+
+               if (!DIFFCODE::isResultError(code) && pCtxt->m_bGuessEncoding)
+               {
+                       GuessEncoding_from_FileLocation(m_FileLocation[0]);
+                       GuessEncoding_from_FileLocation(m_FileLocation[1]);
+               }
        }
        else
        {
@@ -1475,11 +1497,6 @@ int DiffFileData::prepAndCompareTwoFiles(CDiffContext * pCtxt, DIFFITEM &di)
                goto exitPrepAndCompare;
        }
 
-       if (!DIFFCODE::isResultError(code))
-       {
-               GuessEncoding(0, pCtxt);
-               GuessEncoding(1, pCtxt);
-       }
 
 exitPrepAndCompare:
        Reset();
index d3defff..601f090 100644 (file)
@@ -229,13 +229,14 @@ struct DiffFileData
 
        int diffutils_compare_files(int depth);
        int byte_compare_files(BOOL bStopAfterFirstDiff, const IAbortable * piAbortable);
-       void GuessEncoding(int side, CDiffContext * pCtxt);
        int prepAndCompareTwoFiles(CDiffContext * pCtxt, DIFFITEM &di);
        BOOL Diff2Files(struct change ** diffs, int depth,
                int * bin_status, BOOL bMovedBlocks);
        bool Filepath_Transform(FileLocation & fpenc, const CString & filepath, CString & filepathTransformed,
                const CString & filteredFilenames, PrediffingInfo * infoPrediffer, int fd);
-       void Filepath_GuessEncoding(FileLocation & fpenc, const char **data, int count);
+       void GuessEncoding_from_buffer_in_DiffContext(int side, CDiffContext * pCtxt);
+       static void GuessEncoding_from_buffer(FileLocation & fpenc, const char **data, int count);
+       void GuessEncoding_from_FileLocation(FileLocation & fpenc);
 
 // Data (public)
        file_data * m_inf;
index 13e2b22..7d98ce6 100644 (file)
@@ -253,7 +253,9 @@ void GuessCodepageEncoding(LPCTSTR filepath, int *unicoding, int *codepage, BOOL
        if (fi.nByteOrder == 1 && bGuessEncoding)
        {
                LPCTSTR ext = PathFindExtension(filepath);
-               if (unsigned cp = GuessEncoding_from_bytes(ext, (char *)fi.pImage, fi.cbImage))
+               const char *src = (char *)fi.pImage;
+               size_t len = fi.cbImage;
+               if (unsigned cp = GuessEncoding_from_bytes(ext, src, len))
                {
                        *codepage = cp;
                }