UINT32 image_fwrite(mess_image *image, const void *buffer, UINT32 length) { /* if we are not associated with a file, clip the length */ if (!image->file) length = MIN(length, image->length - image->pos); if (image->file) { osd_write(image->file, buffer, image->pos, length, &length); /* since we've written to the file, we may need to invalidate the pointer */ if (image->ptr) { image_freeptr(image, image->ptr); image->ptr = NULL; } } else if (image->ptr) { memcpy(((UINT8 *) image->ptr) + image->pos, buffer, length); } else length = 0; image->pos += length; /* did we grow the file? */ if (image->length < image->pos) image->length = image->pos; /* return */ return length; }
static image_error_t set_image_filename(mess_image *image, const char *filename, const char *zippath) { image_error_t err = IMAGE_ERROR_SUCCESS; char *alloc_filename = NULL; char *new_name; char *new_dir; int pos; /* create the directory string */ new_dir = image_strdup(image, filename); for (pos = strlen(new_dir); (pos > 0); pos--) { if (strchr(":\\/", new_dir[pos - 1])) { new_dir[pos] = '\0'; break; } } /* do we have to concatenate the names? */ if (zippath) { alloc_filename = assemble_3_strings(filename, PATH_SEPARATOR, zippath); filename = alloc_filename; } /* copy the string */ new_name = image_strdup(image, filename); if (!new_name) { err = IMAGE_ERROR_OUTOFMEMORY; goto done; } /* set the new name and dir */ if (image->name) image_freeptr(image, image->name); if (image->dir) image_freeptr(image, image->dir); image->name = new_name; image->dir = new_dir; done: if (alloc_filename) free(alloc_filename); return err; }
static mame_file *image_fopen_custom(mess_image *img, int filetype, int read_or_write) { const char *sysname; char *lpExt; const game_driver *gamedrv = Machine->gamedrv; assert(img); if (!img->name) return NULL; if (img->fp) { /* If already open, we won't open the file again until it is closed. */ return NULL; } do { sysname = gamedrv->name; logerror("image_fopen: trying %s for system %s\n", img->name, sysname); img->fp = mame_fopen(sysname, img->name, filetype, read_or_write); if (img->fp && (read_or_write == OSD_FOPEN_READ)) { lpExt = strrchr( img->name, '.' ); if (lpExt && (mame_stricmp( lpExt, ".ZIP" ) == 0)) { int pathindex; int pathcount = osd_get_path_count(filetype); zip_file *zipfile; zip_entry *zipentry; char *newname; char *name; char *zipname; const char *ext; const struct IODevice *dev; mame_fclose( img->fp ); img->fp = NULL; dev = image_device(img); assert(dev); newname = NULL; zipname = image_malloc( img, strlen( sysname ) + 1 + strlen( img->name ) + 1 ); if( osd_is_absolute_path( img->name ) ) { strcpy( zipname, img->name ); } else { strcpy( zipname, sysname ); strcat( zipname, osd_path_separator() ); strcat( zipname, img->name ); } for (pathindex = 0; pathindex < pathcount; pathindex++) { zipfile = openzip(filetype, pathindex, zipname); if (zipfile) { zipentry = readzip(zipfile); while( zipentry ) { /* mess doesn't support paths in zip files */ name = osd_basename( zipentry->name ); lpExt = strrchr(name, '.'); if (lpExt) { lpExt++; ext = dev->file_extensions; while(*ext) { if( mame_stricmp( lpExt, ext ) == 0 ) { if( newname ) { image_freeptr( img, newname ); } newname = image_malloc(img, strlen(img->name) + 1 + strlen(name) + 1); if (!newname) return NULL; strcpy(newname, img->name); strcat(newname, osd_path_separator()); strcat(newname, name); } ext += strlen(ext) + 1; } } zipentry = readzip(zipfile); } closezip(zipfile); } if( !newname ) { return NULL; } img->fp = mame_fopen(sysname, newname, filetype, read_or_write); if (img->fp) { image_freeptr(img, img->name); img->name = newname; break; } } image_freeptr( img, zipname ); } } gamedrv = mess_next_compatible_driver(gamedrv); } while(!img->fp && gamedrv); if (img->fp) { logerror("image_fopen: found image %s for system %s\n", img->name, sysname); img->length = mame_fsize(img->fp); img->hash = NULL; } return img->fp; }