aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kstring.cpp
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2013-04-18 23:37:54 +0200
committerWillem Jan Palenstijn2013-05-08 20:46:44 +0200
commit02c5cc75a7cb8885d2a0fa141fbc0e763c5b31a0 (patch)
tree72b64a67ebeca41e9b83593da80850e848a99e2e /engines/sci/engine/kstring.cpp
parent1539023834a2ad7cf8942711d60983891a10a82a (diff)
parent1e200620d673af4acdd2d128ed6e390df001aacf (diff)
downloadscummvm-rg350-02c5cc75a7cb8885d2a0fa141fbc0e763c5b31a0.tar.gz
scummvm-rg350-02c5cc75a7cb8885d2a0fa141fbc0e763c5b31a0.tar.bz2
scummvm-rg350-02c5cc75a7cb8885d2a0fa141fbc0e763c5b31a0.zip
Merge branch 'master'
Conflicts: configure base/plugins.cpp
Diffstat (limited to 'engines/sci/engine/kstring.cpp')
-rw-r--r--engines/sci/engine/kstring.cpp47
1 files changed, 29 insertions, 18 deletions
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index fe8d631497..c4db0b891c 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -33,7 +33,7 @@ namespace Sci {
reg_t kStrEnd(EngineState *s, int argc, reg_t *argv) {
reg_t address = argv[0];
- address.offset += s->_segMan->strlen(address);
+ address.incOffset(s->_segMan->strlen(address));
return address;
}
@@ -96,7 +96,7 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) {
byte value;
byte newvalue = 0;
- unsigned int offset = argv[1].toUint16();
+ uint16 offset = argv[1].toUint16();
if (argc > 2)
newvalue = argv[2].toSint16();
@@ -123,18 +123,22 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) {
oddOffset = !oddOffset;
if (!oddOffset) {
- value = tmp.offset & 0x00ff;
+ value = tmp.getOffset() & 0x00ff;
if (argc > 2) { /* Request to modify this char */
- tmp.offset &= 0xff00;
- tmp.offset |= newvalue;
- tmp.segment = 0;
+ uint16 tmpOffset = tmp.toUint16();
+ tmpOffset &= 0xff00;
+ tmpOffset |= newvalue;
+ tmp.setOffset(tmpOffset);
+ tmp.setSegment(0);
}
} else {
- value = tmp.offset >> 8;
+ value = tmp.getOffset() >> 8;
if (argc > 2) { /* Request to modify this char */
- tmp.offset &= 0x00ff;
- tmp.offset |= newvalue << 8;
- tmp.segment = 0;
+ uint16 tmpOffset = tmp.toUint16();
+ tmpOffset &= 0x00ff;
+ tmpOffset |= newvalue << 8;
+ tmp.setOffset(tmpOffset);
+ tmp.setSegment(0);
}
}
}
@@ -161,6 +165,7 @@ reg_t kReadNumber(EngineState *s, int argc, reg_t *argv) {
// do clipping. In SQ4 we get the door code in here and that's even
// larger than uint32!
if (*source == '-') {
+ // FIXME: Setting result to -1 does _not_ negate the output.
result = -1;
source++;
}
@@ -204,7 +209,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
int strLength = 0; /* Used for stuff like "%13s" */
bool unsignedVar = false;
- if (position.segment)
+ if (position.getSegment())
startarg = 2;
else {
// WORKAROUND: QFG1 VGA Mac calls this without the first parameter (dest). It then
@@ -291,7 +296,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) {
if (extralen < 0)
extralen = 0;
- if (reg.segment) /* Heap address? */
+ if (reg.getSegment()) /* Heap address? */
paramindex++;
else
paramindex += 2; /* No, text resource address */
@@ -653,10 +658,16 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) {
case 1: // Size
return make_reg(0, s->_segMan->getString(argv[1]).size());
case 2: { // At (return value at an index)
- if (argv[1].segment == s->_segMan->getStringSegmentId())
- return make_reg(0, s->_segMan->lookupString(argv[1])->getRawData()[argv[2].toUint16()]);
-
- return make_reg(0, s->_segMan->getString(argv[1])[argv[2].toUint16()]);
+ // Note that values are put in bytes to avoid sign extension
+ if (argv[1].getSegment() == s->_segMan->getStringSegmentId()) {
+ SciString *string = s->_segMan->lookupString(argv[1]);
+ byte val = string->getRawData()[argv[2].toUint16()];
+ return make_reg(0, val);
+ } else {
+ Common::String string = s->_segMan->getString(argv[1]);
+ byte val = string[argv[2].toUint16()];
+ return make_reg(0, val);
+ }
}
case 3: { // Atput (put value at an index)
SciString *string = s->_segMan->lookupString(argv[1]);
@@ -699,7 +710,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) {
uint32 string2Size = 0;
Common::String string;
- if (argv[3].segment == s->_segMan->getStringSegmentId()) {
+ if (argv[3].getSegment() == s->_segMan->getStringSegmentId()) {
SciString *sstr;
sstr = s->_segMan->lookupString(argv[3]);
string2 = sstr->getRawData();
@@ -749,7 +760,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) {
SciString *dupString = s->_segMan->allocateString(&stringHandle);
- if (argv[1].segment == s->_segMan->getStringSegmentId()) {
+ if (argv[1].getSegment() == s->_segMan->getStringSegmentId()) {
*dupString = *s->_segMan->lookupString(argv[1]);
} else {
dupString->fromString(s->_segMan->getString(argv[1]));