From 671a788abc51108b883c1bc76f1528305cbe472b Mon Sep 17 00:00:00 2001
From: Rodrigo Braz Monteiro <zeratul@cellosoft.com>
Date: Thu, 20 Nov 2008 04:05:05 +0000
Subject: [PATCH] Originally committed to SVN as r2466.

---
 athenasub/athenasub_2008.vcproj       |  8 +++
 athenasub/src/text_file_reader.cpp    |  2 +-
 athenasub/src/text_reader.cpp         |  4 +-
 athenasub/src/text_reader_cache.cpp   | 85 +++++++++++++++++++++++++++
 athenasub/src/text_reader_cache.h     | 64 ++++++++++++++++++++
 unit_test/src/athenasub/test_file.cpp |  2 +-
 6 files changed, 162 insertions(+), 3 deletions(-)
 create mode 100644 athenasub/src/text_reader_cache.cpp
 create mode 100644 athenasub/src/text_reader_cache.h

diff --git a/athenasub/athenasub_2008.vcproj b/athenasub/athenasub_2008.vcproj
index 9bc5a2546..add3e3045 100644
--- a/athenasub/athenasub_2008.vcproj
+++ b/athenasub/athenasub_2008.vcproj
@@ -475,6 +475,14 @@
 				RelativePath=".\src\text_reader.h"
 				>
 			</File>
+			<File
+				RelativePath=".\src\text_reader_cache.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\src\text_reader_cache.h"
+				>
+			</File>
 			<File
 				RelativePath=".\src\text_writer.cpp"
 				>
diff --git a/athenasub/src/text_file_reader.cpp b/athenasub/src/text_file_reader.cpp
index 128f9b755..e0c245652 100644
--- a/athenasub/src/text_file_reader.cpp
+++ b/athenasub/src/text_file_reader.cpp
@@ -250,5 +250,5 @@ String TextFileReader::GetCurrentEncoding()
 // Rewind the file
 void TextFileReader::Rewind()
 {
-
+	THROW_ATHENA_EXCEPTION(Exception::TODO);
 }
diff --git a/athenasub/src/text_reader.cpp b/athenasub/src/text_reader.cpp
index c6dc0888f..bf3443b5d 100644
--- a/athenasub/src/text_reader.cpp
+++ b/athenasub/src/text_reader.cpp
@@ -37,9 +37,11 @@
 // Headers
 #include "text_reader.h"
 #include "text_file_reader.h"
+#include "text_reader_cache.h"
 using namespace Athenasub;
 
 shared_ptr<TextReader> TextReader::GetReader(wxInputStream &stream,String encoding)
 {
-	return shared_ptr<TextReader>(new TextFileReader(stream,encoding));
+	shared_ptr<TextReader> fileReader = shared_ptr<TextReader>(new TextFileReader(stream,encoding));
+	return shared_ptr<TextReader>(new TextReaderCache(fileReader));
 }
\ No newline at end of file
diff --git a/athenasub/src/text_reader_cache.cpp b/athenasub/src/text_reader_cache.cpp
new file mode 100644
index 000000000..e6e37caf1
--- /dev/null
+++ b/athenasub/src/text_reader_cache.cpp
@@ -0,0 +1,85 @@
+// Copyright (c) 2008, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+// Headers
+#include "text_reader_cache.h"
+using namespace Athenasub;
+
+
+Athenasub::TextReaderCache::TextReaderCache(shared_ptr<TextReader> src)
+: source(src)
+{
+	bufferPos = 0;
+}
+
+String TextReaderCache::ReadLineFromFile()
+{
+	if (bufferPos == buffer.size()) {
+		LoadMore(10);
+	}
+	if (bufferPos == buffer.size()) {
+		return "";
+	}
+	return buffer[bufferPos++];
+}
+
+bool TextReaderCache::HasMoreLines()
+{
+	if (bufferPos != buffer.size())
+		return true;
+	else
+		return CanLoadMore();
+}
+
+void TextReaderCache::Rewind()
+{
+	bufferPos = 0;
+}
+
+void Athenasub::TextReaderCache::LoadMore(int n)
+{
+	for (int i=0;i<n;i++) {
+		if (CanLoadMore())
+			buffer.push_back(source->ReadLineFromFile());
+		else
+			return;
+	}
+}
+
+bool Athenasub::TextReaderCache::CanLoadMore()
+{
+	return source->HasMoreLines();
+}
diff --git a/athenasub/src/text_reader_cache.h b/athenasub/src/text_reader_cache.h
new file mode 100644
index 000000000..5838cadea
--- /dev/null
+++ b/athenasub/src/text_reader_cache.h
@@ -0,0 +1,64 @@
+// Copyright (c) 2008, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+// Headers
+#include "athenasub.h"
+#include "text_reader.h"
+
+
+namespace Athenasub {
+	class TextReaderCache : public TextReader {
+	private:
+		std::vector<String> buffer;
+		size_t bufferPos;
+
+		shared_ptr<TextReader> source;
+
+		void LoadMore(int n=1);
+		bool CanLoadMore();
+
+	public:
+		TextReaderCache(shared_ptr<TextReader> source);
+		virtual ~TextReaderCache() {}
+
+		virtual String ReadLineFromFile();
+		virtual bool HasMoreLines();
+		virtual void Rewind();
+	};
+}
diff --git a/unit_test/src/athenasub/test_file.cpp b/unit_test/src/athenasub/test_file.cpp
index 0b6437604..64f386f16 100644
--- a/unit_test/src/athenasub/test_file.cpp
+++ b/unit_test/src/athenasub/test_file.cpp
@@ -40,7 +40,7 @@
 #include <iostream>
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
-#include "../../../athenasub/include/athenasub/athenasub.h"
+#include "athenasub/athenasub.h"
 using namespace Athenasub;
 
 
-- 
GitLab