Browse Source

StreamReader: fix out-of-range exception

Kim Kulling 8 years ago
parent
commit
a2bbf76cf4
1 changed files with 14 additions and 3 deletions
  1. 14 3
      code/IOStreamBuffer.h

+ 14 - 3
code/IOStreamBuffer.h

@@ -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) {