diff --git a/4.2/1changes.md b/4.2/1changes.md index f265bf9..afc638f 100644 --- a/4.2/1changes.md +++ b/4.2/1changes.md @@ -367,7 +367,7 @@ cargo new --lib mylib [lib] crate-type = ["cdylib"] # cdylib означает, что нужно собрать динамическую библиотеку ``` -А в src/lib.rs внесите показанный ранее код: +А в src/lib.rs внесите показанный код: ```rust use std::ffi::CStr; @@ -380,7 +380,20 @@ pub struct Cased { #[unsafe(no_mangle)] pub extern unsafe "C" fn count_case_ascii(c: Cased) -> u32 { 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: