static void audit_one_rom(core_options *options, const rom_entry *rom, const char *regiontag, const game_driver *gamedrv, UINT32 validation, audit_record *record) { const game_driver *drv; UINT32 crc = 0; UINT8 crcs[4]; int has_crc; /* fill in the record basics */ record->type = AUDIT_FILE_ROM; record->name = ROM_GETNAME(rom); record->exphash = ROM_GETHASHDATA(rom); record->length = 0; record->explength = rom_file_size(rom); /* see if we have a CRC and extract it if so */ has_crc = hash_data_extract_binary_checksum(record->exphash, HASH_CRC, crcs); if (has_crc) crc = (crcs[0] << 24) | (crcs[1] << 16) | (crcs[2] << 8) | crcs[3]; /* find the file and checksum it, getting the file length along the way */ for (drv = gamedrv; drv != NULL; drv = driver_get_clone(drv)) { file_error filerr; mame_file *file; /* open the file if we can */ astring fname(drv->name, PATH_SEPARATOR, ROM_GETNAME(rom)); if (has_crc) filerr = mame_fopen_crc_options(options, libretro_content_directory, fname, crc, OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD, &file); else filerr = mame_fopen_options(options, libretro_content_directory, fname, OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD, &file); /* if we got it, extract the hash and length */ if (filerr == FILERR_NONE) { hash_data_copy(record->hash, mame_fhash(file, validation)); record->length = (UINT32)mame_fsize(file); mame_fclose(file); break; } } /* if not found, check the region as a backup */ if (record->length == 0 && regiontag != NULL) { file_error filerr; mame_file *file; /* open the file if we can */ astring fname(regiontag, PATH_SEPARATOR, ROM_GETNAME(rom)); if (has_crc) filerr = mame_fopen_crc_options(options, libretro_content_directory, fname, crc, OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD, &file); else filerr = mame_fopen_options(options, libretro_content_directory, fname, OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD, &file); /* if we got it, extract the hash and length */ if (filerr == FILERR_NONE) { hash_data_copy(record->hash, mame_fhash(file, validation)); record->length = (UINT32)mame_fsize(file); mame_fclose(file); } } /* if we failed to find the file, set the appropriate status */ if (record->length == 0) { const game_driver *parent; /* no good dump */ if (hash_data_has_info(record->exphash, HASH_INFO_NO_DUMP)) set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND_NODUMP); /* optional ROM */ else if (ROM_ISOPTIONAL(rom)) set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND_OPTIONAL); /* not found and used by parent */ else if (rom_used_by_parent(gamedrv, rom, &parent)) set_status(record, AUDIT_STATUS_NOT_FOUND, (parent->flags & GAME_IS_BIOS_ROOT) ? SUBSTATUS_NOT_FOUND_BIOS : SUBSTATUS_NOT_FOUND_PARENT); /* just plain old not found */ else set_status(record, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND); } /* if we did find the file, do additional verification */ else { /* length mismatch */ if (record->explength != record->length) set_status(record, AUDIT_STATUS_FOUND_INVALID, SUBSTATUS_FOUND_WRONG_LENGTH); /* found but needs a dump */ else if (hash_data_has_info(record->exphash, HASH_INFO_NO_DUMP)) set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_FOUND_NODUMP); /* incorrect hash */ else if (!hash_data_is_equal(record->exphash, record->hash, 0)) set_status(record, AUDIT_STATUS_FOUND_INVALID, SUBSTATUS_FOUND_BAD_CHECKSUM); /* correct hash but needs a redump */ else if (hash_data_has_info(record->exphash, HASH_INFO_BAD_DUMP)) set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD_NEEDS_REDUMP); /* just plain old good */ else set_status(record, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD); } }
static int execute_commands(core_options *options, const char *exename, const game_driver *driver) { static const struct { const char *option; int (*function)(core_options *options, const char *gamename); } info_commands[] = { { CLIOPTION_LISTXML, cli_info_listxml }, { CLIOPTION_LISTFULL, cli_info_listfull }, { CLIOPTION_LISTSOURCE, cli_info_listsource }, { CLIOPTION_LISTCLONES, cli_info_listclones }, { CLIOPTION_LISTCRC, cli_info_listcrc }, #ifdef MESS { CLIOPTION_LISTDEVICES, info_listdevices }, #endif { CLIOPTION_LISTROMS, cli_info_listroms }, { CLIOPTION_LISTSAMPLES, cli_info_listsamples }, { CLIOPTION_VERIFYROMS, info_verifyroms }, { CLIOPTION_VERIFYSAMPLES, info_verifysamples }, { CLIOPTION_ROMIDENT, info_romident } }; int i; /* createconfig? */ if (options_get_bool(options, CLIOPTION_CREATECONFIG)) { file_error filerr; mame_file *file; /* parse any relevant INI files before proceeding */ mame_parse_ini_files(options, driver); /* make the output filename */ filerr = mame_fopen_options(options, NULL, CONFIGNAME ".ini", OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS, &file); /* error if unable to create the file */ if (filerr != FILERR_NONE) { fprintf(stderr, "Unable to create file " CONFIGNAME ".ini\n"); return MAMERR_FATALERROR; } /* output the configuration and exit cleanly */ options_output_ini_file(options, mame_core_file(file)); mame_fclose(file); return MAMERR_NONE; } /* showconfig? */ if (options_get_bool(options, CLIOPTION_SHOWCONFIG)) { /* parse any relevant INI files before proceeding */ mame_parse_ini_files(options, driver); options_output_ini_stdfile(options, stdout); return MAMERR_NONE; } /* informational commands? */ for (i = 0; i < ARRAY_LENGTH(info_commands); i++) if (options_get_bool(options, info_commands[i].option)) { const char *gamename = options_get_string(options, OPTION_GAMENAME); /* parse any relevant INI files before proceeding */ mame_parse_ini_files(options, driver); return (*info_commands[i].function)(options, (gamename[0] == 0) ? "*" : gamename); } return -1; }
int audit_samples(core_options *options, const game_driver *gamedrv, audit_record **audit) { machine_config *config = global_alloc(machine_config(gamedrv->machine_config)); audit_record *record; int records = 0; int sampnum; /* count the number of sample records attached to this driver */ const device_config_sound_interface *sound = NULL; for (bool gotone = config->m_devicelist.first(sound); gotone; gotone = sound->next(sound)) if (sound->devconfig().type() == SOUND_SAMPLES) { const samples_interface *intf = (const samples_interface *)sound->devconfig().static_config(); if (intf->samplenames != NULL) { /* iterate over samples in this entry */ for (sampnum = 0; intf->samplenames[sampnum] != NULL; sampnum++) if (intf->samplenames[sampnum][0] != '*') records++; } } /* if no records, just quit now */ if (records == 0) goto skip; /* allocate memory for the records */ *audit = global_alloc_array_clear(audit_record, records); record = *audit; /* now iterate over sample entries */ for (bool gotone = config->m_devicelist.first(sound); gotone; gotone = sound->next(sound)) if (sound->devconfig().type() == SOUND_SAMPLES) { const samples_interface *intf = (const samples_interface *)sound->devconfig().static_config(); const char *sharedname = NULL; if (intf->samplenames != NULL) { /* iterate over samples in this entry */ for (sampnum = 0; intf->samplenames[sampnum] != NULL; sampnum++) if (intf->samplenames[sampnum][0] == '*') sharedname = &intf->samplenames[sampnum][1]; else { file_error filerr; mame_file *file; /* attempt to access the file from the game driver name */ astring fname(gamedrv->name, PATH_SEPARATOR, intf->samplenames[sampnum]); filerr = mame_fopen_options(options, samplepath, fname, OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD, &file); /* attempt to access the file from the shared driver name */ if (filerr != FILERR_NONE && sharedname != NULL) { fname.cpy(sharedname).cat(PATH_SEPARATOR).cat(intf->samplenames[sampnum]); filerr = mame_fopen_options(options, samplepath, fname, OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD, &file); } /* fill in the record */ record->type = AUDIT_FILE_SAMPLE; record->name = intf->samplenames[sampnum]; if (filerr == FILERR_NONE) { set_status(record++, AUDIT_STATUS_GOOD, SUBSTATUS_GOOD); mame_fclose(file); } else set_status(record++, AUDIT_STATUS_NOT_FOUND, SUBSTATUS_NOT_FOUND); } } } skip: global_free(config); return records; }