static int write_config(const char *filename, const game_driver *gamedrv) { file_error filerr; mame_file *f; char buffer[128]; int retval = 1; if (gamedrv != NULL) { sprintf(buffer, "%s.ini", gamedrv->name); filename = buffer; } filerr = mame_fopen(SEARCHPATH_INI, buffer, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &f); if (filerr != FILERR_NONE) goto done; options_output_ini_file(mame_options(), mame_core_file(f)); retval = 0; done: if (f != NULL) mame_fclose(f); return retval; }
static chd_file *get_disc(const device_config *device) { mame_file *image_file = NULL; chd_file *image_chd = NULL; mame_path *path; /* open a path to the ROMs and find the first CHD file */ path = mame_openpath(mame_options(), OPTION_ROMPATH); if (path != NULL) { const osd_directory_entry *dir; /* iterate while we get new objects */ while ((dir = mame_readpath(path)) != NULL) { int length = strlen(dir->name); /* look for files ending in .chd */ if (length > 4 && dir->name[length - 4] == '.' && tolower(dir->name[length - 3]) == 'c' && tolower(dir->name[length - 2]) == 'h' && tolower(dir->name[length - 1]) == 'd') { file_error filerr; chd_error chderr; /* open the file itself via our search path */ filerr = mame_fopen(SEARCHPATH_IMAGE, dir->name, OPEN_FLAG_READ, &image_file); if (filerr == FILERR_NONE) { /* try to open the CHD */ chderr = chd_open_file(mame_core_file(image_file), CHD_OPEN_READ, NULL, &image_chd); if (chderr == CHDERR_NONE) { set_disk_handle(device->machine, "laserdisc", image_file, image_chd); filename = astring_dupc(dir->name); add_exit_callback(device->machine, free_string); break; } /* close the file on failure */ mame_fclose(image_file); image_file = NULL; } } } mame_closepath(path); } /* if we failed, pop a message and exit */ if (image_file == NULL) fatalerror("No valid image file found!\n"); return get_disk_handle(device->machine, "laserdisc"); }
static int config_save_xml(running_machine *machine, mame_file *file, int which_type) { xml_data_node *root = xml_file_create(); xml_data_node *confignode, *systemnode; config_type *type; /* if we don't have a root, bail */ if (!root) return 0; /* create a config node */ confignode = xml_add_child(root, "mameconfig", NULL); if (!confignode) goto error; xml_set_attribute_int(confignode, "version", CONFIG_VERSION); /* create a system node */ systemnode = xml_add_child(confignode, "system", NULL); if (!systemnode) goto error; xml_set_attribute(systemnode, "name", (which_type == CONFIG_TYPE_DEFAULT) ? "default" : machine->gamedrv->name); /* create the input node and write it out */ /* loop over all registrants and call their save function */ for (type = typelist; type; type = type->next) { xml_data_node *curnode = xml_add_child(systemnode, type->name, NULL); if (!curnode) goto error; (*type->save)(which_type, curnode); /* if nothing was added, just nuke the node */ if (!curnode->value && !curnode->child) xml_delete_node(curnode); } /* flush the file */ xml_file_write(root, mame_core_file(file)); /* free and get out of here */ xml_file_free(root); return 1; error: xml_file_free(root); return 0; }
/*------------------------------------------------- load_software - software image loading -------------------------------------------------*/ bool legacy_image_device_base::load_software(char *swlist, char *swname, rom_entry *start) { const rom_entry *region; astring regiontag; bool retVal = FALSE; for (region = start; region != NULL; region = rom_next_region(region)) { /* loop until we hit the end of this region */ const rom_entry *romp = region + 1; while (!ROMENTRY_ISREGIONEND(romp)) { /* handle files */ if (ROMENTRY_ISFILE(romp)) { UINT32 crc = 0; UINT8 crcbytes[4]; file_error filerr; bool has_crc = hash_data_extract_binary_checksum(ROM_GETHASHDATA(romp), HASH_CRC, crcbytes); if (has_crc) crc = (crcbytes[0] << 24) | (crcbytes[1] << 16) | (crcbytes[2] << 8) | crcbytes[3]; astring fname(swlist, PATH_SEPARATOR, swname, PATH_SEPARATOR, ROM_GETNAME(romp)); if (has_crc) filerr = mame_fopen_crc(libretro_content_directory, fname, crc, OPEN_FLAG_READ, &m_mame_file); else filerr = mame_fopen(libretro_content_directory, fname, OPEN_FLAG_READ, &m_mame_file); if (filerr == FILERR_NONE) { m_file = mame_core_file(m_mame_file); retVal = TRUE; } break; // load first item for start } romp++; /* something else; skip */ } } return retVal; }
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; }
static int config_load_xml(running_machine *machine, mame_file *file, int which_type) { xml_data_node *root, *confignode, *systemnode; config_type *type; const char *srcfile; int version, count; /* read the file */ root = xml_file_read(mame_core_file(file), NULL); if (!root) goto error; /* find the config node */ confignode = xml_get_sibling(root->child, "mameconfig"); if (!confignode) goto error; /* validate the config data version */ version = xml_get_attribute_int(confignode, "version", 0); if (version != CONFIG_VERSION) goto error; /* strip off all the path crap from the source filename */ srcfile = strrchr(machine->gamedrv->source_file, '/'); if (!srcfile) srcfile = strrchr(machine->gamedrv->source_file, '\\'); if (!srcfile) srcfile = strrchr(machine->gamedrv->source_file, ':'); if (!srcfile) srcfile = machine->gamedrv->source_file; else srcfile++; /* loop over all system nodes in the file */ count = 0; for (systemnode = xml_get_sibling(confignode->child, "system"); systemnode; systemnode = xml_get_sibling(systemnode->next, "system")) { /* look up the name of the system here; skip if none */ const char *name = xml_get_attribute_string(systemnode, "name", ""); /* based on the file type, determine whether we have a match */ switch (which_type) { case CONFIG_TYPE_GAME: /* only match on the specific game name */ if (strcmp(name, machine->gamedrv->name) != 0) continue; break; case CONFIG_TYPE_DEFAULT: /* only match on default */ if (strcmp(name, "default") != 0) continue; break; case CONFIG_TYPE_CONTROLLER: { const game_driver *clone_of; /* match on: default, game name, source file name, parent name, grandparent name */ if (strcmp(name, "default") != 0 && strcmp(name, machine->gamedrv->name) != 0 && strcmp(name, srcfile) != 0 && ((clone_of = driver_get_clone(machine->gamedrv)) == NULL || strcmp(name, clone_of->name) != 0) && (clone_of == NULL || ((clone_of = driver_get_clone(clone_of)) == NULL) || strcmp(name, clone_of->name) != 0)) continue; break; } } /* log that we are processing this entry */ if (DEBUG_CONFIG) mame_printf_debug("Entry: %s -- processing\n", name); /* loop over all registrants and call their load function */ for (type = typelist; type; type = type->next) (*type->load)(which_type, xml_get_sibling(systemnode->child, type->name)); count++; } /* error if this isn't a valid game match */ if (count == 0) goto error; /* free the parser */ xml_file_free(root); return 1; error: if (root) xml_file_free(root); return 0; }