Fixed warnings and whitespace

This commit is contained in:
Bart Trzynadlowski 2016-03-22 01:37:55 +00:00
parent 78609688c5
commit 4c7186b1f1

View file

@ -40,22 +40,22 @@ static bool isPowerOfTwo(long x)
// Sega Bass Fishing // Sega Bass Fishing
static struct GameInfo cromInfo = static struct GameInfo cromInfo =
{ {
"crom.bin", "crom.bin",
NULL, NULL,
"Custom CROM Image", "Custom CROM Image",
"Bart Trzynadlowski", "Bart Trzynadlowski",
2015, 2015,
0x10, 0x10,
0, // size of CROM image (filled in at run time) 0, // size of CROM image (filled in at run time)
false, // no need to mirror anything false, // no need to mirror anything
0, // no VROM 0, // no VROM
0, // no sample ROMs 0, // no sample ROMs
GAME_INPUT_COMMON|GAME_INPUT_JOYSTICK1, GAME_INPUT_COMMON|GAME_INPUT_JOYSTICK1,
0, // no MPEG board 0, // no MPEG board
false, // no drive board false, // no drive board
{ {
{ NULL, false, NULL, 0, 0, 0, 0, 0, false } { NULL, false, NULL, 0, 0, 0, 0, 0, false }
} }
}; };
static GameInfo * LoadCROMDirect(const struct ROMMap *Map, const char *file) static GameInfo * LoadCROMDirect(const struct ROMMap *Map, const char *file)
@ -67,9 +67,9 @@ static GameInfo * LoadCROMDirect(const struct ROMMap *Map, const char *file)
return NULL; return NULL;
} }
fseek(fp, 0, SEEK_END); fseek(fp, 0, SEEK_END);
long fileSize = ftell(fp); long fileSize = ftell(fp);
rewind(fp); rewind(fp);
if (fileSize > 0x800000) if (fileSize > 0x800000)
{ {
ErrorLog("CROM image exceeds 8MB."); ErrorLog("CROM image exceeds 8MB.");
fclose(fp); fclose(fp);
@ -81,7 +81,6 @@ static GameInfo * LoadCROMDirect(const struct ROMMap *Map, const char *file)
fclose(fp); fclose(fp);
return NULL; return NULL;
} }
const struct ROMMap *CROM = 0;
while (Map->region && strcmp(Map->region, "CROM")) while (Map->region && strcmp(Map->region, "CROM"))
++Map; ++Map;
if (!Map->region) if (!Map->region)
@ -105,152 +104,141 @@ static GameInfo * LoadCROMDirect(const struct ROMMap *Map, const char *file)
* filled. * filled.
* *
* Parameters: * Parameters:
* dest Destination region. * dest Destination region.
* destOffset Offset within destination to begin mirroring to. * destOffset Offset within destination to begin mirroring to.
* destSize Size in bytes of destination region. * destSize Size in bytes of destination region.
* src Source region to copy from. * src Source region to copy from.
* srcSize Size of region to copy from. * srcSize Size of region to copy from.
*/ */
void CopyRegion(UINT8 *dest, unsigned destOffset, unsigned destSize, UINT8 *src, unsigned srcSize) void CopyRegion(UINT8 *dest, unsigned destOffset, unsigned destSize, UINT8 *src, unsigned srcSize)
{ {
if (!destSize || !srcSize) if (!destSize || !srcSize)
return; return;
while (destOffset < destSize) while (destOffset < destSize)
{ {
// If we'll overrun the destination, trim the copy length // If we'll overrun the destination, trim the copy length
if ((destOffset+srcSize) >= destSize) if ((destOffset+srcSize) >= destSize)
srcSize = destSize-destOffset; srcSize = destSize-destOffset;
// Copy! // Copy!
memcpy(&dest[destOffset], src, srcSize); memcpy(&dest[destOffset], src, srcSize);
destOffset += srcSize; destOffset += srcSize;
} }
} }
// Search for a ROM within a single game based on its CRC // Search for a ROM within a single game based on its CRC
static bool FindROMByCRCInGame(const struct GameInfo **gamePtr, int *romIdxPtr, const struct GameInfo *Game, UINT32 crc) static bool FindROMByCRCInGame(const struct GameInfo **gamePtr, int *romIdxPtr, const struct GameInfo *Game, UINT32 crc)
{ {
unsigned j; for (int j = 0; Game->ROM[j].region != NULL; j++)
{
for (j = 0; Game->ROM[j].region != NULL; j++) if (crc == Game->ROM[j].crc) // found it!
{ {
if (crc == Game->ROM[j].crc) // found it! *gamePtr = Game; // I know this seems redundant, but we do it here because FindROMByCRC() uses this function
{ *romIdxPtr = j;
*gamePtr = Game; // I know this seems redundant, but we do it here because FindROMByCRC() uses this function return OKAY;
*romIdxPtr = j; }
return OKAY; }
}
} return FAIL;
return FAIL;
} }
// Search for a ROM in the complete game list based on CRC32 and return its GameInfo and ROMInfo entries // Search for a ROM in the complete game list based on CRC32 and return its GameInfo and ROMInfo entries
static bool FindROMByCRC(const struct GameInfo **gamePtr, int *romIdxPtr, const struct GameInfo *GameList, const struct GameInfo *TryGame, UINT32 crc) static bool FindROMByCRC(const struct GameInfo **gamePtr, int *romIdxPtr, const struct GameInfo *GameList, const struct GameInfo *TryGame, UINT32 crc)
{ {
unsigned i; if (TryGame != NULL)
{
if (TryGame != NULL) if (FindROMByCRCInGame(gamePtr, romIdxPtr, TryGame, crc) == OKAY)
{ return OKAY;
if (FindROMByCRCInGame(gamePtr, romIdxPtr, TryGame, crc) == OKAY) }
return OKAY;
} for (int i = 0; GameList[i].title != NULL; i++)
{
for (i = 0; GameList[i].title != NULL; i++) if (FindROMByCRCInGame(gamePtr, romIdxPtr, &(GameList[i]), crc) == OKAY)
{ return OKAY;
if (FindROMByCRCInGame(gamePtr, romIdxPtr, &(GameList[i]), crc) == OKAY) }
return OKAY;
} return FAIL;
return FAIL;
} }
// Returns true if this ROM appears only a single time in the entire game list (ie., it is not shared between games) // Returns true if this ROM appears only a single time in the entire game list (ie., it is not shared between games)
static bool ROMIsUnique(const struct GameInfo *GameList, UINT32 crc) static bool ROMIsUnique(const struct GameInfo *GameList, UINT32 crc)
{ {
int timesFound = 0; int timesFound = 0;
for (int i = 0; GameList[i].title != NULL; i++) for (int i = 0; GameList[i].title != NULL; i++)
{ {
for (int j = 0; GameList[i].ROM[j].region != NULL; j++) for (int j = 0; GameList[i].ROM[j].region != NULL; j++)
{ {
if (crc == GameList[i].ROM[j].crc) if (crc == GameList[i].ROM[j].crc)
timesFound++; timesFound++;
} }
} }
return (timesFound == 1) ? true : false; return (timesFound == 1) ? true : false;
} }
static void ByteSwap(UINT8 *buf, unsigned size) static void ByteSwap(UINT8 *buf, unsigned size)
{ {
unsigned i; for (size_t i = 0; i < size; i += 2)
UINT8 x; {
UINT8 x = buf[i+0];
for (i = 0; i < size; i += 2) buf[i+0] = buf[i+1];
{ buf[i+1] = x;
x = buf[i+0]; }
buf[i+0] = buf[i+1];
buf[i+1] = x;
}
} }
// Load a single ROM file // Load a single ROM file
static bool LoadROM(UINT8 *buf, unsigned bufSize, const struct ROMMap *Map, const struct ROMInfo *ROM, unzFile zf, const char *zipFile, bool loadAll) static bool LoadROM(UINT8 *buf, unsigned bufSize, const struct ROMMap *Map, const struct ROMInfo *ROM, unzFile zf, const char *zipFile, bool loadAll)
{ {
char file[2048+1]; char file[2048+1];
int err, bytes; unz_file_info fileInfo;
unz_file_info fileInfo;
unsigned i, j, destIdx, srcIdx; // Read the file into the buffer
int err = unzGetCurrentFileInfo(zf, &fileInfo, file, 2048, NULL, 0, NULL, 0);
// Read the file into the buffer if (err != UNZ_OK)
err = unzGetCurrentFileInfo(zf, &fileInfo, file, 2048, NULL, 0, NULL, 0); return ErrorLog("Unable to extract a file name from '%s'.", zipFile);
if (err != UNZ_OK) if (fileInfo.uncompressed_size != ROM->fileSize)
return ErrorLog("Unable to extract a file name from '%s'.", zipFile); return ErrorLog("'%s' in '%s' is not the correct size (must be %d bytes).", file, zipFile, ROM->fileSize);
if (fileInfo.uncompressed_size != ROM->fileSize) err = unzOpenCurrentFile(zf);
return ErrorLog("'%s' in '%s' is not the correct size (must be %d bytes).", file, zipFile, ROM->fileSize); if (UNZ_OK != err)
err = unzOpenCurrentFile(zf); return ErrorLog("Unable to read '%s' from '%s'.", file, zipFile);
if (UNZ_OK != err) size_t bytes = unzReadCurrentFile(zf, buf, bufSize);
return ErrorLog("Unable to read '%s' from '%s'.", file, zipFile); if (bytes != ROM->fileSize)
bytes = unzReadCurrentFile(zf, buf, bufSize); {
if (bytes != ROM->fileSize) unzCloseCurrentFile(zf);
{ return ErrorLog("Unable to read '%s' from '%s'.", file, zipFile);
unzCloseCurrentFile(zf); }
return ErrorLog("Unable to read '%s' from '%s'.", file, zipFile); err = unzCloseCurrentFile(zf);
} if (UNZ_CRCERROR == err)
err = unzCloseCurrentFile(zf); ErrorLog("CRC error reading '%s' from '%s'. File may be corrupt.", file, zipFile);
if (UNZ_CRCERROR == err)
ErrorLog("CRC error reading '%s' from '%s'. File may be corrupt.", file, zipFile); // Byte swap
if (ROM->byteSwap)
// Byte swap ByteSwap(buf, ROM->fileSize);
if (ROM->byteSwap)
ByteSwap(buf, ROM->fileSize); // Find out how to map the ROM and do it
for (size_t i = 0; Map[i].region != NULL; i++)
// Find out how to map the ROM and do it {
for (i = 0; Map[i].region != NULL; i++) if (!strcmp(Map[i].region, ROM->region))
{ {
if (!strcmp(Map[i].region, ROM->region)) size_t destIdx = ROM->offset;
{ for (size_t srcIdx = 0; srcIdx < ROM->fileSize; )
destIdx = ROM->offset; {
for (srcIdx = 0; srcIdx < ROM->fileSize; ) for (size_t j = 0; j < ROM->groupSize; j++)
{ Map[i].ptr[destIdx+j] = buf[srcIdx++];
for (j = 0; j < ROM->groupSize; j++) destIdx += ROM->stride;
Map[i].ptr[destIdx+j] = buf[srcIdx++]; }
return OKAY;
destIdx += ROM->stride; }
} }
return OKAY; if (loadAll) // need to load all ROMs, so there should be no unmapped regions
} return ErrorLog("%s:%d: No mapping for '%s'.", __FILE__, __LINE__, ROM->region);
} else
return OKAY;
if (loadAll) // need to load all ROMs, so there should be no unmapped regions }
return ErrorLog("%s:%d: No mapping for '%s'.", __FILE__, __LINE__, ROM->region);
else
return OKAY;
}
/* /*
* LoadROMSetFromZIPFile(Map, GameList, zipFile): * LoadROMSetFromZIPFile(Map, GameList, zipFile):
* *
@ -259,265 +247,263 @@ static bool LoadROM(UINT8 *buf, unsigned bufSize, const struct ROMMap *Map, cons
* but the first detected game will be ignored. * but the first detected game will be ignored.
* *
* Parameters: * Parameters:
* Map A list of pointers to the memory buffers for each ROM * Map A list of pointers to the memory buffers for each ROM
* region. * region.
* GameList List of all supported games and their ROMs. * GameList List of all supported games and their ROMs.
* zipFile ZIP file to load from. * zipFile ZIP file to load from.
* loadAll If true, will check to ensure all ROMs were loaded. * loadAll If true, will check to ensure all ROMs were loaded.
* Otherwise, omits this check and loads only specified * Otherwise, omits this check and loads only specified
* regions. * regions.
* *
* Returns: * Returns:
* Pointer to GameInfo struct for loaded game if successful, NULL * Pointer to GameInfo struct for loaded game if successful, NULL
* otherwise. Prints errors. * otherwise. Prints errors.
*/ */
const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const struct GameInfo *GameList, const char *zipFile, bool loadAll) const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const struct GameInfo *GameList, const char *zipFile, bool loadAll)
{ {
if (!strcmp(zipFile, "crom.bin")) if (!strcmp(zipFile, "crom.bin"))
return LoadCROMDirect(Map, zipFile); return LoadCROMDirect(Map, zipFile);
unzFile zf, zfp = NULL; const struct GameInfo *Game = NULL;
unz_file_info fileInfo; const struct GameInfo *CurGame; // this is the game to which the last ROM found is thought to belong
const struct GameInfo *Game = NULL; unz_file_info fileInfo;
const struct GameInfo *CurGame; // this is the game to which the last ROM found is thought to belong string zipFileParent, zfpErr = "";
string zipFileParent, zfpErr = ""; int romIdx = 0; // index within Game->ROM
int romIdx; // index within Game->ROM unsigned romsFound[sizeof(Game->ROM)/sizeof(struct ROMInfo)];
unsigned romsFound[sizeof(Game->ROM)/sizeof(struct ROMInfo)], numROMs; bool multipleGameError = false;
int err;
unsigned i, maxSize; // Try to open file
bool multipleGameError = false; unzFile zf = unzOpen(zipFile);
UINT8 *buf; if (NULL == zf)
{
// Try to open file ErrorLog("Could not open '%s'.", zipFile);
zf = unzOpen(zipFile); return NULL;
if (NULL == zf) }
{
ErrorLog("Could not open '%s'.", zipFile);
return NULL;
}
// First pass: scan every file and determine the game // First pass: scan every file and determine the game
err = unzGoToFirstFile(zf); int err = unzGoToFirstFile(zf);
if (UNZ_OK != err) if (UNZ_OK != err)
{ {
ErrorLog("Unable to read the contents of '%s' (code %X)", zipFile, err); ErrorLog("Unable to read the contents of '%s' (code %X)", zipFile, err);
return NULL; return NULL;
} }
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zf)) for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zf))
{ {
// Identify the file we're looking at // Identify the file we're looking at
err = unzGetCurrentFileInfo(zf, &fileInfo, NULL, 0, NULL, 0, NULL, 0); err = unzGetCurrentFileInfo(zf, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (err != UNZ_OK) if (err != UNZ_OK)
continue; continue;
if (OKAY != FindROMByCRC(&CurGame, &romIdx, GameList, Game, fileInfo.crc)) if (OKAY != FindROMByCRC(&CurGame, &romIdx, GameList, Game, fileInfo.crc))
continue; continue;
// If the ROM appears in multiple games, do not use it to identify the game! // If the ROM appears in multiple games, do not use it to identify the game!
if (!ROMIsUnique(GameList, fileInfo.crc)) if (!ROMIsUnique(GameList, fileInfo.crc))
continue; continue;
// We have a unique ROM used by a single game; identify that game // We have a unique ROM used by a single game; identify that game
if (Game == NULL) // this is the first game we've identified within the ZIP if (Game == NULL) // this is the first game we've identified within the ZIP
{ {
Game = CurGame; Game = CurGame;
DebugLog("ROM set identified: %s (%s), %s\n", Game->id, Game->title, zipFile); DebugLog("ROM set identified: %s (%s), %s\n", Game->id, Game->title, zipFile);
} }
else // we've already identified a game else // we've already identified a game
{ {
if (CurGame != Game) // another game? if (CurGame != Game) // another game?
{ {
DebugLog("%s also contains: %s (%s)\n", zipFile, CurGame->id, CurGame->title); DebugLog("%s also contains: %s (%s)\n", zipFile, CurGame->id, CurGame->title);
if (multipleGameError == false) // only warn about this once if (multipleGameError == false) // only warn about this once
{ {
ErrorLog("Multiple games were found in '%s'; loading '%s'.", zipFile, Game->title); ErrorLog("Multiple games were found in '%s'; loading '%s'.", zipFile, Game->title);
multipleGameError = true; multipleGameError = true;
} }
} }
} }
} }
if (Game == NULL) if (Game == NULL)
{ {
ErrorLog("No Model 3 games found in '%s'.", zipFile); ErrorLog("No Model 3 games found in '%s'.", zipFile);
unzClose(zf); unzClose(zf);
return NULL; return NULL;
} }
if (CurGame->parent) unzFile zfp = 0;
{ if (CurGame->parent)
// Create parent zip file name {
string path = ""; // Create parent zip file name
if (strstr(zipFile, "/")) string path = "";
{ if (strstr(zipFile, "/"))
path = string(zipFile); {
path = path.substr(0, path.find_last_of("/") + 1); path = string(zipFile);
} path = path.substr(0, path.find_last_of("/") + 1);
if (strstr(zipFile, "\\")) }
{ if (strstr(zipFile, "\\"))
path = string(zipFile); {
path = path.substr(0, path.find_last_of("\\") + 1); path = string(zipFile);
} path = path.substr(0, path.find_last_of("\\") + 1);
zipFileParent = path + CurGame->parent + ".zip"; }
zipFileParent = path + CurGame->parent + ".zip";
// Create error message
zfpErr = " or '" + string(zipFileParent) + "'"; // Create error message
zfpErr = " or '" + string(zipFileParent) + "'";
// Try to open file // Try to open file
zfp = unzOpen(zipFileParent.c_str()); zfp = unzOpen(zipFileParent.c_str());
if (NULL == zfp) if (NULL == zfp)
{ {
ErrorLog("Parent ROM set '%s' is missing.", zipFileParent.c_str()); ErrorLog("Parent ROM set '%s' is missing.", zipFileParent.c_str());
unzClose(zf); unzClose(zf);
return NULL; return NULL;
} }
} }
// Second pass: check if all ROM files for the identified game are present // Second pass: check if all ROM files for the identified game are present
err = unzGoToFirstFile(zf); err = unzGoToFirstFile(zf);
if (UNZ_OK != err) if (UNZ_OK != err)
{ {
ErrorLog("Unable to read the contents of '%s' (code %X)", zipFile, err); ErrorLog("Unable to read the contents of '%s' (code %X)", zipFile, err);
unzClose(zf); unzClose(zf);
return NULL; return NULL;
} }
memset(romsFound, 0, sizeof(romsFound)); // here, romsFound[] indicates which ROMs were found in the ZIP file for the game memset(romsFound, 0, sizeof(romsFound)); // here, romsFound[] indicates which ROMs were found in the ZIP file for the game
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zf)) for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zf))
{ {
// Identify the file we're looking at // Identify the file we're looking at
err = unzGetCurrentFileInfo(zf, &fileInfo, NULL, 0, NULL, 0, NULL, 0); err = unzGetCurrentFileInfo(zf, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (err != UNZ_OK) if (err != UNZ_OK)
continue; continue;
// If it's not part of the game we've identified, skip it // If it's not part of the game we've identified, skip it
if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc)) if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc))
continue; continue;
// If we have found a ROM for the correct game, mark its corresponding indicator // If we have found a ROM for the correct game, mark its corresponding indicator
romsFound[romIdx] = 1; romsFound[romIdx] = 1;
} }
if (zfp) if (zfp)
{ {
err = unzGoToFirstFile(zfp); err = unzGoToFirstFile(zfp);
if (UNZ_OK != err) if (UNZ_OK != err)
{ {
ErrorLog("Unable to read the contents of '%s' (code %X)", zipFileParent.c_str(), err); ErrorLog("Unable to read the contents of '%s' (code %X)", zipFileParent.c_str(), err);
unzClose(zf); unzClose(zf);
return NULL; return NULL;
} }
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zfp)) for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zfp))
{ {
// Identify the file we're looking at // Identify the file we're looking at
err = unzGetCurrentFileInfo(zfp, &fileInfo, NULL, 0, NULL, 0, NULL, 0); err = unzGetCurrentFileInfo(zfp, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (err != UNZ_OK) if (err != UNZ_OK)
continue; continue;
// If it's not part of the game we've identified, skip it // If it's not part of the game we've identified, skip it
if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc)) if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc))
continue; continue;
// If we have found a ROM for the correct game, mark its corresponding indicator // If we have found a ROM for the correct game, mark its corresponding indicator
romsFound[romIdx] = 1; romsFound[romIdx] = 1;
} }
} }
// Compute how many ROM files this game has // Compute how many ROM files this game has
for (numROMs = 0; Game->ROM[numROMs].region != NULL; numROMs++) size_t numROMs = 0;
; for (; Game->ROM[numROMs].region != NULL; numROMs++)
;
// If not all ROMs were present, tell the user
err = OKAY; // If not all ROMs were present, tell the user
for (i = 0; i < numROMs; i++) err = OKAY;
{ for (size_t i = 0; i < numROMs; i++)
if ((0 == romsFound[i]) && !Game->ROM[i].optional) // if not found and also not optional {
err |= (int) ErrorLog("'%s' (CRC=%08X) is missing from '%s'%s.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile, zfp ? zfpErr.c_str() : ""); if ((0 == romsFound[i]) && !Game->ROM[i].optional) // if not found and also not optional
} err |= (int) ErrorLog("'%s' (CRC=%08X) is missing from '%s'%s.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile, zfp ? zfpErr.c_str() : "");
if (err != OKAY) }
{ if (err != OKAY)
unzClose(zf); {
if (zfp) unzClose(zfp); unzClose(zf);
return NULL; if (zfp) unzClose(zfp);
} return NULL;
}
// Allocate a scratch buffer big enough to hold the biggest ROM
maxSize = 0; // Allocate a scratch buffer big enough to hold the biggest ROM
for (i = 0; i < numROMs; i++) size_t maxSize = 0;
{ for (size_t i = 0; i < numROMs; i++)
if (Game->ROM[i].fileSize > maxSize) {
maxSize = Game->ROM[i].fileSize; if (Game->ROM[i].fileSize > maxSize)
} maxSize = Game->ROM[i].fileSize;
buf = new(std::nothrow) UINT8[maxSize]; }
if (NULL == buf) UINT8 *buf = new(std::nothrow) UINT8[maxSize];
{ if (NULL == buf)
unzClose(zf); {
if (zfp) unzClose(zfp); unzClose(zf);
ErrorLog("Insufficient memory to load ROM files (%d bytes).", maxSize); if (zfp) unzClose(zfp);
return NULL; ErrorLog("Insufficient memory to load ROM files (%d bytes).", maxSize);
} return NULL;
}
// Third pass: load the ROMs
memset(romsFound, 0, sizeof(romsFound)); // now, romsFound[] is used to indicate whether we successfully loaded the ROM // Third pass: load the ROMs
err = unzGoToFirstFile(zf); memset(romsFound, 0, sizeof(romsFound)); // now, romsFound[] is used to indicate whether we successfully loaded the ROM
if (UNZ_OK != err) err = unzGoToFirstFile(zf);
{ if (UNZ_OK != err)
ErrorLog("Unable to read the contents of '%s' (code %X).", zipFile, err); {
err = FAIL; ErrorLog("Unable to read the contents of '%s' (code %X).", zipFile, err);
goto Quit; err = FAIL;
} goto Quit;
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zf)) }
{ for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zf))
err = unzGetCurrentFileInfo(zf, &fileInfo, NULL, 0, NULL, 0, NULL, 0); {
if (err != UNZ_OK) err = unzGetCurrentFileInfo(zf, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
continue; if (err != UNZ_OK)
continue;
// If this ROM is not part of the game we're loading, skip it
if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc)) // If this ROM is not part of the game we're loading, skip it
continue; if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc))
continue;
// Load the ROM and mark that we did so successfully // Load the ROM and mark that we did so successfully
if (OKAY == LoadROM(buf, maxSize, Map, &Game->ROM[romIdx], zf, zipFile, loadAll)) if (OKAY == LoadROM(buf, maxSize, Map, &Game->ROM[romIdx], zf, zipFile, loadAll))
romsFound[romIdx] = 1; // success! mark as loaded romsFound[romIdx] = 1; // success! mark as loaded
} }
if (zfp) if (zfp)
{ {
err = unzGoToFirstFile(zfp); err = unzGoToFirstFile(zfp);
if (UNZ_OK != err) if (UNZ_OK != err)
{ {
ErrorLog("Unable to read the contents of '%s' (code %X).", zipFileParent.c_str(), err); ErrorLog("Unable to read the contents of '%s' (code %X).", zipFileParent.c_str(), err);
err = FAIL; err = FAIL;
goto Quit; goto Quit;
} }
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zfp)) for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zfp))
{ {
err = unzGetCurrentFileInfo(zfp, &fileInfo, NULL, 0, NULL, 0, NULL, 0); err = unzGetCurrentFileInfo(zfp, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (err != UNZ_OK) if (err != UNZ_OK)
continue; continue;
// If this ROM is not part of the game we're loading, skip it // If this ROM is not part of the game we're loading, skip it
if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc)) if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc))
continue; continue;
// Load the ROM and mark that we did so successfully // Load the ROM and mark that we did so successfully
if (OKAY == LoadROM(buf, maxSize, Map, &Game->ROM[romIdx], zfp, zipFileParent.c_str(), loadAll)) if (OKAY == LoadROM(buf, maxSize, Map, &Game->ROM[romIdx], zfp, zipFileParent.c_str(), loadAll))
romsFound[romIdx] = 1; // success! mark as loaded romsFound[romIdx] = 1; // success! mark as loaded
} }
} }
// Ensure all ROMs were loaded // Ensure all ROMs were loaded
if (loadAll) if (loadAll)
{ {
// See if any ROMs (that are not optional) could not be found // See if any ROMs (that are not optional) could not be found
err = OKAY; err = OKAY;
for (i = 0; i < numROMs; i++) for (size_t i = 0; i < numROMs; i++)
{ {
if (!(romsFound[i] || Game->ROM[i].optional)) // if ROM not found and also not optional if (!(romsFound[i] || Game->ROM[i].optional)) // if ROM not found and also not optional
err = ErrorLog("Could not load '%s' (CRC=%08X) from '%s'%s.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile, zfp ? zfpErr.c_str() : ""); err = ErrorLog("Could not load '%s' (CRC=%08X) from '%s'%s.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile, zfp ? zfpErr.c_str() : "");
} }
} }
else else
err = OKAY; err = OKAY;
Quit: Quit:
unzClose(zf); unzClose(zf);
delete [] buf; delete [] buf;
return (err == OKAY) ? Game : NULL; return (err == OKAY) ? Game : NULL;
} }