got rid of _msgPtrToAdd; slightly improved error checking in addMessageToStack()
svn-id: r13454
This commit is contained in:
parent
a2413dad38
commit
a4e424a4fe
2 changed files with 55 additions and 50 deletions
|
@ -1067,21 +1067,21 @@ protected:
|
||||||
int _charsetBufPos;
|
int _charsetBufPos;
|
||||||
byte _charsetBuffer[512];
|
byte _charsetBuffer[512];
|
||||||
|
|
||||||
protected:
|
bool _keepText;
|
||||||
|
|
||||||
void initCharset(int charset);
|
void initCharset(int charset);
|
||||||
|
|
||||||
void CHARSET_1();
|
void CHARSET_1();
|
||||||
void drawString(int a, const byte *msg);
|
void drawString(int a, const byte *msg);
|
||||||
void addMessageToStack(const byte *msg, byte *dstBuffer, int dstBufferSize);
|
|
||||||
void addIntToStack(int var);
|
|
||||||
void addVerbToStack(int var);
|
|
||||||
void addNameToStack(int var);
|
|
||||||
void addStringToStack(int var);
|
|
||||||
void unkMessage1(const byte *msg);
|
void unkMessage1(const byte *msg);
|
||||||
void unkMessage2(const byte *msg);
|
void unkMessage2(const byte *msg);
|
||||||
protected:
|
|
||||||
byte *_msgPtrToAdd;
|
int addMessageToStack(const byte *msg, byte *dst, int dstSize);
|
||||||
bool _keepText;
|
int addIntToStack(byte *dst, int dstSize, int var);
|
||||||
|
int addVerbToStack(byte *dst, int dstSize, int var);
|
||||||
|
int addNameToStack(byte *dst, int dstSize, int var);
|
||||||
|
int addStringToStack(byte *dst, int dstSize, int var);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Common::Language _language;
|
Common::Language _language;
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -454,55 +454,55 @@ void ScummEngine::drawString(int a, const byte *msg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::addMessageToStack(const byte *msg, byte *dstBuffer, int dstBufferSize) {
|
int ScummEngine::addMessageToStack(const byte *msg, byte *dst, int dstSize) {
|
||||||
uint num = 0;
|
uint num = 0;
|
||||||
uint32 val;
|
uint32 val;
|
||||||
byte chr;
|
byte chr;
|
||||||
const byte *buf;
|
const byte *src;
|
||||||
|
byte *end;
|
||||||
byte transBuf[384];
|
byte transBuf[384];
|
||||||
|
|
||||||
if (dstBuffer) {
|
assert(dst);
|
||||||
_msgPtrToAdd = dstBuffer;
|
end = dst + dstSize;
|
||||||
}
|
|
||||||
|
|
||||||
if (msg == NULL) {
|
if (msg == NULL) {
|
||||||
warning("Bad message in addMessageToStack, ignoring");
|
warning("Bad message in addMessageToStack, ignoring");
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_version >= 7 && msg[0] == '/') {
|
if (_version >= 7 && msg[0] == '/') {
|
||||||
translateText(msg, transBuf);
|
translateText(msg, transBuf);
|
||||||
buf = transBuf;
|
src = transBuf;
|
||||||
} else {
|
} else {
|
||||||
buf = msg;
|
src = msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = 0;
|
num = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
chr = buf[num++];
|
chr = src[num++];
|
||||||
if (chr == 0)
|
if (chr == 0)
|
||||||
break;
|
break;
|
||||||
if (chr == 0xFF) {
|
if (chr == 0xFF) {
|
||||||
chr = buf[num++];
|
chr = src[num++];
|
||||||
if (chr == 1 || chr == 2 || chr == 3 || chr == 8) {
|
if (chr == 1 || chr == 2 || chr == 3 || chr == 8) {
|
||||||
// Simply copy these special codes
|
// Simply copy these special codes
|
||||||
*_msgPtrToAdd++ = 0xFF;
|
*dst++ = 0xFF;
|
||||||
*_msgPtrToAdd++ = chr;
|
*dst++ = chr;
|
||||||
} else {
|
} else {
|
||||||
val = (_version == 8) ? READ_LE_UINT32(buf + num) : READ_LE_UINT16(buf + num);
|
val = (_version == 8) ? READ_LE_UINT32(src + num) : READ_LE_UINT16(src + num);
|
||||||
switch (chr) {
|
switch (chr) {
|
||||||
case 4:
|
case 4:
|
||||||
addIntToStack(val);
|
dst += addIntToStack(dst, end - dst, val);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
addVerbToStack(val);
|
dst += addVerbToStack(dst, end - dst, val);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
addNameToStack(val);
|
dst += addNameToStack(dst, end - dst, val);
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
addStringToStack(val);
|
dst += addStringToStack(dst, end - dst, val);
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
case 10:
|
case 10:
|
||||||
|
@ -510,13 +510,13 @@ void ScummEngine::addMessageToStack(const byte *msg, byte *dstBuffer, int dstBuf
|
||||||
case 13:
|
case 13:
|
||||||
case 14:
|
case 14:
|
||||||
// Simply copy these special codes
|
// Simply copy these special codes
|
||||||
*_msgPtrToAdd++ = 0xFF;
|
*dst++ = 0xFF;
|
||||||
*_msgPtrToAdd++ = chr;
|
*dst++ = chr;
|
||||||
*_msgPtrToAdd++ = buf[num+0];
|
*dst++ = src[num+0];
|
||||||
*_msgPtrToAdd++ = buf[num+1];
|
*dst++ = src[num+1];
|
||||||
if (_version == 8) {
|
if (_version == 8) {
|
||||||
*_msgPtrToAdd++ = buf[num+2];
|
*dst++ = src[num+2];
|
||||||
*_msgPtrToAdd++ = buf[num+3];
|
*dst++ = src[num+3];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -527,27 +527,27 @@ void ScummEngine::addMessageToStack(const byte *msg, byte *dstBuffer, int dstBuf
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (chr != '@') {
|
if (chr != '@') {
|
||||||
*_msgPtrToAdd++ = chr;
|
*dst++ = chr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
*_msgPtrToAdd = 0;
|
|
||||||
|
|
||||||
if (dstBuffer) {
|
|
||||||
// Check for a buffer overflow
|
// Check for a buffer overflow
|
||||||
if (_msgPtrToAdd >= dstBuffer + dstBufferSize)
|
if (dst >= end)
|
||||||
error("addMessageToStack: buffer overflow!");
|
error("addMessageToStack: buffer overflow!");
|
||||||
}
|
}
|
||||||
|
*dst = 0;
|
||||||
|
|
||||||
|
return dstSize - (end - dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::addIntToStack(int var) {
|
int ScummEngine::addIntToStack(byte *dst, int dstSize, int var) {
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
num = readVar(var);
|
num = readVar(var);
|
||||||
_msgPtrToAdd += sprintf((char *)_msgPtrToAdd, "%d", num);
|
return snprintf((char *)dst, dstSize, "%d", num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::addVerbToStack(int var) {
|
int ScummEngine::addVerbToStack(byte *dst, int dstSize, int var) {
|
||||||
int num, k;
|
int num, k;
|
||||||
|
|
||||||
num = readVar(var);
|
num = readVar(var);
|
||||||
|
@ -555,36 +555,40 @@ void ScummEngine::addVerbToStack(int var) {
|
||||||
for (k = 1; k < _numVerbs; k++) {
|
for (k = 1; k < _numVerbs; k++) {
|
||||||
if (num == _verbs[k].verbid && !_verbs[k].type && !_verbs[k].saveid) {
|
if (num == _verbs[k].verbid && !_verbs[k].type && !_verbs[k].saveid) {
|
||||||
const byte *ptr = getResourceAddress(rtVerb, k);
|
const byte *ptr = getResourceAddress(rtVerb, k);
|
||||||
addMessageToStack(ptr, 0, 0);
|
return addMessageToStack(ptr, dst, dstSize);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::addNameToStack(int var) {
|
int ScummEngine::addNameToStack(byte *dst, int dstSize, int var) {
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
num = readVar(var);
|
num = readVar(var);
|
||||||
if (num) {
|
if (num) {
|
||||||
const byte *ptr = getObjOrActorName(num);
|
const byte *ptr = getObjOrActorName(num);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
addMessageToStack(ptr, 0, 0);
|
return addMessageToStack(ptr, dst, dstSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::addStringToStack(int var) {
|
int ScummEngine::addStringToStack(byte *dst, int dstSize, int var) {
|
||||||
const byte *ptr;
|
const byte *ptr;
|
||||||
|
|
||||||
if (_version <= 2) {
|
if (_version <= 2) {
|
||||||
byte chr;
|
byte chr;
|
||||||
|
int i = 0;
|
||||||
while ((chr = (byte)_scummVars[var++])) {
|
while ((chr = (byte)_scummVars[var++])) {
|
||||||
if (chr != '@')
|
if (chr != '@') {
|
||||||
*_msgPtrToAdd++ = chr;
|
*dst++ = chr;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_version == 3 || _version >= 6)
|
if (_version == 3 || _version >= 6)
|
||||||
|
@ -593,9 +597,10 @@ void ScummEngine::addStringToStack(int var) {
|
||||||
if (var) {
|
if (var) {
|
||||||
ptr = getStringAddress(var);
|
ptr = getStringAddress(var);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
addMessageToStack(ptr, 0, 0);
|
return addMessageToStack(ptr, dst, dstSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::initCharset(int charsetno) {
|
void ScummEngine::initCharset(int charsetno) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue