use core::ffi::{c_int, c_void};
use crate::tchar::Tchar;
pub type Hwnd = *mut c_void;
pub type Hmodule = *mut c_void;
pub const NSISPIAPIVER_1_0: c_int = 0x0001_0000;
pub const NSISPIAPIVER_CURR: c_int = NSISPIAPIVER_1_0;
pub const NSPIM_UNLOAD: c_int = 0;
pub const NSPIM_GUIUNLOAD: c_int = 1;
pub type Export =
unsafe extern "C" fn(Hwnd, c_int, *mut Tchar, *mut *mut StackNode, *mut ExtraParameters);
pub type NsisPluginCallback = unsafe extern "C" fn(c_int) -> usize;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct ExecFlags {
pub autoclose: c_int,
pub all_user_var: c_int,
pub exec_error: c_int,
pub abort: c_int,
pub exec_reboot: c_int,
pub reboot_called: c_int,
pub xxx_cur_insttype: c_int,
pub plugin_api_version: c_int,
pub silent: c_int,
pub instdir_error: c_int,
pub rtl: c_int,
pub errlvl: c_int,
pub alter_reg_view: c_int,
pub status_update: c_int,
}
#[repr(C)]
pub struct ExtraParameters {
pub exec_flags: *mut ExecFlags,
pub execute_code_segment: Option<unsafe extern "system" fn(c_int, Hwnd) -> c_int>,
pub validate_filename: Option<unsafe extern "system" fn(*mut Tchar)>,
pub register_plugin_callback:
Option<unsafe extern "system" fn(Hmodule, NsisPluginCallback) -> c_int>,
}
#[repr(C)]
pub struct StackNode {
pub next: *mut StackNode,
pub text: [Tchar; 1],
}
impl StackNode {
#[inline]
pub const fn alloc_size(string_size: usize) -> usize {
core::mem::size_of::<StackNode>() + string_size * core::mem::size_of::<Tchar>()
}
}