$30 off During Our Annual Pro Sale. View Details »

Calling Rust from other languages

Calling Rust from other languages

My lightning talk at PolyConf 2015.

Zbigniew Siciarz

July 02, 2015
Tweet

More Decks by Zbigniew Siciarz

Other Decks in Programming

Transcript

  1. Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  2. Zbigniew Siciarz @zsiciarz
    siciarz.net
    (mostly) Python developer
    http://rustwarsaw.org/
    http://zsiciarz.github.io/24daysofrust/

    View Slide

  3. Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  4. Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  5. fn rust_substrings(value: &str, substr: &str) -> i32 {
    let mut count = 0;
    let substr_len = substr.len();
    let upper_bound = value.len() - substr_len + 1;
    for c in 0..upper_bound {
    let possible_match = &value[c..c+substr_len];
    if possible_match == substr {
    count += 1;
    }
    }
    count
    }
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  6. Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  7. #[no_mangle]
    pub extern "C" fn count_substrings(
    value: *const c_char, substr: *const c_char) -> i32 {
    let c_value = unsafe {
    CStr::from_ptr(value).to_bytes()
    };
    let c_substr = unsafe {
    CStr::from_ptr(substr).to_bytes()
    };
    match str::from_utf8(c_value) {
    Ok(value) => match str::from_utf8(c_substr) {
    Ok(substr) => rust_substrings(value, substr),
    Err(_) => -1,
    },
    Err(_) => -1,
    }
    }
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  8. #include
    #include
    int32_t count_substrings(const char* value, const char*
    substr);
    int main() {
    printf("%d\n", count_substrings("banana", "na"));
    return 0;
    }s
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  9. import ctypes
    library_name = "../target/debug/libstringtools.so"
    stringtools = ctypes.CDLL(library_name)
    print(stringtools.count_substrings(b"banana", b"na"))
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  10. require 'ffi'
    module StringTools
    extend FFI::Library
    ffi_lib "../target/debug/libstringtools.so"
    attach_function :count_substrings, [:string, :string], :int
    end
    puts StringTools.count_substrings("banana", "na")
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  11. using System;
    using System.Runtime.InteropServices;
    public class StringTools
    {
    [DllImport("../target/debug/libstringtools.so")]
    public static extern Int32 count_substrings(string value,
    string substr);
    static public void Main()
    {
    Console.WriteLine(count_substrings("banana", "na"));
    }
    }
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  12. {-# LANGUAGE ForeignFunctionInterface #-}
    import Foreign.C.String (CString, newCString)
    foreign import ccall "count_substrings"
    count_substrings :: CString -> CString -> IO Int
    main :: IO ()
    main = do
    value <- newCString "banana"
    substr <- newCString "na"
    count_substrings value substr >>= print
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  13. package main
    // #cgo LDFLAGS: -L../target/debug -lstringtools
    // int count_substrings(const char* value, const char*
    substr);
    import "C"
    import "fmt"
    func main() {
    value := C.CString("banana")
    substr := C.CString("na")
    fmt.Println(C.count_substrings(value, substr))
    }
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  14. // sorry, code too long :(
    Zbigniew Siciarz @zsiciarz
    siciarz.net

    View Slide

  15. Zbigniew Siciarz @zsiciarz
    siciarz.net
    http://jakegoulding.com/rust-ffi-omnibus/
    https://github.com/zsiciarz/rust-ffi-stringtools
    https://github.com/alexcrichton/rust-ffi-examples
    https://doc.rust-lang.org/book/ffi.html

    View Slide