/* AM 980919 update */ void *osd_fopen(const char *game,const char *filename,int filetype,int _write) { char name[256]; char *gamename; int found = 0; int indx; struct stat stat_buffer; FakeFileHandle *f; int pathc; char** pathv; #ifdef MESS char file[MAXPATHL]; char *extension; #endif f = (FakeFileHandle *)malloc(sizeof(FakeFileHandle)); if (!f) return 0; memset(f,0,sizeof(FakeFileHandle)); gamename = (char *)game; /* Support "-romdir" yuck. */ if (alternate_name) gamename = alternate_name; switch (filetype) { case OSD_FILETYPE_ROM: case OSD_FILETYPE_SAMPLE: #ifdef MESS case OSD_FILETYPE_ROM_CART: #endif /* only for reading */ if (_write) break; if (filetype==OSD_FILETYPE_ROM #ifdef MESS || OSD_FILETYPE_ROM_CART #endif ) { pathc = rompathc; pathv = rompathv; } else { pathc = samplepathc; pathv = samplepathv; } for (indx=0;indx<pathc && !found; ++indx) { const char* dir_name = pathv[indx]; if (!found) { sprintf(name,"%s/%s",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s/%s",dir_name,gamename,filename); if (filetype==OSD_FILETYPE_ROM) { if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } #ifdef MESS /* Zip cart support for MESS */ if (!found && filetype == OSD_FILETYPE_ROM_CART) { extension = strrchr(name, '.'); /* find extension */ if (extension) *extension = '\0'; /* drop extension */ sprintf(name,"%s.zip", name); /* add .zip for zipfile */ if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, filename, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } #endif if (!found) { /* try with a .zip extension */ sprintf(name,"%s/%s.zip", dir_name, gamename); if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, filename, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s/%s.zip",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s.zip/%s",dir_name,gamename,filename); if (filetype==OSD_FILETYPE_ROM) { if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } /* ZipFolders support disabled for rom and sample load. There is no reason to keep it because now zip files are fully supported. */ #if 0 if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s/%s.zif",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0) { sprintf(name,"%s/%s.zif/%s",dir_name,gamename,filename); if (filetype==OSD_FILETYPE_ROM) { if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } #endif } break; #ifdef MESS case OSD_FILETYPE_IMAGE: if(errorlog) fprintf(errorlog,"Open IMAGE '%s' for %s\n", filename, game); strcpy(file, filename); do { for (indx=0; indx < rompathc && !found; ++indx) { const char* dir_name = rompathv[indx]; if (!found) { sprintf(name, "%s/%s", dir_name, gamename); if(errorlog) fprintf(errorlog,"Trying %s\n", name); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s/%s", dir_name, gamename, file); f->file = fopen(name,_write ? "r+b" : "rb"); found = f->file!=0; } } /******************************************************/ /* Zip IMAGE support for MESS */ if (filetype == OSD_FILETYPE_IMAGE && !_write) { extension = strrchr(name, '.'); /* find extension */ if (extension) *extension = '\0'; /* drop extension */ sprintf(name,"%s.zip", name); /* add .zip for zipfile */ if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, filename, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } /******************************************************/ if (!found && !_write) { /* try with a .zip extension */ sprintf(name, "%s/%s.zip", dir_name, gamename); if (errorlog) fprintf(errorlog,"Trying %s\n", name); if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, file, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name, "%s/%s.zip", dir_name, gamename); if (errorlog) fprintf(errorlog,"Trying %s\n", name); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s.zip/%s",dir_name,gamename,file); f->file = fopen(name,_write ? "r+b" : "rb"); found = f->file!=0; } } if (found) { if (errorlog) fprintf(errorlog,"IMAGE %s FOUND in %s!\n",file,name); } } extension = strrchr(file, '.'); if (extension) *extension = '\0'; } while (!found && extension); break; #endif case OSD_FILETYPE_HIGHSCORE: if (mame_highscore_enabled()) { if (!found) { sprintf(name,"%s/%s.hi",hidir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s.zip/%s.hi",hidir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s.zif/%s.hi",hidir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } } break; case OSD_FILETYPE_CONFIG: sprintf(name,"%s/%s.cfg",cfgdir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s.zip/%s.cfg",cfgdir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s.zif/%s.cfg",cfgdir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } break; case OSD_FILETYPE_INPUTLOG: sprintf(name,"%s/%s.inp", inpdir, gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; case OSD_FILETYPE_STATE: sprintf(name,"%s/%s.sta",stadir,gamename); f->file = fopen(name,_write ? "wb" : "rb"); found = !(f->file == 0); if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s.zip/%s.sta",stadir,gamename); f->file = fopen(name,_write ? "wb" : "rb"); found = !(f->file == 0); } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s.zif/%s.sta",stadir,gamename); f->file = fopen(name,_write ? "wb" : "rb"); found = !(f->file == 0); } break; case OSD_FILETYPE_ARTWORK: /* only for reading */ if (_write) break; sprintf(name,"%s/%s", artworkdir, filename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; case OSD_FILETYPE_MEMCARD: sprintf(name, "%s/%s",memcarddir,filename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; case OSD_FILETYPE_SCREENSHOT: /* only for writing */ if (!_write) break; sprintf(name,"%s/%s.png", screenshotdir, filename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; } if (!found) { free(f); return 0; } return f; }
/* AM 980919 update */ void *osd_fopen (const char *game, const char *filename, int filetype, int _write) { char name[256]; char *gamename; int found = 0; int indx; struct stat stat_buffer; FakeFileHandle *f; int pathc; char **pathv; f = (FakeFileHandle *) malloc(sizeof (FakeFileHandle)); if( !f ) { logerror("osd_fopen: failed to mallocFakeFileHandle!\n"); return 0; } memset (f, 0, sizeof (FakeFileHandle)); gamename = (char *) game; /* Support "-romdir" yuck. */ if( alternate_name ) { LOG(("osd_fopen: -romdir overrides '%s' by '%s'\n", gamename, alternate_name)); gamename = alternate_name; } switch( filetype ) { case OSD_FILETYPE_ROM: case OSD_FILETYPE_SAMPLE: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } if( filetype == OSD_FILETYPE_SAMPLE ) { LOG(("osd_fopen: using samplepath\n")); pathc = samplepathc; pathv = samplepathv; } else { LOG(("osd_fopen: using rompath\n")); pathc = rompathc; pathv = rompathv; } for( indx = 0; indx < pathc && !found; ++indx ) { const char *dir_name = pathv[indx]; if( !found ) { sprintf (name, "%s/%s", dir_name, gamename); LOG(("Trying %s\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s/%s", dir_name, gamename, filename); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file (name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen (name, "rb"); found = f->file != 0; } } } if( !found ) { /* try with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s file\n", name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s directory\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s.zip/%s", dir_name, gamename, filename); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file (name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen (name, "rb"); found = f->file != 0; } } } } break; #ifdef MESS case OSD_FILETYPE_IMAGE_R: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } else { LOG(("osd_fopen: using rompath\n")); pathc = rompathc; pathv = rompathv; } LOG(("Open IMAGE_R '%s' for %s\n", filename, game)); for( indx = 0; indx < pathc && !found; ++indx ) { const char *dir_name = pathv[indx]; /* this section allows exact path from .cfg */ if( !found ) { sprintf(name,"%s",dir_name); if( cache_stat(name,&stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf(name,"%s/%s",dir_name,filename); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file (name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } if( !found ) { sprintf (name, "%s/%s", dir_name, gamename); LOG(("Trying %s directory\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s/%s", dir_name, gamename, filename); LOG(("Trying %s file\n", name)); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file(name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen (name, "rb"); found = f->file != 0; } } } /* Zip cart support for MESS */ if( !found && filetype == OSD_FILETYPE_IMAGE_R ) { char *extension = strrchr (name, '.'); /* find extension */ if( extension ) strcpy (extension, ".zip"); else strcat (name, ".zip"); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if( !found ) { /* try with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } } break; /* end of IMAGE_R */ case OSD_FILETYPE_IMAGE_RW: { static char *write_modes[] = {"rb","wb","r+b","r+b","w+b"}; char file[256]; char *extension; LOG(("Open IMAGE_RW '%s' for %s mode '%s'\n", filename, game, write_modes[_write])); strcpy (file, filename); do { /* 29-05-00 Lee Ward: Reversed the search order. */ for (indx=rompathc-1; indx>=0; --indx) { const char *dir_name = rompathv[indx]; /* Exact path support */ /* 29-05-00 Lee Ward: Changed the search order to prevent new files being created in the application root as default */ if( !found ) { sprintf (name, "%s/%s", dir_name, gamename); LOG(("Trying %s directory\n", name)); if( cache_stat(name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s/%s", dir_name, gamename, file); LOG(("Trying %s file\n", name)); f->file = fopen (name, write_modes[_write]); found = f->file != 0; if( !found && _write == 3 ) { f->file = fopen(name, write_modes[4]); found = f->file != 0; } } } /* Steph - Zip disk images support for MESS */ if( !found && !_write ) { extension = strrchr (name, '.'); /* find extension */ /* add .zip for zipfile */ if( extension ) strcpy(extension, ".zip"); else strcat(extension, ".zip"); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32(0L, f->data, f->length); found = 1; } } } if (!found) { sprintf(name, "%s", dir_name); LOG(("Trying %s directory\n", name)); if( cache_stat(name,&stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf(name,"%s/%s", dir_name, file); LOG(("Trying %s file\n", name)); f->file = fopen(name, write_modes[_write]); found = f->file != 0; if( !found && _write == 3 ) { f->file = fopen(name, write_modes[4]); found = f->file != 0; } } } if( !found && !_write ) { extension = strrchr (name, '.'); /* find extension */ /* add .zip for zipfile */ if( extension ) strcpy(extension, ".zip"); else strcat(extension, ".zip"); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32(0L, f->data, f->length); found = 1; } } } if( !found && !_write ) { /* try with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s file\n", name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s ZipMagic directory\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s.zip/%s", dir_name, gamename, file); LOG(("Trying %s\n", name)); f->file = fopen (name, write_modes[_write]); found = f->file != 0; if( !found && _write == 3 ) { f->file = fopen(name, write_modes[4]); found = f->file != 0; } } } if( found ) LOG(("IMAGE_RW %s FOUND in %s!\n", file, name)); } extension = strrchr (file, '.'); if( extension ) *extension = '\0'; } while( !found && extension ); } break; #endif /* MESS */ case OSD_FILETYPE_NVRAM: if( !found ) { sprintf (name, "%s/%s.nv", nvdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.nv", nvdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.nv", nvdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } break; case OSD_FILETYPE_HIGHSCORE: if( mame_highscore_enabled () ) { if( !found ) { sprintf (name, "%s/%s.hi", hidir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.hi", hidir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.hi", hidir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } } break; case OSD_FILETYPE_CONFIG: sprintf (name, "%s/%s.cfg", cfgdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.cfg", cfgdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.cfg", cfgdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } break; case OSD_FILETYPE_INPUTLOG: sprintf (name, "%s/%s.inp", inpdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.cfg", inpdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.cfg", inpdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !_write ) { char file[256]; sprintf (file, "%s.inp", gamename); sprintf (name, "%s/%s.zip", inpdir, gamename); LOG(("Trying %s in %s\n", file, name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file %s for %s\n", name, file)); f->type = kZippedFile; f->offset = 0; found = 1; } } } break; case OSD_FILETYPE_STATE: sprintf (name, "%s/%s.sta", stadir, gamename); f->file = fopen (name, _write ? "wb" : "rb"); found = !(f->file == 0); if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.sta", stadir, gamename); f->file = fopen (name, _write ? "wb" : "rb"); found = !(f->file == 0); } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.sta", stadir, gamename); f->file = fopen (name, _write ? "wb" : "rb"); found = !(f->file == 0); } break; case OSD_FILETYPE_ARTWORK: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } sprintf (name, "%s/%s", artworkdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.png", artworkdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.png", artworkdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { char file[256], *extension; sprintf(file, "%s", filename); sprintf(name, "%s/%s", artworkdir, filename); extension = strrchr(name, '.'); if( extension ) strcpy (extension, ".zip"); else strcat (name, ".zip"); LOG(("Trying %s in %s\n", file, name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file %s\n", name)); f->type = kZippedFile; f->offset = 0; found = 1; } } if( !found ) { sprintf(name, "%s/%s.zip", artworkdir, game); LOG(("Trying %s in %s\n", file, name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file %s\n", name)); f->type = kZippedFile; f->offset = 0; found = 1; } } } } break; case OSD_FILETYPE_MEMCARD: sprintf (name, "%s/%s", memcarddir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; break; case OSD_FILETYPE_SCREENSHOT: /* only for writing */ if( !_write ) { logerror("osd_fopen: type %02x read not supported\n",filetype); break; } sprintf (name, "%s/%s.png", screenshotdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; break; case OSD_FILETYPE_HIGHSCORE_DB: case OSD_FILETYPE_HISTORY: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } f->type = kPlainFile; /* open as ASCII files, not binary like the others */ f->file = fopen (filename, _write ? "w" : "r"); found = f->file != 0; break; /* Steph */ case OSD_FILETYPE_CHEAT: sprintf (name, "%s/%s", cheatdir, filename); f->type = kPlainFile; /* open as ASCII files, not binary like the others */ f->file = fopen (filename, _write ? "a" : "r"); found = f->file != 0; break; case OSD_FILETYPE_LANGUAGE: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } sprintf (name, "%s.lng", filename); f->type = kPlainFile; /* open as ASCII files, not binary like the others */ f->file = fopen (name, _write ? "w" : "r"); found = f->file != 0; logerror("fopen %s = %08x\n",name,(int)f->file); break; default: logerror("osd_fopen(): unknown filetype %02x\n",filetype); } if( !found ) { free(f); return 0; } return f; }
mame_file *mame_fopen(const char *gamename, const char *filename, int filetype, int openforwrite) { /* first verify that we aren't trying to open read-only types as writeables */ switch (filetype) { /* read-only cases */ case FILETYPE_ROM: #ifndef MESS case FILETYPE_IMAGE: #endif case FILETYPE_SAMPLE: case FILETYPE_HIGHSCORE_DB: case FILETYPE_ARTWORK: case FILETYPE_HISTORY: case FILETYPE_LANGUAGE: case FILETYPE_INI: if (openforwrite) { logerror("mame_fopen: type %02x write not supported\n", filetype); return NULL; } break; /* write-only cases */ case FILETYPE_SCREENSHOT: #ifdef PINMAME case FILETYPE_WAVE: #endif /* PINMAME */ if (!openforwrite) { logerror("mame_fopen: type %02x read not supported\n", filetype); return NULL; } break; } /* now open the file appropriately */ switch (filetype) { /* ROM files */ case FILETYPE_ROM: return generic_fopen(filetype, gamename, filename, 0, FILEFLAG_OPENREAD | FILEFLAG_HASH); /* read-only disk images */ case FILETYPE_IMAGE: return generic_fopen(filetype, gamename, filename, 0, FILEFLAG_OPENREAD | FILEFLAG_NOZIP); /* differencing disk images */ case FILETYPE_IMAGE_DIFF: return generic_fopen(filetype, gamename, filename, 0, FILEFLAG_OPENREAD | FILEFLAG_OPENWRITE); /* samples */ case FILETYPE_SAMPLE: return generic_fopen(filetype, gamename, filename, 0, FILEFLAG_OPENREAD); /* artwork files */ case FILETYPE_ARTWORK: return generic_fopen(filetype, gamename, filename, 0, FILEFLAG_OPENREAD); /* NVRAM files */ case FILETYPE_NVRAM: return generic_fopen(filetype, NULL, gamename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* high score files */ case FILETYPE_HIGHSCORE: if (!mame_highscore_enabled()) return NULL; return generic_fopen(filetype, NULL, gamename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* highscore database */ case FILETYPE_HIGHSCORE_DB: return generic_fopen(filetype, NULL, filename, 0, FILEFLAG_OPENREAD); /* config files */ case FILETYPE_CONFIG: return generic_fopen(filetype, NULL, gamename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* input logs */ case FILETYPE_INPUTLOG: return generic_fopen(filetype, NULL, gamename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* save state files */ case FILETYPE_STATE: return generic_fopen(filetype, NULL, filename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* memory card files */ case FILETYPE_MEMCARD: return generic_fopen(filetype, NULL, filename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* screenshot files */ case FILETYPE_SCREENSHOT: #ifdef PINMAME case FILETYPE_WAVE: #endif /* PINMAME */ return generic_fopen(filetype, NULL, filename, 0, FILEFLAG_OPENWRITE); /* history files */ case FILETYPE_HISTORY: return generic_fopen(filetype, NULL, filename, 0, FILEFLAG_OPENREAD); /* cheat file */ case FILETYPE_CHEAT: return generic_fopen(filetype, NULL, filename, 0, FILEFLAG_OPENREAD | (openforwrite ? FILEFLAG_OPENWRITE : 0)); /* language file */ case FILETYPE_LANGUAGE: return generic_fopen(filetype, NULL, filename, 0, FILEFLAG_OPENREAD); /* ctrlr files */ case FILETYPE_CTRLR: return generic_fopen(filetype, gamename, filename, 0, openforwrite ? FILEFLAG_OPENWRITE : FILEFLAG_OPENREAD); /* game specific ini files */ case FILETYPE_INI: return generic_fopen(filetype, NULL, gamename, 0, FILEFLAG_OPENREAD); /* anything else */ default: logerror("mame_fopen(): unknown filetype %02x\n", filetype); return NULL; } return NULL; }