changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate gen.rs

changeset 7: 315fedf35bc7
author: ellis <ellis@rwest.io>
date: Sun, 07 May 2023 18:06:13 -0400
permissions: -rw-r--r--
description: rust ffi macros, general stuff
7
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
1
 //! demo
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
2
 pub use fig::*;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
3
 pub use obj::*;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
4
 use std::ffi::{CStr, CString}; //OsStr,Path
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
5
                                //use std::os::unix::ffi::OsStrExt;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
6
 use std::slice;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
7
 use libc::{c_char,size_t};
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
8
 
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
9
 #[macro_export]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
10
 macro_rules! cdefn {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
11
   (free $t:tt $n:tt) => {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
12
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
13
     pub unsafe extern "C" fn $n(ptr: *mut $t) {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
14
       if ptr.is_null() {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
15
         return;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
16
       }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
17
       let _ = Box::from_raw(ptr);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
18
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
19
   };
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
20
   (from_string $t:tt $n:tt) => {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
21
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
22
     pub unsafe extern "C" fn $n(ptr: *const c_char) -> *mut $t {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
23
       assert!(!ptr.is_null());
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
24
       let p = CStr::from_ptr(ptr).to_str().unwrap();
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
25
       Box::into_raw(Box::new(p.into()))
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
26
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
27
   };
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
28
   (json_string $t:tt $r:tt $w:tt) => {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
29
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
30
     pub unsafe extern "C" fn $r(ptr: *const c_char) -> *mut $t {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
31
       assert!(!ptr.is_null());
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
32
       let s = CStr::from_ptr(ptr);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
33
       Box::into_raw(Box::new($t::from_json_str(&s.to_str().unwrap()).unwrap()))
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
34
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
35
 
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
36
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
37
     pub unsafe extern "C" fn $w(ptr: *const $t) -> *mut c_char {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
38
       let p = &*ptr;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
39
       let x = p.to_json_string().unwrap();
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
40
       CString::new(x.as_str().as_bytes()).unwrap().into_raw()
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
41
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
42
   };
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
43
   (ron_string $t:tt $r:tt $w:tt) => {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
44
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
45
     pub unsafe extern "C" fn $r(ptr: *const c_char) -> *mut $t {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
46
       assert!(!ptr.is_null());
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
47
       let s = CStr::from_ptr(ptr);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
48
       Box::into_raw(Box::new($t::from_ron_str(&s.to_str().unwrap()).unwrap()))
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
49
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
50
 
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
51
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
52
     pub unsafe extern "C" fn $w(ptr: *const $t) -> *mut c_char {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
53
       let p = &*ptr;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
54
       let x = p.to_ron_string().unwrap();
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
55
       CString::new(x.as_str().as_bytes()).unwrap().into_raw()
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
56
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
57
   };
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
58
   (bytes $t:tt $r:tt $w:tt) => {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
59
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
60
     pub unsafe extern "C" fn $r(ptr: *const u8, len: size_t) -> *mut $t {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
61
       Box::into_raw(Box::new($t::decode(slice::from_raw_parts(ptr,len)).unwrap()))
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
62
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
63
 
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
64
     #[no_mangle]
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
65
     pub unsafe extern "C" fn $w(ptr: *const $t) -> *mut u8 {
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
66
       let p = &*ptr;
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
67
       let mut x = p.encode().unwrap();
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
68
       let r = x.as_mut_ptr();
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
69
       std::mem::forget(x);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
70
       r
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
71
     }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
72
   }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
73
 }
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
74
 
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
75
 cdefn!(free Service free_service);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
76
 cdefn!(from_string Service service_from_string);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
77
 cdefn!(json_string Service service_from_json_string service_to_json_string);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
78
 cdefn!(ron_string Service service_from_ron_string service_to_ron_string);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
79
 cdefn!(bytes Service service_decode service_encode);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
80
 cdefn!(free CustomService free_custom_service);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
81
 cdefn!(from_string CustomService custom_service_from_string);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
82
 cdefn!(json_string CustomService custom_service_from_json_string custom_service_to_json_string);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
83
 cdefn!(ron_string CustomService custom_service_from_ron_string custom_service_to_ron_string);
315fedf35bc7 rust ffi macros, general stuff
ellis <ellis@rwest.io>
parents:
diff changeset
84
 cdefn!(bytes CustomService custom_service_decode custom_service_encode);