eclisp-sys 0.1.0

FFI Bindings for Embeddable Common Lisp
use std::ffi::{CStr, CString};

use eclisp_sys as sys;

const CODE: &str = r#"
(defun hello-lisp ()
  (format t "hello-lisp!~%")
  :foo)
"#;

#[test]
fn runs() {
    let program = CString::new("eclisp-test").unwrap();
    let mut argv = [program.as_ptr().cast_mut()];

    // Surely unsafe is fine! :D
    unsafe {
        sys::cl_boot(1, argv.as_mut_ptr());

        let source = CString::new(CODE).unwrap();
        let lisp_string = sys::ecl_make_simple_base_string(source.as_ptr(), -1);
        let form = sys::si_string_to_object(1, lisp_string);
        sys::cl_eval(form);

        let call = CString::new("(hello-lisp)").unwrap();
        let lisp_string = sys::ecl_make_simple_base_string(call.as_ptr(), -1);
        let form = sys::si_string_to_object(1, lisp_string);
        let result = sys::cl_eval(form);

        let printed = sys::cl_prin1_to_string(result);
        let base = sys::ecl_null_terminated_base_string(printed);
        let ptr = sys::ecl_base_string_pointer_safe(base);
        let value = CStr::from_ptr(ptr).to_string_lossy().into_owned();
        assert_eq!(value, ":FOO");

        sys::cl_shutdown();
    }
}