static void identify_data(const char *name, const UINT8 *data, int length, romident_status *status) { char hash[HASH_BUF_SIZE]; UINT8 *tempjed = NULL; astring *basename; int found = 0; jed_data jed; /* if this is a '.jed' file, process it into raw bits first */ if (core_filename_ends_with(name, ".jed") && jed_parse(data, length, &jed) == JEDERR_NONE) { /* now determine the new data length and allocate temporary memory for it */ length = jedbin_output(&jed, NULL, 0); tempjed = malloc(length); if (tempjed == NULL) return; /* create a binary output of the JED data and use that instead */ jedbin_output(&jed, tempjed, length); data = tempjed; } /* compute the hash of the data */ hash_data_clear(hash); hash_compute(hash, data, length, HASH_SHA1 | HASH_CRC); /* output the name */ status->total++; basename = core_filename_extract_base(astring_alloc(), name, FALSE); mame_printf_info("%-20s", astring_c(basename)); astring_free(basename); /* see if we can find a match in the ROMs */ match_roms(hash, length, &found); /* if we didn't find it, try to guess what it might be */ if (found == 0) { /* if not a power of 2, assume it is a non-ROM file */ if ((length & (length - 1)) != 0) { mame_printf_info("NOT A ROM\n"); status->nonroms++; } /* otherwise, it's just not a match */ else mame_printf_info("NO MATCH\n"); } /* if we did find it, count it as a match */ else status->matches++; /* free any temporary JED data */ if (tempjed != NULL) free(tempjed); }
void identify_rom(const char* name, const char* hash, int length) { int found = 0; /* remove directory name */ int i; for (i = strlen(name)-1;i >= 0;i--) { if (name[i] == '/' || name[i] == '\\') { i++; break; } } if (!silentident) fprintf(stdout_file, "%s ",&name[0]); for (i = 0; drivers[i]; i++) match_roms(drivers[i],hash,&found); for (i = 0; test_drivers[i]; i++) match_roms(test_drivers[i],hash,&found); if (found == 0) { unsigned size = length; while (size && (size & 1) == 0) size >>= 1; if (size & ~1) { if (!silentident) fprintf(stdout_file, "NOT A ROM\n"); } else { if (!silentident) fprintf(stdout_file, "NO MATCH\n"); if (knownstatus == KNOWN_START) knownstatus = KNOWN_NONE; else if (knownstatus == KNOWN_ALL) knownstatus = KNOWN_SOME; } }
static void identify_file(core_options *options, const char *name, romident_status *status) { file_error filerr; osd_file *file; UINT64 length; if (core_filename_ends_with(name, ".chd")) { chd_file *chd; chd_error err; astring basename; int found = 0; core_filename_extract_base(&basename, name, FALSE); mame_printf_info("%-20s", basename.cstr()); status->total++; err = chd_open(name, CHD_OPEN_READ, NULL, &chd); if (err != CHDERR_NONE) { mame_printf_info("NOT A CHD\n"); status->nonroms++; } else { chd_header header; header = *chd_get_header(chd); if (header.flags & CHDFLAGS_IS_WRITEABLE) { mame_printf_info("is a writable CHD\n"); } else { static const UINT8 nullhash[HASH_BUF_SIZE] = { 0 }; char hash[HASH_BUF_SIZE]; /* actual hash information */ hash_data_clear(hash); /* if there's an MD5 or SHA1 hash, add them to the output hash */ if (memcmp(nullhash, header.md5, sizeof(header.md5)) != 0) hash_data_insert_binary_checksum(hash, HASH_MD5, header.md5); if (memcmp(nullhash, header.sha1, sizeof(header.sha1)) != 0) hash_data_insert_binary_checksum(hash, HASH_SHA1, header.sha1); length = header.logicalbytes; match_roms(options, hash, length, &found); if (found == 0) { mame_printf_info("NO MATCH\n"); } /* if we did find it, count it as a match */ else status->matches++; } chd_close(chd); } } else { /* open for read and process if it opens and has a valid length */ filerr = osd_open(name, OPEN_FLAG_READ, &file, &length); if (filerr == FILERR_NONE && length > 0 && (UINT32)length == length) { UINT8 *data = global_alloc_array(UINT8, length); if (data != NULL) { UINT32 bytes; /* read file data into RAM and identify it */ filerr = osd_read(file, data, 0, length, &bytes); if (filerr == FILERR_NONE) identify_data(options, name, data, bytes, status); global_free(data); } osd_close(file); } } }