diff options
Diffstat (limited to 'src/engine/shared/linereader.cpp')
| -rw-r--r-- | src/engine/shared/linereader.cpp | 24 |
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 |