forked from rarten/ooz
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathbun.h
94 lines (78 loc) · 3.98 KB
/
bun.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#pragma once
#include <stddef.h>
#include <stdint.h>
#if defined _WIN32 || defined __CYGWIN__
#ifdef BUN_BUILD_DLL
#ifdef __GNUC__
#define BUN_DLL_PUBLIC __attribute__ ((dllexport))
#else
#define BUN_DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
#endif
#else
#ifdef __GNUC__
#define BUN_DLL_PUBLIC __attribute__ ((dllimport))
#else
#define BUN_DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.
#endif
#endif
#define BUN_DLL_LOCAL
#else
#if __GNUC__ >= 4
#define BUN_DLL_PUBLIC __attribute__ ((visibility ("default")))
#define BUN_DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else
#define BUN_DLL_PUBLIC
#define BUN_DLL_LOCAL
#endif
#endif
extern "C" {
/* BunMem is returned from functions that need to allocate the returned data.
* It keeps track of its own size and needs to be freed from the application side
* when the application is finished with it.
*/
typedef uint8_t* BunMem;
struct Bun;
struct BunIndex;
struct VfsFile;
struct Vfs {
VfsFile* (*open)(Vfs*, char const*);
void (*close)(Vfs*, VfsFile*);
int64_t(*size)(Vfs*, VfsFile*);
int64_t(*read)(Vfs*, VfsFile*, uint8_t* out, int64_t offset, int64_t size);
};
BUN_DLL_PUBLIC BunMem BunMemAlloc(size_t size);
BUN_DLL_PUBLIC int64_t BunMemSize(BunMem mem);
BUN_DLL_PUBLIC void BunMemFree(BunMem mem);
BUN_DLL_PUBLIC Bun* BunNew(char const* decompressor_path, char const* decompressor_export);
BUN_DLL_PUBLIC void BunDelete(Bun* bun);
BUN_DLL_PUBLIC BunIndex* BunIndexOpen(Bun* bun, Vfs* vfs, char const* bundle_dir);
BUN_DLL_PUBLIC void BunIndexClose(BunIndex* idx);
BUN_DLL_PUBLIC int32_t BunIndexLookupFileByPath(BunIndex* idx, char const* path);
BUN_DLL_PUBLIC BunMem BunIndexExtractFile(BunIndex* idx, int32_t file_id);
BUN_DLL_PUBLIC BunMem BunIndexExtractBundle(BunIndex* idx, int32_t bundle_id);
BUN_DLL_PUBLIC int BunIndexBundleInfo(BunIndex const* idx, int32_t bundle_info_id, char const** name, uint32_t* uncompressed_size);
BUN_DLL_PUBLIC int BunIndexFileInfo(BunIndex const* idx, int32_t file_info_id,
uint64_t* path_hash, uint32_t* bundle_index_, uint32_t* file_offset_, uint32_t* file_size_);
BUN_DLL_PUBLIC int BunIndexPathRepInfo(BunIndex const* idx, int32_t path_rep_id,
uint64_t* hash, uint32_t* offset, uint32_t* size, uint32_t* recursive_size);
BUN_DLL_PUBLIC BunMem BunIndexPathRepContents(BunIndex const* idx);
BUN_DLL_PUBLIC int BunIndexPathRepLowercase(BunIndex const *idx);
BUN_DLL_PUBLIC int32_t BunIndexBundleCount(BunIndex* idx);
BUN_DLL_PUBLIC int32_t BunIndexBundleIdByName(BunIndex* idx, char const* name);
BUN_DLL_PUBLIC int32_t BunIndexBundleFileCount(BunIndex* idx, int32_t bundle_id);
BUN_DLL_PUBLIC BunMem BunIndexBundleName(BunIndex* idx, int32_t bundle_id);
BUN_DLL_PUBLIC int32_t BunIndexBundleFileOffset(BunIndex* idx, int32_t bundle_id, int32_t file_id);
BUN_DLL_PUBLIC int32_t BunIndexBundleFileSize(BunIndex* idx, int32_t bundle_id, int32_t file_id);
/* The BunDecompress family of functions decompresses either individual raw blocks or a full PoE bundle file.
* They can either decompress into an user-supplied buffer of sufficient size or allocate a buffer for the caller.
* Allocating functions return an BunMem or NULL.
* Functions with user-supplied storage returns the resulting size or -1 in case of error.
* The buffer supplied must have an additional 64 bytes of scratch space at the end.
*/
BUN_DLL_PUBLIC int BunDecompressBlock(Bun* bun, uint8_t const* src_data, size_t src_size, uint8_t* dst_data, size_t dst_size);
BUN_DLL_PUBLIC BunMem BunDecompressBlockAlloc(Bun* bun, uint8_t const* src_data, size_t src_size, size_t dst_size);
/* If the output buffer supplied to BunDecompressBundle is NULL or of zero size, the function returns the number of bytes needed.
*/
BUN_DLL_PUBLIC int64_t BunDecompressBundle(Bun* bun, uint8_t const* src_data, size_t src_size, uint8_t* dst_data, size_t dst_size);
BUN_DLL_PUBLIC BunMem BunDecompressBundleAlloc(Bun* bun, uint8_t const* src_data, size_t src_size);
}