From 95891f95c728cdcf8bbd66d42a4c2b08c735b4fc Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Mon, 19 Jan 2004 22:31:21 +0000 Subject: *temporary* fix for LineReader to handle files not terminated by an empty string (*.crd) svn-id: r12527 --- queen/credits.cpp | 3 ++- queen/logic.cpp | 4 +++- queen/resource.cpp | 14 ++++++++------ queen/resource.h | 5 +++-- 4 files changed, 16 insertions(+), 10 deletions(-) (limited to 'queen') diff --git a/queen/credits.cpp b/queen/credits.cpp index 6d81839dd9..2ccc4055a7 100644 --- a/queen/credits.cpp +++ b/queen/credits.cpp @@ -31,7 +31,8 @@ namespace Queen { Credits::Credits(QueenEngine *vm, const char* filename) : _vm(vm), _running(true), _count(0), _pause(0), _justify(0), _fontSize(0), _color(0), _zone(0) { _credits = new LineReader( - (char*)_vm->resource()->loadFile(filename)); + (char *)_vm->resource()->loadFile(filename), + _vm->resource()->fileSize(filename)); } Credits::~Credits() { diff --git a/queen/logic.cpp b/queen/logic.cpp index 5bd080d763..7c7197ce3e 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -187,7 +187,9 @@ void Logic::initialise() { // Step 2 : read queen2.jas and grab all description texts - _queen2jas = new LineReader((char*)_vm->resource()->loadFile("QUEEN2.JAS")); + _queen2jas = new LineReader( + (char *)_vm->resource()->loadFile("QUEEN2.JAS"), + _vm->resource()->fileSize("QUEEN2.JAS")); _objDescription = new char*[_numDescriptions + 1]; _objDescription[0] = 0; diff --git a/queen/resource.cpp b/queen/resource.cpp index da92f94836..156d21eda0 100644 --- a/queen/resource.cpp +++ b/queen/resource.cpp @@ -246,20 +246,22 @@ File *Resource::giveCompressedSound(const char *filename) { return _resourceFile; } -LineReader::LineReader(char *buffer) : _buffer(buffer), _current(0) { +LineReader::LineReader(char *buffer, uint32 bufsize) : _buffer(buffer), _bufSize(bufsize), _current(0) { } LineReader::~LineReader() { delete[] _buffer; } -char* LineReader::nextLine() { +char *LineReader::nextLine() { char *startOfLine = _buffer + _current; char *curPos = startOfLine; - while (*curPos++ != 0xd) ; - *(curPos - 1) = '\0'; // '\r' - *curPos = '\0'; // '\n' - _current = (curPos - _buffer) + 1; + while (curPos < _buffer + _bufSize && *curPos++ != 0xd) ; + *(curPos - 1) = '\0'; // '\r' + if (curPos < _buffer + _bufSize) { + *curPos = '\0'; // '\n' + _current = (curPos - _buffer) + 1; + } return startOfLine; } diff --git a/queen/resource.h b/queen/resource.h index 59f50885ef..1e97444463 100644 --- a/queen/resource.h +++ b/queen/resource.h @@ -64,12 +64,13 @@ struct GameVersion { class LineReader { public: - LineReader(char *buffer); + LineReader(char *buffer, uint32 bufsize); ~LineReader(); - char* nextLine(); + char *nextLine(); private: char *_buffer; + uint32 _bufSize; int _current; }; -- cgit v1.2.3