Index: FileTextLines.cpp
===================================================================
--- FileTextLines.cpp	(revision 6248)
+++ FileTextLines.cpp	(working copy)
@@ -21,6 +21,61 @@
 #include "UnicodeUtils.h"
 #include ".\filetextlines.h"
 
+CStdioFileK::CStdioFileK(LPCTSTR lpszFileName, UINT nOpenFlags)
+{
+	ASSERT(lpszFileName != NULL);
+	ASSERT(AfxIsValidString(lpszFileName));
+
+	CFileException e;
+	if (!Open(lpszFileName, nOpenFlags, &e))
+		AfxThrowFileException(e.m_cause, e.m_lOsError, e.m_strFileName);
+}
+
+BOOL CStdioFileK::ReadString(CStringA& rString)
+{
+	ASSERT_VALID(this);
+
+#ifndef afxChNil
+	static TCHAR afxChNil = '\0';
+#endif
+
+	rString = &afxChNil;    // empty string without deallocating
+	const int nMaxSize = 128;
+	LPSTR lpsz = rString.GetBuffer(nMaxSize);
+	LPSTR lpszResult;
+	int nLen = 0;
+	for (;;)
+	{
+		lpszResult = fgets(lpsz, nMaxSize+1, m_pStream);
+		rString.ReleaseBuffer();
+
+		// handle error/eof case
+		if (lpszResult == NULL && !feof(m_pStream))
+		{
+			clearerr(m_pStream);
+			AfxThrowFileException(CFileException::generic, _doserrno,
+				m_strFileName);
+		}
+
+		// if string is read completely or EOF
+		if (lpszResult == NULL ||
+			(nLen = strlen(lpsz)) < nMaxSize ||
+			lpsz[nLen-1] == '\n')
+			break;
+
+		nLen = rString.GetLength();
+		lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen;
+	}
+
+	// remove '\n' from end of string if present
+	lpsz = rString.GetBuffer(0);
+	nLen = rString.GetLength();
+	if (nLen != 0 && lpsz[nLen-1] == '\n')
+		rString.GetBufferSetLength(nLen-1);
+
+	return lpszResult != NULL;
+}
+
 CFileTextLines::CFileTextLines(void)
 {
 }
@@ -236,10 +291,10 @@
 	}
 	
 	BOOL bRetval = TRUE;
-	CString sLine;
+	CStringA sLine;
 	try
 	{
-		CStdioFile file(sFilePath, (m_UnicodeType == CFileTextLines::UNICODE_LE ? CFile::typeBinary : CFile::typeText)
+		CStdioFileK file(sFilePath, (m_UnicodeType == CFileTextLines::UNICODE_LE ? CFile::typeBinary : CFile::typeText)
 			| CFile::modeRead | CFile::shareDenyNone);
 
 		switch (m_UnicodeType)
@@ -258,19 +313,19 @@
 			switch (m_UnicodeType)
 			{
 			case CFileTextLines::ASCII:
-				Add(sLine);
+				Add(CString(sLine));
 				break;
 			case CFileTextLines::UNICODE_LE:
-				Add(sLine);
+				Add(CString(sLine));
 				break;
 			case CFileTextLines::UTF8BOM:
 			case CFileTextLines::UTF8:
 				{
-					Add(CUnicodeUtils::GetUnicode(CUnicodeUtils::ConvertWCHARStringToUTF8(sLine)));
+					Add(CUnicodeUtils::GetUnicode(CUnicodeUtils::ConvertWCHARStringToUTF8(CString(sLine))));
 				}
 				break;
 			default:
-				Add(sLine);
+				Add(CString(sLine));
 			} // switch (m_UnicodeType) 
 		} // while (file.ReadString(sLine)) 
 		file.Close();
Index: FileTextLines.h
===================================================================
--- FileTextLines.h	(revision 6248)
+++ FileTextLines.h	(working copy)
@@ -40,6 +40,12 @@
 typedef CStdArray<CString> CStdCStringArray;
 typedef CStdArray<DWORD> CStdDWORDArray;
 
+class CStdioFileK : public CStdioFile
+{
+public:
+	CStdioFileK(LPCTSTR lpszFileName, UINT nOpenFlags);
+	BOOL ReadString( CStringA& rString);
+};
 
 /**
  * \ingroup TortoiseMerge


