1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use std::ffi::CStr; use std::os::raw::c_void; pub type DOMReference = i32; pub type CString = i32; pub type Element = i32; pub type EventListener = i32; pub type Event = i32; pub const UNDEFINED: i32 = -1; pub fn to_cstring(s: &str) -> CString { std::ffi::CString::new(s).unwrap().into_raw() as i32 } pub fn to_string(c: CString) -> String { let s: &CStr = unsafe { CStr::from_ptr(c as *const i8) }; s.to_str().unwrap().to_owned() } extern "C" { fn global_debugger(); fn global_get_window() -> Element; fn global_release(handle: i32); fn global_create_event_listener() -> EventListener; fn global_get_property(element: Element, property_name: CString) -> i32; fn global_sys_call(id: i32, param_a: i32, param_b: i32, param_c: i32); } pub fn sys_call(id: i32, param_a: i32, param_b: i32, param_c: i32) { unsafe { global_sys_call(id, param_a, param_b, param_c); } } pub fn debugger() { unsafe { global_debugger(); } } pub fn window() -> Element { unsafe { global_get_window() } } pub fn document() -> Element { crate::window::get_document(window()) } pub fn release(handle: i32) { unsafe { global_release(handle) } } pub fn create_event_listener() -> EventListener { unsafe { global_create_event_listener() } } pub fn get_property(element: Element, property_name: &str) -> i32 { unsafe { global_get_property(element, to_cstring(property_name)) } } #[no_mangle] pub fn malloc(size: i32) -> *mut c_void { let mut buf = Vec::with_capacity(size as usize); let ptr = buf.as_mut_ptr(); std::mem::forget(buf); return ptr as *mut c_void; }