From ce42fa68ffea09fb12a1439fd0cdbf6e9896f57b Mon Sep 17 00:00:00 2001 From: oy Date: Thu, 20 Jan 2011 21:17:11 +0100 Subject: fixed possible CRLF line ending problem in the linereader --- src/engine/shared/linereader.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'src/engine/shared') 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 -- cgit 1.4.1