use std::ffi::c_void;
pub mod utf16;
const FLAGS_ASCII: usize = 0x07_C8;
const FLAGS_UTF16: usize = 0x07_D0;
#[repr(C)]
pub struct CFStringAscii {
isa: *const c_void,
flags: usize,
data: *const u8,
len: usize,
}
unsafe impl Sync for CFStringAscii {}
impl CFStringAscii {
pub const fn new(isa: *const c_void, data: *const u8, len: usize) -> Self {
Self {
isa,
data,
len,
flags: FLAGS_ASCII,
}
}
pub const fn as_ptr(&self) -> *const c_void {
self as *const Self as *const c_void
}
}
#[repr(C)]
pub struct CFStringUtf16 {
isa: *const c_void,
flags: usize,
data: *const u16,
len: usize,
}
unsafe impl Sync for CFStringUtf16 {}
impl CFStringUtf16 {
pub const fn new(isa: *const c_void, data: *const u16, len: usize) -> Self {
Self {
isa,
data,
len,
flags: FLAGS_UTF16,
}
}
pub const fn as_ptr(&self) -> *const c_void {
self as *const Self as *const c_void
}
}
pub const fn trim_trailing_nul(s: &str) -> &[u8] {
match s.as_bytes() {
[b @ .., 0] => b,
b => b,
}
}
pub const fn is_ascii(bytes: &[u8]) -> bool {
let mut i = 0;
loop {
if i == bytes.len() {
return true;
}
let byte = bytes[i];
if !byte.is_ascii() || byte == 0 {
return false;
}
i += 1;
}
}