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
extern crate jwconv;


use std::ffi::{CStr, CString};
use std::os::raw::c_char;


macro_rules! cchar_to_str {
    ($x:ident) => ({
        let ptr = unsafe {
            assert!(!$x.is_null());
            CStr::from_ptr($x)
        };
        ptr.to_str().unwrap()
    })
}

macro_rules! str_to_cchar {
    ($x:expr) => ({
        CString::new($x).unwrap().into_raw()
    })
}


#[no_mangle]
pub extern fn romaji_to_hiragana(data: *const c_char) -> *const c_char {
    let data = cchar_to_str!(data);
    let result = jwconv::romaji_to_hiragana(data);
    str_to_cchar!(result)
}

#[no_mangle]
pub extern fn romaji_to_katakana(data: *const c_char) -> *const c_char {
    let data = cchar_to_str!(data);
    let result = jwconv::romaji_to_katakana(data);
    str_to_cchar!(result)
}

#[no_mangle]
pub extern fn string_free(ptr: *mut c_char) {
    unsafe {
        if ptr.is_null() { return }
        CString::from_raw(ptr)
    };
}