From 490f7f33350109a285b2f6c43bdd964e0479bd31 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Fri, 3 Jun 2022 02:35:34 +0300 Subject: [PATCH] Rust add module "kernaux_sys::cmdline" --- pkgs/rust/kernaux-sys/src/cmdline.rs | 70 ++++++++++++++++++++++++++++ pkgs/rust/kernaux-sys/src/lib.rs | 2 + 2 files changed, 72 insertions(+) create mode 100644 pkgs/rust/kernaux-sys/src/cmdline.rs diff --git a/pkgs/rust/kernaux-sys/src/cmdline.rs b/pkgs/rust/kernaux-sys/src/cmdline.rs new file mode 100644 index 0000000..c8ffb44 --- /dev/null +++ b/pkgs/rust/kernaux-sys/src/cmdline.rs @@ -0,0 +1,70 @@ +use libc::{c_char, size_t}; + +pub const ERROR_MSG_SIZE_MAX: usize = 256; +pub const ERROR_MSG_SLEN_MAX: usize = ERROR_MSG_SIZE_MAX - 1; + +#[link(name = "kernaux")] +extern "C" { + #[link_name = "kernaux_cmdline"] + // TODO: Rust's "bool" is not guaranteed to be compatible with C's one + pub fn cmdline( + cmdline: *const c_char, + error_msg: *mut c_char, + argc: *mut size_t, + argv: *mut *mut c_char, + buffer: *mut c_char, + argv_count_max: size_t, + buffer_size: size_t, + ) -> bool; +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::ffi::{CStr, CString}; + + const ARGV_COUNT_MAX: usize = 100; + const BUFFER_SIZE: usize = 4096; + + #[test] + fn default() { + let cmdline = CString::new("foo bar\\ baz \"car cdr\"").unwrap(); + + let mut error_msg: [c_char; ERROR_MSG_SIZE_MAX] = + [0; ERROR_MSG_SIZE_MAX]; + let mut argc: size_t = 0; + let mut argv: [*mut c_char; ARGV_COUNT_MAX] = + [0 as *mut c_char; ARGV_COUNT_MAX]; + let mut buffer: [c_char; BUFFER_SIZE] = [0; BUFFER_SIZE]; + + unsafe { + assert!(super::cmdline( + cmdline.as_ptr(), + error_msg.as_mut_ptr(), + &mut argc, + argv.as_mut_ptr(), + buffer.as_mut_ptr(), + ARGV_COUNT_MAX, + BUFFER_SIZE, + )); + } + + assert_eq!( + unsafe { CStr::from_ptr(error_msg.as_ptr()) } + .to_str() + .unwrap(), + "", + ); + assert_eq!(argc, 3); + assert_eq!(unsafe { CStr::from_ptr(argv[0]) }.to_str().unwrap(), "foo"); + assert_eq!( + unsafe { CStr::from_ptr(argv[1]) }.to_str().unwrap(), + "bar baz", + ); + assert_eq!( + unsafe { CStr::from_ptr(argv[2]) }.to_str().unwrap(), + "car cdr", + ); + } +} diff --git a/pkgs/rust/kernaux-sys/src/lib.rs b/pkgs/rust/kernaux-sys/src/lib.rs index 102a66f..527cabb 100644 --- a/pkgs/rust/kernaux-sys/src/lib.rs +++ b/pkgs/rust/kernaux-sys/src/lib.rs @@ -4,7 +4,9 @@ extern crate std; pub mod assert; +pub mod cmdline; pub mod ntoa; pub use assert::*; +pub use cmdline::cmdline; pub use ntoa::{MAX_PREFIX_LEN as NTOA_MAX_PREFIX_LEN, *};