diff --git a/src/libretro/UtilRetro.cpp b/src/libretro/UtilRetro.cpp index 72f7bbdd..041da945 100644 --- a/src/libretro/UtilRetro.cpp +++ b/src/libretro/UtilRetro.cpp @@ -99,16 +99,19 @@ bool utilIsGBAImage(const char* file) bool utilIsGBImage(const char* file) { - if (strlen(file) > 4) { - const char* p = strrchr(file, '.'); - - if (p != NULL) { - if ((_stricmp(p, ".dmg") == 0) || (_stricmp(p, ".gb") == 0) || (_stricmp(p, ".gbc") == 0) || (_stricmp(p, ".cgb") == 0) || (_stricmp(p, ".sgb") == 0)) - return true; - } - } - - return false; + FILE *fp; + bool ret = false; + char buffer[47]; + if (!file || !(fd = fopen (file, "r"))) //TODO more checks here (does file exist, is it a file, a symlink or a blockdevice) + return ret; + fseek (fp, 0, SEEK_END); + if (ftell (fp) >= 0x8000) { //afaik there can be no gb-rom smaller than this + fseek (fp, 0x104, SEEK_SET); + fread (buffer, sizeof (char), 47, fp); + ret = !memcmp (buffer, gb_image_header, 47); + } + fclose (fp); + return ret; } // strip .gz or .z off end diff --git a/src/libretro/UtilRetro.h b/src/libretro/UtilRetro.h index b2b2199a..90d4064e 100644 --- a/src/libretro/UtilRetro.h +++ b/src/libretro/UtilRetro.h @@ -16,3 +16,10 @@ extern const char *saveDotCodeFile; extern bool skipSaveGameBattery; extern bool skipSaveGameCheats; #define MAX_CHEATS 100 + +const char gb_image_header[]={ +0xce, 0xed, 0x66, 0x66, 0xcc, 0x0d, 0x00, 0x0b, 0x03, 0x73, 0x00, +0x83, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x08, 0x11, 0x1f, 0x88, 0x89, +0x00, 0x0e, 0xdc, 0xcc, 0x6e, 0xe6, 0xdd, 0xdd, 0xd9, 0x99, 0xbb, +0xbb, 0x67, 0x63, 0x6e, 0x0e, 0xec, 0xcc, 0xdd, 0xdc, 0x99, 0x9f, +0xbb, 0xb9, 0x33, 0x3e};