From 6f4c59f9281d2eff5497339878ff0207cc25a99f Mon Sep 17 00:00:00 2001 From: neuecc Date: Thu, 7 Sep 2023 17:38:45 +0900 Subject: [PATCH] ReadMe for v1.8.0 --- README.md | 61 ++-- csbindgen-tests/src/lib.rs | 32 +++ csbindgen-tests/src/lz4.rs | 477 +++++++++++++++++--------------- dotnet-sandbox/NativeMethods.cs | 22 +- dotnet-sandbox/lz4_bindgen.cs | 150 ++++------ 5 files changed, 374 insertions(+), 368 deletions(-) diff --git a/README.md b/README.md index c69fd18..a4657e3 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Install on `Cargo.toml` as `build-dependencies` and set up `bindgen::Builder` on crate-type = ["cdylib"] [build-dependencies] -csbindgen = "1.7.5" +csbindgen = "1.8.0" ``` ### Rust to C#. @@ -479,6 +479,10 @@ Rust types will map these C# types. | `*const *const T` | `T**` | | `*mut *const T` | `T**` | | `*const *mut T` | `T**` | +| `&T` | `T*` | +| `&mut T` | `T*` | +| `&&T` | `T**` | +| `&*mut T` | `T**` | | `NonNull` | `T*` | | `Box` | `T*` | @@ -552,42 +556,19 @@ internal unsafe partial struct MyIntVec3 It also supports unit struct, but there is no C# struct that is synonymous with Rust's unit struct (0 byte), so it cannot be materialized. Instead of using void*, it is recommended to use typed pointers. ``` -// 0-byte +// 0-byte in Rust #[repr(C)] -pub struct CounterContext; +pub struct MyContext; ``` ```csharp -// 1-byte +// 1-byte in C# [StructLayout(LayoutKind.Sequential)] -internal unsafe partial struct CounterContext +internal unsafe partial struct MyContext { } ``` -```rust -// recommend to use as pointer, in C#, holds CounterContext* -#[no_mangle] -pub extern "C" fn create_counter_context() -> *mut CounterContext { - let ctx = Box::new(InternalCounterContext { - set: HashSet::new(), - }); - Box::into_raw(ctx) as *mut CounterContext -} - -#[no_mangle] -pub unsafe extern "C" fn counter_context_insert(context: *mut CounterContext, value: i32) { - let mut counter = Box::from_raw(context as *mut InternalCounterContext); - counter.set.insert(value); - Box::into_raw(counter); -} - -#[no_mangle] -pub unsafe extern "C" fn destroy_counter_context(context: *mut CounterContext) { - _ = Box::from_raw(context as *mut InternalCounterContext); -} -``` - ### Union `Union` will generate `[FieldOffset(0)]` struct. @@ -765,43 +746,47 @@ NativeMethods.delete_context(context); You can also pass memory allocated by C# to Rust (use `fixed` or `GCHandle.Alloc(Pinned)`). The important thing is that memory allocated in Rust must release in Rust and memory allocated in C# must release in C#. -If you want to pass a non FFI Safe struct, cast it to `*mut c_void`. Then C# will treat it as a `void*`. csbindgen does not support Opaque Type. Additionally, by returning a unit struct instead of `c_void`, you can create a typed handler. +If you want to pass a non FFI Safe struct reference, csbindgen generates empty C# struct. ```rust #[no_mangle] pub extern "C" fn create_counter_context() -> *mut CounterContext { - let ctx = Box::new(InternalCounterContext { + let ctx = Box::new(CounterContext { set: HashSet::new(), }); - Box::into_raw(ctx) as *mut c_void + Box::into_raw(ctx) } #[no_mangle] pub unsafe extern "C" fn insert_counter_context(context: *mut CounterContext, value: i32) { - let mut counter = Box::from_raw(context as *mut InternalCounterContext); + let mut counter = Box::from_raw(context); counter.set.insert(value); Box::into_raw(counter); } #[no_mangle] pub unsafe extern "C" fn delete_counter_context(context: *mut CounterContext) { - let counter = Box::from_raw(context as *mut InternalCounterContext); + let counter = Box::from_raw(context); for value in counter.set.iter() { println!("counter value: {}", value) } } -#[repr(C)] -pub struct CounterContext; - // no repr(C) -pub struct InternalCounterContext { +pub struct CounterContext { pub set: HashSet, } ``` ```csharp -var ctx = NativeMethods.create_counter_context(); +// csbindgen generates this handler type +[StructLayout(LayoutKind.Sequential)] +internal unsafe partial struct CounterContext +{ +} + +// You can hold pointer instance +CounterContext* ctx = NativeMethods.create_counter_context(); NativeMethods.insert_counter_context(ctx, 10); NativeMethods.insert_counter_context(ctx, 20); diff --git a/csbindgen-tests/src/lib.rs b/csbindgen-tests/src/lib.rs index c252b88..0bbccdb 100644 --- a/csbindgen-tests/src/lib.rs +++ b/csbindgen-tests/src/lib.rs @@ -609,6 +609,38 @@ pub struct CallbackTable { pub extern "C" fn reference_type(_a: &i32, _b: &*mut i32, _c: &[u8; 16], _d: &Context) {} +pub extern "C" fn reference_hogemoge1(_a : &mut i32, _b: &&i32){} +pub extern "C" fn reference_hogemoge2(_a : &mut i32, _b: &*mut i32){} + + +#[no_mangle] +pub extern "C" fn create_counter_context2() -> *mut CounterContext2 { + let ctx = Box::new(CounterContext2 { + set: HashSet::new(), + }); + Box::into_raw(ctx) +} + +#[no_mangle] +pub unsafe extern "C" fn insert_counter_context2(context: *mut CounterContext2, value: i32) { + let mut counter = Box::from_raw(context); + counter.set.insert(value); + Box::into_raw(counter); +} + +#[no_mangle] +pub unsafe extern "C" fn delete_counter_context2(context: *mut CounterContext2) { + let counter = Box::from_raw(context); + for value in counter.set.iter() { + println!("counter value: {}", value) + } +} + +// no repr(C) +pub struct CounterContext2 { + pub set: HashSet, +} + pub struct InternalHiddenContext { pub a: i32 } diff --git a/csbindgen-tests/src/lz4.rs b/csbindgen-tests/src/lz4.rs index 8717473..ab61181 100644 --- a/csbindgen-tests/src/lz4.rs +++ b/csbindgen-tests/src/lz4.rs @@ -1,5 +1,34 @@ /* automatically generated by rust-bindgen 0.64.0 */ +pub const _VCRT_COMPILER_PREPROCESSOR: u32 = 1; +pub const _SAL_VERSION: u32 = 20; +pub const __SAL_H_VERSION: u32 = 180000000; +pub const _USE_DECLSPECS_FOR_SAL: u32 = 0; +pub const _USE_ATTRIBUTES_FOR_SAL: u32 = 0; +pub const _CRT_PACKING: u32 = 8; +pub const _HAS_EXCEPTIONS: u32 = 1; +pub const _STL_LANG: u32 = 0; +pub const _HAS_CXX17: u32 = 0; +pub const _HAS_CXX20: u32 = 0; +pub const _HAS_CXX23: u32 = 0; +pub const _HAS_NODISCARD: u32 = 0; +pub const _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE: u32 = 1; +pub const _CRT_BUILD_DESKTOP_APP: u32 = 1; +pub const _ARGMAX: u32 = 100; +pub const _CRT_INT_MAX: u32 = 2147483647; +pub const _CRT_FUNCTIONS_REQUIRED: u32 = 1; +pub const _CRT_HAS_CXX17: u32 = 0; +pub const _CRT_HAS_C11: u32 = 1; +pub const _CRT_INTERNAL_NONSTDC_NAMES: u32 = 1; +pub const __STDC_SECURE_LIB__: u32 = 200411; +pub const __GOT_SECURE_LIB__: u32 = 200411; +pub const __STDC_WANT_SECURE_LIB__: u32 = 1; +pub const _SECURECRT_FILL_BUFFER_PATTERN: u32 = 254; +pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES: u32 = 0; +pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT: u32 = 0; +pub const _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES: u32 = 1; +pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY: u32 = 0; +pub const _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES_MEMORY: u32 = 0; pub const LZ4_FREESTANDING: u32 = 0; pub const LZ4_VERSION_MAJOR: u32 = 1; pub const LZ4_VERSION_MINOR: u32 = 9; @@ -13,101 +42,10 @@ pub const LZ4_MAX_INPUT_SIZE: u32 = 2113929216; pub const LZ4_HASHLOG: u32 = 12; pub const LZ4_HASHTABLESIZE: u32 = 16384; pub const LZ4_HASH_SIZE_U32: u32 = 4096; -pub const _STDINT_H: u32 = 1; -pub const _FEATURES_H: u32 = 1; -pub const _DEFAULT_SOURCE: u32 = 1; -pub const __GLIBC_USE_ISOC2X: u32 = 0; -pub const __USE_ISOC11: u32 = 1; -pub const __USE_ISOC99: u32 = 1; -pub const __USE_ISOC95: u32 = 1; -pub const __USE_POSIX_IMPLICITLY: u32 = 1; -pub const _POSIX_SOURCE: u32 = 1; -pub const _POSIX_C_SOURCE: u32 = 200809; -pub const __USE_POSIX: u32 = 1; -pub const __USE_POSIX2: u32 = 1; -pub const __USE_POSIX199309: u32 = 1; -pub const __USE_POSIX199506: u32 = 1; -pub const __USE_XOPEN2K: u32 = 1; -pub const __USE_XOPEN2K8: u32 = 1; -pub const _ATFILE_SOURCE: u32 = 1; -pub const __WORDSIZE: u32 = 64; -pub const __WORDSIZE_TIME64_COMPAT32: u32 = 1; -pub const __SYSCALL_WORDSIZE: u32 = 64; -pub const __TIMESIZE: u32 = 64; -pub const __USE_MISC: u32 = 1; -pub const __USE_ATFILE: u32 = 1; -pub const __USE_FORTIFY_LEVEL: u32 = 0; -pub const __GLIBC_USE_DEPRECATED_GETS: u32 = 0; -pub const __GLIBC_USE_DEPRECATED_SCANF: u32 = 0; -pub const _STDC_PREDEF_H: u32 = 1; -pub const __STDC_IEC_559__: u32 = 1; -pub const __STDC_IEC_60559_BFP__: u32 = 201404; -pub const __STDC_IEC_559_COMPLEX__: u32 = 1; -pub const __STDC_IEC_60559_COMPLEX__: u32 = 201404; -pub const __STDC_ISO_10646__: u32 = 201706; -pub const __GNU_LIBRARY__: u32 = 6; -pub const __GLIBC__: u32 = 2; -pub const __GLIBC_MINOR__: u32 = 35; -pub const _SYS_CDEFS_H: u32 = 1; -pub const __glibc_c99_flexarr_available: u32 = 1; -pub const __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI: u32 = 0; -pub const __HAVE_GENERIC_SELECTION: u32 = 1; -pub const __GLIBC_USE_LIB_EXT2: u32 = 0; -pub const __GLIBC_USE_IEC_60559_BFP_EXT: u32 = 0; -pub const __GLIBC_USE_IEC_60559_BFP_EXT_C2X: u32 = 0; -pub const __GLIBC_USE_IEC_60559_EXT: u32 = 0; -pub const __GLIBC_USE_IEC_60559_FUNCS_EXT: u32 = 0; -pub const __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X: u32 = 0; -pub const __GLIBC_USE_IEC_60559_TYPES_EXT: u32 = 0; -pub const _BITS_TYPES_H: u32 = 1; -pub const _BITS_TYPESIZES_H: u32 = 1; -pub const __OFF_T_MATCHES_OFF64_T: u32 = 1; -pub const __INO_T_MATCHES_INO64_T: u32 = 1; -pub const __RLIM_T_MATCHES_RLIM64_T: u32 = 1; -pub const __STATFS_MATCHES_STATFS64: u32 = 1; -pub const __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64: u32 = 1; -pub const __FD_SETSIZE: u32 = 1024; -pub const _BITS_TIME64_H: u32 = 1; -pub const _BITS_WCHAR_H: u32 = 1; -pub const _BITS_STDINT_INTN_H: u32 = 1; -pub const _BITS_STDINT_UINTN_H: u32 = 1; -pub const INT8_MIN: i32 = -128; -pub const INT16_MIN: i32 = -32768; -pub const INT32_MIN: i32 = -2147483648; -pub const INT8_MAX: u32 = 127; -pub const INT16_MAX: u32 = 32767; -pub const INT32_MAX: u32 = 2147483647; -pub const UINT8_MAX: u32 = 255; -pub const UINT16_MAX: u32 = 65535; -pub const UINT32_MAX: u32 = 4294967295; -pub const INT_LEAST8_MIN: i32 = -128; -pub const INT_LEAST16_MIN: i32 = -32768; -pub const INT_LEAST32_MIN: i32 = -2147483648; -pub const INT_LEAST8_MAX: u32 = 127; -pub const INT_LEAST16_MAX: u32 = 32767; -pub const INT_LEAST32_MAX: u32 = 2147483647; -pub const UINT_LEAST8_MAX: u32 = 255; -pub const UINT_LEAST16_MAX: u32 = 65535; -pub const UINT_LEAST32_MAX: u32 = 4294967295; -pub const INT_FAST8_MIN: i32 = -128; -pub const INT_FAST16_MIN: i64 = -9223372036854775808; -pub const INT_FAST32_MIN: i64 = -9223372036854775808; -pub const INT_FAST8_MAX: u32 = 127; -pub const INT_FAST16_MAX: u64 = 9223372036854775807; -pub const INT_FAST32_MAX: u64 = 9223372036854775807; -pub const UINT_FAST8_MAX: u32 = 255; -pub const UINT_FAST16_MAX: i32 = -1; -pub const UINT_FAST32_MAX: i32 = -1; -pub const INTPTR_MIN: i64 = -9223372036854775808; -pub const INTPTR_MAX: u64 = 9223372036854775807; -pub const UINTPTR_MAX: i32 = -1; -pub const PTRDIFF_MIN: i64 = -9223372036854775808; -pub const PTRDIFF_MAX: u64 = 9223372036854775807; -pub const SIG_ATOMIC_MIN: i32 = -2147483648; -pub const SIG_ATOMIC_MAX: u32 = 2147483647; -pub const SIZE_MAX: i32 = -1; +pub const WCHAR_MIN: u32 = 0; +pub const WCHAR_MAX: u32 = 65535; pub const WINT_MIN: u32 = 0; -pub const WINT_MAX: u32 = 4294967295; +pub const WINT_MAX: u32 = 65535; pub const LZ4_STREAM_MINSIZE: u32 = 16416; pub const LZ4_STREAMDECODE_MINSIZE: u32 = 32; pub const LZ4HC_CLEVEL_MIN: u32 = 3; @@ -135,49 +73,210 @@ pub const XXH_VERSION_MAJOR: u32 = 0; pub const XXH_VERSION_MINOR: u32 = 6; pub const XXH_VERSION_RELEASE: u32 = 5; pub const XXH_VERSION_NUMBER: u32 = 605; -pub type wchar_t = ::std::os::raw::c_int; +pub type va_list = *mut ::std::os::raw::c_char; +extern "C" { + pub fn __va_start(arg1: *mut *mut ::std::os::raw::c_char, ...); +} +pub type __vcrt_bool = bool; +pub type wchar_t = ::std::os::raw::c_ushort; +extern "C" { + pub fn __security_init_cookie(); +} +extern "C" { + pub fn __security_check_cookie(_StackCookie: usize); +} +extern "C" { + pub fn __report_gsfailure(_StackCookie: usize) -> !; +} +extern "C" { + pub static mut __security_cookie: usize; +} +pub type __crt_bool = bool; +extern "C" { + pub fn _invalid_parameter_noinfo(); +} +extern "C" { + pub fn _invalid_parameter_noinfo_noreturn() -> !; +} +extern "C" { + pub fn _invoke_watson( + _Expression: *const wchar_t, + _FunctionName: *const wchar_t, + _FileName: *const wchar_t, + _LineNo: ::std::os::raw::c_uint, + _Reserved: usize, + ) -> !; +} +pub type errno_t = ::std::os::raw::c_int; +pub type wint_t = ::std::os::raw::c_ushort; +pub type wctype_t = ::std::os::raw::c_ushort; +pub type __time32_t = ::std::os::raw::c_long; +pub type __time64_t = ::std::os::raw::c_longlong; #[repr(C)] -#[repr(align(16))] #[derive(Debug, Copy, Clone)] -pub struct max_align_t { - pub __clang_max_align_nonce1: ::std::os::raw::c_longlong, - pub __bindgen_padding_0: u64, - pub __clang_max_align_nonce2: u128, +pub struct __crt_locale_data_public { + pub _locale_pctype: *const ::std::os::raw::c_ushort, + pub _locale_mb_cur_max: ::std::os::raw::c_int, + pub _locale_lc_codepage: ::std::os::raw::c_uint, } #[test] -fn bindgen_test_layout_max_align_t() { - const UNINIT: ::std::mem::MaybeUninit = ::std::mem::MaybeUninit::uninit(); +fn bindgen_test_layout___crt_locale_data_public() { + const UNINIT: ::std::mem::MaybeUninit<__crt_locale_data_public> = + ::std::mem::MaybeUninit::uninit(); let ptr = UNINIT.as_ptr(); assert_eq!( - ::std::mem::size_of::(), - 32usize, - concat!("Size of: ", stringify!(max_align_t)) - ); - assert_eq!( - ::std::mem::align_of::(), + ::std::mem::size_of::<__crt_locale_data_public>(), 16usize, - concat!("Alignment of ", stringify!(max_align_t)) + concat!("Size of: ", stringify!(__crt_locale_data_public)) ); assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).__clang_max_align_nonce1) as usize - ptr as usize }, + ::std::mem::align_of::<__crt_locale_data_public>(), + 8usize, + concat!("Alignment of ", stringify!(__crt_locale_data_public)) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr)._locale_pctype) as usize - ptr as usize }, 0usize, concat!( "Offset of field: ", - stringify!(max_align_t), + stringify!(__crt_locale_data_public), "::", - stringify!(__clang_max_align_nonce1) + stringify!(_locale_pctype) ) ); assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).__clang_max_align_nonce2) as usize - ptr as usize }, - 16usize, + unsafe { ::std::ptr::addr_of!((*ptr)._locale_mb_cur_max) as usize - ptr as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(max_align_t), + stringify!(__crt_locale_data_public), "::", - stringify!(__clang_max_align_nonce2) + stringify!(_locale_mb_cur_max) ) ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr)._locale_lc_codepage) as usize - ptr as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(__crt_locale_data_public), + "::", + stringify!(_locale_lc_codepage) + ) + ); +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct __crt_locale_pointers { + pub locinfo: *mut __crt_locale_data, + pub mbcinfo: *mut __crt_multibyte_data, +} +#[test] +fn bindgen_test_layout___crt_locale_pointers() { + const UNINIT: ::std::mem::MaybeUninit<__crt_locale_pointers> = + ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); + assert_eq!( + ::std::mem::size_of::<__crt_locale_pointers>(), + 16usize, + concat!("Size of: ", stringify!(__crt_locale_pointers)) + ); + assert_eq!( + ::std::mem::align_of::<__crt_locale_pointers>(), + 8usize, + concat!("Alignment of ", stringify!(__crt_locale_pointers)) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr).locinfo) as usize - ptr as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(__crt_locale_pointers), + "::", + stringify!(locinfo) + ) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr).mbcinfo) as usize - ptr as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(__crt_locale_pointers), + "::", + stringify!(mbcinfo) + ) + ); +} +pub type _locale_t = *mut __crt_locale_pointers; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _Mbstatet { + pub _Wchar: ::std::os::raw::c_ulong, + pub _Byte: ::std::os::raw::c_ushort, + pub _State: ::std::os::raw::c_ushort, +} +#[test] +fn bindgen_test_layout__Mbstatet() { + const UNINIT: ::std::mem::MaybeUninit<_Mbstatet> = ::std::mem::MaybeUninit::uninit(); + let ptr = UNINIT.as_ptr(); + assert_eq!( + ::std::mem::size_of::<_Mbstatet>(), + 8usize, + concat!("Size of: ", stringify!(_Mbstatet)) + ); + assert_eq!( + ::std::mem::align_of::<_Mbstatet>(), + 4usize, + concat!("Alignment of ", stringify!(_Mbstatet)) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr)._Wchar) as usize - ptr as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(_Mbstatet), + "::", + stringify!(_Wchar) + ) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr)._Byte) as usize - ptr as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(_Mbstatet), + "::", + stringify!(_Byte) + ) + ); + assert_eq!( + unsafe { ::std::ptr::addr_of!((*ptr)._State) as usize - ptr as usize }, + 6usize, + concat!( + "Offset of field: ", + stringify!(_Mbstatet), + "::", + stringify!(_State) + ) + ); +} +pub type mbstate_t = _Mbstatet; +pub type time_t = __time64_t; +pub type rsize_t = usize; +extern "C" { + pub fn _errno() -> *mut ::std::os::raw::c_int; +} +extern "C" { + pub fn _set_errno(_Value: ::std::os::raw::c_int) -> errno_t; +} +extern "C" { + pub fn _get_errno(_Value: *mut ::std::os::raw::c_int) -> errno_t; +} +extern "C" { + pub fn __threadid() -> ::std::os::raw::c_ulong; +} +extern "C" { + pub fn __threadhandle() -> usize; } extern "C" { pub fn LZ4_versionNumber() -> ::std::os::raw::c_int; @@ -340,116 +439,24 @@ extern "C" { dictSize: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } -pub type __u_char = ::std::os::raw::c_uchar; -pub type __u_short = ::std::os::raw::c_ushort; -pub type __u_int = ::std::os::raw::c_uint; -pub type __u_long = ::std::os::raw::c_ulong; -pub type __int8_t = ::std::os::raw::c_schar; -pub type __uint8_t = ::std::os::raw::c_uchar; -pub type __int16_t = ::std::os::raw::c_short; -pub type __uint16_t = ::std::os::raw::c_ushort; -pub type __int32_t = ::std::os::raw::c_int; -pub type __uint32_t = ::std::os::raw::c_uint; -pub type __int64_t = ::std::os::raw::c_long; -pub type __uint64_t = ::std::os::raw::c_ulong; -pub type __int_least8_t = __int8_t; -pub type __uint_least8_t = __uint8_t; -pub type __int_least16_t = __int16_t; -pub type __uint_least16_t = __uint16_t; -pub type __int_least32_t = __int32_t; -pub type __uint_least32_t = __uint32_t; -pub type __int_least64_t = __int64_t; -pub type __uint_least64_t = __uint64_t; -pub type __quad_t = ::std::os::raw::c_long; -pub type __u_quad_t = ::std::os::raw::c_ulong; -pub type __intmax_t = ::std::os::raw::c_long; -pub type __uintmax_t = ::std::os::raw::c_ulong; -pub type __dev_t = ::std::os::raw::c_ulong; -pub type __uid_t = ::std::os::raw::c_uint; -pub type __gid_t = ::std::os::raw::c_uint; -pub type __ino_t = ::std::os::raw::c_ulong; -pub type __ino64_t = ::std::os::raw::c_ulong; -pub type __mode_t = ::std::os::raw::c_uint; -pub type __nlink_t = ::std::os::raw::c_ulong; -pub type __off_t = ::std::os::raw::c_long; -pub type __off64_t = ::std::os::raw::c_long; -pub type __pid_t = ::std::os::raw::c_int; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __fsid_t { - pub __val: [::std::os::raw::c_int; 2usize], -} -#[test] -fn bindgen_test_layout___fsid_t() { - const UNINIT: ::std::mem::MaybeUninit<__fsid_t> = ::std::mem::MaybeUninit::uninit(); - let ptr = UNINIT.as_ptr(); - assert_eq!( - ::std::mem::size_of::<__fsid_t>(), - 8usize, - concat!("Size of: ", stringify!(__fsid_t)) - ); - assert_eq!( - ::std::mem::align_of::<__fsid_t>(), - 4usize, - concat!("Alignment of ", stringify!(__fsid_t)) - ); - assert_eq!( - unsafe { ::std::ptr::addr_of!((*ptr).__val) as usize - ptr as usize }, - 0usize, - concat!( - "Offset of field: ", - stringify!(__fsid_t), - "::", - stringify!(__val) - ) - ); -} -pub type __clock_t = ::std::os::raw::c_long; -pub type __rlim_t = ::std::os::raw::c_ulong; -pub type __rlim64_t = ::std::os::raw::c_ulong; -pub type __id_t = ::std::os::raw::c_uint; -pub type __time_t = ::std::os::raw::c_long; -pub type __useconds_t = ::std::os::raw::c_uint; -pub type __suseconds_t = ::std::os::raw::c_long; -pub type __suseconds64_t = ::std::os::raw::c_long; -pub type __daddr_t = ::std::os::raw::c_int; -pub type __key_t = ::std::os::raw::c_int; -pub type __clockid_t = ::std::os::raw::c_int; -pub type __timer_t = *mut ::std::os::raw::c_void; -pub type __blksize_t = ::std::os::raw::c_long; -pub type __blkcnt_t = ::std::os::raw::c_long; -pub type __blkcnt64_t = ::std::os::raw::c_long; -pub type __fsblkcnt_t = ::std::os::raw::c_ulong; -pub type __fsblkcnt64_t = ::std::os::raw::c_ulong; -pub type __fsfilcnt_t = ::std::os::raw::c_ulong; -pub type __fsfilcnt64_t = ::std::os::raw::c_ulong; -pub type __fsword_t = ::std::os::raw::c_long; -pub type __ssize_t = ::std::os::raw::c_long; -pub type __syscall_slong_t = ::std::os::raw::c_long; -pub type __syscall_ulong_t = ::std::os::raw::c_ulong; -pub type __loff_t = __off64_t; -pub type __caddr_t = *mut ::std::os::raw::c_char; -pub type __intptr_t = ::std::os::raw::c_long; -pub type __socklen_t = ::std::os::raw::c_uint; -pub type __sig_atomic_t = ::std::os::raw::c_int; -pub type int_least8_t = __int_least8_t; -pub type int_least16_t = __int_least16_t; -pub type int_least32_t = __int_least32_t; -pub type int_least64_t = __int_least64_t; -pub type uint_least8_t = __uint_least8_t; -pub type uint_least16_t = __uint_least16_t; -pub type uint_least32_t = __uint_least32_t; -pub type uint_least64_t = __uint_least64_t; +pub type int_least8_t = ::std::os::raw::c_schar; +pub type int_least16_t = ::std::os::raw::c_short; +pub type int_least32_t = ::std::os::raw::c_int; +pub type int_least64_t = ::std::os::raw::c_longlong; +pub type uint_least8_t = ::std::os::raw::c_uchar; +pub type uint_least16_t = ::std::os::raw::c_ushort; +pub type uint_least32_t = ::std::os::raw::c_uint; +pub type uint_least64_t = ::std::os::raw::c_ulonglong; pub type int_fast8_t = ::std::os::raw::c_schar; -pub type int_fast16_t = ::std::os::raw::c_long; -pub type int_fast32_t = ::std::os::raw::c_long; -pub type int_fast64_t = ::std::os::raw::c_long; +pub type int_fast16_t = ::std::os::raw::c_int; +pub type int_fast32_t = ::std::os::raw::c_int; +pub type int_fast64_t = ::std::os::raw::c_longlong; pub type uint_fast8_t = ::std::os::raw::c_uchar; -pub type uint_fast16_t = ::std::os::raw::c_ulong; -pub type uint_fast32_t = ::std::os::raw::c_ulong; -pub type uint_fast64_t = ::std::os::raw::c_ulong; -pub type intmax_t = __intmax_t; -pub type uintmax_t = __uintmax_t; +pub type uint_fast16_t = ::std::os::raw::c_uint; +pub type uint_fast32_t = ::std::os::raw::c_uint; +pub type uint_fast64_t = ::std::os::raw::c_ulonglong; +pub type intmax_t = ::std::os::raw::c_longlong; +pub type uintmax_t = ::std::os::raw::c_ulonglong; pub type LZ4_i8 = i8; pub type LZ4_byte = u8; pub type LZ4_u16 = u16; @@ -1239,19 +1246,19 @@ pub const LZ4F_blockSizeID_t_LZ4F_max64KB: LZ4F_blockSizeID_t = 4; pub const LZ4F_blockSizeID_t_LZ4F_max256KB: LZ4F_blockSizeID_t = 5; pub const LZ4F_blockSizeID_t_LZ4F_max1MB: LZ4F_blockSizeID_t = 6; pub const LZ4F_blockSizeID_t_LZ4F_max4MB: LZ4F_blockSizeID_t = 7; -pub type LZ4F_blockSizeID_t = ::std::os::raw::c_uint; +pub type LZ4F_blockSizeID_t = ::std::os::raw::c_int; pub const LZ4F_blockMode_t_LZ4F_blockLinked: LZ4F_blockMode_t = 0; pub const LZ4F_blockMode_t_LZ4F_blockIndependent: LZ4F_blockMode_t = 1; -pub type LZ4F_blockMode_t = ::std::os::raw::c_uint; +pub type LZ4F_blockMode_t = ::std::os::raw::c_int; pub const LZ4F_contentChecksum_t_LZ4F_noContentChecksum: LZ4F_contentChecksum_t = 0; pub const LZ4F_contentChecksum_t_LZ4F_contentChecksumEnabled: LZ4F_contentChecksum_t = 1; -pub type LZ4F_contentChecksum_t = ::std::os::raw::c_uint; +pub type LZ4F_contentChecksum_t = ::std::os::raw::c_int; pub const LZ4F_blockChecksum_t_LZ4F_noBlockChecksum: LZ4F_blockChecksum_t = 0; pub const LZ4F_blockChecksum_t_LZ4F_blockChecksumEnabled: LZ4F_blockChecksum_t = 1; -pub type LZ4F_blockChecksum_t = ::std::os::raw::c_uint; +pub type LZ4F_blockChecksum_t = ::std::os::raw::c_int; pub const LZ4F_frameType_t_LZ4F_frame: LZ4F_frameType_t = 0; pub const LZ4F_frameType_t_LZ4F_skippableFrame: LZ4F_frameType_t = 1; -pub type LZ4F_frameType_t = ::std::os::raw::c_uint; +pub type LZ4F_frameType_t = ::std::os::raw::c_int; #[doc = " LZ4F_frameInfo_t :\n makes it possible to set or read frame parameters.\n Structure must be first init to 0, using memset() or LZ4F_INIT_FRAMEINFO,\n setting all parameters to default.\n It's then possible to update selectively some parameters"] #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -1659,7 +1666,7 @@ extern "C" { } pub const XXH_errorcode_XXH_OK: XXH_errorcode = 0; pub const XXH_errorcode_XXH_ERROR: XXH_errorcode = 1; -pub type XXH_errorcode = ::std::os::raw::c_uint; +pub type XXH_errorcode = ::std::os::raw::c_int; extern "C" { pub fn XXH_versionNumber() -> ::std::os::raw::c_uint; } @@ -1813,3 +1820,13 @@ extern "C" { extern "C" { pub fn XXH64_hashFromCanonical(src: *const XXH64_canonical_t) -> XXH64_hash_t; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct __crt_locale_data { + pub _address: u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct __crt_multibyte_data { + pub _address: u8, +} diff --git a/dotnet-sandbox/NativeMethods.cs b/dotnet-sandbox/NativeMethods.cs index bd405a2..1cb6d92 100644 --- a/dotnet-sandbox/NativeMethods.cs +++ b/dotnet-sandbox/NativeMethods.cs @@ -176,10 +176,24 @@ namespace CsBindgen [DllImport(__DllName, EntryPoint = "call_bindgen_lz4", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void call_bindgen_lz4(); - [DllImport(__DllName, EntryPoint = "reference_type", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void reference_type(int* _a, int** _b, void/* byte[] */* _c, Context* _d); + [DllImport(__DllName, EntryPoint = "reference_hogemoge1", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + public static extern void reference_hogemoge1(int* _a, int** _b); + + [DllImport(__DllName, EntryPoint = "reference_hogemoge2", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + public static extern void reference_hogemoge2(int* _a, int** _b); + + [DllImport(__DllName, EntryPoint = "create_counter_context2", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + public static extern CounterContext2* create_counter_context2(); + + [DllImport(__DllName, EntryPoint = "insert_counter_context2", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + public static extern void insert_counter_context2(CounterContext2* context, int value); + + [DllImport(__DllName, EntryPoint = "delete_counter_context2", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + public static extern void delete_counter_context2(CounterContext2* context); + [DllImport(__DllName, EntryPoint = "init_treat_as_empty_struct_context", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void init_treat_as_empty_struct_context(TreatAsEmptyStruct** _out); @@ -187,7 +201,6 @@ namespace CsBindgen public static extern void free_treat_as_empty_struct_context(TreatAsEmptyStruct* _src); - } [StructLayout(LayoutKind.Sequential)] @@ -271,6 +284,11 @@ namespace CsBindgen public delegate* unmanaged[Cdecl] foobar; } + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct CounterContext2 + { + } + [StructLayout(LayoutKind.Sequential)] internal unsafe partial struct TreatAsEmptyStruct { diff --git a/dotnet-sandbox/lz4_bindgen.cs b/dotnet-sandbox/lz4_bindgen.cs index 6dcbe7a..e75bf0d 100644 --- a/dotnet-sandbox/lz4_bindgen.cs +++ b/dotnet-sandbox/lz4_bindgen.cs @@ -19,6 +19,35 @@ namespace CsBindgen #endif + public const uint _VCRT_COMPILER_PREPROCESSOR = 1; + public const uint _SAL_VERSION = 20; + public const uint __SAL_H_VERSION = 180000000; + public const uint _USE_DECLSPECS_FOR_SAL = 0; + public const uint _USE_ATTRIBUTES_FOR_SAL = 0; + public const uint _CRT_PACKING = 8; + public const uint _HAS_EXCEPTIONS = 1; + public const uint _STL_LANG = 0; + public const uint _HAS_CXX17 = 0; + public const uint _HAS_CXX20 = 0; + public const uint _HAS_CXX23 = 0; + public const uint _HAS_NODISCARD = 0; + public const uint _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE = 1; + public const uint _CRT_BUILD_DESKTOP_APP = 1; + public const uint _ARGMAX = 100; + public const uint _CRT_INT_MAX = 2147483647; + public const uint _CRT_FUNCTIONS_REQUIRED = 1; + public const uint _CRT_HAS_CXX17 = 0; + public const uint _CRT_HAS_C11 = 1; + public const uint _CRT_INTERNAL_NONSTDC_NAMES = 1; + public const uint __STDC_SECURE_LIB__ = 200411; + public const uint __GOT_SECURE_LIB__ = 200411; + public const uint __STDC_WANT_SECURE_LIB__ = 1; + public const uint _SECURECRT_FILL_BUFFER_PATTERN = 254; + public const uint _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES = 0; + public const uint _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT = 0; + public const uint _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES = 1; + public const uint _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY = 0; + public const uint _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES_MEMORY = 0; public const uint LZ4_FREESTANDING = 0; public const uint LZ4_VERSION_MAJOR = 1; public const uint LZ4_VERSION_MINOR = 9; @@ -32,85 +61,10 @@ namespace CsBindgen public const uint LZ4_HASHLOG = 12; public const uint LZ4_HASHTABLESIZE = 16384; public const uint LZ4_HASH_SIZE_U32 = 4096; - public const uint _STDINT_H = 1; - public const uint _FEATURES_H = 1; - public const uint _DEFAULT_SOURCE = 1; - public const uint __GLIBC_USE_ISOC2X = 0; - public const uint __USE_ISOC11 = 1; - public const uint __USE_ISOC99 = 1; - public const uint __USE_ISOC95 = 1; - public const uint __USE_POSIX_IMPLICITLY = 1; - public const uint _POSIX_SOURCE = 1; - public const uint _POSIX_C_SOURCE = 200809; - public const uint __USE_POSIX = 1; - public const uint __USE_POSIX2 = 1; - public const uint __USE_POSIX199309 = 1; - public const uint __USE_POSIX199506 = 1; - public const uint __USE_XOPEN2K = 1; - public const uint __USE_XOPEN2K8 = 1; - public const uint _ATFILE_SOURCE = 1; - public const uint __WORDSIZE = 64; - public const uint __WORDSIZE_TIME64_COMPAT32 = 1; - public const uint __SYSCALL_WORDSIZE = 64; - public const uint __TIMESIZE = 64; - public const uint __USE_MISC = 1; - public const uint __USE_ATFILE = 1; - public const uint __USE_FORTIFY_LEVEL = 0; - public const uint __GLIBC_USE_DEPRECATED_GETS = 0; - public const uint __GLIBC_USE_DEPRECATED_SCANF = 0; - public const uint _STDC_PREDEF_H = 1; - public const uint __STDC_IEC_559__ = 1; - public const uint __STDC_IEC_60559_BFP__ = 201404; - public const uint __STDC_IEC_559_COMPLEX__ = 1; - public const uint __STDC_IEC_60559_COMPLEX__ = 201404; - public const uint __STDC_ISO_10646__ = 201706; - public const uint __GNU_LIBRARY__ = 6; - public const uint __GLIBC__ = 2; - public const uint __GLIBC_MINOR__ = 35; - public const uint _SYS_CDEFS_H = 1; - public const uint __glibc_c99_flexarr_available = 1; - public const uint __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI = 0; - public const uint __HAVE_GENERIC_SELECTION = 1; - public const uint __GLIBC_USE_LIB_EXT2 = 0; - public const uint __GLIBC_USE_IEC_60559_BFP_EXT = 0; - public const uint __GLIBC_USE_IEC_60559_BFP_EXT_C2X = 0; - public const uint __GLIBC_USE_IEC_60559_EXT = 0; - public const uint __GLIBC_USE_IEC_60559_FUNCS_EXT = 0; - public const uint __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X = 0; - public const uint __GLIBC_USE_IEC_60559_TYPES_EXT = 0; - public const uint _BITS_TYPES_H = 1; - public const uint _BITS_TYPESIZES_H = 1; - public const uint __OFF_T_MATCHES_OFF64_T = 1; - public const uint __INO_T_MATCHES_INO64_T = 1; - public const uint __RLIM_T_MATCHES_RLIM64_T = 1; - public const uint __STATFS_MATCHES_STATFS64 = 1; - public const uint __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 = 1; - public const uint __FD_SETSIZE = 1024; - public const uint _BITS_TIME64_H = 1; - public const uint _BITS_WCHAR_H = 1; - public const uint _BITS_STDINT_INTN_H = 1; - public const uint _BITS_STDINT_UINTN_H = 1; - public const uint INT8_MAX = 127; - public const uint INT16_MAX = 32767; - public const uint INT32_MAX = 2147483647; - public const uint UINT8_MAX = 255; - public const uint UINT16_MAX = 65535; - public const uint UINT32_MAX = 4294967295; - public const uint INT_LEAST8_MAX = 127; - public const uint INT_LEAST16_MAX = 32767; - public const uint INT_LEAST32_MAX = 2147483647; - public const uint UINT_LEAST8_MAX = 255; - public const uint UINT_LEAST16_MAX = 65535; - public const uint UINT_LEAST32_MAX = 4294967295; - public const uint INT_FAST8_MAX = 127; - public const ulong INT_FAST16_MAX = 9223372036854775807; - public const ulong INT_FAST32_MAX = 9223372036854775807; - public const uint UINT_FAST8_MAX = 255; - public const ulong INTPTR_MAX = 9223372036854775807; - public const ulong PTRDIFF_MAX = 9223372036854775807; - public const uint SIG_ATOMIC_MAX = 2147483647; + public const uint WCHAR_MIN = 0; + public const uint WCHAR_MAX = 65535; public const uint WINT_MIN = 0; - public const uint WINT_MAX = 4294967295; + public const uint WINT_MAX = 65535; public const uint LZ4_STREAM_MINSIZE = 16416; public const uint LZ4_STREAMDECODE_MINSIZE = 32; public const uint LZ4HC_CLEVEL_MIN = 3; @@ -138,21 +92,21 @@ namespace CsBindgen public const uint XXH_VERSION_MINOR = 6; public const uint XXH_VERSION_RELEASE = 5; public const uint XXH_VERSION_NUMBER = 605; - public const uint LZ4F_blockSizeID_t_LZ4F_default = 0; - public const uint LZ4F_blockSizeID_t_LZ4F_max64KB = 4; - public const uint LZ4F_blockSizeID_t_LZ4F_max256KB = 5; - public const uint LZ4F_blockSizeID_t_LZ4F_max1MB = 6; - public const uint LZ4F_blockSizeID_t_LZ4F_max4MB = 7; - public const uint LZ4F_blockMode_t_LZ4F_blockLinked = 0; - public const uint LZ4F_blockMode_t_LZ4F_blockIndependent = 1; - public const uint LZ4F_contentChecksum_t_LZ4F_noContentChecksum = 0; - public const uint LZ4F_contentChecksum_t_LZ4F_contentChecksumEnabled = 1; - public const uint LZ4F_blockChecksum_t_LZ4F_noBlockChecksum = 0; - public const uint LZ4F_blockChecksum_t_LZ4F_blockChecksumEnabled = 1; - public const uint LZ4F_frameType_t_LZ4F_frame = 0; - public const uint LZ4F_frameType_t_LZ4F_skippableFrame = 1; - public const uint XXH_errorcode_XXH_OK = 0; - public const uint XXH_errorcode_XXH_ERROR = 1; + public const int LZ4F_blockSizeID_t_LZ4F_default = 0; + public const int LZ4F_blockSizeID_t_LZ4F_max64KB = 4; + public const int LZ4F_blockSizeID_t_LZ4F_max256KB = 5; + public const int LZ4F_blockSizeID_t_LZ4F_max1MB = 6; + public const int LZ4F_blockSizeID_t_LZ4F_max4MB = 7; + public const int LZ4F_blockMode_t_LZ4F_blockLinked = 0; + public const int LZ4F_blockMode_t_LZ4F_blockIndependent = 1; + public const int LZ4F_contentChecksum_t_LZ4F_noContentChecksum = 0; + public const int LZ4F_contentChecksum_t_LZ4F_contentChecksumEnabled = 1; + public const int LZ4F_blockChecksum_t_LZ4F_noBlockChecksum = 0; + public const int LZ4F_blockChecksum_t_LZ4F_blockChecksumEnabled = 1; + public const int LZ4F_frameType_t_LZ4F_frame = 0; + public const int LZ4F_frameType_t_LZ4F_skippableFrame = 1; + public const int XXH_errorcode_XXH_OK = 0; + public const int XXH_errorcode_XXH_ERROR = 1; [DllImport(__DllName, EntryPoint = "csbindgen_LZ4_versionNumber", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] @@ -538,13 +492,13 @@ namespace CsBindgen [StructLayout(LayoutKind.Sequential)] public unsafe partial struct LZ4F_frameInfo_t { - public uint blockSizeID; - public uint blockMode; - public uint contentChecksumFlag; - public uint frameType; + public int blockSizeID; + public int blockMode; + public int contentChecksumFlag; + public int frameType; public ulong contentSize; public uint dictID; - public uint blockChecksumFlag; + public int blockChecksumFlag; } [StructLayout(LayoutKind.Sequential)]