Skip to main content

rapidgzip_sys/
lib.rs

1//! Raw FFI bindings for the native `rapidgzip` C ABI.
2//!
3//! Most users should depend on the safe `rapidgzip` crate instead of calling
4//! this layer directly.
5
6use libc::{c_char, c_int, c_void, size_t};
7
8/// Status code returned by the native `rapidgzip` C ABI.
9#[repr(C)]
10#[derive(Debug, Copy, Clone, PartialEq, Eq)]
11#[allow(non_camel_case_types)]
12pub enum rgz_status_t {
13    RGZ_STATUS_OK = 0,
14    RGZ_STATUS_EOF = 1,
15    RGZ_STATUS_INVALID_ARGUMENT = 10,
16    RGZ_STATUS_IO_ERROR = 11,
17    RGZ_STATUS_DATA_ERROR = 12,
18    RGZ_STATUS_UNSUPPORTED = 13,
19    RGZ_STATUS_OUT_OF_MEMORY = 14,
20    RGZ_STATUS_INTERNAL_ERROR = 15,
21    RGZ_STATUS_SEEK_ERROR = 16,
22    RGZ_STATUS_INDEX_ERROR = 17,
23    RGZ_STATUS_STATE_ERROR = 18,
24    RGZ_STATUS_NOT_IMPLEMENTED = 19,
25}
26
27/// Native I/O mode flags stored in `rgz_config_t.flags`.
28///
29/// These values expose the upstream reader strategies without expanding the
30/// ABI struct layout. `AUTO` keeps the native default behavior.
31pub const RGZ_IO_READ_MODE_MASK: u32 = 0b11;
32pub const RGZ_IO_READ_MODE_AUTO: u32 = 0;
33pub const RGZ_IO_READ_MODE_SEQUENTIAL: u32 = 1;
34pub const RGZ_IO_READ_MODE_PREAD: u32 = 2;
35pub const RGZ_IO_READ_MODE_LOCKED_READ_AND_SEEK: u32 = 3;
36
37/// Reader configuration passed across the FFI boundary.
38#[repr(C)]
39pub struct rgz_config_t {
40    pub struct_size: u32,
41    pub flags: u32,
42    pub parallelism: u32,
43    pub reserved0: u32,
44    pub chunk_size: u64,
45    pub reserved1: u64,
46}
47
48/// Callback table used for custom callback-backed inputs.
49#[repr(C)]
50#[derive(Copy, Clone)]
51pub struct rgz_callbacks_t {
52    pub read: Option<
53        unsafe extern "C" fn(user_data: *mut c_void, dst: *mut c_char, len: size_t) -> size_t,
54    >,
55    pub seek:
56        Option<unsafe extern "C" fn(user_data: *mut c_void, offset: i64, origin: c_int) -> u64>,
57    pub get_size: Option<unsafe extern "C" fn(user_data: *mut c_void) -> u64>,
58    pub clone: Option<unsafe extern "C" fn(user_data: *mut c_void) -> *mut c_void>,
59    pub free_user_data: Option<unsafe extern "C" fn(user_data: *mut c_void)>,
60}
61
62/// Opaque native reader handle.
63#[repr(C)]
64pub struct rgz_reader_t {
65    _unused: [u8; 0],
66}
67
68extern "C" {
69    pub fn rgz_abi_version() -> u32;
70    pub fn rgz_config_init(config: *mut rgz_config_t);
71
72    pub fn rgz_open_path_ex(
73        path: *const c_char,
74        config: *const rgz_config_t,
75        status_out: *mut rgz_status_t,
76    ) -> *mut rgz_reader_t;
77
78    pub fn rgz_open_callbacks(
79        callbacks: rgz_callbacks_t,
80        user_data: *mut c_void,
81        config: *const rgz_config_t,
82        status_out: *mut rgz_status_t,
83    ) -> *mut rgz_reader_t;
84
85    pub fn rgz_close(reader: *mut rgz_reader_t);
86
87    pub fn rgz_read(
88        reader: *mut rgz_reader_t,
89        dst: *mut c_void,
90        len: size_t,
91        read_out: *mut size_t,
92    ) -> rgz_status_t;
93
94    pub fn rgz_read_discard(
95        reader: *mut rgz_reader_t,
96        len: size_t,
97        read_out: *mut size_t,
98    ) -> rgz_status_t;
99
100    pub fn rgz_read_to_fd(
101        reader: *mut rgz_reader_t,
102        output_fd: c_int,
103        len: size_t,
104        read_out: *mut size_t,
105    ) -> rgz_status_t;
106
107    pub fn rgz_set_keep_index(reader: *mut rgz_reader_t, keep_index: bool) -> rgz_status_t;
108
109    pub fn rgz_seek_to(reader: *mut rgz_reader_t, uncompressed_offset: u64) -> rgz_status_t;
110
111    pub fn rgz_tell(reader: *mut rgz_reader_t, offset_out: *mut u64) -> rgz_status_t;
112
113    pub fn rgz_import_index_path(reader: *mut rgz_reader_t, path: *const c_char) -> rgz_status_t;
114
115    pub fn rgz_export_index_path(reader: *mut rgz_reader_t, path: *const c_char) -> rgz_status_t;
116
117    pub fn rgz_import_index_callbacks(
118        reader: *mut rgz_reader_t,
119        callbacks: rgz_callbacks_t,
120        user_data: *mut c_void,
121    ) -> rgz_status_t;
122
123    pub fn rgz_export_index_write(
124        reader: *mut rgz_reader_t,
125        write_cb: unsafe extern "C" fn(
126            user_data: *mut c_void,
127            buffer: *const c_void,
128            size: size_t,
129        ) -> size_t,
130        user_data: *mut c_void,
131    ) -> rgz_status_t;
132
133    pub fn rgz_last_error(reader: *mut rgz_reader_t) -> *const c_char;
134    pub fn rgz_last_global_error() -> *const c_char;
135    pub fn rgz_last_status(reader: *mut rgz_reader_t) -> rgz_status_t;
136}