unsigned char *read_archive(struct archive *zip, const char *filename, int *sizep) { int l = 0; int r = zip->count - 1; while (l <= r) { int m = (l + r) >> 1; int c = strcmp(filename, zip->table[m].name); if (c < 0) r = m - 1; else if (c > 0) l = m + 1; else return read_zip_file(zip->file, zip->table[m].offset, sizep); } return NULL; }
/* Generic compressed file loader. * Extracts to buf, unless optional_filename != 0 * Then extracts to optional_filename and leaves buf alone. */ int read_compressed_file(const char * path, void **buf, const char* optional_filename, ssize_t *length) { const char* file_ext = NULL; char *archive_found = NULL; char archive_path[PATH_MAX_LENGTH] = {0}; if (optional_filename) { /* Safety check. * If optional_filename and optional_filename * exists, we simply return 0, * hoping that optional_filename is the * same as requested. */ if(path_file_exists(optional_filename)) { *length = 0; return 1; } } /* We split carchive path and relative path: */ strlcpy(archive_path, path, sizeof(archive_path)); archive_found = (char*)strchr(archive_path,'#'); rarch_assert(archive_found != NULL); /* We assure that there is something after the '#' symbol. */ if (strlen(archive_found) <= 1) { /* * This error condition happens for example, when * path = /path/to/file.7z, or * path = /path/to/file.7z# */ RARCH_ERR("Could not extract image path and carchive path from " "path: %s.\n", path); *length = 0; return 0; } /* We split the string in two, by putting a \0, where the hash was: */ *archive_found = '\0'; archive_found += 1; file_ext = path_get_extension(archive_path); #ifdef HAVE_7ZIP if (strcasecmp(file_ext,"7z") == 0) { *length = read_7zip_file(archive_path,archive_found,buf,optional_filename); if (*length != -1) return 1; } #endif #ifdef HAVE_ZLIB if (strcasecmp(file_ext,"zip") == 0) { *length = read_zip_file(archive_path,archive_found,buf,optional_filename); if (*length != -1) return 1; } #endif return 0; }