dtmt/examples/lua.rs
2019-08-15 19:17:23 -04:00

54 lines
1.6 KiB
Rust

use std::env;
use std::ffi::{CStr, CString};
use std::ptr;
use luajit_sys as sys;
unsafe fn run_script(script_name: String, script_src: String) {
let lua = sys::luaL_newstate();
assert_ne!(lua, ptr::null_mut());
sys::luaL_openlibs(lua);
let script_data = script_src.as_bytes();
let script_name = CString::new(script_name).unwrap();
let mut error = sys::luaL_loadbuffer(
lua,
script_data.as_ptr() as _,
script_data.len() as _,
script_name.as_ptr() as _,
);
if error != 0 {
eprintln!("luaL_loadbuffer failed");
} else {
error = sys::lua_pcall(lua, 0, 1, 0);
if error != 0 {
eprintln!("lua_pcall failed");
}
}
let idx = sys::lua_gettop(lua);
if sys::lua_isnoneornil(lua, idx) != 1 {
let s = sys::lua_tostring(lua, idx);
assert_ne!(s, ptr::null(), "lua_tostring returned null");
let result = CStr::from_ptr(s).to_string_lossy().to_string();
println!("script result: {}", result);
}
sys::lua_close(lua);
}
fn main() {
if let Some(script_name) = env::args().skip(1).next() {
let script_src = std::fs::read_to_string(&script_name)
.unwrap_or_else(|e| panic!("failed to read file: '{}' {:?}", &script_name, e));
unsafe {
run_script(script_name, script_src);
}
} else {
println!(
"{} FILE",
env::current_exe()
.unwrap()
.file_name()
.unwrap()
.to_string_lossy()
);
}
}