From 78b9a903add0431893c92e5e4c8f01b761a48277 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Sun, 24 Jan 2016 13:33:33 +0100 Subject: LAB: Add a workaround for DOS version using long filenames --- engines/lab/resource.cpp | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'engines/lab/resource.cpp') diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp index f16fd533ca..096d29361f 100644 --- a/engines/lab/resource.cpp +++ b/engines/lab/resource.cpp @@ -175,22 +175,50 @@ Common::String Resource::translateFileName(const Common::String filename) { upperFilename.deleteChar(0); } + if (_vm->getPlatform() == Common::kPlatformDOS) { + // Some script of the DOS version uses names used in the Amiga (and Windows) version, + // which isn't limited to 8.3 characters. We need to parse upperFilename to detect + // the filename, and fix it if required so it matches a DOS filename. + while (upperFilename.contains('/') && upperFilename.size()) { + fileNameStrFinal += upperFilename[0]; + upperFilename.deleteChar(0); + } + + for (int i = 0; (i < 8) && upperFilename.size() && (upperFilename[0] != '.'); i++) { + fileNameStrFinal += upperFilename[0]; + upperFilename.deleteChar(0); + } + + // Remove the extra character in the filename + while (upperFilename.size() && (upperFilename[0] != '.')) + upperFilename.deleteChar(0); + + // copy max 4 characters for the extension ('.foo') + for (int i = 0; (i < 4) && upperFilename.size(); i++) { + fileNameStrFinal += upperFilename[0]; + upperFilename.deleteChar(0); + } + + // Skip the extra characters of the extension + upperFilename.clear(); + } + fileNameStrFinal += upperFilename; return fileNameStrFinal; } -Common::File *Resource::openDataFile(const Common::String fileName, uint32 fileHeader) { +Common::File *Resource::openDataFile(const Common::String filename, uint32 fileHeader) { Common::File *dataFile = new Common::File(); - dataFile->open(translateFileName(fileName)); + dataFile->open(translateFileName(filename)); if (!dataFile->isOpen()) - error("openDataFile: Couldn't open %s (%s)", translateFileName(fileName).c_str(), fileName.c_str()); + error("openDataFile: Couldn't open %s (%s)", translateFileName(filename).c_str(), filename.c_str()); if (fileHeader > 0) { uint32 headerTag = dataFile->readUint32BE(); if (headerTag != fileHeader) { dataFile->close(); - error("openDataFile: Unexpected header in %s (%s) - expected: %d, got: %d", translateFileName(fileName).c_str(), fileName.c_str(), fileHeader, headerTag); + error("openDataFile: Unexpected header in %s (%s) - expected: %d, got: %d", translateFileName(filename).c_str(), filename.c_str(), fileHeader, headerTag); } } -- cgit v1.2.3