aboutsummaryrefslogtreecommitdiff
path: root/engines/hugo/hugo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hugo/hugo.cpp')
-rw-r--r--engines/hugo/hugo.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index ef3352829d..445a8d7b25 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -83,8 +83,8 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy
}
HugoEngine::~HugoEngine() {
- free(_textData);
- free(_stringtData);
+ freeTexts(_textData);
+ freeTexts(_stringtData);
if (_arrayNouns) {
for (int i = 0; _arrayNouns[i]; i++)
@@ -98,17 +98,23 @@ HugoEngine::~HugoEngine() {
free(_arrayVerbs);
}
- free(_screenNames);
+ freeTexts(_screenNames);
_screen->freePalette();
- free(_textEngine);
- free(_textIntro);
+ freeTexts(_textEngine);
+ freeTexts(_textIntro);
free(_introX);
free(_introY);
- free(_textMouse);
- free(_textParser);
- free(_textSchedule);
- free(_textUtil);
- free(_arrayReqs);
+ freeTexts(_textMouse);
+ freeTexts(_textParser);
+ freeTexts(_textSchedule);
+ freeTexts(_textUtil);
+
+ if (_arrayReqs) {
+ for (int i = 0; _arrayReqs[i] != 0; i++)
+ free(_arrayReqs[i]);
+ free(_arrayReqs);
+ }
+
free(_hotspots);
free(_invent);
@@ -751,6 +757,7 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
int len;
char **res = 0;
char *pos = 0;
+ char *posBck = 0;
for (int varnt = 0; varnt < _numVariant; varnt++) {
numTexts = in.readUint16BE();
@@ -765,6 +772,7 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ posBck = pos;
}
pos += DATAALIGNMENT;
@@ -778,6 +786,9 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
if (varnt == _gameVariant)
res[i] = pos;
}
+
+ if (varnt != _gameVariant)
+ free(posBck);
}
return res;
@@ -822,6 +833,7 @@ char ***HugoEngine::loadTextsArray(Common::File &in) {
int numTexts = in.readUint16BE();
int entryLen = in.readUint16BE();
char *pos = (char *)malloc(entryLen);
+ char *posBck = 0;
char **res = 0;
if (varnt == _gameVariant) {
res = (char **)malloc(sizeof(char *) * numTexts);
@@ -830,6 +842,7 @@ char ***HugoEngine::loadTextsArray(Common::File &in) {
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ posBck = pos;
}
pos += DATAALIGNMENT;
@@ -845,6 +858,8 @@ char ***HugoEngine::loadTextsArray(Common::File &in) {
if (varnt == _gameVariant)
resArray[i] = res;
+ else
+ free(posBck);
}
}
@@ -876,7 +891,7 @@ void HugoEngine::freeTexts(char **ptr) {
if (!ptr)
return;
- free(*ptr);
+ free(*ptr - DATAALIGNMENT);
free(ptr);
}