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"
>
+
+
+
+
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::GetReader(wxInputStream &stream,String encoding)
{
- return shared_ptr(new TextFileReader(stream,encoding));
+ shared_ptr fileReader = shared_ptr(new TextFileReader(stream,encoding));
+ return shared_ptr(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 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;iReadLineFromFile());
+ 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 buffer;
+ size_t bufferPos;
+
+ shared_ptr source;
+
+ void LoadMore(int n=1);
+ bool CanLoadMore();
+
+ public:
+ TextReaderCache(shared_ptr 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
#include
#include
-#include "../../../athenasub/include/athenasub/athenasub.h"
+#include "athenasub/athenasub.h"
using namespace Athenasub;