summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/tags.cc
diff options
context:
space:
mode:
authorNicholas Feinberg <pleasingfung@gmail.com>2014-05-17 23:27:02 -0700
committerNicholas Feinberg <pleasingfung@gmail.com>2014-05-25 22:23:50 -0700
commit45708ce3bb43928b896f86db63b39e3b3dc107a7 (patch)
tree1ca4d54933bf6c02da617ce1541237b1e9a24e43 /crawl-ref/source/tags.cc
parent3798112249fd3d3cba55ec8c0c0f48c73bbea6f3 (diff)
downloadcrawl-ref-45708ce3bb43928b896f86db63b39e3b3dc107a7.tar.gz
crawl-ref-45708ce3bb43928b896f86db63b39e3b3dc107a7.zip
Don't die when encountering 0-byte ghost files
Diffstat (limited to 'crawl-ref/source/tags.cc')
-rw-r--r--crawl-ref/source/tags.cc20
1 files changed, 10 insertions, 10 deletions
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index afc243539d..e31fd7cbe0 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -97,7 +97,7 @@ extern abyss_state abyssal_state;
reader::reader(const string &_read_filename, int minorVersion)
: _filename(_read_filename), _chunk(0), _pbuf(NULL), _read_offset(0),
- _minorVersion(minorVersion)
+ _minorVersion(minorVersion), _safe_read(false)
{
_file = fopen_u(_filename.c_str(), "rb");
opened_file = !!_file;
@@ -105,7 +105,7 @@ reader::reader(const string &_read_filename, int minorVersion)
reader::reader(package *save, const string &chunkname, int minorVersion)
: _file(0), _chunk(0), opened_file(false), _pbuf(0), _read_offset(0),
- _minorVersion(minorVersion)
+ _minorVersion(minorVersion), _safe_read(false)
{
ASSERT(save);
_chunk = new chunk_reader(save, chunkname);
@@ -143,9 +143,9 @@ bool reader::valid() const
(_pbuf && _read_offset < _pbuf->size());
}
-static NORETURN void _short_read()
+static NORETURN void _short_read(bool safe_read)
{
- if (!crawl_state.need_save)
+ if (!crawl_state.need_save || safe_read)
throw short_read_exception();
// Would be nice to name the save chunk here, but in interesting cases
// we're reading a copy from memory (why?).
@@ -159,20 +159,20 @@ unsigned char reader::readByte()
{
int b = fgetc(_file);
if (b == EOF)
- _short_read();
+ _short_read(_safe_read);
return b;
}
else if (_chunk)
{
unsigned char buf;
if (_chunk->read(&buf, 1) != 1)
- _short_read();
+ _short_read(_safe_read);
return buf;
}
else
{
if (_read_offset >= _pbuf->size())
- _short_read();
+ _short_read(_safe_read);
return (*_pbuf)[_read_offset++];
}
}
@@ -184,7 +184,7 @@ void reader::read(void *data, size_t size)
if (data)
{
if (fread(data, 1, size, _file) != size)
- _short_read();
+ _short_read(_safe_read);
}
else
fseek(_file, (long)size, SEEK_CUR);
@@ -192,12 +192,12 @@ void reader::read(void *data, size_t size)
else if (_chunk)
{
if (_chunk->read(data, size) != size)
- _short_read();
+ _short_read(_safe_read);
}
else
{
if (_read_offset+size > _pbuf->size())
- _short_read();
+ _short_read(_safe_read);
if (data && size)
memcpy(data, &(*_pbuf)[_read_offset], size);