From 21c90abd44e1ba08048c3b292a9cbe19354b0f55 Mon Sep 17 00:00:00 2001 From: Sweetbread Date: Wed, 8 May 2024 20:42:41 +0300 Subject: [PATCH] refactor: Change to Rust's CStr --- Cargo.toml | 5 ----- examples/con.rs | 8 ++------ examples/dark.rs | 22 ++++++++++------------ examples/hwa.rs | 20 +++++++++++--------- src/dll.rs | 2 +- src/dll/console.rs | 13 +++++-------- src/modules/graphics.rs | 2 +- src/modules/system.rs | 2 +- src/modules/windows.rs | 21 ++++++++++----------- 9 files changed, 41 insertions(+), 54 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7c11c39..bc59867 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,8 +21,3 @@ path = "examples/dark.rs" [profile.release] opt-level = "z" lto = "thin" - -[dependencies] -cstr_core = { version = "0.2.6", default-features = false, features = ["nightly"] } - -[build-dependencies] diff --git a/examples/con.rs b/examples/con.rs index 9018e05..68ca565 100644 --- a/examples/con.rs +++ b/examples/con.rs @@ -1,19 +1,15 @@ #![no_std] #![no_main] -use cstr_core::cstr; use kos::{dll::Console, threads::exit}; extern crate alloc; #[no_mangle] pub fn kol_main() { - let header = cstr!("Rust!"); - let string = "Hi from Rust!"; - let con_lib = Console::import(None).unwrap(); - con_lib.init(u32::MAX, u32::MAX, u32::MAX, u32::MAX, header); - con_lib.write_string(string); + con_lib.init(u32::MAX, u32::MAX, u32::MAX, u32::MAX, c"Rust!"); + con_lib.write_string("Hi from Rust!"); con_lib.exit(false); exit(); diff --git a/examples/dark.rs b/examples/dark.rs index 6b75c8f..b65f3a7 100644 --- a/examples/dark.rs +++ b/examples/dark.rs @@ -1,8 +1,6 @@ #![no_std] #![no_main] -use cstr_core::{cstr, CStr}; - use kos::{ graphics::{display_message, Color, Dot, Size}, input::fetch_key, @@ -13,14 +11,14 @@ use kos::{ }, }; -const HEADER: &CStr = cstr!("Dark Mode Demo"); -const TEXT: [&CStr; 6] = [ - cstr!("Lorem ipsum dolor sit amet,"), - cstr!("semper et rutrum placerat,"), - cstr!("Integer sed diam commodo quam varius"), - cstr!("Sed finibus urna sit amet felis"), - cstr!("vestibulum elementum. Maecenas at feugiat lacus"), - cstr!("tristique et sit amet tortor."), +const HEADER: &'static CStr = c"Dark Mode Demo"; +const TEXT: [&'static CStr; 6] = [ + c"Lorem ipsum dolor sit amet,", + c"semper et rutrum placerat,", + c"Integer sed diam commodo quam varius", + c"Sed finibus urna sit amet felis", + c"vestibulum elementum. Maecenas at feugiat lacus", + c"tristique et sit amet tortor.", ]; const BTN: u32 = 42; const WINDOW_SIZE: Size = Size { @@ -66,9 +64,9 @@ fn draw_window(invert: bool) { Dot { x: 20, y: 310 }, Color::rgb(255, 255, 255), if invert { - cstr!("Light mode") + c"Light mode" } else { - cstr!("Dark mode") + c"Dark mode" }, None, ); diff --git a/examples/hwa.rs b/examples/hwa.rs index c6f8fbc..e2da521 100644 --- a/examples/hwa.rs +++ b/examples/hwa.rs @@ -1,8 +1,8 @@ #![no_std] #![no_main] -use cstr_core::{cstr, CStr}; - +use alloc::ffi::CString; +use core::ffi::CStr; use kos::{ graphics::{display_message, Color, Dot, Size}, input::fetch_key, @@ -14,8 +14,8 @@ use kos::{ }, }; -const HEADER: &CStr = cstr!("Hey Kolibri"); -const MSG: &CStr = cstr!("Hello from Rust!"); +const HEADER: &CStr = c"Hey Kolibri"; +const MSG: &CStr = c"Hello from Rust!"; const BTN: u32 = 42; #[macro_use] @@ -45,16 +45,18 @@ fn draw_window(c: usize) { ); let btn_str = match get_lang() { - Lang::German => format!("Taste gedrückt: {} mal\0", c), - Lang::Russian => format!("Кнопка нажата: {} раз\0", c), - Lang::French => format!("Button enfoncé : {} fois\0", c), - _ => format!("Button pressed: {} times\0", c), + Lang::German => format!("Taste gedrückt: {} mal", c), + Lang::Russian => format!("Кнопка нажата: {} раз", c), + Lang::French => format!("Button enfoncé : {} fois", c), + _ => format!("Button pressed: {} times", c), }; display_message( Dot { x: 10, y: 30 }, Color::rgb(0, 0, 0), - CStr::from_bytes_with_nul(btn_str.as_bytes()).unwrap_or(cstr!("String error")), + CString::new(btn_str.as_bytes()) + .expect("CString error") + .as_c_str(), None, ); diff --git a/src/dll.rs b/src/dll.rs index b449d97..386edc4 100644 --- a/src/dll.rs +++ b/src/dll.rs @@ -1,5 +1,5 @@ use crate::sys; -use cstr_core::CStr; +use core::ffi::CStr; mod console; pub use console::Console; diff --git a/src/dll/console.rs b/src/dll/console.rs index 7719af6..f5a5a08 100644 --- a/src/dll/console.rs +++ b/src/dll/console.rs @@ -1,7 +1,6 @@ use crate::dll::DLL; +use core::ffi::CStr; use core::mem::transmute; -use cstr_core::cstr; -use cstr_core::CStr; pub struct Console { con_init: extern "stdcall" fn(u32, u32, u32, u32, *const u8), @@ -11,16 +10,14 @@ pub struct Console { impl Console { pub fn import(path: Option<&CStr>) -> Result { - let lib = DLL::load_dll(path.unwrap_or(cstr!("/sys/lib/console.obj"))); + let lib = DLL::load_dll(path.unwrap_or(c"/sys/lib/console.obj")); match lib { Err(e) => return Err(e), Ok(dll) => unsafe { Ok(Console { - con_init: transmute(dll.get_func(cstr!("con_init")).ok().unwrap()), - con_write_string: transmute( - dll.get_func(cstr!("con_write_string")).ok().unwrap(), - ), - con_exit: transmute(dll.get_func(cstr!("con_exit")).ok().unwrap()), + con_init: transmute(dll.get_func(c"con_init").ok().unwrap()), + con_write_string: transmute(dll.get_func(c"con_write_string").ok().unwrap()), + con_exit: transmute(dll.get_func(c"con_exit").ok().unwrap()), }) }, } diff --git a/src/modules/graphics.rs b/src/modules/graphics.rs index 49dad4a..1e92292 100644 --- a/src/modules/graphics.rs +++ b/src/modules/graphics.rs @@ -1,5 +1,5 @@ use crate::sys; -use cstr_core::CStr; +use core::ffi::CStr; #[derive(Clone, Copy)] pub struct Color(u8, u8, u8); diff --git a/src/modules/system.rs b/src/modules/system.rs index 3506fac..634ae7f 100644 --- a/src/modules/system.rs +++ b/src/modules/system.rs @@ -1,7 +1,7 @@ use crate::sys; use crate::throw_new; use alloc::string::String; -use cstr_core::CStr; +use core::ffi::CStr; trait Debuggable { fn data_iter(self) -> impl Iterator; diff --git a/src/modules/windows.rs b/src/modules/windows.rs index 5c8ff7a..2dafd70 100644 --- a/src/modules/windows.rs +++ b/src/modules/windows.rs @@ -2,7 +2,8 @@ use crate::graphics::{Color, Dot, Size}; use crate::sys; use crate::system::debug_write; use crate::throw_new; -use cstr_core::{cstr, CStr}; +use alloc::ffi::CString; +use core::ffi::CStr; #[repr(u32)] pub enum WindowKind { @@ -16,12 +17,12 @@ pub enum WindowKind { pub struct WindowParams<'a> { pub color: Color, pub kind: WindowKind, - pub title: Option<&'a cstr_core::CStr>, + pub title: Option<&'a CStr>, } pub const CLOSE_BUTTON: u32 = 1; -pub fn define_window(start: Dot, size: Size, params: WindowParams<'_>) { +pub fn define_window(start: Dot, size: Size, params: WindowParams) { const RELATIVE_FLAG: u32 = 0x20; unsafe { @@ -60,14 +61,12 @@ pub fn define_button( crate::graphics::display_message( Dot { x: 10, y: 200 }, Color::rgb(255, 0, 0), - CStr::from_bytes_with_nul( - format!( - "x:{:?} y:{:?} w:{:?} h:{:?}\n\0", - start.x, start.y, size.width, size.height - ) - .as_bytes(), - ) - .unwrap_or(cstr!("String error")), + CString::new(format!( + "x:{:?} y:{:?} w:{:?} h:{:?}\n", + start.x, start.y, size.width, size.height + )) + .expect("CString error") + .as_c_str(), None, ); throw_new!(format!(