diff options
| author | Weicao Mao <1992414357@qq.com> | 2025-06-14 04:35:18 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-14 04:35:18 +0800 |
| commit | f0929789d5e3957082c41534eecd2ebf5dd38163 (patch) | |
| tree | 00692a012dde9ca06ffc725066228157e0e83ec8 /core/bindings/c_lang | |
| parent | 8a87a67ac7eaed22b3d925b8a2d66e60c3847007 (diff) | |
| parent | f657a9c2056d4e5692ddbc19217b654277300c75 (diff) | |
Merge pull request #1 from CatilGrass/c_bindings
Merge to main
Diffstat (limited to 'core/bindings/c_lang')
| -rw-r--r-- | core/bindings/c_lang/Cargo.toml | 12 | ||||
| -rw-r--r-- | core/bindings/c_lang/headers/ngpd_player.h | 39 | ||||
| -rw-r--r-- | core/bindings/c_lang/src/data/mod.rs | 1 | ||||
| -rw-r--r-- | core/bindings/c_lang/src/data/ngpd_player.rs | 139 | ||||
| -rw-r--r-- | core/bindings/c_lang/src/lib.rs | 1 |
5 files changed, 0 insertions, 192 deletions
diff --git a/core/bindings/c_lang/Cargo.toml b/core/bindings/c_lang/Cargo.toml deleted file mode 100644 index a0ee61f..0000000 --- a/core/bindings/c_lang/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "nogamepads-c-bindings" -edition = "2024" -version.workspace = true - -[dependencies] -nogamepads-core = { path = "../../../core" } -libc = "0.2.172" - -[lib] -name = "nogamepads_c" -crate-type = ["cdylib"] diff --git a/core/bindings/c_lang/headers/ngpd_player.h b/core/bindings/c_lang/headers/ngpd_player.h deleted file mode 100644 index 00fbe5b..0000000 --- a/core/bindings/c_lang/headers/ngpd_player.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef PLAYER_FFI_H -#define PLAYER_FFI_H - -#include <stdbool.h> -#include <stdint.h> - -typedef struct FfiAccount { - char* id; - char* player_hash; -} FfiAccount; - -typedef struct FfiCustomize { - char* nickname; - int32_t color_hue; - double color_saturation; - double color_value; -} FfiCustomize; - -typedef struct FfiPlayer { - FfiAccount account; - FfiCustomize* customize; -} FfiPlayer; - -#ifdef __cplusplus -extern "C" { -#endif - -FfiPlayer* player_register(const char* id, const char* password); -bool player_check(const FfiPlayer* player, const char* password); -void player_set_nickname(FfiPlayer* player, const char* nickname); -void player_set_hue(FfiPlayer* player, int hue); -void player_set_hsv(FfiPlayer* player, int hue, double saturation, double value); -void player_free(FfiPlayer* player); - -#ifdef __cplusplus -} -#endif - -#endif
\ No newline at end of file diff --git a/core/bindings/c_lang/src/data/mod.rs b/core/bindings/c_lang/src/data/mod.rs deleted file mode 100644 index 32af6d8..0000000 --- a/core/bindings/c_lang/src/data/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod ngpd_player;
\ No newline at end of file diff --git a/core/bindings/c_lang/src/data/ngpd_player.rs b/core/bindings/c_lang/src/data/ngpd_player.rs deleted file mode 100644 index 2ab615c..0000000 --- a/core/bindings/c_lang/src/data/ngpd_player.rs +++ /dev/null @@ -1,139 +0,0 @@ -use std::ffi::{CStr, CString}; -use std::os::raw::{c_char, c_double, c_int}; -use std::ptr; -use nogamepads_core::data::player::player_data::{Account, Customize, Player}; - -#[repr(C)] -pub struct FfiAccount { - id: *mut c_char, - player_hash: *mut c_char, -} - -#[repr(C)] -pub struct FfiCustomize { - nickname: *mut c_char, - color_hue: c_int, - color_saturation: c_double, - color_value: c_double, -} - -#[repr(C)] -pub struct FfiPlayer { - account: FfiAccount, - customize: *mut FfiCustomize, -} - -impl From<Account> for FfiAccount { - fn from(acc: Account) -> Self { - FfiAccount { - id: CString::new(acc.id).unwrap().into_raw(), - player_hash: CString::new(acc.player_hash).unwrap().into_raw(), - } - } -} - -impl From<Player> for FfiPlayer { - fn from(player: Player) -> Self { - let account = FfiAccount::from(player.account); - let customize = player.customize.map(|c| { - Box::into_raw(Box::new(FfiCustomize { - nickname: CString::new(c.nickname).unwrap().into_raw(), - color_hue: c.color_hue, - color_saturation: c.color_saturation, - color_value: c.color_value, - })) - }).unwrap_or(ptr::null_mut()); - - FfiPlayer { account, customize } - } -} - -impl TryFrom<&FfiPlayer> for Player { - type Error = (); - - fn try_from(ffi: &FfiPlayer) -> Result<Self, Self::Error> { - let account = Account { - id: unsafe { CStr::from_ptr(ffi.account.id) }.to_str().map_err(|_| ())?.to_owned(), - player_hash: unsafe { CStr::from_ptr(ffi.account.player_hash) }.to_str().map_err(|_| ())?.to_owned(), - }; - - let customize = if !ffi.customize.is_null() { - let c = unsafe { &*ffi.customize }; - Some(Customize { - nickname: unsafe { CStr::from_ptr(c.nickname) }.to_str().map_err(|_| ())?.to_owned(), - color_hue: c.color_hue, - color_saturation: c.color_saturation, - color_value: c.color_value, - }) - } else { - None - }; - - Ok(Player { account, customize }) - } -} - -#[unsafe(no_mangle)] -pub extern "C" fn player_register(id: *const c_char, password: *const c_char) -> *mut FfiPlayer { - let id_str = unsafe { CStr::from_ptr(id) }.to_string_lossy(); - let pass_str = unsafe { CStr::from_ptr(password) }.to_string_lossy(); - - let player = Player::register(id_str.into_owned(), pass_str.into_owned()); - Box::into_raw(Box::new(FfiPlayer::from(player))) -} - -#[unsafe(no_mangle)] -pub extern "C" fn player_check(player: *const FfiPlayer, password: *const c_char) -> bool { - let player = unsafe { &*player }; - let pass_str = unsafe { CStr::from_ptr(password) }.to_string_lossy(); - - Player::try_from(player) - .map(|p| p.check(pass_str.into_owned())) - .unwrap_or(false) -} - -#[unsafe(no_mangle)] -pub extern "C" fn player_set_nickname(player: *mut FfiPlayer, nickname: *const c_char) { - let nickname_str = unsafe { CStr::from_ptr(nickname) }.to_string_lossy().into_owned(); - let mut rust_player : Player = unsafe { (&*player).try_into().unwrap() }; - - rust_player.nickname(&nickname_str); - *unsafe { &mut *player } = FfiPlayer::from(rust_player); -} - -#[unsafe(no_mangle)] -pub extern "C" fn player_set_hue(player: *mut FfiPlayer, hue: c_int) { - let mut rust_player : Player = unsafe { (&*player).try_into().unwrap() }; - - rust_player.hue(hue); - *unsafe { &mut *player } = FfiPlayer::from(rust_player); -} - -#[unsafe(no_mangle)] -pub extern "C" fn player_set_hsv( - player: *mut FfiPlayer, hue: c_int, saturation: c_double, value: c_double -) { - let mut rust_player : Player = unsafe { (&*player).try_into().unwrap() }; - - rust_player.hsv(hue, saturation, value); - *unsafe { &mut *player } = FfiPlayer::from(rust_player); -} - -#[unsafe(no_mangle)] -pub extern "C" fn player_free(player: *mut FfiPlayer) { - if player.is_null() { return; } - - let ffi_player = unsafe { Box::from_raw(player) }; - - // Free account strings - unsafe { - let _ = CString::from_raw(ffi_player.account.id); - let _ = CString::from_raw(ffi_player.account.player_hash); - } - - // Free customize if present - if !ffi_player.customize.is_null() { - let ffi_custom = unsafe { Box::from_raw(ffi_player.customize) }; - unsafe { let _ = CString::from_raw(ffi_custom.nickname); }; - } -}
\ No newline at end of file diff --git a/core/bindings/c_lang/src/lib.rs b/core/bindings/c_lang/src/lib.rs deleted file mode 100644 index 12e35bb..0000000 --- a/core/bindings/c_lang/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod data;
\ No newline at end of file |
