void zlib_parse_file_iterate_stop(void *data) { zlib_transfer_t *state = (zlib_transfer_t*)data; if (!state || !state->handle) return; state->type = ZLIB_TRANSFER_DEINIT; zlib_parse_file_iterate(data, NULL, NULL, NULL, NULL, NULL); }
static void rarch_task_decompress_handler_subdir(rarch_task_t *task) { bool returnerr; decompress_state_t *dec = (decompress_state_t*)task->state; int ret = zlib_parse_file_iterate(&dec->zlib, &returnerr, dec->source_file, dec->valid_ext, file_decompressed_subdir, dec); task->progress = zlib_parse_file_progress(&dec->zlib); if (task->cancelled || ret != 0) { task->error = dec->callback_error; zlib_parse_file_iterate_stop(&dec->zlib); rarch_task_decompress_handler_finished(task, dec); } }
/** * zlib_parse_file: * @file : filename path of archive * @valid_exts : Valid extensions of archive to be parsed. * If NULL, allow all. * @file_cb : file_cb function pointer * @userdata : userdata to pass to file_cb function pointer. * * Low-level file parsing. Enumerates over all files and calls * file_cb with userdata. * * Returns: true (1) on success, otherwise false (0). **/ bool zlib_parse_file(const char *file, const char *valid_exts, zlib_file_cb file_cb, void *userdata) { zlib_transfer_t state = {0}; bool returnerr = true; state.type = ZLIB_TRANSFER_INIT; for (;;) { int ret = zlib_parse_file_iterate(&state, &returnerr, file, valid_exts, file_cb, userdata); if (ret != 0) break; } return returnerr; }
static int database_info_iterate_playlist_zip( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { bool returnerr = true; #ifdef HAVE_ZLIB if (db_state->crc != 0) return database_info_iterate_crc_lookup(db_state, db, db_state->zip_name); else { if (zlib_parse_file_iterate(&db->state, &returnerr, name, NULL, zlib_compare_crc32, (void*)db_state) != 0) return 0; if (db_state->crc) zlib_parse_file_iterate_stop(&db->state); } #endif return 1; }