aboutsummaryrefslogtreecommitdiff
path: root/engines/sky/compact.cpp
diff options
context:
space:
mode:
authorColin Snover2017-11-07 22:53:19 -0600
committerEugene Sandulenko2017-12-08 07:55:56 +0000
commit8e829371c9d12fc121e9edbd05d40a2f03166cf1 (patch)
treeeac7643d790a606cbbf3fa1e6f1728ab0a5dca78 /engines/sky/compact.cpp
parent4c777a9afcd402adda3335e46eac6ffcd24205f0 (diff)
downloadscummvm-rg350-8e829371c9d12fc121e9edbd05d40a2f03166cf1.tar.gz
scummvm-rg350-8e829371c9d12fc121e9edbd05d40a2f03166cf1.tar.bz2
scummvm-rg350-8e829371c9d12fc121e9edbd05d40a2f03166cf1.zip
SKY: Fix unaligned pointer dereferences
Dereferencing an unaligned pointer will cause a memory fault on at least older ARM and SPARC architectures, and is warned about starting in Clang 4.
Diffstat (limited to 'engines/sky/compact.cpp')
-rw-r--r--engines/sky/compact.cpp41
1 files changed, 32 insertions, 9 deletions
diff --git a/engines/sky/compact.cpp b/engines/sky/compact.cpp
index ab244c1f84..13ea300942 100644
--- a/engines/sky/compact.cpp
+++ b/engines/sky/compact.cpp
@@ -311,24 +311,47 @@ const char *SkyCompact::nameForType(uint16 type) {
return _typeNames[type];
}
-uint16 *SkyCompact::getSub(Compact *cpt, uint16 mode) {
+uint16 SkyCompact::getSub(Compact *cpt, uint16 mode) {
switch (mode) {
case 0:
- return &(cpt->baseSub);
+ return cpt->baseSub;
case 2:
- return &(cpt->baseSub_off);
+ return cpt->baseSub_off;
case 4:
- return &(cpt->actionSub);
+ return cpt->actionSub;
case 6:
- return &(cpt->actionSub_off);
+ return cpt->actionSub_off;
case 8:
- return &(cpt->getToSub);
+ return cpt->getToSub;
case 10:
- return &(cpt->getToSub_off);
+ return cpt->getToSub_off;
case 12:
- return &(cpt->extraSub);
+ return cpt->extraSub;
case 14:
- return &(cpt->extraSub_off);
+ return cpt->extraSub_off;
+ default:
+ error("Invalid Mode (%d)", mode);
+ }
+}
+
+void SkyCompact::setSub(Compact *cpt, uint16 mode, uint16 value) {
+ switch (mode) {
+ case 0:
+ cpt->baseSub = value;
+ case 2:
+ cpt->baseSub_off = value;
+ case 4:
+ cpt->actionSub = value;
+ case 6:
+ cpt->actionSub_off = value;
+ case 8:
+ cpt->getToSub = value;
+ case 10:
+ cpt->getToSub_off = value;
+ case 12:
+ cpt->extraSub = value;
+ case 14:
+ cpt->extraSub_off = value;
default:
error("Invalid Mode (%d)", mode);
}