about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-01-20 21:17:11 +0100
committeroy <Tom_Adams@web.de>2011-01-20 21:17:11 +0100
commitce42fa68ffea09fb12a1439fd0cdbf6e9896f57b (patch)
tree5993eed6ac71edafc9e24782bc4ece4e6f60f292 /src
parent7c67a1334c1cac4c8144aec86dfe516fc073e790 (diff)
downloadzcatch-ce42fa68ffea09fb12a1439fd0cdbf6e9896f57b.tar.gz
zcatch-ce42fa68ffea09fb12a1439fd0cdbf6e9896f57b.zip
fixed possible CRLF line ending problem in the linereader
Diffstat (limited to 'src')
-rw-r--r--src/engine/shared/linereader.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/engine/shared/linereader.cpp b/src/engine/shared/linereader.cpp
index 3efddb59..b705ff0e 100644
--- a/src/engine/shared/linereader.cpp
+++ b/src/engine/shared/linereader.cpp
@@ -4,7 +4,7 @@
 
 void CLineReader::Init(IOHANDLE io)
 {
-	m_BufferMaxSize = 4*1024;
+	m_BufferMaxSize = sizeof(m_aBuffer);
 	m_BufferSize = 0;
 	m_BufferPos = 0;
 	m_IO = io;
@@ -13,6 +13,7 @@ void CLineReader::Init(IOHANDLE io)
 char *CLineReader::Get()
 {
 	unsigned LineStart = m_BufferPos;
+	bool CRLFBreak = false;
 
 	while(1)
 	{
@@ -53,10 +54,25 @@ char *CLineReader::Get()
 			if(m_aBuffer[m_BufferPos] == '\n' || m_aBuffer[m_BufferPos] == '\r')
 			{
 				// line found
-				if(m_aBuffer[m_BufferPos] == '\r' && m_BufferPos+1 < m_BufferSize && m_aBuffer[m_BufferPos+1] == '\n')
+				if(m_aBuffer[m_BufferPos] == '\r')
+				{
+					if(m_BufferPos+1 >= m_BufferSize)
+					{
+						// read more to get the connected '\n'
+						CRLFBreak = true;
+						++m_BufferPos;
+						continue;
+					}
+					else if(m_aBuffer[m_BufferPos+1] == '\n')
+						m_aBuffer[m_BufferPos++] = 0;
+				}
+				m_aBuffer[m_BufferPos++] = 0;
+				return &m_aBuffer[LineStart];
+			}
+			else if(CRLFBreak)
+			{
+				if(m_aBuffer[m_BufferPos] == '\n')
 					m_aBuffer[m_BufferPos++] = 0;
-				m_aBuffer[m_BufferPos] = 0;
-				m_BufferPos++;
 				return &m_aBuffer[LineStart];
 			}
 			else