[Winmerge-svn] SF.net SVN: winmerge:[6936] trunk/Src
Windows visual diff and merge for files and directories
Brought to you by:
christianlist,
grimmdp
From: <ki...@us...> - 2009-07-26 17:17:28
|
Revision: 6936 http://winmerge.svn.sourceforge.net/winmerge/?rev=6936&view=rev Author: kimmov Date: 2009-07-26 17:17:18 +0000 (Sun, 26 Jul 2009) Log Message: ----------- Catch out of memory error when converting byte array to string. Modified Paths: -------------- trunk/Src/Common/UniFile.cpp trunk/Src/Common/unicoder.cpp trunk/Src/Common/unicoder.h trunk/Src/UniMarkdownFile.cpp Modified: trunk/Src/Common/UniFile.cpp =================================================================== --- trunk/Src/Common/UniFile.cpp 2009-07-26 16:26:58 UTC (rev 6935) +++ trunk/Src/Common/UniFile.cpp 2009-07-26 17:17:18 UTC (rev 6936) @@ -456,7 +456,7 @@ * @param [out] line Line read. * @param [out] eol EOL bytes read (if any). * @param [out] lossy TRUE if there were lossy encoding. - * @return TRUE if there is more lines to read, TRUE when last line is read. + * @return true if there is more lines to read, false when last line is read. */ bool UniMemFile::ReadString(String & line, String & eol, bool * lossy) { @@ -581,7 +581,11 @@ RecordZero(m_txtstats, offset); } } - line = ucr::maketstring((LPCSTR)m_current, eolptr - m_current, m_codepage, lossy); + bool success = ucr::maketstring(line, (LPCSTR)m_current, eolptr - m_current, m_codepage, lossy); + if (!success) + { + return false; + } if (lossy && *lossy) ++m_txtstats.nlosses; if (!eof) Modified: trunk/Src/Common/unicoder.cpp =================================================================== --- trunk/Src/Common/unicoder.cpp 2009-07-26 16:26:58 UTC (rev 6935) +++ trunk/Src/Common/unicoder.cpp 2009-07-26 17:17:18 UTC (rev 6936) @@ -463,18 +463,27 @@ } /** - * @brief Convert series of bytes (8-bit chars) to TCHARs, using specified codepage + * @brief Convert series of bytes (8-bit chars) to TCHARs. * - * TODO: This doesn't inform the caller whether translation was lossy + * @param [out] str String returned. + * @param [in] lpd Original byte array to convert. + * @param [in] len Length of the original byte array. + * @param [in] codepage Codepage used. + * @param [out] lossy Was conversion lossy? + * @return true if conversion succeeds, false otherwise. + * @todo This doesn't inform the caller whether translation was lossy * In fact, this doesn't even know. Probably going to have to make * two passes, the first with MB_ERR_INVALID_CHARS. Ugh. :( */ -String maketstring(const char* lpd, unsigned int len, int codepage, bool * lossy) +bool maketstring(String & str, const char* lpd, unsigned int len, int codepage, bool * lossy) { int defcodepage = getDefaultCodepage(); if (!len) - return _T(""); + { + str.clear(); + return true; + } // 0 is a valid value (CP_ACP)! if (codepage == -1) @@ -485,8 +494,17 @@ // TCHAR is wchar_t, so convert into String (str) DWORD flags = MB_ERR_INVALID_CHARS; int wlen = len * 2 + 6; - String str; - str.resize(wlen); + + try + { + str.resize(wlen); + } + catch (std::bad_alloc) + { + // Not enough memory - exit + return false; + } + LPWSTR wbuff = &*str.begin(); do { @@ -508,15 +526,23 @@ ASSERT(FALSE); --n; } - str.resize(n); - return str; + try + { + str.resize(n); + } + catch (std::bad_alloc) + { + // Not enough memory - exit + return false; + } + return true; } *lossy = true; flags ^= MB_ERR_INVALID_CHARS; } while (flags == 0 && GetLastError() == ERROR_NO_UNICODE_TRANSLATION); str = _T('?'); - return str; + return true; #else if (EqualCodepages(codepage, defcodepage)) @@ -526,8 +552,8 @@ return String(lpd, len); } - String str = CrossConvertToStringA(lpd, len, codepage, defcodepage, lossy); - return str; + str = CrossConvertToStringA(lpd, len, codepage, defcodepage, lossy); + return true; #endif } Modified: trunk/Src/Common/unicoder.h =================================================================== --- trunk/Src/Common/unicoder.h 2009-07-26 16:26:58 UTC (rev 6935) +++ trunk/Src/Common/unicoder.h 2009-07-26 17:17:18 UTC (rev 6936) @@ -52,7 +52,7 @@ String maketchar(unsigned int ch, bool & lossy); int writeBom(void* dest, UNICODESET unicoding); unsigned int get_unicode_char(unsigned char * ptr, UNICODESET unicoding, int codepage = 0); -String maketstring(const char* lpd, unsigned int len, int codepage, bool * lossy); +bool maketstring(String & str, const char* lpd, unsigned int len, int codepage, bool * lossy); String maketchar(unsigned int unich, bool & lossy); String maketchar(unsigned int unich, bool & lossy, unsigned int codepage); unsigned int byteToUnicode(unsigned char ch); Modified: trunk/Src/UniMarkdownFile.cpp =================================================================== --- trunk/Src/UniMarkdownFile.cpp 2009-07-26 16:26:58 UTC (rev 6935) +++ trunk/Src/UniMarkdownFile.cpp 2009-07-26 17:17:18 UTC (rev 6936) @@ -138,7 +138,8 @@ String UniMarkdownFile::maketstring(LPCSTR lpd, UINT len) { bool lossy = false; - String s = ucr::maketstring(lpd, len, m_codepage, &lossy); + String s; + ucr::maketstring(s, lpd, len, m_codepage, &lossy); if (lossy) ++m_txtstats.nlosses; return s; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |