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;