static astring *assemble_software_path(astring *str, const game_driver *gamedrv, const char *filename) { if (osd_is_absolute_path(filename)) astring_cpyc(str, filename); else astring_assemble_5(str, "software", PATH_SEPARATOR, gamedrv->name, PATH_SEPARATOR, filename); return str; }
int astring_vprintf(astring *dst, const char *format, va_list args) { char tempbuf[4096]; int result; /* sprintf into the temporary buffer */ result = vsprintf(tempbuf, format, args); /* set the result */ astring_cpyc(dst, tempbuf); return result; }
int astring_printf(astring *dst, const char *format, ...) { char tempbuf[4096]; va_list args; int result; /* sprintf into the temporary buffer */ va_start(args, format); result = vsprintf(tempbuf, format, args); va_end(args); /* set the result */ astring_cpyc(dst, tempbuf); return result; }
astring *core_filename_extract_base(astring *result, const char *name, int strip_extension) { /* find the start of the name */ const char *start = name + strlen(name); while (start > name && !is_directory_separator(start[-1])) start--; /* copy the rest into an astring */ astring_cpyc(result, start); /* chop the extension if present */ if (strip_extension) astring_substr(result, 0, astring_rchr(result, 0, '.')); return result; }
static const multicartslot_pcb_type *identify_pcb(device_image_interface &image) { const multicartslot_config *config = get_config(&image.device()); astring pcb_name; const multicartslot_pcb_type *pcb_type = NULL; multicart_t *mc; int i; if (image.exists()) { /* try opening this as if it were a multicart */ multicart_open_error me = multicart_open(image.device().machine().options(), image.filename(), image.device().machine().system().name, MULTICART_FLAGS_DONT_LOAD_RESOURCES, &mc); if (me == MCERR_NONE) { /* this was a multicart - read from it */ astring_cpyc(&pcb_name, mc->pcb_type); multicart_close(image.device().machine().options(), mc); } else { if (me != MCERR_NOT_MULTICART) fatalerror("multicart error: %s", multicart_error_text(me)); } /* look for PCB type with matching name */ for (i = 0; (i < ARRAY_LENGTH(config->pcb_types)) && (config->pcb_types[i].name != NULL); i++) { if ((config->pcb_types[i].name[0] == '\0') || !strcmp(astring_c(&pcb_name), config->pcb_types[i].name)) { pcb_type = &config->pcb_types[i]; break; } } /* check for unknown PCB type */ if ((mc != NULL) && (pcb_type == NULL)) fatalerror("Unknown PCB type \"%s\"", astring_c(&pcb_name)); } else { /* no device loaded; use the default */ pcb_type = (config->pcb_types[0].name != NULL) ? &config->pcb_types[0] : NULL; } return pcb_type; }
astring *astring_cpy(astring *dst, const astring *src) { return astring_cpyc(dst, src->text); }
void node_testzippath(xml_data_node *node) { xml_attribute_node *attr_node; xml_data_node *first_child_node; xml_data_node *child_node; const char *path; const char *plus; astring *apath = NULL; zippath_directory *directory = NULL; const osd_directory_entry *dirent; const char *type_string; file_error err; UINT64 size; mess_pile pile; core_file *file = NULL; pile_init(&pile); /* name the test case */ report_testcase_begin("zippath"); /* retrieve path */ attr_node = xml_get_attribute(node, "path"); path = (attr_node != NULL) ? attr_node->value : ""; /* retrieve 'plus' - for testing zippath_combine */ attr_node = xml_get_attribute(node, "plus"); if (attr_node != NULL) { plus = attr_node->value; apath = zippath_combine(astring_alloc(), path, plus); report_message(MSG_INFO, "Testing ZIP Path '%s' + '%s' ==> '%s'", path, plus, astring_c(apath)); } else { apath = astring_cpyc(astring_alloc(), path); report_message(MSG_INFO, "Testing ZIP Path '%s'", astring_c(apath)); } /* try doing a file compare */ messtest_get_data(node, &pile); if (pile_size(&pile) > 0) { err = zippath_fopen(astring_c(apath), OPEN_FLAG_READ, &file, NULL); if (err != FILERR_NONE) { report_message(MSG_FAILURE, "Error %d opening file", (int) err); goto done; } if (pile_size(&pile) != core_fsize(file)) { report_message(MSG_FAILURE, "Expected file to be of length %d, instead got %d", (int) pile_size(&pile), (int) core_fsize(file)); goto done; } if (memcmp(pile_getptr(&pile), core_fbuffer(file), pile_size(&pile))) { report_message(MSG_FAILURE, "File sizes match, but contents do not"); goto done; } } /* try doing a directory listing */ first_child_node = xml_get_sibling(node->child, "entry"); if (first_child_node != NULL) { err = zippath_opendir(astring_c(apath), &directory); if (err != FILERR_NONE) { report_message(MSG_FAILURE, "Error %d opening directory", (int) err); goto done; } /* read each directory entry */ while((dirent = zippath_readdir(directory)) != NULL) { /* find it in the list */ for (child_node = first_child_node; child_node != NULL; child_node = xml_get_sibling(child_node->next, "entry")) { attr_node = xml_get_attribute(child_node, "name"); if ((attr_node != NULL) && !strcmp(attr_node->value, dirent->name)) break; } /* did we find the node? */ if (child_node != NULL) { /* check dirent type */ attr_node = xml_get_attribute(child_node, "type"); if (attr_node != NULL) { type_string = dir_entry_type_string(dirent->type); if (mame_stricmp(attr_node->value, type_string)) report_message(MSG_FAILURE, "Expected '%s' to be '%s', but instead got '%s'", dirent->name, attr_node->value, type_string); } /* check size */ attr_node = xml_get_attribute(child_node, "size"); if (attr_node != NULL) { size = atoi(attr_node->value); if (size != dirent->size) report_message(MSG_FAILURE, "Expected '%s' to be of size '%ld', but instead got '%ld'", dirent->name, (long) size, (long) dirent->size); } } else { report_message(MSG_FAILURE, "Unexpected directory entry '%s'", dirent->name); } } } done: pile_delete(&pile); if (apath != NULL) astring_free(apath); if (file != NULL) core_fclose(file); if (directory != NULL) zippath_closedir(directory); }