diff --git a/src/wrapper.rs b/src/wrapper.rs index d98e01da..148b89f3 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -17,4 +17,5 @@ //! Wrappers for different plugin types. Each wrapper has an entry point macro that you can pass the //! name of a type that implements `Plugin` to. The macro will handle the rest. +pub mod util; pub mod vst3; diff --git a/src/wrapper/util.rs b/src/wrapper/util.rs new file mode 100644 index 00000000..5f33eeed --- /dev/null +++ b/src/wrapper/util.rs @@ -0,0 +1,35 @@ +// nih-plug: plugins, but rewritten in Rust +// Copyright (C) 2022 Robbert van der Helm +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use std::cmp; +use std::os::raw::c_char; + +/// The equivalent of the `strlcpy()` C function. Copy `src` to `dest` as a null-terminated +/// C-string. If `dest` does not have enough capacity, add a null terminator at the end to prevent +/// buffer overflows. +pub fn strlcpy(dest: &mut [c_char], src: &str) { + if dest.is_empty() { + return; + } + + let src_bytes: &[u8] = src.as_bytes(); + let src_bytes_signed: &[i8] = unsafe { &*(src_bytes as *const [u8] as *const [i8]) }; + + // Make sure there's always room for a null terminator + let copy_len = cmp::min(dest.len() - 1, src.len()); + dest[..copy_len].copy_from_slice(&src_bytes_signed[..copy_len]); + dest[copy_len] = 0; +}