/// Unregister a previously registered C plugin by name.
///
/// # Parameters
///
/// - `name`: null-terminated UTF-8 plugin name. Must not be null.
/// - `out_error`: receives a heap-allocated error string on failure.
///
/// # Safety
///
/// `name` must point to a valid null-terminated C string.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn {{ full_unregister_name }}(
    name: *const std::ffi::c_char,
    out_error: *mut *mut std::ffi::c_char,
) -> i32 {
    if name.is_null() {
        ffi_set_out_error(out_error, "name must not be null");
        return 1;
    }
    // SAFETY: name is non-null (checked above); it points to a valid C string.
    let plugin_name = match unsafe { std::ffi::CStr::from_ptr(name) }.to_str() {
        Ok(s) => s,
        Err(_) => {
            ffi_set_out_error(out_error, "name is not valid UTF-8");
            return 1;
        }
    };

    let registry = {{ registry_getter }}();
    let mut registry = registry.write();
    if let Err(e) = registry.remove(plugin_name) {
        ffi_set_out_error(out_error, &e.to_string());
        return 1;
    }
    0
}
