我开始使用rust来创建一个使用gnu readline库的小玩具命令提示应用程序。我开始使用c外部函数接口,然后使用came across this in rust 0.8。
crate extra有一个模块extra::rl
,它似乎是一个包含所有必需工具的readline。我的问题是,这是生锈0.10,如果是这样,它在哪里?如果没有,它是否打包为外部模块,如果是,我在哪里可以找到它?
提前致谢。
答案 0 :(得分:1)
use std::c_str;
#[link(name = "readline")]
extern {
fn readline (p: *std::libc::c_char) -> * std::libc::c_char;
}
fn rust_readline (prompt: &str) -> Option<~str> {
let cprmt = prompt.to_c_str();
cprmt.with_ref(|c_buf| {
unsafe {
let ret = c_str::CString::new (readline (c_buf), true);
ret.as_str().map(|ret| ret.to_owned())
}
})
}
fn eval(input: &str)
{
println! ("{}", input);
}
fn main()
{
loop {
let val = rust_readline (">>> ");
match val {
None => { break }
_ => {
let input = val.unwrap ();
eval(input);
}
}
}
}
这是一个样本REPL样式的解释器,只是打印而不是eval'ing。基于http://redbrain.co.uk/2013/11/09/rust-and-readline-c-ffi/的代码。他的榜样不再编纂。
此代码现在位于github here。
答案 1 :(得分:1)
对不起我真的应该说,我想出了一个回答我自己的问题,它包括了readline的历史。我把它放在这里以防其他人想要这些功能。
//! Readline FFI
//extern crate libc;
use std::libc;
use libc::c_char;
use std::c_str;
#[link(name = "readline")]
extern {
fn readline(p: *c_char) -> * c_char;
fn add_history(l: *c_char);
}
pub fn rust_readline(prompt: &str) -> Option<~str> {
let c_prompt = prompt.to_c_str();
c_prompt.with_ref(|c_buf| {
unsafe {
let ret = c_str::CString::new(readline(c_buf), true);
ret.as_str().map(|ret| ret.to_owned())
}
})
}
pub fn rust_add_history(line: &str) -> int {
// if line.len() == 0 { return Err("Empty string!") }
let c_line = line.to_c_str();
c_line.with_ref(|my_c_line| {
unsafe {
// println!("{}", my_c_line)
add_history(my_c_line);
}
});
0
}
fn main() {
loop {
let val = rust_readline("mikes_lisp> ");
match val {
None => { break }
_ => {
let input = val.unwrap();
rust_add_history(input);
println!("you said: '{}'", input);
}
}
}
}