taisei/src/vfs/zipfile_impl.h
Andrei Alexeyev 3169b16d10
vfs: refactor VFSNode allocation and handling of backend-specific data
VFSNode no longer has the generic void* data1 and data2 fields.
Introduced a macro system that allows backends to easily "subclass"
VFSNode to add extra fields.
2023-01-20 17:13:46 +01:00

62 lines
1.4 KiB
C

/*
* This software is licensed under the terms of the MIT License.
* See COPYING for further information.
* ---
* Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>.
*/
#pragma once
#include "taisei.h"
// libzip on clang creates useless noise
DIAGNOSTIC_CLANG(push)
DIAGNOSTIC_CLANG(ignored "-Wnullability-extension")
DIAGNOSTIC_CLANG(ignored "-Wnullability-completeness")
#include <zip.h>
DIAGNOSTIC_CLANG(pop)
#include "util/libzip_compat.h"
#include "private.h"
#include "hashtable.h"
/* zipfile */
VFS_NODE_TYPE(VFSZipNode, {
VFSNode *source;
ht_str2int_t pathmap;
SDL_TLSID tls_id;
});
typedef struct VFSZipFileTLS {
zip_t *zip;
SDL_RWops *stream;
zip_error_t error;
} VFSZipFileTLS;
typedef struct VFSZipFileIterData {
zip_int64_t idx;
zip_int64_t num;
const char *prefix;
size_t prefix_len;
char *allocated;
} VFSZipFileIterData;
const char *vfs_zipfile_iter_shared(VFSZipFileIterData *idata, VFSZipFileTLS *tls);
void vfs_zipfile_iter_stop(VFSNode *node, void **opaque);
VFSZipFileTLS *vfs_zipfile_get_tls(VFSZipNode *znode, bool create);
/* zippath */
VFS_NODE_TYPE(VFSZipPathNode, {
VFSZipNode *zipnode;
uint64_t index;
ssize_t size;
ssize_t compressed_size;
VFSInfo info;
uint16_t compression;
});
VFSNode *vfs_zippath_create(VFSZipNode *zipnode, zip_int64_t idx);
SDL_RWops *vfs_zippath_make_rwops(VFSZipPathNode *zpnode) attr_nonnull_all;