use std::ffi::{c_char, CString};
use vst3::Steinberg::Vst::TChar;
pub fn copy_cstring(src: &str, dst: &mut [c_char]) {
if dst.is_empty() {
return;
}
let c_string = CString::new(src).unwrap_or_else(|_| CString::default());
let bytes = c_string.as_bytes_with_nul();
for (src, dst) in bytes.iter().zip(dst.iter_mut()) {
*dst = *src as c_char;
}
if bytes.len() > dst.len() {
if let Some(last) = dst.last_mut() {
*last = 0;
}
}
}
pub fn copy_wstring(src: &str, dst: &mut [TChar]) {
if dst.is_empty() {
return;
}
let mut len = 0;
for (src_char, dst_char) in src.encode_utf16().zip(dst.iter_mut()) {
*dst_char = src_char as TChar;
len += 1;
}
if len < dst.len() {
dst[len] = 0;
} else if let Some(last) = dst.last_mut() {
*last = 0;
}
}
pub unsafe fn len_wstring(string: *const TChar) -> usize {
if string.is_null() {
return 0;
}
let mut len = 0;
while *string.add(len) != 0 {
len += 1;
}
len
}
pub unsafe fn wstring_to_string(string: *const TChar) -> Option<String> {
if string.is_null() {
return None;
}
let len = len_wstring(string);
let slice = std::slice::from_raw_parts(string, len);
String::from_utf16(slice).ok()
}