vault backup: 2025-12-14 09:49:55

This commit is contained in:
akulij 2025-12-14 09:49:55 +08:00
parent 4d7ee9b819
commit 7312a7027d

View File

@ -367,7 +367,7 @@ cargo new --lib mylib
[lib] [lib]
crate-type = ["cdylib"] # cdylib означает, что нужно собрать динамическую библиотеку crate-type = ["cdylib"] # cdylib означает, что нужно собрать динамическую библиотеку
``` ```
А в src/lib.rs внесите показанный ранее код: А в src/lib.rs внесите показанный код:
```rust ```rust
use std::ffi::CStr; use std::ffi::CStr;
@ -380,7 +380,20 @@ pub struct Cased {
#[unsafe(no_mangle)] #[unsafe(no_mangle)]
pub extern unsafe "C" fn count_case_ascii(c: Cased) -> u32 { pub extern unsafe "C" fn count_case_ascii(c: Cased) -> u32 {
let cstring = unsafe { CStr::from_ptr(c.cstring) }; let cstring = unsafe { CStr::from_ptr(c.cstring) };
let case = (case as u8) << 5;
let mut counter = 0;
for c in cstring.to_bytes() {
// super naive check for character boundary
if !(((65 <= c) && (c <= 90)) && ((97 <= c) && (c <= 122))) {
continue;
}
if case & c != 0 {
counter += 1;
}
}
counter
} }
``` ```
Соберите библиотеку. Выходным файлом получится target/debug/libmylib.so (В зависимости от вашей ОС расширение .so, используемое в linux, может замениться на .dylib в macos или .dll в windows). Можем проверить наличие символа в библиотеке для функции через nm из пакета binutils: Соберите библиотеку. Выходным файлом получится target/debug/libmylib.so (В зависимости от вашей ОС расширение .so, используемое в linux, может замениться на .dylib в macos или .dll в windows). Можем проверить наличие символа в библиотеке для функции через nm из пакета binutils: