Compare commits
No commits in common. "7312a7027d9256fb4b31f89a17f2675449aff1d0" and "633d17413d6f03f1c9e83c17423045ed690a1b69" have entirely different histories.
7312a7027d
...
633d17413d
@ -367,33 +367,11 @@ 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;
|
|
||||||
|
|
||||||
pub struct Cased {
|
|
||||||
cstring: *const c_char,
|
|
||||||
case: bool, // true for uppercase,
|
|
||||||
// false for lowercase
|
|
||||||
}
|
|
||||||
|
|
||||||
#[unsafe(no_mangle)]
|
#[unsafe(no_mangle)]
|
||||||
pub extern unsafe "C" fn count_case_ascii(c: Cased) -> u32 {
|
pub extern "C" fn doublefast(x: u32) -> u32 {
|
||||||
let cstring = unsafe { CStr::from_ptr(c.cstring) };
|
x << 1
|
||||||
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:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user