Add proper error checking in file parsing code.

svn-id: r40489
This commit is contained in:
Johannes Schickel 2009-05-12 14:35:50 +00:00
parent 8524bf3a25
commit 76984ded25
2 changed files with 21 additions and 17 deletions

View File

@ -83,13 +83,15 @@ bool EMCInterpreter::load(const char *filename, EMCData *scriptData, const Commo
case MKID_BE('TEXT'):
scriptData->text = new byte[chunk->size];
assert(scriptData->text);
chunk->read(scriptData->text, chunk->size);
if (chunk->read(scriptData->text, chunk->size) != chunk->size)
error("Couldn't read TEXT chunk from file '%s'", filename);
break;
case MKID_BE('ORDR'):
scriptData->ordr = new uint16[chunk->size >> 1];
assert(scriptData->ordr);
chunk->read(scriptData->ordr, chunk->size);
if (chunk->read(scriptData->ordr, chunk->size) != chunk->size)
error("Couldn't read ORDR chunk from file '%s'", filename);
for (int i = (chunk->size >> 1) - 1; i >= 0; --i)
scriptData->ordr[i] = READ_BE_UINT16(&scriptData->ordr[i]);
@ -98,7 +100,8 @@ bool EMCInterpreter::load(const char *filename, EMCData *scriptData, const Commo
case MKID_BE('DATA'):
scriptData->data = new uint16[chunk->size >> 1];
assert(scriptData->data);
chunk->read(scriptData->data, chunk->size);
if (chunk->read(scriptData->data, chunk->size) != chunk->size)
error("Couldn't read DATA chunk from file '%s'", filename);
for (int i = (chunk->size >> 1) - 1; i >= 0; --i)
scriptData->data[i] = READ_BE_UINT16(&scriptData->data[i]);
@ -110,17 +113,14 @@ bool EMCInterpreter::load(const char *filename, EMCData *scriptData, const Commo
}
}
if (!scriptData->ordr) {
unload(scriptData);
error("Couldn't read ORDR chunk from file: '%s'", filename);
return false;
}
if (!scriptData->ordr)
error("No ORDR chunk found in file: '%s'", filename);
if (!scriptData->data) {
unload(scriptData);
error("Couldn't read DATA chunk from file: '%s'", filename);
return false;
}
if (!scriptData->data)
error("No DATA chunk found in file: '%s'", filename);
if (stream->err())
error("Read error while parsing file '%s", filename);
delete stream;

View File

@ -149,7 +149,8 @@ TIM *TIMInterpreter::load(const char *filename, const Common::Array<const TIMOpc
avtlChunkSize = chunk->size >> 1;
tim->avtl = new uint16[avtlChunkSize];
assert(tim->avtl);
chunk->read(tim->avtl, chunk->size);
if (chunk->read(tim->avtl, chunk->size) != chunk->size)
error("Couldn't read AVTL chunk from file '%s'", filename);
for (int i = avtlChunkSize - 1; i >= 0; --i)
tim->avtl[i] = READ_LE_UINT16(&tim->avtl[i]);
@ -161,10 +162,13 @@ TIM *TIMInterpreter::load(const char *filename, const Common::Array<const TIMOpc
}
}
delete stream;
if (!tim->avtl)
error("Couldn't read AVTL chunk from file: '%s'", filename);
error("No AVTL chunk found in file: '%s'", filename);
if (stream->err())
error("Read error while parsing file '%s", filename);
delete stream;
int num = (avtlChunkSize < TIM::kCountFuncs) ? avtlChunkSize : (int)TIM::kCountFuncs;
for (int i = 0; i < num; ++i)