diff options
Diffstat (limited to 'src/internals.rs')
-rw-r--r-- | src/internals.rs | 137 |
1 files changed, 71 insertions, 66 deletions
diff --git a/src/internals.rs b/src/internals.rs index d1b714f..ec96299 100644 --- a/src/internals.rs +++ b/src/internals.rs @@ -20,30 +20,39 @@ //! This also includes the hexchat_plugin struct, from hexchat-plugin.h. Note that we use the //! struct even on non-Windows platforms because it's a lot easier that way. Should be safe, tho. +use std::marker::PhantomData; +use std::marker::PhantomPinned; + use libc; -// apparently this is the right way to do these -#[repr(i8)] -pub enum HexchatList { - __One, - __Two, +use ltptr::*; + +// apparently this is the new right way to do these +#[repr(C)] +pub struct HexchatList { + _data: libc::c_void, + // remove Send/Sync/etc + _marker: PhantomData<(*mut u8, PhantomPinned)> } -#[repr(i8)] -pub enum HexchatHook { - __One, - __Two, +#[repr(C)] +pub struct HexchatHook { + _data: libc::c_void, + // remove Send/Sync/etc + _marker: PhantomData<(*mut u8, PhantomPinned)> } -#[repr(i8)] -pub enum HexchatContext { - __One, - __Two, +#[repr(C)] +pub struct HexchatContext { + _data: libc::c_void, + // remove Send/Sync/etc + _marker: PhantomData<(*mut u8, PhantomPinned)> } // not in hexchat-plugin.h -#[repr(i8)] -pub enum PluginGuiHandle { - __One, - __Two, +#[repr(C)] +pub struct PluginGuiHandle { + _data: libc::c_void, + // remove Send/Sync/etc + _marker: PhantomData<(*mut u8, PhantomPinned)> } #[repr(C)] @@ -51,147 +60,143 @@ pub struct HexchatEventAttrs { pub server_time_utc: libc::time_t, } -pub type HexchatPlugin = Ph; - #[repr(C)] -pub struct Ph { - pub hexchat_hook_command: unsafe extern "C" fn(ph: *mut HexchatPlugin, +pub struct Ph<'ph> { + pub(crate) hexchat_hook_command: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char, pri: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int, help_text: *const libc::c_char, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_hook_server: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_hook_server: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char, pri: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_hook_print: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_hook_print: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char, pri: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(word: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_hook_timer: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_hook_timer: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, timeout: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_hook_fd: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_hook_fd: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, fd: libc::c_int, flags: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(fd: libc::c_int, flags: libc::c_int, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_unhook: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_unhook: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, hook: *const HexchatHook) -> *const libc::c_void, - pub hexchat_print: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_print: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, text: *const libc::c_char), // this is VERY NAUGHTY. + // NOTE this is an *owned* pointer, so {Const,Mut}LtPtr don't apply here. // TODO see if hexchat's gonna provide a proper userdata field at some point. - // it appears this function isn't used anywhere by hexchat so we reuse its pointer. - // on linux, it's a dummy anyway. - // another option would've been to use one of the printf functions. // TODO test this on platforms hexchat doesn't build on, like AVR. - pub userdata: *mut libc::c_void, - /*pub hexchat_printf_do_not_use: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) userdata: *mut crate::PhUserdata<'ph>, + /*pub(crate) hexchat_printf_do_not_use: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, format: *const libc::c_char, ...),*/ - pub hexchat_command: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_command: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, command: *const libc::c_char), - pub hexchat_commandf_do_not_use: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_commandf_do_not_use: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, format: *const libc::c_char, ...), - pub hexchat_nickcmp: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_nickcmp: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, s1: *const libc::c_char, s2: *const libc::c_char) -> libc::c_int, - pub hexchat_set_context: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_set_context: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, ctx: *const HexchatContext) -> libc::c_int, - pub hexchat_find_context: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_find_context: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, servname: *const libc::c_char, channel: *const libc::c_char) -> *const HexchatContext, - pub hexchat_get_context: unsafe extern "C" fn(ph: *mut HexchatPlugin) -> *const HexchatContext, - pub hexchat_get_info: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_get_context: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>) -> *const HexchatContext, + pub(crate) hexchat_get_info: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, id: *const libc::c_char) -> *const libc::c_char, - pub hexchat_get_prefs: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_get_prefs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char, string: *mut *const libc::c_char, integer: *mut libc::c_int) -> libc::c_int, - pub hexchat_list_get: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_get: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char) -> *mut HexchatList, - pub hexchat_list_free: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_free: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, xlist: *const HexchatList), - pub hexchat_list_fields: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_fields: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char) -> *const *const libc::c_char, - pub hexchat_list_next: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_next: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, xlist: *const HexchatList) -> libc::c_int, - pub hexchat_list_str: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_str: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, xlist: *const HexchatList, name: *const libc::c_char) -> *const libc::c_char, - pub hexchat_list_int: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_int: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, xlist: *const HexchatList, name: *const libc::c_char) -> libc::c_int, - pub hexchat_plugingui_add: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_plugingui_add: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, filename: *const libc::c_char, name: *const libc::c_char, desc: *const libc::c_char, version: *const libc::c_char, reserved: *mut char) -> *const PluginGuiHandle, - pub hexchat_plugingui_remove: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_plugingui_remove: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, handle: *const PluginGuiHandle), - pub hexchat_emit_print: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_emit_print: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, event_name: *const libc::c_char, ...) -> libc::c_int, - pub hexchat_read_fd: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_read_fd: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, src: *const libc::c_void, buf: *mut char, len: *mut libc::c_int) -> libc::c_int, - pub hexchat_list_time: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_list_time: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, xlist: *const HexchatList, name: *const libc::c_char) -> libc::time_t, - pub hexchat_gettext: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_gettext: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, msgid: *const libc::c_char) -> *const libc::c_char, - pub hexchat_send_modes: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_send_modes: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, targets: *mut *const libc::c_char, ntargets: libc::c_int, modes_per_line: libc::c_int, sign: libc::c_char, mode: libc::c_char), - pub hexchat_strip: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_strip: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, string: *const libc::c_char, len: libc::c_int, flags: libc::c_int) -> *const libc::c_char, - pub hexchat_free: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_free: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, ptr: *const libc::c_void), - pub hexchat_pluginpref_set_str: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_pluginpref_set_str: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, var: *const libc::c_char, value: *const libc::c_char) -> libc::c_int, - pub hexchat_pluginpref_get_str: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_pluginpref_get_str: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, var: *const libc::c_char, dest: *mut char) -> libc::c_int, - pub hexchat_pluginpref_set_int: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_pluginpref_set_int: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, var: *const libc::c_char, value: libc::c_int) -> libc::c_int, - pub hexchat_pluginpref_get_int: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_pluginpref_get_int: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, var: *const libc::c_char) -> libc::c_int, - pub hexchat_pluginpref_delete: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_pluginpref_delete: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, var: *const libc::c_char) -> libc::c_int, - pub hexchat_pluginpref_list: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_pluginpref_list: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, dest: *mut char) -> libc::c_int, - pub hexchat_hook_server_attrs: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_hook_server_attrs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char, pri: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, attrs: *const HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_hook_print_attrs: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_hook_print_attrs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, name: *const libc::c_char, pri: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(word: *const *const libc::c_char, attrs: *const HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const HexchatHook, - pub hexchat_emit_print_attrs: unsafe extern "C" fn(ph: *mut HexchatPlugin, attrs: *const HexchatEventAttrs, + pub(crate) hexchat_emit_print_attrs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, attrs: *const HexchatEventAttrs, event_name: *const libc::c_char, ...) -> libc::c_int, - pub hexchat_event_attrs_create: unsafe extern "C" fn(ph: *mut HexchatPlugin) -> *mut HexchatEventAttrs, - pub hexchat_event_attrs_free: unsafe extern "C" fn(ph: *mut HexchatPlugin, + pub(crate) hexchat_event_attrs_create: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>) -> *mut HexchatEventAttrs, + pub(crate) hexchat_event_attrs_free: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, attrs: *mut HexchatEventAttrs), } |