/* AM 980919 updated */ int osd_fchecksum (const char *game, const char *filename, unsigned int *length, unsigned int *sum) { char name[256]; int found = 0; const char *gamename = game; if (!found) { /* try with a .zip extension */ sprintf(name,"%s.zip\0", gamename); /*if (cache_stat(name)==0)*/ { sprintf(name,"%sroms/%s.zip\0", gp2x_path_mame, gamename); if (checksum_zipped_file (name, filename, length, sum)==0) { found = 1; } } } if (!found) { if (cache_stat((char *)gamename)==0) { sprintf(name,"%sroms/%s/%s\0",gp2x_path_mame, gamename, filename); if (checksum_file(name,0,length,sum)==0) { found = 1; } } } if (!found) return -1; return 0; }
/* AM 980919 updated */ int osd_fchecksum (const char *game, const char *filename, unsigned int *length, unsigned int *sum) { char name[256]; int indx; struct stat stat_buffer; int found = 0; const char *gamename = game; /* Support "-romdir" yuck. */ if (alternate_name) gamename = alternate_name; for (indx=0;indx<rompathc && !found; ++indx) { const char* dir_name = rompathv[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 (checksum_file(name,0,length,sum)==0) { found = 1; } } } if (!found) { /* try with a .zip extension */ sprintf(name,"%s/%s.zip", dir_name, gamename); if (cache_stat(name,&stat_buffer)==0) { if (checksum_zipped_file (name, filename, length, sum)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fchecksum) zip file for %s\n", filename); found = 1; } } } 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 (checksum_file(name,0,length,sum)==0) { found = 1; } } } } if (!found) return -1; return 0; }
static mame_file *generic_fopen(int pathtype, const char *gamename, const char *filename, const char* hash, UINT32 flags) { static const char *access_modes[] = { "rb", "rb", "wb", "r+b" }; const char *extension = get_extension_for_filetype(pathtype); int pathcount = osd_get_path_count(pathtype); int pathindex, pathstart, pathstop, pathinc; mame_file file, *newfile; char tempname[256]; LOG(("generic_fopen(%d, %s, %s, %s, %X)\n", pathc, gamename, filename, extension, flags)); /* reset the file handle */ memset(&file, 0, sizeof(file)); /* check for incompatible flags */ if ((flags & FILEFLAG_OPENWRITE) && (flags & FILEFLAG_HASH)) fprintf(stderr, "Can't use HASH option with WRITE option in generic_fopen!\n"); /* determine start/stop based on reverse search flag */ if (!(flags & FILEFLAG_REVERSE_SEARCH)) { pathstart = 0; pathstop = pathcount; pathinc = 1; } else { pathstart = pathcount - 1; pathstop = -1; pathinc = -1; } /* loop over paths */ for (pathindex = pathstart; pathindex != pathstop; pathindex += pathinc) { char name[1024]; /* ----------------- STEP 1: OPEN THE FILE RAW -------------------- */ /* first look for path/gamename as a directory */ compose_path(name, gamename, NULL, NULL); LOG(("Trying %s\n", name)); /* if the directory exists, proceed */ if (*name == 0 || osd_get_path_info(pathtype, pathindex, name) == PATH_IS_DIRECTORY) { /* now look for path/gamename/filename.ext */ compose_path(name, gamename, filename, extension); /* if we need checksums, load it into RAM and compute it along the way */ if (flags & FILEFLAG_HASH) { if (checksum_file(pathtype, pathindex, name, &file.data, &file.length, file.hash) == 0) { file.type = RAM_FILE; break; } } /* otherwise, just open it straight */ else { file.type = PLAIN_FILE; file.file = osd_fopen(pathtype, pathindex, name, access_modes[flags & 3]); if (file.file == NULL && (flags & 3) == 3) file.file = osd_fopen(pathtype, pathindex, name, "w+b"); if (file.file != NULL) break; } } /* ----------------- STEP 2: OPEN THE FILE IN A ZIP -------------------- */ /* now look for it within a ZIP file */ if (!(flags & (FILEFLAG_OPENWRITE | FILEFLAG_NOZIP))) { /* first look for path/gamename.zip */ compose_path(name, gamename, NULL, "zip"); LOG(("Trying %s file\n", name)); /* if the ZIP file exists, proceed */ if (osd_get_path_info(pathtype, pathindex, name) == PATH_IS_FILE) { UINT32 ziplength; /* if the file was able to be extracted from the ZIP, continue */ compose_path(tempname, NULL, filename, extension); /* verify-only case */ if (flags & FILEFLAG_VERIFY_ONLY) { UINT8 crcs[4]; UINT32 crc = 0; /* Since this is a .ZIP file, we extract the CRC from the expected hash (if any), so that we can load by CRC if needed. We must check that the hash really contains a CRC, because it could be a NO_DUMP rom for which we do not know the CRC yet. */ if (hash && hash_data_extract_binary_checksum(hash, HASH_CRC, crcs) != 0) { /* Store the CRC in a single DWORD */ crc = ((unsigned long)crcs[0] << 24) | ((unsigned long)crcs[1] << 16) | ((unsigned long)crcs[2] << 8) | ((unsigned long)crcs[3] << 0); } hash_data_clear(file.hash); if (checksum_zipped_file(pathtype, pathindex, name, tempname, &ziplength, &crc) == 0) { file.length = ziplength; file.type = UNLOADED_ZIPPED_FILE; crcs[0] = (UINT8)(crc >> 24); crcs[1] = (UINT8)(crc >> 16); crcs[2] = (UINT8)(crc >> 8); crcs[3] = (UINT8)(crc >> 0); hash_data_insert_binary_checksum(file.hash, HASH_CRC, crcs); break; } }