StreamReader: fix out-of-range exception
authorKim Kulling <kim.kulling@googlemail.com>
Thu, 27 Jul 2017 18:49:49 +0000 (20:49 +0200)
committerKim Kulling <kim.kulling@googlemail.com>
Thu, 27 Jul 2017 18:49:49 +0000 (20:49 +0200)
code/IOStreamBuffer.h

index 6ca37b6..d7528de 100644 (file)
@@ -284,11 +284,17 @@ bool IOStreamBuffer<T>::getNextDataLine( std::vector<T> &buffer, T continuationT
     return true;
 }
 
+static 
+inline
+bool isEndOfCache( size_t pos, size_t cacheSize ) {
+    return ( pos == cacheSize );
+}
+
 template<class T>
 inline
 bool IOStreamBuffer<T>::getNextLine(std::vector<T> &buffer) {
     buffer.resize(m_cacheSize);
-    if (m_cachePos == m_cacheSize || 0 == m_filePos) {
+    if ( isEndOfCache( m_cachePos, m_cacheSize ) || 0 == m_filePos) {
        if (!readNextBlock()) {
           return false;
        }
@@ -300,11 +306,16 @@ bool IOStreamBuffer<T>::getNextLine(std::vector<T> &buffer) {
             ++m_cachePos;
         }
         ++m_cachePos;
+        if ( isEndOfCache( m_cachePos, m_cacheSize ) ) {
+            if ( !readNextBlock() ) {
+                return false;
+            }
+        }
     }
 
     size_t i = 0;
-    while (!IsLineEnd(m_cache[m_cachePos])) {
-        buffer[i] = m_cache[m_cachePos];
+    while (!IsLineEnd(m_cache[ m_cachePos ])) {
+        buffer[i] = m_cache[ m_cachePos ];
         m_cachePos++;
         i++;
         if (m_cachePos >= m_cacheSize) {